From 8e5ef51471ea1cd06aac2d4bbb7ce30dc7b4b3e3 Mon Sep 17 00:00:00 2001 From: Ali Zahid Date: Wed, 10 Dec 2014 11:02:20 +0400 Subject: [PATCH] Ember library updated to 1.8.1 --- src/context.js | 2 +- vendor/{ember-1.7.0.js => ember-1.8.1.js} | 13508 ++++++++++---------- 2 files changed, 6631 insertions(+), 6879 deletions(-) rename vendor/{ember-1.7.0.js => ember-1.8.1.js} (84%) diff --git a/src/context.js b/src/context.js index e79b96f..4ce90e0 100644 --- a/src/context.js +++ b/src/context.js @@ -6,7 +6,7 @@ var fs = require('fs'); var vm = require('vm'); var HANDLEBARSJS = fs.readFileSync(__dirname + '/../vendor/handlebars-1.3.0.js', 'utf8') -var EMBERJS = fs.readFileSync(__dirname + '/../vendor/ember-1.7.0.js', 'utf8') +var EMBERJS = fs.readFileSync(__dirname + '/../vendor/ember-1.8.1.js', 'utf8') function getBaseSandbox() { diff --git a/vendor/ember-1.7.0.js b/vendor/ember-1.8.1.js similarity index 84% rename from vendor/ember-1.7.0.js rename to vendor/ember-1.8.1.js index 7d5ea73..59cd4b6 100644 --- a/vendor/ember-1.7.0.js +++ b/vendor/ember-1.8.1.js @@ -5,24 +5,24 @@ * Portions Copyright 2008-2011 Apple Inc. All rights reserved. * @license Licensed under MIT license * See https://raw.github.com/emberjs/ember.js/master/LICENSE - * @version 1.7.0 + * @version 1.8.1 */ (function() { -var define, requireModule, require, requirejs, Ember; +var enifed, requireModule, eriuqer, requirejs, Ember; (function() { Ember = this.Ember = this.Ember || {}; - if (typeof Ember === 'undefined') { Ember = {} }; + if (typeof Ember === 'undefined') { Ember = {}; }; if (typeof Ember.__loader === 'undefined') { var registry = {}, seen = {}; - define = function(name, deps, callback) { + enifed = function(name, deps, callback) { registry[name] = { deps: deps, callback: callback }; }; - requirejs = require = requireModule = function(name) { + requirejs = eriuqer = requireModule = function(name) { if (seen.hasOwnProperty(name)) { return seen[name]; } seen[name] = {}; @@ -30,11 +30,11 @@ var define, requireModule, require, requirejs, Ember; throw new Error("Could not find module " + name); } - var mod = registry[name], - deps = mod.deps, - callback = mod.callback, - reified = [], - exports; + var mod = registry[name]; + var deps = mod.deps; + var callback = mod.callback; + var reified = []; + var exports; for (var i=0, l=deps.length; i 3 ? slice.call(arguments, 3) : undefined; + var stack = this.DEBUG ? new Error() : undefined; + var length = arguments.length; + var args; + + if (length > 3) { + args = new Array(length - 3); + for (var i = 3; i < length; i++) { + args[i-3] = arguments[i]; + } + } else { + args = undefined; + } + if (!this.currentInstance) { createAutorun(this); } return this.currentInstance.schedule(queueName, target, method, args, false, stack); }, @@ -231,15 +230,34 @@ define("backburner", method = target[method]; } - var stack = this.DEBUG ? new Error() : undefined, - args = arguments.length > 3 ? slice.call(arguments, 3) : undefined; - if (!this.currentInstance) { createAutorun(this); } + var stack = this.DEBUG ? new Error() : undefined; + var length = arguments.length; + var args; + + if (length > 3) { + args = new Array(length - 3); + for (var i = 3; i < length; i++) { + args[i-3] = arguments[i]; + } + } else { + args = undefined; + } + + if (!this.currentInstance) { + createAutorun(this); + } return this.currentInstance.schedule(queueName, target, method, args, true, stack); }, setTimeout: function() { - var args = slice.call(arguments), - length = args.length, + var l = arguments.length; + var args = new Array(l); + + for (var x = 0; x < l; x++) { + args[x] = arguments[x]; + } + + var length = args.length, method, wait, target, methodOrTarget, methodOrWait, methodOrArgs; @@ -285,7 +303,7 @@ define("backburner", } } - var executeAt = (+new Date()) + parseInt(wait, 10); + var executeAt = now() + parseInt(wait, 10); if (isString(method)) { method = target[method]; @@ -306,9 +324,9 @@ define("backburner", } // find position to insert - var i = searchTimer(executeAt, timers); + var i = searchTimer(executeAt, this._timers); - timers.splice(i, 0, executeAt, fn); + this._timers.splice(i, 0, executeAt, fn); updateLaterTimer(this, executeAt, wait); @@ -316,13 +334,10 @@ define("backburner", }, throttle: function(target, method /* , args, wait, [immediate] */) { - var self = this, - args = arguments, - immediate = pop.call(args), - wait, - throttler, - index, - timer; + var backburner = this; + var args = arguments; + var immediate = pop.call(args); + var wait, throttler, index, timer; if (isNumber(immediate) || isString(immediate)) { wait = immediate; @@ -338,16 +353,16 @@ define("backburner", timer = global.setTimeout(function() { if (!immediate) { - self.run.apply(self, args); + backburner.run.apply(backburner, args); } - var index = findThrottler(target, method, self._throttlers); + var index = findThrottler(target, method, backburner._throttlers); if (index > -1) { - self._throttlers.splice(index, 1); + backburner._throttlers.splice(index, 1); } }, wait); if (immediate) { - self.run.apply(self, args); + this.run.apply(this, args); } throttler = [target, method, timer]; @@ -358,13 +373,10 @@ define("backburner", }, debounce: function(target, method /* , args, wait, [immediate] */) { - var self = this, - args = arguments, - immediate = pop.call(args), - wait, - index, - debouncee, - timer; + var backburner = this; + var args = arguments; + var immediate = pop.call(args); + var wait, index, debouncee, timer; if (isNumber(immediate) || isString(immediate)) { wait = immediate; @@ -385,21 +397,25 @@ define("backburner", timer = global.setTimeout(function() { if (!immediate) { - self.run.apply(self, args); + backburner.run.apply(backburner, args); } - var index = findDebouncee(target, method, self._debouncees); + var index = findDebouncee(target, method, backburner._debouncees); if (index > -1) { - self._debouncees.splice(index, 1); + backburner._debouncees.splice(index, 1); } }, wait); if (immediate && index === -1) { - self.run.apply(self, args); + backburner.run.apply(backburner, args); } - debouncee = [target, method, timer]; + debouncee = [ + target, + method, + timer + ]; - self._debouncees.push(debouncee); + backburner._debouncees.push(debouncee); return debouncee; }, @@ -419,7 +435,7 @@ define("backburner", clearTimeout(this._laterTimer); this._laterTimer = null; } - timers = []; + this._timers = []; if (this._autorun) { clearTimeout(this._autorun); @@ -428,7 +444,7 @@ define("backburner", }, hasTimers: function() { - return !!timers.length || !!this._debouncees.length || !!this._throttlers.length || this._autorun; + return !!this._timers.length || !!this._debouncees.length || !!this._throttlers.length || this._autorun; }, cancel: function(timer) { @@ -437,9 +453,18 @@ define("backburner", if (timer && timerType === 'object' && timer.queue && timer.method) { // we're cancelling a deferOnce return timer.queue.cancel(timer); } else if (timerType === 'function') { // we're cancelling a setTimeout - for (var i = 0, l = timers.length; i < l; i += 2) { - if (timers[i + 1] === timer) { - timers.splice(i, 2); // remove the two elements + for (var i = 0, l = this._timers.length; i < l; i += 2) { + if (this._timers[i + 1] === timer) { + this._timers.splice(i, 2); // remove the two elements + if (i === 0) { + if (this._laterTimer) { // Active timer? Then clear timer and reset for future timer + clearTimeout(this._laterTimer); + this._laterTimer = null; + } + if (this._timers.length > 0) { // Update to next available timer when available + updateLaterTimer(this, this._timers[0], this._timers[0] - now()); + } + } return true; } } @@ -452,18 +477,17 @@ define("backburner", }, _cancelItem: function(findMethod, array, timer){ - var item, - index; + var item, index; if (timer.length < 3) { return false; } index = findMethod(timer[0], timer[1], array); - if(index > -1) { + if (index > -1) { item = array[index]; - if(item[2] === timer[2]){ + if (item[2] === timer[2]) { array.splice(index, 1); clearTimeout(timer[2]); return true; @@ -486,21 +510,10 @@ define("backburner", Backburner.prototype.end = wrapInTryCatch(originalEnd); } - function wrapInTryCatch(func) { - return function () { - try { - return func.apply(this, arguments); - } catch (e) { - throw e; - } - }; - } - function getOnError(options) { return options.onError || (options.onErrorTarget && options.onErrorTarget[options.onErrorMethod]); } - function createAutorun(backburner) { backburner.begin(); backburner._autorun = global.setTimeout(function() { @@ -509,33 +522,48 @@ define("backburner", }); } - function updateLaterTimer(self, executeAt, wait) { - if (!self._laterTimer || executeAt < self._laterTimerExpiresAt) { - self._laterTimer = global.setTimeout(function() { - self._laterTimer = null; - self._laterTimerExpiresAt = null; - executeTimers(self); + function updateLaterTimer(backburner, executeAt, wait) { + var n = now(); + if (!backburner._laterTimer || executeAt < backburner._laterTimerExpiresAt || backburner._laterTimerExpiresAt < n) { + + if (backburner._laterTimer) { + // Clear when: + // - Already expired + // - New timer is earlier + clearTimeout(backburner._laterTimer); + + if (backburner._laterTimerExpiresAt < n) { // If timer was never triggered + // Calculate the left-over wait-time + wait = Math.max(0, executeAt - n); + } + } + + backburner._laterTimer = global.setTimeout(function() { + backburner._laterTimer = null; + backburner._laterTimerExpiresAt = null; + executeTimers(backburner); }, wait); - self._laterTimerExpiresAt = executeAt; + + backburner._laterTimerExpiresAt = n + wait; } } - function executeTimers(self) { - var now = +new Date(), - time, fns, i, l; + function executeTimers(backburner) { + var n = now(); + var fns, i, l; - self.run(function() { - i = searchTimer(now, timers); + backburner.run(function() { + i = searchTimer(n, backburner._timers); - fns = timers.splice(0, i); + fns = backburner._timers.splice(0, i); for (i = 1, l = fns.length; i < l; i += 2) { - self.schedule(self.options.defaultQueue, null, fns[i]); + backburner.schedule(backburner.options.defaultQueue, null, fns[i]); } }); - if (timers.length) { - updateLaterTimer(self, timers[0], timers[0] - now); + if (backburner._timers.length) { + updateLaterTimer(backburner, backburner._timers[0], backburner._timers[0] - n); } } @@ -548,8 +576,8 @@ define("backburner", } function findItem(target, method, collection) { - var item, - index = -1; + var item; + var index = -1; for (var i = 0, l = collection.length; i < l; i++) { item = collection[i]; @@ -562,10 +590,31 @@ define("backburner", return index; } - function searchTimer(time, timers) { - var start = 0, - end = timers.length - 2, - middle, l; + __exports__["default"] = Backburner; + }); +enifed("backburner.umd", + ["./backburner"], + function(__dependency1__) { + "use strict"; + var Backburner = __dependency1__["default"]; + + /* global define:true module:true window: true */ + if (typeof enifed === 'function' && enifed.amd) { + enifed(function() { return Backburner; }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = Backburner; + } else if (typeof this !== 'undefined') { + this['Backburner'] = Backburner; + } + }); +enifed("backburner/binary-search", + ["exports"], + function(__exports__) { + "use strict"; + __exports__["default"] = function binarySearch(time, timers) { + var start = 0; + var end = timers.length - 2; + var middle, l; while (start < end) { // since timers is an array of pairs 'l' will always @@ -585,18 +634,14 @@ define("backburner", return (time >= timers[start]) ? start + 2 : start; } - - __exports__.Backburner = Backburner; }); -define("backburner/deferred_action_queues", - ["backburner/utils","backburner/queue","exports"], +enifed("backburner/deferred-action-queues", + ["./utils","./queue","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; - var Utils = __dependency1__["default"]; - var Queue = __dependency2__.Queue; - - var each = Utils.each, - isString = Utils.isString; + var each = __dependency1__.each; + var isString = __dependency1__.isString; + var Queue = __dependency2__["default"]; function DeferredActionQueues(queueNames, options) { var queues = this.queues = {}; @@ -605,20 +650,20 @@ define("backburner/deferred_action_queues", this.options = options; each(queueNames, function(queueName) { - queues[queueName] = new Queue(this, queueName, options); + queues[queueName] = new Queue(queueName, options[queueName], options); }); } - DeferredActionQueues.prototype = { - queueNames: null, - queues: null, - options: null, + function noSuchQueue(name) { + throw new Error("You attempted to schedule an action in a queue (" + name + ") that doesn't exist"); + } - schedule: function(queueName, target, method, args, onceFlag, stack) { - var queues = this.queues, - queue = queues[queueName]; + DeferredActionQueues.prototype = { + schedule: function(name, target, method, args, onceFlag, stack) { + var queues = this.queues; + var queue = queues[name]; - if (!queue) { throw new Error("You attempted to schedule an action in a queue (" + queueName + ") that doesn't exist"); } + if (!queue) { noSuchQueue(name); } if (onceFlag) { return queue.pushUnique(target, method, args, stack); @@ -627,7 +672,7 @@ define("backburner/deferred_action_queues", } }, - invoke: function(target, method, args, _) { + invoke: function(target, method, args, _, _errorRecordedForStack) { if (args && args.length > 0) { method.apply(target, args); } else { @@ -635,7 +680,7 @@ define("backburner/deferred_action_queues", } }, - invokeWithOnError: function(target, method, args, onError) { + invokeWithOnError: function(target, method, args, onError, errorRecordedForStack) { try { if (args && args.length > 0) { method.apply(target, args); @@ -643,59 +688,80 @@ define("backburner/deferred_action_queues", method.call(target); } } catch(error) { - onError(error); + onError(error, errorRecordedForStack); } }, flush: function() { - var queues = this.queues, - queueNames = this.queueNames, - queueName, queue, queueItems, priorQueueNameIndex, - queueNameIndex = 0, numberOfQueues = queueNames.length, - options = this.options, - onError = options.onError || (options.onErrorTarget && options.onErrorTarget[options.onErrorMethod]), - invoke = onError ? this.invokeWithOnError : this.invoke; - - outerloop: + var queues = this.queues; + var queueNames = this.queueNames; + var queueName, queue, queueItems, priorQueueNameIndex; + var queueNameIndex = 0; + var numberOfQueues = queueNames.length; + var options = this.options; + var onError = options.onError || (options.onErrorTarget && options.onErrorTarget[options.onErrorMethod]); + var invoke = onError ? this.invokeWithOnError : this.invoke; + while (queueNameIndex < numberOfQueues) { queueName = queueNames[queueNameIndex]; queue = queues[queueName]; queueItems = queue._queueBeingFlushed = queue._queue.slice(); queue._queue = []; + queue.targetQueues = Object.create(null); - var queueOptions = queue.options, // TODO: write a test for this - before = queueOptions && queueOptions.before, - after = queueOptions && queueOptions.after, - target, method, args, stack, - queueIndex = 0, numberOfQueueItems = queueItems.length; + var queueOptions = queue.options; // TODO: write a test for this + var before = queueOptions && queueOptions.before; + var after = queueOptions && queueOptions.after; + var target, method, args, errorRecordedForStack; + var queueIndex = 0; + var numberOfQueueItems = queueItems.length; - if (numberOfQueueItems && before) { before(); } + if (numberOfQueueItems && before) { + before(); + } while (queueIndex < numberOfQueueItems) { - target = queueItems[queueIndex]; - method = queueItems[queueIndex+1]; - args = queueItems[queueIndex+2]; - stack = queueItems[queueIndex+3]; // Debugging assistance + target = queueItems[queueIndex]; + method = queueItems[queueIndex+1]; + args = queueItems[queueIndex+2]; + errorRecordedForStack = queueItems[queueIndex+3]; // Debugging assistance - if (isString(method)) { method = target[method]; } + // + + if (isString(method)) { + method = target[method]; + } // method could have been nullified / canceled during flush if (method) { - invoke(target, method, args, onError); + // + // ** Attention intrepid developer ** + // + // To find out the stack of this task when it was scheduled onto + // the run loop, add the following to your app.js: + // + // Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production. + // + // Once that is in place, when you are at a breakpoint and navigate + // here in the stack explorer, you can look at `errorRecordedForStack.stack`, + // which will be the captured stack when this job was scheduled. + // + invoke(target, method, args, onError, errorRecordedForStack); } queueIndex += 4; } queue._queueBeingFlushed = null; - if (numberOfQueueItems && after) { after(); } + if (numberOfQueueItems && after) { + after(); + } if ((priorQueueNameIndex = indexOfPriorQueueWithActions(this, queueNameIndex)) !== -1) { queueNameIndex = priorQueueNameIndex; - continue outerloop; + } else { + queueNameIndex++; } - - queueNameIndex++; } } }; @@ -712,60 +778,134 @@ define("backburner/deferred_action_queues", return -1; } - __exports__.DeferredActionQueues = DeferredActionQueues; + __exports__["default"] = DeferredActionQueues; }); -define("backburner/queue", +enifed("backburner/platform", ["exports"], function(__exports__) { "use strict"; - function Queue(daq, name, options) { - this.daq = daq; + // In IE 6-8, try/finally doesn't work without a catch. + // Unfortunately, this is impossible to test for since wrapping it in a parent try/catch doesn't trigger the bug. + // This tests for another broken try/catch behavior that only exhibits in the same versions of IE. + var needsIETryCatchFix = (function(e,x){ + try{ x(); } + catch(e) { } // jshint ignore:line + return !!e; + })(); + __exports__.needsIETryCatchFix = needsIETryCatchFix; + }); +enifed("backburner/queue", + ["exports"], + function(__exports__) { + "use strict"; + function Queue(name, options, globalOptions) { this.name = name; - this.globalOptions = options; - this.options = options[name]; + this.globalOptions = globalOptions || {}; + this.options = options; this._queue = []; + this.targetQueues = Object.create(null); + this._queueBeingFlushed = undefined; } Queue.prototype = { - daq: null, - name: null, - options: null, - onError: null, - _queue: null, - push: function(target, method, args, stack) { var queue = this._queue; queue.push(target, method, args, stack); - return {queue: this, target: target, method: method}; + + return { + queue: this, + target: target, + method: method + }; }, - pushUnique: function(target, method, args, stack) { - var queue = this._queue, currentTarget, currentMethod, i, l; + pushUniqueWithoutGuid: function(target, method, args, stack) { + var queue = this._queue; - for (i = 0, l = queue.length; i < l; i += 4) { - currentTarget = queue[i]; - currentMethod = queue[i+1]; + for (var i = 0, l = queue.length; i < l; i += 4) { + var currentTarget = queue[i]; + var currentMethod = queue[i+1]; if (currentTarget === target && currentMethod === method) { - queue[i+2] = args; // replace args + queue[i+2] = args; // replace args queue[i+3] = stack; // replace stack - return {queue: this, target: target, method: method}; + return; } } queue.push(target, method, args, stack); - return {queue: this, target: target, method: method}; + }, + + targetQueue: function(targetQueue, target, method, args, stack) { + var queue = this._queue; + + for (var i = 0, l = targetQueue.length; i < l; i += 4) { + var currentMethod = targetQueue[i]; + var currentIndex = targetQueue[i + 1]; + + if (currentMethod === method) { + queue[currentIndex + 2] = args; // replace args + queue[currentIndex + 3] = stack; // replace stack + return; + } + } + + targetQueue.push( + method, + queue.push(target, method, args, stack) - 4 + ); + }, + + pushUniqueWithGuid: function(guid, target, method, args, stack) { + var hasLocalQueue = this.targetQueues[guid]; + + if (hasLocalQueue) { + this.targetQueue(hasLocalQueue, target, method, args, stack); + } else { + this.targetQueues[guid] = [ + method, + this._queue.push(target, method, args, stack) - 4 + ]; + } + + return { + queue: this, + target: target, + method: method + }; + }, + + pushUnique: function(target, method, args, stack) { + var queue = this._queue, currentTarget, currentMethod, i, l; + var KEY = this.globalOptions.GUID_KEY; + + if (target && KEY) { + var guid = target[KEY]; + if (guid) { + return this.pushUniqueWithGuid(guid, target, method, args, stack); + } + } + + this.pushUniqueWithoutGuid(target, method, args, stack); + + return { + queue: this, + target: target, + method: method + }; }, // TODO: remove me, only being used for Ember.run.sync flush: function() { - var queue = this._queue, - globalOptions = this.globalOptions, - options = this.options, - before = options && options.before, - after = options && options.after, - onError = globalOptions.onError || (globalOptions.onErrorTarget && globalOptions.onErrorTarget[globalOptions.onErrorMethod]), - target, method, args, stack, i, l = queue.length; + var queue = this._queue; + var globalOptions = this.globalOptions; + var options = this.options; + var before = options && options.before; + var after = options && options.after; + var onError = globalOptions.onError || (globalOptions.onErrorTarget && globalOptions.onErrorTarget[globalOptions.onErrorMethod]); + var target, method, args, stack, i, l = queue.length; + + this.targetQueues = Object.create(null); if (l && before) { before(); } for (i = 0; i < l; i += 4) { @@ -810,12 +950,28 @@ define("backburner/queue", cancel: function(actionToCancel) { var queue = this._queue, currentTarget, currentMethod, i, l; + var target = actionToCancel.target; + var method = actionToCancel.method; + var GUID_KEY = this.globalOptions.GUID_KEY; + + if (GUID_KEY && this.targetQueues && target) { + var targetQueue = this.targetQueues[target[GUID_KEY]]; + + if (targetQueue) { + for (i = 0, l = targetQueue.length; i < l; i++) { + if (targetQueue[i] === method) { + targetQueue.splice(i, 1); + } + } + } + } for (i = 0, l = queue.length; i < l; i += 4) { currentTarget = queue[i]; currentMethod = queue[i+1]; - if (currentTarget === actionToCancel.target && currentMethod === actionToCancel.method) { + if (currentTarget === target && + currentMethod === method) { queue.splice(i, 4); return true; } @@ -831,7 +987,8 @@ define("backburner/queue", currentTarget = queue[i]; currentMethod = queue[i+1]; - if (currentTarget === actionToCancel.target && currentMethod === actionToCancel.method) { + if (currentTarget === target && + currentMethod === method) { // don't mess with array during flush // just nullify the method queue[i+1] = null; @@ -841,44 +998,63 @@ define("backburner/queue", } }; - __exports__.Queue = Queue; + __exports__["default"] = Queue; }); -define("backburner/utils", +enifed("backburner/utils", ["exports"], function(__exports__) { "use strict"; - __exports__["default"] = { - each: function(collection, callback) { - for (var i = 0; i < collection.length; i++) { - callback(collection[i]); - } - }, + var NUMBER = /\d+/; - isString: function(suspect) { - return typeof suspect === 'string'; - }, + function each(collection, callback) { + for (var i = 0; i < collection.length; i++) { + callback(collection[i]); + } + } - isFunction: function(suspect) { - return typeof suspect === 'function'; - }, + __exports__.each = each;// Date.now is not available in browsers < IE9 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility + var now = Date.now || function() { return new Date().getTime(); }; + __exports__.now = now; + function isString(suspect) { + return typeof suspect === 'string'; + } - isNumber: function(suspect) { - return typeof suspect === 'number'; - } - }; - }); + __exports__.isString = isString;function isFunction(suspect) { + return typeof suspect === 'function'; + } + + __exports__.isFunction = isFunction;function isNumber(suspect) { + return typeof suspect === 'number'; + } + + __exports__.isNumber = isNumber;function isCoercableNumber(number) { + return isNumber(number) || NUMBER.test(number); + } + + __exports__.isCoercableNumber = isCoercableNumber;function wrapInTryCatch(func) { + return function () { + try { + return func.apply(this, arguments); + } catch (e) { + throw e; + } + }; + } -define("calculateVersion", + __exports__.wrapInTryCatch = wrapInTryCatch; + }); +enifed("calculateVersion", [], function() { "use strict"; 'use strict'; - var fs = require('fs'); - var path = require('path'); + var fs = eriuqer('fs'); + var path = eriuqer('path'); module.exports = function () { - var packageVersion = require('../package.json').version; + var packageVersion = eriuqer('../package.json').version; var output = [packageVersion]; var gitPath = path.join(__dirname,'..','.git'); var headFilePath = path.join(gitPath, 'HEAD'); @@ -909,7 +1085,7 @@ define("calculateVersion", } }; }); -define("container", +enifed("container", ["container/container","exports"], function(__dependency1__, __exports__) { "use strict"; @@ -936,13 +1112,14 @@ define("container", __exports__["default"] = Container; }); -define("container/container", - ["container/inheriting_dict","ember-metal/core","exports"], - function(__dependency1__, __dependency2__, __exports__) { +enifed("container/container", + ["ember-metal/core","ember-metal/keys","ember-metal/dictionary","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; - var InheritingDict = __dependency1__["default"]; - var Ember = __dependency2__["default"]; + var Ember = __dependency1__["default"]; // Ember.assert + var emberKeys = __dependency2__["default"]; + var dictionary = __dependency3__["default"]; // A lightweight container that helps to assemble and decouple components. // Public api for the container is still in flux. @@ -953,18 +1130,19 @@ define("container/container", this.resolver = parent && parent.resolver || function() {}; - this.registry = new InheritingDict(parent && parent.registry); - this.cache = new InheritingDict(parent && parent.cache); - this.factoryCache = new InheritingDict(parent && parent.factoryCache); - this.resolveCache = new InheritingDict(parent && parent.resolveCache); - this.typeInjections = new InheritingDict(parent && parent.typeInjections); - this.injections = {}; + this.registry = dictionary(parent ? parent.registry : null); + this.cache = dictionary(parent ? parent.cache : null); + this.factoryCache = dictionary(parent ? parent.factoryCache : null); + this.resolveCache = dictionary(parent ? parent.resolveCache : null); + this.typeInjections = dictionary(parent ? parent.typeInjections : null); + this.injections = dictionary(null); + this.normalizeCache = dictionary(null); - this.factoryTypeInjections = new InheritingDict(parent && parent.factoryTypeInjections); - this.factoryInjections = {}; + this.factoryTypeInjections = dictionary(parent ? parent.factoryTypeInjections : null); + this.factoryInjections = dictionary(null); - this._options = new InheritingDict(parent && parent._options); - this._typeOptions = new InheritingDict(parent && parent._typeOptions); + this._options = dictionary(parent ? parent._options : null); + this._typeOptions = dictionary(parent ? parent._typeOptions : null); } Container.prototype = { @@ -1077,20 +1255,19 @@ define("container/container", @param {Object} options */ register: function(fullName, factory, options) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - + if (factory === undefined) { throw new TypeError('Attempting to register an unknown factory: `' + fullName + '`'); } var normalizedName = this.normalize(fullName); - if (this.cache.has(normalizedName)) { + if (normalizedName in this.cache) { throw new Error('Cannot re-register: `' + fullName +'`, as it has already been looked up.'); } - this.registry.set(normalizedName, factory); - this._options.set(normalizedName, options || {}); + this.registry[normalizedName] = factory; + this._options[normalizedName] = (options || {}); }, /** @@ -1110,15 +1287,14 @@ define("container/container", @param {String} fullName */ unregister: function(fullName) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - + var normalizedName = this.normalize(fullName); - this.registry.remove(normalizedName); - this.cache.remove(normalizedName); - this.factoryCache.remove(normalizedName); - this.resolveCache.remove(normalizedName); - this._options.remove(normalizedName); + delete this.registry[normalizedName]; + delete this.cache[normalizedName]; + delete this.factoryCache[normalizedName]; + delete this.resolveCache[normalizedName]; + delete this._options[normalizedName]; }, /** @@ -1154,8 +1330,7 @@ define("container/container", @return {Function} fullName's factory */ resolve: function(fullName) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - return resolve(this, this.normalize(fullName)); + return resolve(this, this.normalize(fullName)); }, /** @@ -1177,12 +1352,25 @@ define("container/container", /** A hook to enable custom fullName normalization behaviour + @method normalizeFullName + @param {String} fullName + @return {string} normalized fullName + */ + normalizeFullName: function(fullName) { + return fullName; + }, + + /** + normalize a fullName based on the applications conventions + @method normalize @param {String} fullName @return {string} normalized fullName */ normalize: function(fullName) { - return fullName; + return this.normalizeCache[fullName] || ( + this.normalizeCache[fullName] = this.normalizeFullName(fullName) + ); }, /** @@ -1236,8 +1424,7 @@ define("container/container", @return {any} */ lookup: function(fullName, options) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - return lookup(this, this.normalize(fullName), options); + return lookup(this, this.normalize(fullName), options); }, /** @@ -1248,8 +1435,7 @@ define("container/container", @return {any} */ lookupFactory: function(fullName) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - return factoryFor(this, this.normalize(fullName)); + return factoryFor(this, this.normalize(fullName)); }, /** @@ -1261,8 +1447,7 @@ define("container/container", @return {Boolean} */ has: function(fullName) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - return has(this, this.normalize(fullName)); + return has(this, this.normalize(fullName)); }, /** @@ -1295,7 +1480,7 @@ define("container/container", optionsForType: function(type, options) { if (this.parent) { illegalChildOperation('optionsForType'); } - this._typeOptions.set(type, options); + this._typeOptions[type] = options; }, /** @@ -1343,13 +1528,14 @@ define("container/container", @param {String} fullName */ typeInjection: function(type, property, fullName) { - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); + if (this.parent) { illegalChildOperation('typeInjection'); } var fullNameType = fullName.split(':')[0]; - if(fullNameType === type) { + if (fullNameType === type) { throw new Error('Cannot inject a `' + fullName + '` on other ' + type + '(s). Register the `' + fullName + '` as a different type and perform the typeInjection.'); } + addTypeInjection(this.typeInjections, type, property, fullName); }, @@ -1407,10 +1593,9 @@ define("container/container", return this.typeInjection(fullName, property, normalizedInjectionName); } - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - var normalizedName = this.normalize(fullName); + var normalizedName = this.normalize(fullName); - if (this.cache.has(normalizedName)) { + if (this.cache[normalizedName]) { throw new Error("Attempted to register an injection for a type that has already been looked up. ('" + normalizedName + "', '" + property + "', '" + injectionName + "')"); } addInjection(this.injections, normalizedName, property, normalizedInjectionName); @@ -1513,9 +1698,8 @@ define("container/container", return this.factoryTypeInjection(normalizedName, property, normalizedInjectionName); } - Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - - if (this.factoryCache.has(normalizedName)) { + + if (this.factoryCache[normalizedName]) { throw new Error('Attempted to register a factoryInjection for a type that has already ' + 'been looked up. (\'' + normalizedName + '\', \'' + property + '\', \'' + injectionName + '\')'); } @@ -1557,17 +1741,17 @@ define("container/container", }; function resolve(container, normalizedName) { - var cached = container.resolveCache.get(normalizedName); + var cached = container.resolveCache[normalizedName]; if (cached) { return cached; } - var resolved = container.resolver(normalizedName) || container.registry.get(normalizedName); - container.resolveCache.set(normalizedName, resolved); + var resolved = container.resolver(normalizedName) || container.registry[normalizedName]; + container.resolveCache[normalizedName] = resolved; return resolved; } function has(container, fullName){ - if (container.cache.has(fullName)) { + if (container.cache[fullName]) { return true; } @@ -1577,8 +1761,8 @@ define("container/container", function lookup(container, fullName, options) { options = options || {}; - if (container.cache.has(fullName) && options.singleton !== false) { - return container.cache.get(fullName); + if (container.cache[fullName] && options.singleton !== false) { + return container.cache[fullName]; } var value = instantiate(container, fullName); @@ -1586,7 +1770,7 @@ define("container/container", if (value === undefined) { return; } if (isSingleton(container, fullName) && options.singleton !== false) { - container.cache.set(fullName, value); + container.cache[fullName] = value; } return value; @@ -1624,14 +1808,14 @@ define("container/container", } function option(container, fullName, optionName) { - var options = container._options.get(fullName); + var options = container._options[fullName]; if (options && options[optionName] !== undefined) { return options[optionName]; } var type = fullName.split(':')[0]; - options = container._typeOptions.get(type); + options = container._typeOptions[type]; if (options) { return options[optionName]; @@ -1640,8 +1824,8 @@ define("container/container", function factoryFor(container, fullName) { var cache = container.factoryCache; - if (cache.has(fullName)) { - return cache.get(fullName); + if (cache[fullName]) { + return cache[fullName]; } var factory = container.resolve(fullName); if (factory === undefined) { return; } @@ -1650,6 +1834,7 @@ define("container/container", if (!factory || typeof factory.extend !== 'function' || (!Ember.MODEL_FACTORY_INJECTIONS && type === 'model')) { // TODO: think about a 'safe' merge style extension // for now just fallback to create time injection + cache[fullName] = factory; return factory; } else { var injections = injectionsFor(container, fullName); @@ -1660,18 +1845,18 @@ define("container/container", var injectedFactory = factory.extend(injections); injectedFactory.reopenClass(factoryInjections); - cache.set(fullName, injectedFactory); + cache[fullName] = injectedFactory; return injectedFactory; } } function injectionsFor(container, fullName) { - var splitName = fullName.split(':'), - type = splitName[0], - injections = []; + var splitName = fullName.split(':'); + var type = splitName[0]; + var injections = []; - injections = injections.concat(container.typeInjections.get(type) || []); + injections = injections.concat(container.typeInjections[type] || []); injections = injections.concat(container.injections[fullName] || []); injections = buildInjections(container, injections); @@ -1682,11 +1867,11 @@ define("container/container", } function factoryInjectionsFor(container, fullName) { - var splitName = fullName.split(':'), - type = splitName[0], - factoryInjections = []; + var splitName = fullName.split(':'); + var type = splitName[0]; + var factoryInjections = []; - factoryInjections = factoryInjections.concat(container.factoryTypeInjections.get(type) || []); + factoryInjections = factoryInjections.concat(container.factoryTypeInjections[type] || []); factoryInjections = factoryInjections.concat(container.factoryInjections[fullName] || []); factoryInjections = buildInjections(container, factoryInjections); @@ -1721,26 +1906,34 @@ define("container/container", } function eachDestroyable(container, callback) { - container.cache.eachLocal(function(key, value) { - if (option(container, key, 'instantiate') === false) { return; } - callback(value); - }); + var cache = container.cache; + var keys = emberKeys(cache); + var key, value; + + for (var i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + value = cache[key]; + + if (option(container, key, 'instantiate') !== false) { + callback(value); + } + } } function resetCache(container) { - container.cache.eachLocal(function(key, value) { - if (option(container, key, 'instantiate') === false) { return; } + eachDestroyable(container, function(value) { value.destroy(); }); - container.cache.dict = {}; + + container.cache.dict = dictionary(null); } function addTypeInjection(rules, type, property, fullName) { - var injections = rules.get(type); + var injections = rules[type]; if (!injections) { injections = []; - rules.set(type, injections); + rules[type] = injections; } injections.push({ @@ -1759,126 +1952,15 @@ define("container/container", function addInjection(rules, factoryName, property, injectionName) { var injections = rules[factoryName] = rules[factoryName] || []; - injections.push({ property: property, fullName: injectionName }); + injections.push({ + property: property, + fullName: injectionName + }); } __exports__["default"] = Container; }); -define("container/inheriting_dict", - ["exports"], - function(__exports__) { - "use strict"; - // A safe and simple inheriting object. - function InheritingDict(parent) { - this.parent = parent; - this.dict = {}; - } - - InheritingDict.prototype = { - - /** - @property parent - @type InheritingDict - @default null - */ - - parent: null, - - /** - Object used to store the current nodes data. - - @property dict - @type Object - @default Object - */ - dict: null, - - /** - Retrieve the value given a key, if the value is present at the current - level use it, otherwise walk up the parent hierarchy and try again. If - no matching key is found, return undefined. - - @method get - @param {String} key - @return {any} - */ - get: function(key) { - var dict = this.dict; - - if (dict.hasOwnProperty(key)) { - return dict[key]; - } - - if (this.parent) { - return this.parent.get(key); - } - }, - - /** - Set the given value for the given key, at the current level. - - @method set - @param {String} key - @param {Any} value - */ - set: function(key, value) { - this.dict[key] = value; - }, - - /** - Delete the given key - - @method remove - @param {String} key - */ - remove: function(key) { - delete this.dict[key]; - }, - - /** - Check for the existence of given a key, if the key is present at the current - level return true, otherwise walk up the parent hierarchy and try again. If - no matching key is found, return false. - - @method has - @param {String} key - @return {Boolean} - */ - has: function(key) { - var dict = this.dict; - - if (dict.hasOwnProperty(key)) { - return true; - } - - if (this.parent) { - return this.parent.has(key); - } - - return false; - }, - - /** - Iterate and invoke a callback for each local key-value pair. - - @method eachLocal - @param {Function} callback - @param {Object} binding - */ - eachLocal: function(callback, binding) { - var dict = this.dict; - - for (var prop in dict) { - if (dict.hasOwnProperty(prop)) { - callback.call(binding, prop, dict[prop]); - } - } - } - }; - - __exports__["default"] = InheritingDict; - }); -define("ember-application", +enifed("ember-application", ["ember-metal/core","ember-runtime/system/lazy_load","ember-application/system/dag","ember-application/system/resolver","ember-application/system/application","ember-application/ext/controller"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__) { "use strict"; @@ -1906,7 +1988,7 @@ define("ember-application", runLoadHooks('Ember.Application', Application); }); -define("ember-application/ext/controller", +enifed("ember-application/ext/controller", ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/error","ember-metal/utils","ember-metal/computed","ember-runtime/mixins/controller","ember-routing/system/controller_for","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; @@ -1927,13 +2009,13 @@ define("ember-application/ext/controller", var controllerFor = __dependency8__["default"]; function verifyNeedsDependencies(controller, container, needs) { - var dependency, i, l, missing = []; + var dependency, i, l; + var missing = []; for (i=0, l=needs.length; i 0) { - Ember.assert(' `' + inspect(this) + ' specifies `needs`, but does ' + - "not have a container. Please ensure this controller was " + - "instantiated with a container.", - this.container || meta(this, false).descs.controllers !== defaultControllersComputedProperty); - + if (this.container) { verifyNeedsDependencies(this, this.container, needs); } @@ -2056,8 +2135,7 @@ define("ember-application/ext/controller", @deprecated Use `needs` instead */ controllerFor: function(controllerName) { - Ember.deprecate("Controller#controllerFor is deprecated, please use Controller#needs instead"); - return controllerFor(get(this, 'container'), controllerName); + return controllerFor(get(this, 'container'), controllerName); }, /** @@ -2084,9 +2162,9 @@ define("ember-application/ext/controller", __exports__["default"] = ControllerMixin; }); -define("ember-application/system/application", - ["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-metal/enumerable_utils","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-views/system/event_dispatcher","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-routing/system/cache","ember-metal/core","ember-handlebars-compiler","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __exports__) { +enifed("ember-application/system/application", + ["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-metal/enumerable_utils","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-handlebars/controls/select","ember-views/system/event_dispatcher","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-routing/system/cache","ember-metal/core","ember-handlebars-compiler","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __dependency28__, __exports__) { "use strict"; /** @module ember @@ -2110,21 +2188,31 @@ define("ember-application/system/application", var EnumerableUtils = __dependency14__["default"]; var ObjectController = __dependency15__["default"]; var ArrayController = __dependency16__["default"]; - var EventDispatcher = __dependency17__["default"]; + var SelectView = __dependency17__["default"]; + var EventDispatcher = __dependency18__["default"]; //import ContainerDebugAdapter from "ember-extension-support/container_debug_adapter"; - var jQuery = __dependency18__["default"]; - var Route = __dependency19__["default"]; - var Router = __dependency20__["default"]; - var HashLocation = __dependency21__["default"]; - var HistoryLocation = __dependency22__["default"]; - var AutoLocation = __dependency23__["default"]; - var NoneLocation = __dependency24__["default"]; - var BucketCache = __dependency25__["default"]; - - var K = __dependency26__.K; - var EmberHandlebars = __dependency27__["default"]; + var jQuery = __dependency19__["default"]; + var Route = __dependency20__["default"]; + var Router = __dependency21__["default"]; + var HashLocation = __dependency22__["default"]; + var HistoryLocation = __dependency23__["default"]; + var AutoLocation = __dependency24__["default"]; + var NoneLocation = __dependency25__["default"]; + var BucketCache = __dependency26__["default"]; + + var K = __dependency27__.K; + var EmberHandlebars = __dependency28__["default"]; var ContainerDebugAdapter; + function props(obj) { + var properties = []; + + for (var key in obj) { + properties.push(key); + } + + return properties; + } /** An instance of `Ember.Application` is the starting point for every Ember @@ -2344,7 +2432,7 @@ define("ember-application/system/application", this.scheduleInitialize(); - Ember.libraries.registerCoreLibrary('Handlebars', EmberHandlebars.VERSION); + Ember.libraries.registerCoreLibrary('Handlebars' + (EmberHandlebars.compile ? '' : '-runtime'), EmberHandlebars.VERSION); Ember.libraries.registerCoreLibrary('jQuery', jQuery().jquery); if ( Ember.LOG_VERSION ) { @@ -2356,13 +2444,10 @@ define("ember-application/system/application", var maxNameLength = Math.max.apply(this, nameLengths); - Ember.debug('-------------------------------'); - Ember.libraries.each(function(name, version) { + Ember.libraries.each(function(name, version) { var spaces = new Array(maxNameLength - name.length + 1).join(" "); - Ember.debug([name, spaces, ' : ', version].join("")); - }); - Ember.debug('-------------------------------'); - } + }); + } }, /** @@ -2465,9 +2550,7 @@ define("ember-application/system/application", @method deferReadiness */ deferReadiness: function() { - Ember.assert("You must call deferReadiness on an instance of Ember.Application", this instanceof Application); - Ember.assert("You cannot defer readiness since the `ready()` hook has already been called.", this._readinessDeferrals > 0); - this._readinessDeferrals++; + this._readinessDeferrals++; }, /** @@ -2479,8 +2562,7 @@ define("ember-application/system/application", @see {Ember.Application#deferReadiness} */ advanceReadiness: function() { - Ember.assert("You must call advanceReadiness on an instance of Ember.Application", this instanceof Application); - this._readinessDeferrals--; + this._readinessDeferrals--; if (this._readinessDeferrals === 0) { run.once(this, this.didBecomeReady); @@ -2614,8 +2696,7 @@ define("ember-application/system/application", @method initialize **/ initialize: function() { - Ember.deprecate('Calling initialize manually is not supported. Please see Ember.Application#advanceReadiness and Ember.Application#deferReadiness'); - }, + }, /** Initialize the application. This happens automatically. @@ -2741,21 +2822,21 @@ define("ember-application/system/application", @method runInitializers */ runInitializers: function() { - var initializers = get(this.constructor, 'initializers'); + var initializersByName = get(this.constructor, 'initializers'); + var initializers = props(initializersByName); var container = this.__container__; var graph = new DAG(); var namespace = this; var name, initializer; - for (name in initializers) { - initializer = initializers[name]; + for (var i = 0; i < initializers.length; i++) { + initializer = initializersByName[initializers[i]]; graph.addEdges(initializer.name, initializer.initialize, initializer.before, initializer.after); } graph.topsort(function (vertex) { var initializer = vertex.value; - Ember.assert("No application initializer named '"+vertex.name+"'", initializer); - initializer(container, namespace); + initializer(container, namespace); }); }, @@ -2857,14 +2938,13 @@ define("ember-application/system/application", @deprecated */ then: function() { - Ember.deprecate('Do not use `.then` on an instance of Ember.Application. Please use the `.ready` hook instead.'); - + this._super.apply(this, arguments); } }); Application.reopenClass({ - initializers: {}, + initializers: create(null), /** Initializer receives an object which has the following attributes: @@ -2997,9 +3077,7 @@ define("ember-application/system/application", }); } - Ember.assert("The initializer '" + initializer.name + "' has already been registered", !this.initializers[initializer.name]); - Ember.assert("An initializer cannot be registered without an initialize function", canInvoke(initializer, 'initialize')); - + this.initializers[initializer.name] = initializer; }, @@ -3032,9 +3110,9 @@ define("ember-application/system/application", var container = new Container(); container.set = set; - container.resolver = resolverFor(namespace); - container.normalize = container.resolver.normalize; - container.describe = container.resolver.describe; + container.resolver = resolverFor(namespace); + container.normalizeFullName = container.resolver.normalize; + container.describe = container.resolver.describe; container.makeToString = container.resolver.makeToString; container.optionsForType('component', { singleton: false }); @@ -3047,6 +3125,9 @@ define("ember-application/system/application", container.register('controller:basic', Controller, { instantiate: false }); container.register('controller:object', ObjectController, { instantiate: false }); container.register('controller:array', ArrayController, { instantiate: false }); + + container.register('view:select', SelectView); + container.register('route:basic', Route, { instantiate: false }); container.register('event_dispatcher:main', EventDispatcher); @@ -3101,8 +3182,7 @@ define("ember-application/system/application", */ function resolverFor(namespace) { if (namespace.get('resolver')) { - Ember.deprecate('Application.resolver is deprecated in favor of Application.Resolver', false); - } + } var ResolverClass = namespace.get('resolver') || namespace.get('Resolver') || DefaultResolver; var resolver = ResolverClass.create({ @@ -3125,8 +3205,7 @@ define("ember-application/system/application", if (resolver.normalize) { return resolver.normalize(fullName); } else { - Ember.deprecate('The Resolver should now provide a \'normalize\' function', false); - return fullName; + return fullName; } }; @@ -3137,7 +3216,7 @@ define("ember-application/system/application", __exports__["default"] = Application; }); -define("ember-application/system/dag", +enifed("ember-application/system/dag", ["ember-metal/error","exports"], function(__dependency1__, __exports__) { "use strict"; @@ -3180,7 +3259,22 @@ define("ember-application/system/dag", */ function DAG() { this.names = []; - this.vertices = {}; + this.vertices = Object.create(null); + } + + /** + * DAG Vertex + * + * @class Vertex + * @constructor + */ + + function Vertex(name) { + this.name = name; + this.incoming = {}; + this.incomingNames = []; + this.hasOutgoing = false; + this.value = null; } /** @@ -3191,13 +3285,13 @@ define("ember-application/system/dag", * @param {String} name The name of the vertex to add */ DAG.prototype.add = function(name) { - if (!name) { return; } - if (this.vertices.hasOwnProperty(name)) { + if (!name) { + throw new Error("Can't add Vertex without name"); + } + if (this.vertices[name] !== undefined) { return this.vertices[name]; } - var vertex = { - name: name, incoming: {}, incomingNames: [], hasOutgoing: false, value: null - }; + var vertex = new Vertex(name); this.vertices[name] = vertex; this.names.push(name); return vertex; @@ -3217,7 +3311,7 @@ define("ember-application/system/dag", /** * Connects the vertices with the given names, adding them to the graph if - * necesary, only if this does not produce is any circular dependency. + * necessary, only if this does not produce is any circular dependency. * * @private * @method addEdge @@ -3228,7 +3322,8 @@ define("ember-application/system/dag", if (!fromName || !toName || fromName === toName) { return; } - var from = this.add(fromName), to = this.add(toName); + var from = this.add(fromName); + var to = this.add(toName); if (to.incoming.hasOwnProperty(fromName)) { return; } @@ -3307,9 +3402,9 @@ define("ember-application/system/dag", __exports__["default"] = DAG; }); -define("ember-application/system/resolver", - ["ember-metal/core","ember-metal/property_get","ember-metal/logger","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/system/namespace","ember-handlebars","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) { +enifed("ember-application/system/resolver", + ["ember-metal/core","ember-metal/property_get","ember-metal/logger","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/system/namespace","ember-handlebars","ember-metal/dictionary","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; /** @module ember @@ -3414,6 +3509,7 @@ define("ember-application/system/resolver", @namespace Ember @extends Ember.Object */ + var dictionary = __dependency8__["default"]; __exports__["default"] = EmberObject.extend({ /** @@ -3424,22 +3520,28 @@ define("ember-application/system/resolver", */ namespace: null, + init: function() { + this._parseNameCache = dictionary(null); + }, normalize: function(fullName) { - var split = fullName.split(':', 2), - type = split[0], - name = split[1]; - - Ember.assert("Tried to normalize a container name without a colon (:) in it. You probably tried to lookup a name that did not contain a type, a colon, and a name. A proper lookup name would be `view:post`.", split.length === 2); + var split = fullName.split(':', 2); + var type = split[0]; + var name = split[1]; + if (type !== 'template') { var result = name; if (result.indexOf('.') > -1) { - result = result.replace(/\.(.)/g, function(m) { return m.charAt(1).toUpperCase(); }); + result = result.replace(/\.(.)/g, function(m) { + return m.charAt(1).toUpperCase(); + }); } if (name.indexOf('_') > -1) { - result = result.replace(/_(.)/g, function(m) { return m.charAt(1).toUpperCase(); }); + result = result.replace(/_(.)/g, function(m) { + return m.charAt(1).toUpperCase(); + }); } return type + ':' + result; @@ -3459,9 +3561,9 @@ define("ember-application/system/resolver", @return {Object} the resolved factory */ resolve: function(fullName) { - var parsedName = this.parseName(fullName), - resolveMethodName = parsedName.resolveMethodName, - resolved; + var parsedName = this.parseName(fullName); + var resolveMethodName = parsedName.resolveMethodName; + var resolved; if (!(parsedName.name && parsedName.type)) { throw new TypeError('Invalid fullName: `' + fullName + '`, must be of the form `type:name` '); @@ -3490,12 +3592,19 @@ define("ember-application/system/resolver", @param {String} fullName the lookup string @method parseName */ + parseName: function(fullName) { - var nameParts = fullName.split(':'), - type = nameParts[0], fullNameWithoutType = nameParts[1], - name = fullNameWithoutType, - namespace = get(this, 'namespace'), - root = namespace; + return this._parseNameCache[fullName] || ( + this._parseNameCache[fullName] = this._parseName(fullName) + ); + }, + + _parseName: function(fullName) { + var nameParts = fullName.split(':'); + var type = nameParts[0], fullNameWithoutType = nameParts[1]; + var name = fullNameWithoutType; + var namespace = get(this, 'namespace'); + var root = namespace; if (type !== 'template' && name.indexOf('/') !== -1) { var parts = name.split('/'); @@ -3503,8 +3612,7 @@ define("ember-application/system/resolver", var namespaceName = capitalize(parts.slice(0, -1).join('.')); root = Namespace.byName(namespaceName); - Ember.assert('You are looking for a ' + name + ' ' + type + ' in the ' + namespaceName + ' namespace, but the namespace could not be found', root); - } + } return { fullName: fullName, @@ -3534,7 +3642,10 @@ define("ember-application/system/resolver", } var description = parsedName.root + '.' + classify(parsedName.name); - if (parsedName.type !== 'model') { description += classify(parsedName.type); } + + if (parsedName.type !== 'model') { + description += classify(parsedName.type); + } return description; }, @@ -3577,6 +3688,7 @@ define("ember-application/system/resolver", return Ember.TEMPLATES[templateName]; } }, + /** Lookup the view using `resolveOther` @@ -3589,6 +3701,7 @@ define("ember-application/system/resolver", this.useRouterNaming(parsedName); return this.resolveOther(parsedName); }, + /** Lookup the controller using `resolveOther` @@ -3677,198 +3790,7 @@ define("ember-application/system/resolver", } }); }); -define("ember-debug", - ["ember-metal/core","ember-metal/error","ember-metal/logger"], - function(__dependency1__, __dependency2__, __dependency3__) { - "use strict"; - /*global __fail__*/ - - var Ember = __dependency1__["default"]; - var EmberError = __dependency2__["default"]; - var Logger = __dependency3__["default"]; - - /** - Ember Debug - - @module ember - @submodule ember-debug - */ - - /** - @class Ember - */ - - /** - Define an assertion that will throw an exception if the condition is not - met. Ember build tools will remove any calls to `Ember.assert()` when - doing a production build. Example: - - ```javascript - // Test for truthiness - Ember.assert('Must pass a valid object', obj); - - // Fail unconditionally - Ember.assert('This code path should never be run'); - ``` - - @method assert - @param {String} desc A description of the assertion. This will become - the text of the Error thrown if the assertion fails. - @param {Boolean} test Must be truthy for the assertion to pass. If - falsy, an exception will be thrown. - */ - Ember.assert = function(desc, test) { - if (!test) { - throw new EmberError("Assertion Failed: " + desc); - } - }; - - - /** - Display a warning with the provided message. Ember build tools will - remove any calls to `Ember.warn()` when doing a production build. - - @method warn - @param {String} message A warning to display. - @param {Boolean} test An optional boolean. If falsy, the warning - will be displayed. - */ - Ember.warn = function(message, test) { - if (!test) { - Logger.warn("WARNING: "+message); - if ('trace' in Logger) Logger.trace(); - } - }; - - /** - Display a debug notice. Ember build tools will remove any calls to - `Ember.debug()` when doing a production build. - - ```javascript - Ember.debug('I\'m a debug notice!'); - ``` - - @method debug - @param {String} message A debug message to display. - */ - Ember.debug = function(message) { - Logger.debug("DEBUG: "+message); - }; - - /** - Display a deprecation warning with the provided message and a stack trace - (Chrome and Firefox only). Ember build tools will remove any calls to - `Ember.deprecate()` when doing a production build. - - @method deprecate - @param {String} message A description of the deprecation. - @param {Boolean} test An optional boolean. If falsy, the deprecation - will be displayed. - */ - Ember.deprecate = function(message, test) { - if (test) { return; } - - if (Ember.ENV.RAISE_ON_DEPRECATION) { throw new EmberError(message); } - - var error; - - // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome - try { __fail__.fail(); } catch (e) { error = e; } - - if (Ember.LOG_STACKTRACE_ON_DEPRECATION && error.stack) { - var stack, stackStr = ''; - if (error['arguments']) { - // Chrome - stack = error.stack.replace(/^\s+at\s+/gm, ''). - replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2'). - replace(/^Object.\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n'); - stack.shift(); - } else { - // Firefox - stack = error.stack.replace(/(?:\n@:0)?\s+$/m, ''). - replace(/^\(/gm, '{anonymous}(').split('\n'); - } - - stackStr = "\n " + stack.slice(2).join("\n "); - message = message + stackStr; - } - - Logger.warn("DEPRECATION: "+message); - }; - - - - /** - Alias an old, deprecated method with its new counterpart. - - Display a deprecation warning with the provided message and a stack trace - (Chrome and Firefox only) when the assigned method is called. - - Ember build tools will not remove calls to `Ember.deprecateFunc()`, though - no warnings will be shown in production. - - ```javascript - Ember.oldMethod = Ember.deprecateFunc('Please use the new, updated method', Ember.newMethod); - ``` - - @method deprecateFunc - @param {String} message A description of the deprecation. - @param {Function} func The new function called to replace its deprecated counterpart. - @return {Function} a new function that wrapped the original function with a deprecation warning - */ - Ember.deprecateFunc = function(message, func) { - return function() { - Ember.deprecate(message); - return func.apply(this, arguments); - }; - }; - - - /** - Run a function meant for debugging. Ember build tools will remove any calls to - `Ember.runInDebug()` when doing a production build. - - ```javascript - Ember.runInDebug(function() { - Ember.Handlebars.EachView.reopen({ - didInsertElement: function() { - console.log('I\'m happy'); - } - }); - }); - ``` - - @method runInDebug - @param {Function} func The function to be executed. - @since 1.5.0 - */ - Ember.runInDebug = function(func) { - func(); - }; - - // Inform the developer about the Ember Inspector if not installed. - if (!Ember.testing) { - var isFirefox = typeof InstallTrigger !== 'undefined'; - var isChrome = !!window.chrome && !window.opera; - - if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) { - window.addEventListener("load", function() { - if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) { - var downloadURL; - - if(isChrome) { - downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi'; - } else if(isFirefox) { - downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/'; - } - - Ember.debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL); - } - }, false); - } - } - }); -define("ember-extension-support", +enifed("ember-extension-support", ["ember-metal/core","ember-extension-support/data_adapter","ember-extension-support/container_debug_adapter"], function(__dependency1__, __dependency2__, __dependency3__) { "use strict"; @@ -3887,7 +3809,7 @@ define("ember-extension-support", Ember.DataAdapter = DataAdapter; Ember.ContainerDebugAdapter = ContainerDebugAdapter; }); -define("ember-extension-support/container_debug_adapter", +enifed("ember-extension-support/container_debug_adapter", ["ember-metal/core","ember-runtime/system/native_array","ember-metal/utils","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) { "use strict"; @@ -3964,7 +3886,7 @@ define("ember-extension-support/container_debug_adapter", classes in the resolver for a given type. @method canCatalogEntriesByType - @param {string} type The type. e.g. "model", "controller", "route" + @param {String} type The type. e.g. "model", "controller", "route" @return {boolean} whether a list is available for this type. */ canCatalogEntriesByType: function(type) { @@ -3976,7 +3898,7 @@ define("ember-extension-support/container_debug_adapter", Returns the available classes a given type. @method catalogEntriesByType - @param {string} type The type. e.g. "model", "controller", "route" + @param {String} type The type. e.g. "model", "controller", "route" @return {Array} An array of strings. */ catalogEntriesByType: function(type) { @@ -4000,7 +3922,7 @@ define("ember-extension-support/container_debug_adapter", } }); }); -define("ember-extension-support/data_adapter", +enifed("ember-extension-support/data_adapter", ["ember-metal/core","ember-metal/property_get","ember-metal/run_loop","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","ember-runtime/system/native_array","ember-application/system/application","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; @@ -4138,8 +4060,10 @@ define("ember-extension-support/data_adapter", @return {Function} Method to call to remove all observers */ watchModelTypes: function(typesAdded, typesUpdated) { - var modelTypes = this.getModelTypes(), - self = this, typesToSend, releaseMethods = emberA(); + var modelTypes = this.getModelTypes(); + var self = this; + var releaseMethods = emberA(); + var typesToSend; typesToSend = modelTypes.map(function(type) { var klass = type.klass; @@ -4280,7 +4204,8 @@ define("ember-extension-support/data_adapter", */ observeModelType: function(type, typesUpdated) { - var self = this, records = this.getRecords(type); + var self = this; + var records = this.getRecords(type); var onChange = function() { typesUpdated([self.wrapModelType(type)]); @@ -4320,8 +4245,9 @@ define("ember-extension-support/data_adapter", release: {Function} The function to remove observers */ wrapModelType: function(type, name) { - var release, records = this.getRecords(type), - typeToSend, self = this; + var records = this.getRecords(type); + var self = this; + var release, typeToSend; typeToSend = { name: name || type.toString(), @@ -4343,8 +4269,9 @@ define("ember-extension-support/data_adapter", @return {Array} Array of model types */ getModelTypes: function() { - var types, self = this, - containerDebugAdapter = this.get('containerDebugAdapter'); + var self = this; + var containerDebugAdapter = this.get('containerDebugAdapter'); + var types; if (containerDebugAdapter.canCatalogEntriesByType('model')) { types = containerDebugAdapter.catalogEntriesByType('model'); @@ -4375,9 +4302,9 @@ define("ember-extension-support/data_adapter", @return {Array} Array of model type strings */ _getObjectsOnNamespaces: function() { - var namespaces = emberA(Namespace.NAMESPACES), - types = emberA(), - self = this; + var namespaces = emberA(Namespace.NAMESPACES); + var types = emberA(); + var self = this; namespaces.forEach(function(namespace) { for (var key in namespace) { @@ -4420,7 +4347,9 @@ define("ember-extension-support/data_adapter", searchKeywords: {Array} */ wrapRecord: function(record) { - var recordToSend = { object: record }, columnValues = {}, self = this; + var recordToSend = { object: record }; + var columnValues = {}; + var self = this; recordToSend.columnValues = this.getRecordColumnValues(record); recordToSend.searchKeywords = this.getRecordKeywords(record); @@ -4493,17 +4422,21 @@ define("ember-extension-support/data_adapter", } }); }); -define("ember-extension-support/initializers", +enifed("ember-extension-support/initializers", [], function() { "use strict"; }); -define("ember-handlebars-compiler", +enifed("ember-handlebars-compiler", ["ember-metal/core","exports"], function(__dependency1__, __exports__) { - "use strict"; - /* global Handlebars:true */ + /* global Handlebars:true */ + + // Remove "use strict"; from transpiled module (in browser builds only) until + // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed + // + // REMOVE_USE_STRICT: true /** @module ember @@ -4528,19 +4461,12 @@ define("ember-handlebars-compiler", // ES6Todo: when ember-debug is es6'ed import this. // var emberAssert = Ember.assert; var Handlebars = (Ember.imports && Ember.imports.Handlebars) || (this && this.Handlebars); - if (!Handlebars && typeof require === 'function') { - Handlebars = require('handlebars'); + if (!Handlebars && typeof eriuqer === 'function') { + Handlebars = eriuqer('handlebars'); } - Ember.assert("Ember Handlebars requires Handlebars version 1.0 or 1.1. Include " + - "a SCRIPT tag in the HTML HEAD linking to the Handlebars file " + - "before you link to Ember.", Handlebars); - - Ember.assert("Ember Handlebars requires Handlebars version 1.0 or 1.1, " + - "COMPILER_REVISION expected: 4, got: " + Handlebars.COMPILER_REVISION + - " - Please note: Builds of master may have other COMPILER_REVISION values.", - Handlebars.COMPILER_REVISION === 4); - + + /** Prepares the Handlebars templating library for use inside Ember's view system. @@ -4598,7 +4524,7 @@ define("ember-handlebars-compiler", Which is functionally equivalent to: ```handlebars - {{view App.CalendarView}} + {{view 'calendar'}} ``` Options in the helper will be passed to the view in exactly the same @@ -4614,8 +4540,7 @@ define("ember-handlebars-compiler", if (!View) { View = requireModule('ember-views/views/view')['default']; } // ES6TODO: stupid circular dep if (!Component) { Component = requireModule('ember-views/views/component')['default']; } // ES6TODO: stupid circular dep - Ember.assert("You tried to register a component named '" + name + "', but component names must include a '-'", !Component.detect(value) || name.match(/-/)); - + if (View.detect(value)) { EmberHandlebars.registerHelper(name, EmberHandlebars.makeViewHelper(value)); } else { @@ -4637,8 +4562,7 @@ define("ember-handlebars-compiler", */ EmberHandlebars.makeViewHelper = function(ViewClass) { return function(options) { - Ember.assert("You can only pass attributes (such as name=value) not bare values to a helper for a View found in '" + ViewClass.toString() + "'", arguments.length < 2); - return EmberHandlebars.helpers.view.call(this, ViewClass, options); + return EmberHandlebars.helpers.view.call(this, ViewClass, options); }; }; @@ -4711,14 +4635,14 @@ define("ember-handlebars-compiler", // This can go away once the following is closed: // https://github.com/wycats/handlebars.js/issues/634 - var DOT_LOOKUP_REGEX = /helpers\.(.*?)\)/, - BRACKET_STRING_LOOKUP_REGEX = /helpers\['(.*?)'/, - INVOCATION_SPLITTING_REGEX = /(.*blockHelperMissing\.call\(.*)(stack[0-9]+)(,.*)/; + var DOT_LOOKUP_REGEX = /helpers\.(.*?)\)/; + var BRACKET_STRING_LOOKUP_REGEX = /helpers\['(.*?)'/; + var INVOCATION_SPLITTING_REGEX = /(.*blockHelperMissing\.call\(.*)(stack[0-9]+)(,.*)/; EmberHandlebars.JavaScriptCompiler.stringifyLastBlockHelperMissingInvocation = function(source) { - var helperInvocation = source[source.length - 1], - helperName = (DOT_LOOKUP_REGEX.exec(helperInvocation) || BRACKET_STRING_LOOKUP_REGEX.exec(helperInvocation))[1], - matches = INVOCATION_SPLITTING_REGEX.exec(helperInvocation); + var helperInvocation = source[source.length - 1]; + var helperName = (DOT_LOOKUP_REGEX.exec(helperInvocation) || BRACKET_STRING_LOOKUP_REGEX.exec(helperInvocation))[1]; + var matches = INVOCATION_SPLITTING_REGEX.exec(helperInvocation); source[source.length - 1] = matches[1] + "'" + helperName + "'" + matches[3]; }; @@ -4771,12 +4695,12 @@ define("ember-handlebars-compiler", @method precompile @for Ember.Handlebars @static - @param {String} string The template to precompile + @param {String|Object} value The template to precompile or an Handlebars AST @param {Boolean} asObject optional parameter, defaulting to true, of whether or not the compiled template should be returned as an Object or a String */ - EmberHandlebars.precompile = function(string, asObject) { - var ast = Handlebars.parse(string); + EmberHandlebars.precompile = function(value, asObject) { + var ast = Handlebars.parse(value); var options = { knownHelpers: { @@ -4825,7 +4749,7 @@ define("ember-handlebars-compiler", __exports__["default"] = EmberHandlebars; }); -define("ember-handlebars", +enifed("ember-handlebars", ["ember-handlebars-compiler","ember-metal/core","ember-runtime/system/lazy_load","ember-handlebars/loader","ember-handlebars/ext","ember-handlebars/string","ember-handlebars/helpers/shared","ember-handlebars/helpers/binding","ember-handlebars/helpers/collection","ember-handlebars/helpers/view","ember-handlebars/helpers/unbound","ember-handlebars/helpers/debug","ember-handlebars/helpers/each","ember-handlebars/helpers/template","ember-handlebars/helpers/partial","ember-handlebars/helpers/yield","ember-handlebars/helpers/loc","ember-handlebars/controls/checkbox","ember-handlebars/controls/select","ember-handlebars/controls/text_area","ember-handlebars/controls/text_field","ember-handlebars/controls/text_support","ember-handlebars/controls","ember-handlebars/component_lookup","ember-handlebars/views/handlebars_bound_view","ember-handlebars/views/metamorph_view","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __exports__) { "use strict"; @@ -4976,7 +4900,7 @@ define("ember-handlebars", __exports__["default"] = EmberHandlebars; }); -define("ember-handlebars/component_lookup", +enifed("ember-handlebars/component_lookup", ["ember-runtime/system/object","exports"], function(__dependency1__, __exports__) { "use strict"; @@ -4987,9 +4911,9 @@ define("ember-handlebars/component_lookup", container = container || this.container; - var fullName = 'component:' + name, - templateFullName = 'template:components/' + name, - templateRegistered = container && container.has(templateFullName); + var fullName = 'component:' + name; + var templateFullName = 'template:components/' + name; + var templateRegistered = container && container.has(templateFullName); if (templateRegistered) { container.injection(fullName, 'layout', templateFullName); @@ -5011,7 +4935,7 @@ define("ember-handlebars/component_lookup", __exports__["default"] = ComponentLookup; }); -define("ember-handlebars/controls", +enifed("ember-handlebars/controls", ["ember-handlebars/controls/checkbox","ember-handlebars/controls/text_field","ember-handlebars/controls/text_area","ember-metal/core","ember-handlebars-compiler","ember-handlebars/ext","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) { "use strict"; @@ -5102,7 +5026,7 @@ define("ember-handlebars/controls", The helper can send multiple actions based on user events. - The action property defines the action which is send when + The action property defines the action which is sent when the user presses the return key. ```handlebars @@ -5118,6 +5042,7 @@ define("ember-handlebars/controls", * `focus-out` * `key-press` + For example, if you desire an action to be sent when the input is blurred, you only need to setup the action name to the event name property. @@ -5215,21 +5140,21 @@ define("ember-handlebars/controls", @param {Hash} options */ function inputHelper(options) { - Ember.assert('You can only pass attributes to the `input` helper, not arguments', arguments.length < 2); - - var hash = options.hash, - types = options.hashTypes, - inputType = _resolveOption(this, options, 'type'), - onEvent = hash.on; - - delete hash.type; - delete hash.on; + + var hash = options.hash; + var types = options.hashTypes; + var inputType = _resolveOption(this, options, 'type'); + var onEvent = hash.on; if (inputType === 'checkbox') { - Ember.assert("{{input type='checkbox'}} does not support setting `value=someBooleanValue`; you must use `checked=someBooleanValue` instead.", options.hashTypes.value !== 'ID'); + delete hash.type; + delete types.type; + + return helpers.view.call(this, Checkbox, options); } else { - if (inputType) { hash.type = inputType; } + delete hash.on; + hash.onEvent = onEvent || 'enter'; return helpers.view.call(this, TextField, options); } @@ -5398,7 +5323,7 @@ define("ember-handlebars/controls", Internally, `{{textarea}}` creates an instance of `Ember.TextArea`, passing arguments from the helper to `Ember.TextArea`'s `create` method. You can extend the capabilities of text areas in your application by reopening this - class. For example, if you are building a Bootstrap project where `data-*` + class. For example, if you are building a Bootstrap project where `data-*` attributes are used, you can globally add support for a `data-*` attribute on all `{{textarea}}`s' in your app by reopening `Ember.TextArea` or `Ember.TextSupport` and adding it to the `attributeBindings` concatenated @@ -5421,17 +5346,16 @@ define("ember-handlebars/controls", @param {Hash} options */ function textareaHelper(options) { - Ember.assert('You can only pass attributes to the `textarea` helper, not arguments', arguments.length < 2); - - var hash = options.hash, - types = options.hashTypes; + + var hash = options.hash; + var types = options.hashTypes; return helpers.view.call(this, TextArea, options); } __exports__.textareaHelper = textareaHelper; }); -define("ember-handlebars/controls/checkbox", +enifed("ember-handlebars/controls/checkbox", ["ember-metal/property_get","ember-metal/property_set","ember-views/views/view","exports"], function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; @@ -5507,7 +5431,7 @@ define("ember-handlebars/controls/checkbox", } }); }); -define("ember-handlebars/controls/select", +enifed("ember-handlebars/controls/select", ["ember-handlebars-compiler","ember-metal/enumerable_utils","ember-metal/property_get","ember-metal/property_set","ember-views/views/view","ember-views/views/collection_view","ember-metal/utils","ember-metal/is_none","ember-metal/computed","ember-runtime/system/native_array","ember-metal/mixin","ember-metal/properties","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) { "use strict"; @@ -5555,8 +5479,8 @@ define("ember-handlebars/controls/select", }, selected: computed(function() { - var content = get(this, 'content'), - selection = get(this, 'parentView.selection'); + var content = get(this, 'content'); + var selection = get(this, 'parentView.selection'); if (get(this, 'parentView.multiple')) { return selection && indexOf(selection, content.valueOf()) > -1; } else { @@ -5626,7 +5550,7 @@ define("ember-handlebars/controls/select", ``` ```handlebars - {{view Ember.Select content=names}} + {{view "select" content=names}} ``` Would result in the following HTML: @@ -5649,10 +5573,7 @@ define("ember-handlebars/controls/select", ``` ```handlebars - {{view Ember.Select - content=names - value=selectedName - }} + {{view "select" content=names value=selectedName}} ``` Would result in the following HTML with the `'); - canSet = el.options.length === 1; - } + view.buffer = null; + if (element && element.nodeType === 1) { + // We have hooks, we shouldn't make element observable + // consider just doing view.element = element + set(view, 'element', element); + } + return element; + }; - innerHTMLTags[tagName] = canSet; + EmberRenderer.prototype.destroyView = function destroyView(view) { + view.removedFromDOM = true; + view.destroy(); + }; - return canSet; + EmberRenderer.prototype.childViews = function childViews(view) { + return view._childViews; }; - function setInnerHTML(element, html) { - var tagName = element.tagName; + Renderer.prototype.willCreateElement = function (view) { + if (subscribers.length && view.instrumentDetails) { + view._instrumentEnd = _instrumentStart('render.'+view.instrumentName, function viewInstrumentDetails() { + var details = {}; + view.instrumentDetails(details); + return details; + }); + } + if (view._transitionTo) { + view._transitionTo('inBuffer'); + } + }; // inBuffer + Renderer.prototype.didCreateElement = function (view) { + if (view._transitionTo) { + view._transitionTo('hasElement'); + } + if (view._instrumentEnd) { + view._instrumentEnd(); + } + }; // hasElement + Renderer.prototype.willInsertElement = function (view) { + if (view.trigger) { view.trigger('willInsertElement'); } + }; // will place into DOM + Renderer.prototype.didInsertElement = function (view) { + if (view._transitionTo) { + view._transitionTo('inDOM'); + } + if (view.trigger) { view.trigger('didInsertElement'); } + }; // inDOM // placed into DOM - if (canSetInnerHTML(tagName)) { - setInnerHTMLWithoutFix(element, html); - } else { - // Firefox versions < 11 do not have support for element.outerHTML. - var outerHTML = element.outerHTML || new XMLSerializer().serializeToString(element); - Ember.assert("Can't set innerHTML on "+element.tagName+" in this browser", outerHTML); + Renderer.prototype.willRemoveElement = function (view) {}; - var startTag = outerHTML.match(new RegExp("<"+tagName+"([^>]*)>", 'i'))[0], - endTag = ''; + Renderer.prototype.willDestroyElement = function (view) { + if (view.trigger) { view.trigger('willDestroyElement'); } + if (view.trigger) { view.trigger('willClearRender'); } + }; - var wrapper = document.createElement('div'); - setInnerHTMLWithoutFix(wrapper, startTag + html + endTag); - element = wrapper.firstChild; - while (element.tagName !== tagName) { - element = element.nextSibling; - } + Renderer.prototype.didDestroyElement = function (view) { + set(view, 'element', null); + if (view._transitionTo) { + view._transitionTo('preRender'); } + }; // element destroyed so view.destroy shouldn't try to remove it removedFromDOM - return element; - } + __exports__["default"] = EmberRenderer; + }); +enifed("ember-views/system/utils", + ["exports"], + function(__exports__) { + "use strict"; + /** + @module ember + @submodule ember-views + */ - __exports__.setInnerHTML = setInnerHTML;function isSimpleClick(event) { - var modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey, - secondaryClick = event.which > 1; // IE9 may return undefined + function isSimpleClick(event) { + var modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey; + var secondaryClick = event.which > 1; // IE9 may return undefined return !modifier && !secondaryClick; } __exports__.isSimpleClick = isSimpleClick; }); -define("ember-views/views/collection_view", - ["ember-metal/core","ember-metal/platform","ember-metal/binding","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-views/views/container_view","ember-views/views/core_view","ember-views/views/view","ember-metal/mixin","ember-runtime/mixins/array","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) { +enifed("ember-views/views/collection_view", + ["ember-metal/core","ember-metal/platform","ember-metal/binding","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-views/views/container_view","ember-views/views/core_view","ember-views/views/view","ember-metal/mixin","ember-handlebars/ext","ember-runtime/mixins/array","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) { "use strict"; /** @@ -37956,7 +37907,8 @@ define("ember-views/views/collection_view", var View = __dependency10__["default"]; var observer = __dependency11__.observer; var beforeObserver = __dependency11__.beforeObserver; - var EmberArray = __dependency12__["default"]; + var handlebarsGetView = __dependency12__.handlebarsGetView; + var EmberArray = __dependency13__["default"]; /** `Ember.CollectionView` is an `Ember.View` descendent responsible for managing @@ -37979,27 +37931,32 @@ define("ember-views/views/collection_view", The view for each item in the collection will have its `content` property set to the item. - ## Specifying itemViewClass + ## Specifying `itemViewClass` By default the view class for each item in the managed collection will be an instance of `Ember.View`. You can supply a different class by setting the `CollectionView`'s `itemViewClass` property. - Given an empty `` and the following code: + Given the following application code: ```javascript - someItemsView = Ember.CollectionView.create({ + var App = Ember.Application.create(); + App.ItemListView = Ember.CollectionView.extend({ classNames: ['a-collection'], content: ['A','B','C'], itemViewClass: Ember.View.extend({ template: Ember.Handlebars.compile("the letter: {{view.content}}") }) }); + ``` + + And a simple application template: - someItemsView.appendTo('body'); + ```handlebars + {{view 'item-list'}} ``` - Will result in the following HTML structure + The following HTML will result: ```html
@@ -38015,21 +37972,26 @@ define("ember-views/views/collection_view", "ul", "ol", "table", "thead", "tbody", "tfoot", "tr", or "select" will result in the item views receiving an appropriately matched `tagName` property. - Given an empty `` and the following code: + Given the following application code: ```javascript - anUnorderedListView = Ember.CollectionView.create({ + var App = Ember.Application.create(); + App.UnorderedListView = Ember.CollectionView.create({ tagName: 'ul', content: ['A','B','C'], itemViewClass: Ember.View.extend({ template: Ember.Handlebars.compile("the letter: {{view.content}}") }) }); + ``` - anUnorderedListView.appendTo('body'); + And a simple application template: + + ```handlebars + {{view 'unordered-list-view'}} ``` - Will result in the following HTML structure + The following HTML will result: ```html
    @@ -38040,7 +38002,7 @@ define("ember-views/views/collection_view", ``` Additional `tagName` pairs can be provided by adding to - `Ember.CollectionView.CONTAINER_MAP ` + `Ember.CollectionView.CONTAINER_MAP`. For example: ```javascript Ember.CollectionView.CONTAINER_MAP['article'] = 'section' @@ -38053,7 +38015,7 @@ define("ember-views/views/collection_view", `createChildView` method can be overidden: ```javascript - CustomCollectionView = Ember.CollectionView.extend({ + App.CustomCollectionView = Ember.CollectionView.extend({ createChildView: function(viewClass, attrs) { if (attrs.content.kind == 'album') { viewClass = App.AlbumView; @@ -38073,18 +38035,23 @@ define("ember-views/views/collection_view", will be the `CollectionView`s only child. ```javascript - aListWithNothing = Ember.CollectionView.create({ - classNames: ['nothing'] + var App = Ember.Application.create(); + App.ListWithNothing = Ember.CollectionView.create({ + classNames: ['nothing'], content: null, emptyView: Ember.View.extend({ template: Ember.Handlebars.compile("The collection is empty") }) }); + ``` + + And a simple application template: - aListWithNothing.appendTo('body'); + ```handlebars + {{view 'list-with-nothing'}} ``` - Will result in the following HTML structure + The following HTML will result: ```html
    @@ -38197,8 +38164,7 @@ define("ember-views/views/collection_view", @method _assertArrayLike */ _assertArrayLike: function(content) { - Ember.assert(fmt("an Ember.CollectionView's content must implement Ember.Array. You passed %@", [content]), EmberArray.detect(content)); - }, + }, /** Removes the content and content observers. @@ -38242,18 +38208,8 @@ define("ember-views/views/collection_view", // Loop through child views that correspond with the removed items. // Note that we loop from the end of the array to the beginning because // we are mutating it as we go. - var childViews = this._childViews, childView, idx, len; - - len = this._childViews.length; - - var removingAll = removedCount === len; - - if (removingAll) { - this.currentState.empty(this); - this.invokeRecursively(function(view) { - view.removedFromDOM = true; - }, false); - } + var childViews = this._childViews; + var childView, idx; for (idx = start + removedCount - 1; idx >= start; idx--) { childView = childViews[idx]; @@ -38276,21 +38232,14 @@ define("ember-views/views/collection_view", @param {Number} added number of object added to content */ arrayDidChange: function(content, start, removed, added) { - var addedViews = [], view, item, idx, len, itemViewClass, - emptyView; + var addedViews = []; + var view, item, idx, len, itemViewClass, emptyView; len = content ? get(content, 'length') : 0; if (len) { itemViewClass = get(this, 'itemViewClass'); - - if ('string' === typeof itemViewClass && isGlobalPath(itemViewClass)) { - itemViewClass = get(itemViewClass) || itemViewClass; - } - - Ember.assert(fmt("itemViewClass must be a subclass of Ember.View, not %@", - [itemViewClass]), - 'string' === typeof itemViewClass || View.detect(itemViewClass)); + itemViewClass = handlebarsGetView(content, itemViewClass, this.container); for (idx = start; idx < start+added; idx++) { item = content.objectAt(idx); @@ -38375,7 +38324,7 @@ define("ember-views/views/collection_view", __exports__["default"] = CollectionView; }); -define("ember-views/views/component", +enifed("ember-views/views/component", ["ember-metal/core","ember-views/mixins/component_template_deprecation","ember-runtime/mixins/target_action_support","ember-views/views/view","ember-metal/property_get","ember-metal/property_set","ember-metal/is_none","ember-metal/computed","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; @@ -38525,11 +38474,10 @@ define("ember-views/views/component", template: computed(function(key, value) { if (value !== undefined) { return value; } - var templateName = get(this, 'templateName'), - template = this.templateForName(templateName, 'template'); - - Ember.assert("You specified the templateName " + templateName + " for " + this + ", but it did not exist.", !templateName || template); + var templateName = get(this, 'templateName'); + var template = this.templateForName(templateName, 'template'); + return template || get(this, 'defaultTemplate'); }).property('templateName'), @@ -38551,13 +38499,12 @@ define("ember-views/views/component", }, _yield: function(context, options) { - var view = options.data.view, - parentView = this._parentView, - template = get(this, 'template'); + var view = options.data.view; + var parentView = this._parentView; + var template = get(this, 'template'); if (template) { - Ember.assert("A Component must have a parent view in order to yield.", parentView); - + view.appendChild(View, { isVirtual: true, tagName: '', @@ -38664,22 +38611,15 @@ define("ember-views/views/component", @param [context] {*} a context to send with the action */ sendAction: function(action) { - var actionName, - contexts = a_slice.call(arguments, 1); + var actionName; + var contexts = a_slice.call(arguments, 1); // Send the default action if (action === undefined) { actionName = get(this, 'action'); - Ember.assert("The default action was triggered on the component " + this.toString() + - ", but the action name (" + actionName + ") was not a string.", - isNone(actionName) || typeof actionName === 'string'); - } else { + } else { actionName = get(this, action); - Ember.assert("The " + action + " action was triggered on the component " + - this.toString() + ", but the action name (" + actionName + - ") was not a string.", - isNone(actionName) || typeof actionName === 'string'); - } + } // If no action name for that action could be found, just abort. if (actionName === undefined) { return; } @@ -38693,9 +38633,9 @@ define("ember-views/views/component", __exports__["default"] = Component; }); -define("ember-views/views/container_view", - ["ember-metal/core","ember-metal/merge","ember-runtime/mixins/mutable_array","ember-metal/property_get","ember-metal/property_set","ember-views/views/view","ember-views/views/view_collection","ember-views/views/states","ember-metal/error","ember-metal/enumerable_utils","ember-metal/computed","ember-metal/run_loop","ember-metal/properties","ember-views/system/render_buffer","ember-metal/mixin","ember-runtime/system/native_array","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __exports__) { +enifed("ember-views/views/container_view", + ["ember-metal/core","ember-metal/merge","ember-runtime/mixins/mutable_array","ember-metal/property_get","ember-metal/property_set","ember-views/views/view","ember-views/views/states","ember-metal/error","ember-metal/enumerable_utils","ember-metal/computed","ember-metal/run_loop","ember-metal/properties","ember-views/system/render_buffer","ember-metal/mixin","ember-runtime/system/native_array","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; // Ember.assert, Ember.K @@ -38706,22 +38646,21 @@ define("ember-views/views/container_view", var set = __dependency5__.set; var View = __dependency6__["default"]; - var ViewCollection = __dependency7__["default"]; - var cloneStates = __dependency8__.cloneStates; - var EmberViewStates = __dependency8__.states; + var cloneStates = __dependency7__.cloneStates; + var EmberViewStates = __dependency7__.states; - var EmberError = __dependency9__["default"]; + var EmberError = __dependency8__["default"]; - var forEach = __dependency10__.forEach; + var forEach = __dependency9__.forEach; - var computed = __dependency11__.computed; - var run = __dependency12__["default"]; - var defineProperty = __dependency13__.defineProperty; - var renderBuffer = __dependency14__["default"]; - var observer = __dependency15__.observer; - var beforeObserver = __dependency15__.beforeObserver; - var emberA = __dependency16__.A; + var computed = __dependency10__.computed; + var run = __dependency11__["default"]; + var defineProperty = __dependency12__.defineProperty; + var renderBuffer = __dependency13__["default"]; + var observer = __dependency14__.observer; + var beforeObserver = __dependency14__.beforeObserver; + var emberA = __dependency15__.A; /** @module ember @@ -38881,14 +38820,11 @@ define("ember-views/views/container_view", @extends Ember.View */ var ContainerView = View.extend(MutableArray, { + isContainer: true, _states: states, willWatchProperty: function(prop){ - Ember.deprecate( - "ContainerViews should not be observed as arrays. This behavior will change in future implementations of ContainerView.", - !prop.match(/\[]/) && prop.indexOf('@') !== 0 - ); - }, + }, init: function() { this._super(); @@ -38924,8 +38860,7 @@ define("ember-views/views/container_view", replace: function(idx, removedCount, addedViews) { var addedCount = addedViews ? get(addedViews, 'length') : 0; var self = this; - Ember.assert("You can't add a child to a container - the child is already a child of another view", emberA(addedViews).every(function(item) { return !get(item, '_parentView') || get(item, '_parentView') === self; })); - + this.arrayContentWillChange(idx, removedCount, addedCount); this.childViewsWillChange(this._childViews, idx, removedCount); @@ -38959,9 +38894,6 @@ define("ember-views/views/container_view", @param {Ember.RenderBuffer} buffer the buffer to render to */ render: function(buffer) { - this.forEachChildView(function(view) { - view.renderToBuffer(buffer); - }); }, instrumentName: 'container', @@ -39046,8 +38978,7 @@ define("ember-views/views/container_view", _currentViewDidChange: observer('currentView', function() { var currentView = get(this, 'currentView'); if (currentView) { - Ember.assert("You tried to set a current view that already has a parent. Make sure you don't have multiple outlets in the same view.", !get(currentView, '_parentView')); - this.pushObject(currentView); + this.pushObject(currentView); } }), @@ -39080,62 +39011,33 @@ define("ember-views/views/container_view", }, ensureChildrenAreInDOM: function(view) { - var childViews = view._childViews, i, len, childView, previous, buffer, viewCollection = new ViewCollection(); + var childViews = view._childViews; + var renderer = view._renderer; + var i, len, childView; for (i = 0, len = childViews.length; i < len; i++) { childView = childViews[i]; - - if (!buffer) { buffer = renderBuffer(); buffer._hasElement = false; } - - if (childView.renderToBufferIfNeeded(buffer)) { - viewCollection.push(childView); - } else if (viewCollection.length) { - insertViewCollection(view, viewCollection, previous, buffer); - buffer = null; - previous = childView; - viewCollection.clear(); - } else { - previous = childView; + if (!childView._elementCreated) { + renderer.renderTree(childView, view, i); } } - - if (viewCollection.length) { - insertViewCollection(view, viewCollection, previous, buffer); - } } }); - function insertViewCollection(view, viewCollection, previous, buffer) { - viewCollection.triggerRecursively('willInsertElement'); - - if (previous) { - previous.domManager.after(previous, buffer.string()); - } else { - view.domManager.prepend(view, buffer.string()); - } - - viewCollection.forEach(function(v) { - v._transitionTo('inDOM'); - v.propertyDidChange('element'); - v.triggerRecursively('didInsertElement'); - }); - } - - __exports__["default"] = ContainerView; }); -define("ember-views/views/core_view", - ["ember-views/views/states","ember-runtime/system/object","ember-runtime/mixins/evented","ember-runtime/mixins/action_handler","ember-metal/properties","ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/utils","ember-metal/instrumentation","ember-views/system/render_buffer","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) { +enifed("ember-views/views/core_view", + ["ember-views/system/renderer","ember-views/views/states","ember-runtime/system/object","ember-runtime/mixins/evented","ember-runtime/mixins/action_handler","ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/utils","ember-metal/instrumentation","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) { "use strict"; - var cloneStates = __dependency1__.cloneStates; - var states = __dependency1__.states; - var EmberObject = __dependency2__["default"]; - var Evented = __dependency3__["default"]; - var ActionHandler = __dependency4__["default"]; + var Rerender = __dependency1__["default"]; + + var cloneStates = __dependency2__.cloneStates; + var states = __dependency2__.states; + var EmberObject = __dependency3__["default"]; + var Evented = __dependency4__["default"]; + var ActionHandler = __dependency5__["default"]; - var defineProperty = __dependency5__.defineProperty; - var deprecateProperty = __dependency5__.deprecateProperty; var get = __dependency6__.get; var set = __dependency7__.set; var computed = __dependency8__.computed; @@ -39144,9 +39046,6 @@ define("ember-views/views/core_view", var instrument = __dependency10__.instrument; - - var renderBuffer = __dependency11__["default"]; - /** `Ember.CoreView` is an abstract class that exists to give view-like behavior to both Ember's main view class `Ember.View` and other classes like @@ -39164,6 +39063,8 @@ define("ember-views/views/core_view", */ var CoreView = EmberObject.extend(Evented, ActionHandler, { isView: true, + isVirtual: false, + isContainer: false, _states: cloneStates(states), @@ -39171,9 +39072,6 @@ define("ember-views/views/core_view", this._super(); this._transitionTo('preRender'); this._isVisible = get(this, 'isVisible'); - - deprecateProperty(this, 'states', '_states'); - deprecateProperty(this, 'state', '_state'); }, /** @@ -39212,55 +39110,6 @@ define("ember-views/views/core_view", hash.view = this; }, - /** - Invoked by the view system when this view needs to produce an HTML - representation. This method will create a new render buffer, if needed, - then apply any default attributes, such as class names and visibility. - Finally, the `render()` method is invoked, which is responsible for - doing the bulk of the rendering. - - You should not need to override this method; instead, implement the - `template` property, or if you need more control, override the `render` - method. - - @method renderToBuffer - @param {Ember.RenderBuffer} buffer the render buffer. If no buffer is - passed, a default buffer, using the current view's `tagName`, will - be used. - @private - */ - renderToBuffer: function(buffer) { - var name = 'render.' + this.instrumentName, - details = {}; - - this.instrumentDetails(details); - - return instrument(name, details, function instrumentRenderToBuffer() { - return this._renderToBuffer(buffer); - }, this); - }, - - _renderToBuffer: function(_buffer) { - // If this is the top-most view, start a new buffer. Otherwise, - // create a new buffer relative to the original using the - // provided buffer operation (for example, `insertAfter` will - // insert a new buffer after the "parent buffer"). - var tagName = this.tagName; - - if (tagName === null || tagName === undefined) { - tagName = 'div'; - } - - var buffer = this.buffer = _buffer && _buffer.begin(tagName) || renderBuffer(tagName); - this._transitionTo('inBuffer', false); - - this.beforeRender(buffer); - this.render(buffer); - this.afterRender(buffer); - - return buffer; - }, - /** Override the default event firing from `Ember.Evented` to also call methods with the given name. @@ -39283,18 +39132,6 @@ define("ember-views/views/core_view", } }, - deprecatedSendHandles: function(actionName) { - return !!this[actionName]; - }, - - deprecatedSend: function(actionName) { - var args = [].slice.call(arguments, 1); - Ember.assert('' + this + " has the action " + actionName + " but it is not a function", typeof this[actionName] === 'function'); - Ember.deprecate('Action handlers implemented directly on views are deprecated in favor of action handlers on an `actions` object ( action: `' + actionName + '` on ' + this + ')', false); - this[actionName].apply(this, args); - return; - }, - has: function(name) { return typeOf(this[name]) === 'function' || this._super(name); }, @@ -39304,9 +39141,12 @@ define("ember-views/views/core_view", if (!this._super()) { return; } + // destroy the element -- this will avoid each child view destroying // the element over and over again... - if (!this.removedFromDOM) { this.destroyElement(); } + if (!this.removedFromDOM && this._renderer) { + this._renderer.remove(this, true); + } // remove from parent if found. Don't call removeFromParent, // as removeFromParent will try to remove the element from @@ -39319,15 +39159,17 @@ define("ember-views/views/core_view", }, clearRenderedChildren: Ember.K, - triggerRecursively: Ember.K, - invokeRecursively: Ember.K, _transitionTo: Ember.K, destroyElement: Ember.K }); + CoreView.reopenClass({ + renderer: new Rerender() + }); + __exports__["default"] = CoreView; }); -define("ember-views/views/states", +enifed("ember-views/views/states", ["ember-metal/platform","ember-metal/merge","ember-views/views/states/default","ember-views/views/states/pre_render","ember-views/views/states/in_buffer","ember-views/views/states/has_element","ember-views/views/states/in_dom","ember-views/views/states/destroying","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; @@ -39368,7 +39210,7 @@ define("ember-views/views/states", }; __exports__.states = states; }); -define("ember-views/views/states/default", +enifed("ember-views/views/states/default", ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/run_loop","ember-metal/error","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; @@ -39403,23 +39245,16 @@ define("ember-views/views/states/default", }, destroyElement: function(view) { - set(view, 'element', null); - if (view._scheduledInsert) { - run.cancel(view._scheduledInsert); - view._scheduledInsert = null; - } + if (view._renderer) + view._renderer.remove(view, false); return view; }, - renderToBufferIfNeeded: function () { - return false; - }, - rerender: Ember.K, invokeObserver: Ember.K }; }); -define("ember-views/views/states/destroying", +enifed("ember-views/views/states/destroying", ["ember-metal/merge","ember-metal/platform","ember-runtime/system/string","ember-views/views/states/default","ember-metal/error","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; @@ -39446,27 +39281,12 @@ define("ember-views/views/states/destroying", }, destroyElement: function() { throw new EmberError(fmt(destroyingError, ['destroyElement'])); - }, - empty: function() { - throw new EmberError(fmt(destroyingError, ['empty'])); - }, - - setElement: function() { - throw new EmberError(fmt(destroyingError, ["set('element', ...)"])); - }, - - renderToBufferIfNeeded: function() { - return false; - }, - - // Since element insertion is scheduled, don't do anything if - // the view has been destroyed between scheduling and execution - insertElement: Ember.K + } }); __exports__["default"] = destroying; }); -define("ember-views/views/states/has_element", +enifed("ember-views/views/states/has_element", ["ember-views/views/states/default","ember-metal/run_loop","ember-metal/merge","ember-metal/platform","ember-views/system/jquery","ember-metal/error","ember-metal/property_get","ember-metal/property_set","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; @@ -39489,7 +39309,7 @@ define("ember-views/views/states/has_element", merge(hasElement, { $: function(view, sel) { - var elem = get(view, 'element'); + var elem = view.get('concreteView').element; return sel ? jQuery(sel, elem) : jQuery(elem); }, @@ -39500,25 +39320,17 @@ define("ember-views/views/states/has_element", return jQuery("#" + get(view, 'elementId'))[0]; }, - setElement: function(view, value) { - if (value === null) { - view._transitionTo('preRender'); - } else { - throw new EmberError("You cannot set an element to a non-null value when the element is already in the DOM."); - } - - return value; - }, - // once the view has been inserted into the DOM, rerendering is // deferred to allow bindings to synchronize. rerender: function(view) { - view.triggerRecursively('willClearRender'); - - view.clearRenderedChildren(); - - view.domManager.replace(view); - return view; + if (view._root._morph && !view._elementInserted) { + throw new EmberError("Something you did caused a view to re-render after it rendered but before it was inserted into the DOM."); + } + // TODO: should be scheduled with renderer + run.scheduleOnce('render', function () { + if (view.isDestroying) return; + view._renderer.renderTree(view, view._parentView); + }); }, // once the view is already in the DOM, destroying it removes it @@ -39526,27 +39338,10 @@ define("ember-views/views/states/has_element", // preRender state if inDOM. destroyElement: function(view) { - view._notifyWillDestroyElement(); - view.domManager.remove(view); - set(view, 'element', null); - if (view._scheduledInsert) { - run.cancel(view._scheduledInsert); - view._scheduledInsert = null; - } + view._renderer.remove(view, false); return view; }, - empty: function(view) { - var _childViews = view._childViews, len, idx; - if (_childViews) { - len = _childViews.length; - for (idx = 0; idx < len; idx++) { - _childViews[idx]._notifyWillDestroyElement(); - } - } - view.domManager.empty(view); - }, - // Handle events from `Ember.EventDispatcher` handleEvent: function(view, eventName, evt) { if (view.has(eventName)) { @@ -39565,7 +39360,7 @@ define("ember-views/views/states/has_element", __exports__["default"] = hasElement; }); -define("ember-views/views/states/in_buffer", +enifed("ember-views/views/states/in_buffer", ["ember-views/views/states/default","ember-metal/error","ember-metal/core","ember-metal/platform","ember-metal/merge","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; @@ -39604,58 +39399,22 @@ define("ember-views/views/states/in_buffer", // view will render that view and append the resulting // buffer into its buffer. appendChild: function(view, childView, options) { - var buffer = view.buffer, _childViews = view._childViews; + var buffer = view.buffer; + var _childViews = view._childViews; childView = view.createChildView(childView, options); if (!_childViews.length) { _childViews = view._childViews = _childViews.slice(); } _childViews.push(childView); - childView.renderToBuffer(buffer); + if (!childView._morph) { + buffer.pushChildView(childView); + } view.propertyDidChange('childViews'); return childView; }, - // when a view is rendered in a buffer, destroying the - // element will simply destroy the buffer and put the - // state back into the preRender state. - destroyElement: function(view) { - view.clearBuffer(); - var viewCollection = view._notifyWillDestroyElement(); - viewCollection.transitionTo('preRender', false); - - return view; - }, - - empty: function() { - Ember.assert("Emptying a view in the inBuffer state is not allowed and " + - "should not happen under normal circumstances. Most likely " + - "there is a bug in your application. This may be due to " + - "excessive property change notifications."); - }, - - renderToBufferIfNeeded: function (view, buffer) { - return false; - }, - - // It should be impossible for a rendered view to be scheduled for - // insertion. - insertElement: function() { - throw new EmberError("You can't insert an element that has already been rendered"); - }, - - setElement: function(view, value) { - if (value === null) { - view._transitionTo('preRender'); - } else { - view.clearBuffer(); - view._transitionTo('hasElement'); - } - - return value; - }, - invokeObserver: function(target, observer) { observer.call(target); } @@ -39663,7 +39422,7 @@ define("ember-views/views/states/in_buffer", __exports__["default"] = inBuffer; }); -define("ember-views/views/states/in_dom", +enifed("ember-views/views/states/in_dom", ["ember-metal/core","ember-metal/platform","ember-metal/merge","ember-metal/error","ember-views/views/states/has_element","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; @@ -39690,8 +39449,7 @@ define("ember-views/views/states/in_dom", // Register the view for event handling. This hash is used by // Ember.EventDispatcher to dispatch incoming events. if (!view.isVirtual) { - Ember.assert("Attempted to register a view with an id already in use: "+view.elementId, !View.views[view.elementId]); - View.views[view.elementId] = view; + View.views[view.elementId] = view; } view.addBeforeObserver('elementId', function() { @@ -39703,21 +39461,15 @@ define("ember-views/views/states/in_dom", if (!View) { View = requireModule('ember-views/views/view')["default"]; } // ES6TODO: this sucks. Have to avoid cycles... if (!this.isVirtual) delete View.views[view.elementId]; - }, - - insertElement: function(view, fn) { - throw new EmberError("You can't insert an element into the DOM that has already been inserted"); } }); __exports__["default"] = inDOM; }); -define("ember-views/views/states/pre_render", +enifed("ember-views/views/states/pre_render", ["ember-views/views/states/default","ember-metal/platform","ember-metal/merge","ember-views/system/jquery","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { "use strict"; - /* global Node */ - var _default = __dependency1__["default"]; var create = __dependency2__.create; var merge = __dependency3__["default"]; @@ -39729,44 +39481,10 @@ define("ember-views/views/states/pre_render", */ var preRender = create(_default); - merge(preRender, { - // a view leaves the preRender state once its element has been - // created (createElement). - insertElement: function(view, fn) { - view.createElement(); - var viewCollection = view.viewHierarchyCollection(); - - viewCollection.trigger('willInsertElement'); - - fn.call(view); - - // We transition to `inDOM` if the element exists in the DOM - var element = view.get('element'); - if (jQuery.contains(document.body, element)) { - viewCollection.transitionTo('inDOM', false); - viewCollection.trigger('didInsertElement'); - } - }, - - renderToBufferIfNeeded: function(view, buffer) { - view.renderToBuffer(buffer); - return true; - }, - - empty: Ember.K, - - setElement: function(view, value) { - if (value !== null) { - view._transitionTo('hasElement'); - } - return value; - } - }); - __exports__["default"] = preRender; }); -define("ember-views/views/view", - ["ember-metal/core","ember-runtime/mixins/evented","ember-runtime/system/object","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/set_properties","ember-metal/run_loop","ember-metal/observer","ember-metal/properties","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/is_none","ember-runtime/system/native_array","ember-runtime/system/string","ember-metal/enumerable_utils","ember-runtime/copy","ember-metal/binding","ember-metal/property_events","ember-views/system/jquery","ember-views/system/ext","ember-views/views/core_view","ember-views/views/view_collection","exports"], +enifed("ember-views/views/view", + ["ember-metal/core","ember-runtime/mixins/evented","ember-runtime/system/object","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/set_properties","ember-metal/run_loop","ember-metal/observer","ember-metal/properties","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/is_none","ember-metal/deprecate_property","ember-runtime/system/native_array","ember-runtime/system/string","ember-metal/enumerable_utils","ember-runtime/copy","ember-metal/binding","ember-metal/property_events","ember-views/system/jquery","ember-views/system/ext","ember-views/views/core_view","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __exports__) { "use strict"; // Ember.assert, Ember.deprecate, Ember.warn, Ember.TEMPLATES, @@ -39796,46 +39514,36 @@ define("ember-views/views/view", var isArray = __dependency11__.isArray; var isNone = __dependency14__.isNone; var Mixin = __dependency13__.Mixin; - var emberA = __dependency15__.A; + var deprecateProperty = __dependency15__.deprecateProperty; + var emberA = __dependency16__.A; - var dasherize = __dependency16__.dasherize; + var dasherize = __dependency17__.dasherize; // ES6TODO: functions on EnumerableUtils should get their own export - var forEach = __dependency17__.forEach; - var addObject = __dependency17__.addObject; - var removeObject = __dependency17__.removeObject; + var forEach = __dependency18__.forEach; + var addObject = __dependency18__.addObject; + var removeObject = __dependency18__.removeObject; var beforeObserver = __dependency13__.beforeObserver; - var copy = __dependency18__["default"]; - var isGlobalPath = __dependency19__.isGlobalPath; + var copy = __dependency19__["default"]; + var isGlobalPath = __dependency20__.isGlobalPath; - var propertyWillChange = __dependency20__.propertyWillChange; - var propertyDidChange = __dependency20__.propertyDidChange; + var propertyWillChange = __dependency21__.propertyWillChange; + var propertyDidChange = __dependency21__.propertyDidChange; - var jQuery = __dependency21__["default"]; + var jQuery = __dependency22__["default"]; // for the side effect of extending Ember.run.queues - var CoreView = __dependency23__["default"]; - var ViewCollection = __dependency24__["default"]; + var CoreView = __dependency24__["default"]; /** @module ember @submodule ember-views */ - - var ContainerView; - - function nullViewsBuffer(view) { - view.buffer = null; - - } - - function clearCachedElement(view) { - meta(view).cache.element = undefined; - } - var childViewsProperty = computed(function() { - var childViews = this._childViews, ret = emberA(), view = this; + var childViews = this._childViews; + var ret = emberA(); + var view = this; forEach(childViews, function(view) { var currentChildViews; @@ -39849,20 +39557,13 @@ define("ember-views/views/view", }); ret.replace = function (idx, removedCount, addedViews) { - if (!ContainerView) { ContainerView = requireModule('ember-views/views/container_view')['default']; } // ES6TODO: stupid circular dep - - if (view instanceof ContainerView) { - Ember.deprecate("Manipulating an Ember.ContainerView through its childViews property is deprecated. Please use the ContainerView instance itself as an Ember.MutableArray."); - return view.replace(idx, removedCount, addedViews); - } throw new EmberError("childViews is immutable"); }; return ret; }); - Ember.warn("The VIEW_PRESERVES_CONTEXT flag has been removed and the functionality can no longer be disabled.", Ember.ENV.VIEW_PRESERVES_CONTEXT !== false); - + /** Global hash of shared templates. This will automatically be populated by the build tools so that you can store your Handlebars templates in @@ -40373,8 +40074,9 @@ define("ember-views/views/view", on the descendent. ```javascript - OuterView = Ember.View.extend({ - template: Ember.Handlebars.compile("outer {{#view InnerView}}inner{{/view}} outer"), + var App = Ember.Application.create(); + App.OuterView = Ember.View.extend({ + template: Ember.Handlebars.compile("outer {{#view 'inner'}}inner{{/view}} outer"), eventManager: Ember.Object.create({ mouseEnter: function(event, view) { // view might be instance of either @@ -40384,7 +40086,7 @@ define("ember-views/views/view", }) }); - InnerView = Ember.View.extend({ + App.InnerView = Ember.View.extend({ click: function(event) { // will be called if rendered inside // an OuterView because OuterView's @@ -40528,11 +40230,10 @@ define("ember-views/views/view", template: computed('templateName', function(key, value) { if (value !== undefined) { return value; } - var templateName = get(this, 'templateName'), - template = this.templateForName(templateName, 'template'); - - Ember.assert("You specified the templateName " + templateName + " for " + this + ", but it did not exist.", !templateName || template); + var templateName = get(this, 'templateName'); + var template = this.templateForName(templateName, 'template'); + return template || get(this, 'defaultTemplate'); }), @@ -40563,11 +40264,10 @@ define("ember-views/views/view", @type Function */ layout: computed(function(key) { - var layoutName = get(this, 'layoutName'), - layout = this.templateForName(layoutName, 'layout'); - - Ember.assert("You specified the layoutName " + layoutName + " for " + this + ", but it did not exist.", !layoutName || layout); + var layoutName = get(this, 'layoutName'); + var layout = this.templateForName(layoutName, 'layout'); + return layout || get(this, 'defaultLayout'); }).property('layoutName'), @@ -40578,8 +40278,7 @@ define("ember-views/views/view", templateForName: function(name, type) { if (!name) { return; } - Ember.assert("templateNames are not allowed to contain periods: "+name, name.indexOf('.') === -1); - + if (!this.container) { throw new EmberError('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + @@ -40704,8 +40403,7 @@ define("ember-views/views/view", @deprecated */ nearestInstanceOf: function(klass) { - Ember.deprecate("nearestInstanceOf is deprecated and will be removed from future releases. Use nearestOfType."); - var view = get(this, 'parentView'); + var view = get(this, 'parentView'); while (view) { if (view instanceof klass) { return view; } @@ -40723,8 +40421,8 @@ define("ember-views/views/view", @return Ember.View */ nearestOfType: function(klass) { - var view = get(this, 'parentView'), - isOfType = klass instanceof Mixin ? + var view = get(this, 'parentView'); + var isOfType = klass instanceof Mixin ? function(view) { return klass.detect(view); } : function(view) { return klass.detect(view.constructor); }; @@ -40839,8 +40537,7 @@ define("ember-views/views/view", // is the view's controller by default. A hash of data is also passed that provides // the template with access to the view and render buffer. - Ember.assert('template must be a function. Did you mean to call Ember.Handlebars.compile("...") or specify templateName instead?', typeof template === 'function'); - // The template should write directly to the render buffer instead + // The template should write directly to the render buffer instead // of returning a string. output = template(context, { data: data }); @@ -40870,21 +40567,6 @@ define("ember-views/views/view", return this.currentState.rerender(this); }, - clearRenderedChildren: function() { - var lengthBefore = this.lengthBeforeRender, - lengthAfter = this.lengthAfterRender; - - // If there were child views created during the last call to render(), - // remove them under the assumption that they will be re-created when - // we re-render. - - // VIEW-TODO: Unit test this path. - var childViews = this._childViews; - for (var i=lengthAfter-1; i>=lengthBefore; i--) { - if (childViews[i]) { childViews[i].destroy(); } - } - }, - /** Iterates over the view's `classNameBindings` array, inserts the value of the specified property into the `classNames` array, then creates an @@ -40895,16 +40577,15 @@ define("ember-views/views/view", @private */ _applyClassNameBindings: function(classBindings) { - var classNames = this.classNames, - elem, newClass, dasherizedClass; + var classNames = this.classNames; + var elem, newClass, dasherizedClass; // Loop through all of the configured bindings. These will be either // property names ('isUrgent') or property paths relative to the view // ('content.isUrgent') forEach(classBindings, function(binding) { - Ember.assert("classNameBindings must not have spaces in them. Multiple class name bindings can be provided as elements of an array, e.g. ['foo', ':bar']", binding.indexOf(' ') === -1); - + // Variable in which the old class value is saved. The observer function // closes over this variable, so it knows which string to remove when // the property changes. @@ -40975,14 +40656,15 @@ define("ember-views/views/view", @private */ _applyAttributeBindings: function(buffer, attributeBindings) { - var attributeValue, - unspecifiedAttributeBindings = this._unspecifiedAttributeBindings = this._unspecifiedAttributeBindings || {}; + var attributeValue; + var unspecifiedAttributeBindings = this._unspecifiedAttributeBindings = this._unspecifiedAttributeBindings || {}; forEach(attributeBindings, function(binding) { - var split = binding.split(':'), - property = split[0], - attributeName = split[1] || property; + var split = binding.split(':'); + var property = split[0]; + var attributeName = split[1] || property; + if (property in this) { this._setupAttributeBindingObservation(property, attributeName); @@ -41071,13 +40753,7 @@ define("ember-views/views/view", @property element @type DOMElement */ - element: computed('_parentView', function(key, value) { - if (value !== undefined) { - return this.currentState.setElement(this, value); - } else { - return this.currentState.getElement(this); - } - }), + element: null, /** Returns a jQuery object for this view's element. If you pass in a selector @@ -41096,9 +40772,9 @@ define("ember-views/views/view", }, mutateChildViews: function(callback) { - var childViews = this._childViews, - idx = childViews.length, - view; + var childViews = this._childViews; + var idx = childViews.length; + var view; while(--idx >= 0) { view = childViews[idx]; @@ -41113,8 +40789,8 @@ define("ember-views/views/view", if (!childViews) { return this; } - var len = childViews.length, - view, idx; + var len = childViews.length; + var view, idx; for (idx = 0; idx < len; idx++) { view = childViews[idx]; @@ -41144,14 +40820,11 @@ define("ember-views/views/view", @param {String|DOMElement|jQuery} A selector, element, HTML string, or jQuery object @return {Ember.View} receiver */ - appendTo: function(target) { - // Schedule the DOM element to be created and appended to the given - // element after bindings have synchronized. - this._insertElementLater(function() { - Ember.assert("You tried to append to (" + target + ") but that isn't in the DOM", jQuery(target).length > 0); - Ember.assert("You cannot append to an existing Ember.View. Consider using Ember.ContainerView instead.", !jQuery(target).is('.ember-view') && !jQuery(target).parents().is('.ember-view')); - this.$().appendTo(target); - }); + appendTo: function(selector) { + var target = jQuery(selector); + + + this.constructor.renderer.appendTo(this, target[0]); return this; }, @@ -41169,49 +40842,15 @@ define("ember-views/views/view", @param {String|DOMElement|jQuery} target A selector, element, HTML string, or jQuery object @return {Ember.View} received */ - replaceIn: function(target) { - Ember.assert("You tried to replace in (" + target + ") but that isn't in the DOM", jQuery(target).length > 0); - Ember.assert("You cannot replace an existing Ember.View. Consider using Ember.ContainerView instead.", !jQuery(target).is('.ember-view') && !jQuery(target).parents().is('.ember-view')); + replaceIn: function(selector) { + var target = jQuery(selector); - this._insertElementLater(function() { - jQuery(target).empty(); - this.$().appendTo(target); - }); + + this.constructor.renderer.replaceIn(this, target[0]); return this; }, - /** - Schedules a DOM operation to occur during the next render phase. This - ensures that all bindings have finished synchronizing before the view is - rendered. - - To use, pass a function that performs a DOM operation. - - Before your function is called, this view and all child views will receive - the `willInsertElement` event. After your function is invoked, this view - and all of its child views will receive the `didInsertElement` event. - - ```javascript - view._insertElementLater(function() { - this.createElement(); - this.$().appendTo('body'); - }); - ``` - - @method _insertElementLater - @param {Function} fn the function that inserts the element into the DOM - @private - */ - _insertElementLater: function(fn) { - this._scheduledInsert = run.scheduleOnce('render', this, '_insertElement', fn); - }, - - _insertElement: function (fn) { - this._scheduledInsert = null; - this.currentState.insertElement(this, fn); - }, - /** Appends the view's element to the document body. If the view does not have an HTML representation yet, `createElement()` will be called @@ -41245,9 +40884,6 @@ define("ember-views/views/view", // In the interim, we will just re-render if that happens. It is more // important than elements get garbage collected. if (!this.removedFromDOM) { this.destroyElement(); } - this.invokeRecursively(function(view) { - if (view.clearRenderedChildren) { view.clearRenderedChildren(); } - }); }, elementId: null, @@ -41269,20 +40905,20 @@ define("ember-views/views/view", }, /** - Creates a DOM representation of the view and all of its - child views by recursively calling the `render()` method. + Creates a DOM representation of the view and all of its child views by + recursively calling the `render()` method. - After the element has been created, `didInsertElement` will + After the element has been inserted into the DOM, `didInsertElement` will be called on this view and all of its child views. @method createElement @return {Ember.View} receiver */ createElement: function() { - if (get(this, 'element')) { return this; } + if (this.element) { return this; } - var buffer = this.renderToBuffer(); - set(this, 'element', buffer.element()); + this._didCreateElementWithoutMorph = true; + this.constructor.renderer.renderTree(this); return this; }, @@ -41299,6 +40935,9 @@ define("ember-views/views/view", or after the view was re-rendered. Override this function to do any set up that requires an element in the document body. + When a view has children, didInsertElement will be called on the + child view(s) first, bubbling upwards through the hierarchy. + @event didInsertElement */ didInsertElement: Ember.K, @@ -41312,65 +40951,6 @@ define("ember-views/views/view", */ willClearRender: Ember.K, - /** - Run this callback on the current view (unless includeSelf is false) and recursively on child views. - - @method invokeRecursively - @param fn {Function} - @param includeSelf {Boolean} Includes itself if true. - @private - */ - invokeRecursively: function(fn, includeSelf) { - var childViews = (includeSelf === false) ? this._childViews : [this]; - var currentViews, view, currentChildViews; - - while (childViews.length) { - currentViews = childViews.slice(); - childViews = []; - - for (var i=0, l=currentViews.length; i=0; i--) { - childViews[i].removedFromDOM = true; - } - // remove from non-virtual parent view if viewName was specified if (viewName && nonVirtualParentView) { nonVirtualParentView.set(viewName, null); } - childLen = childViews.length; - for (i=childLen-1; i>=0; i--) { - childViews[i].destroy(); - } - return this; }, @@ -41781,13 +41307,11 @@ define("ember-views/views/view", var fullName = 'view:' + view; var ViewKlass = this.container.lookupFactory(fullName); - Ember.assert("Could not find view: '" + fullName + "'", !!ViewKlass); - + attrs.templateData = get(this, 'templateData'); view = ViewKlass.create(attrs); } else { - Ember.assert('You must pass instance or subclass of View', view.isView); - attrs.container = this.container; + attrs.container = this.container; if (!get(view, 'templateData')) { attrs.templateData = get(this, 'templateData'); @@ -41817,16 +41341,18 @@ define("ember-views/views/view", _toggleVisibility: function() { var $el = this.$(); - if (!$el) { return; } - var isVisible = get(this, 'isVisible'); if (this._isVisible === isVisible) { return ; } - $el.toggle(isVisible); - + // It's important to keep these in sync, even if we don't yet have + // an element in the DOM to manipulate: this._isVisible = isVisible; + if (!$el) { return; } + + $el.toggle(isVisible); + if (this._isAncestorHidden()) { return; } if (isVisible) { @@ -41870,29 +41396,16 @@ define("ember-views/views/view", return false; }, - - clearBuffer: function() { - this.invokeRecursively(nullViewsBuffer); - }, transitionTo: function(state, children) { - Ember.deprecate("Ember.View#transitionTo has been deprecated, it is for internal use only"); - this._transitionTo(state, children); + this._transitionTo(state, children); }, _transitionTo: function(state, children) { var priorState = this.currentState; var currentState = this.currentState = this._states[state]; - this._state = state; if (priorState && priorState.exit) { priorState.exit(this); } if (currentState.enter) { currentState.enter(this); } - if (state === 'inDOM') { meta(this).cache.element = undefined; } - - if (children !== false) { - this.forEachChildView(function(view) { - view._transitionTo(state); - }); - } }, // ....................................................... @@ -41921,13 +41434,13 @@ define("ember-views/views/view", return; } - var view = this, - stateCheckedObserver = function() { - view.currentState.invokeObserver(this, observer); - }, - scheduledObserver = function() { - run.scheduleOnce('render', this, stateCheckedObserver); - }; + var view = this; + var stateCheckedObserver = function() { + view.currentState.invokeObserver(this, observer); + }; + var scheduledObserver = function() { + run.scheduleOnce('render', this, stateCheckedObserver); + }; addObserver(root, path, target, scheduledObserver); @@ -41937,6 +41450,8 @@ define("ember-views/views/view", } }); + deprecateProperty(View.prototype, 'state', '_state'); + deprecateProperty(View.prototype, 'states', '_states'); /* Describe how the specified actions should behave in the various @@ -41969,48 +41484,6 @@ define("ember-views/views/view", run.once(View, 'notifyMutationListeners'); } - var DOMManager = { - prepend: function(view, html) { - view.$().prepend(html); - notifyMutationListeners(); - }, - - after: function(view, html) { - view.$().after(html); - notifyMutationListeners(); - }, - - html: function(view, html) { - view.$().html(html); - notifyMutationListeners(); - }, - - replace: function(view) { - var element = get(view, 'element'); - - set(view, 'element', null); - - view._insertElementLater(function() { - jQuery(element).replaceWith(get(view, 'element')); - notifyMutationListeners(); - }); - }, - - remove: function(view) { - view.$().remove(); - notifyMutationListeners(); - }, - - empty: function(view) { - view.$().empty(); - notifyMutationListeners(); - } - }; - - View.reopen({ - domManager: DOMManager - }); - View.reopenClass({ /** @@ -42033,11 +41506,10 @@ define("ember-views/views/view", @private */ _parsePropertyPath: function(path) { - var split = path.split(':'), - propertyPath = split[0], - classNames = "", - className, - falsyClassName; + var split = path.split(':'); + var propertyPath = split[0]; + var classNames = ""; + var className, falsyClassName; // check if the property is defined as prop:class or prop:trueClass:falseClass if (split.length > 1) { @@ -42121,7 +41593,7 @@ define("ember-views/views/view", }); var mutation = EmberObject.extend(Evented).create(); - + // TODO MOVE TO RENDERER HOOKS View.addMutationListener = function(callback) { mutation.on('change', callback); }; @@ -42179,78 +41651,11 @@ define("ember-views/views/view", __exports__["default"] = View; }); -define("ember-views/views/view_collection", - ["ember-metal/enumerable_utils","exports"], - function(__dependency1__, __exports__) { - "use strict"; - var forEach = __dependency1__.forEach; - - function ViewCollection(initialViews) { - var views = this.views = initialViews || []; - this.length = views.length; - } - - ViewCollection.prototype = { - length: 0, - - trigger: function(eventName) { - var views = this.views, view; - for (var i = 0, l = views.length; i < l; i++) { - view = views[i]; - if (view.trigger) { view.trigger(eventName); } - } - }, - - triggerRecursively: function(eventName) { - var views = this.views; - for (var i = 0, l = views.length; i < l; i++) { - views[i].triggerRecursively(eventName); - } - }, - - invokeRecursively: function(fn) { - var views = this.views, view; - - for (var i = 0, l = views.length; i < l; i++) { - view = views[i]; - fn(view); - } - }, - - transitionTo: function(state, children) { - var views = this.views; - for (var i = 0, l = views.length; i < l; i++) { - views[i]._transitionTo(state, children); - } - }, - - push: function() { - this.length += arguments.length; - var views = this.views; - return views.push.apply(views, arguments); - }, - - objectAt: function(idx) { - return this.views[idx]; - }, - - forEach: function(callback) { - var views = this.views; - return forEach(views, callback); - }, - - clear: function() { - this.length = 0; - this.views.length = 0; - } - }; - - __exports__["default"] = ViewCollection; - }); -define("ember", +enifed("ember", ["ember-metal","ember-runtime","ember-handlebars","ember-views","ember-routing","ember-routing-handlebars","ember-application","ember-extension-support"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__) { "use strict"; + /* global navigator */ // require the main entry points for each of these packages // this is so that the global exports occur properly @@ -42266,521 +41671,830 @@ define("ember", @module ember */ - function throwWithMessage(msg) { - return function() { - throw new Ember.Error(msg); - }; + }); +enifed("morph", + ["./morph/morph","./morph/dom-helper","exports"], + function(__dependency1__, __dependency2__, __exports__) { + "use strict"; + var Morph = __dependency1__["default"]; + var Morph; + __exports__.Morph = Morph; + var DOMHelper = __dependency2__["default"]; + var DOMHelper; + __exports__.DOMHelper = DOMHelper; + }); +enifed("morph/dom-helper", + ["../morph/morph","./dom-helper/build-html-dom","exports"], + function(__dependency1__, __dependency2__, __exports__) { + "use strict"; + var Morph = __dependency1__["default"]; + var buildHTMLDOM = __dependency2__.buildHTMLDOM; + var svgNamespace = __dependency2__.svgNamespace; + var svgHTMLIntegrationPoints = __dependency2__.svgHTMLIntegrationPoints; + + var deletesBlankTextNodes = (function(){ + var element = document.createElement('div'); + element.appendChild( document.createTextNode('') ); + var clonedElement = element.cloneNode(true); + return clonedElement.childNodes.length === 0; + })(); + + var ignoresCheckedAttribute = (function(){ + var element = document.createElement('input'); + element.setAttribute('checked', 'checked'); + var clonedElement = element.cloneNode(false); + return !clonedElement.checked; + })(); + + function isSVG(ns){ + return ns === svgNamespace; + } + + // This is not the namespace of the element, but of + // the elements inside that elements. + function interiorNamespace(element){ + if ( + element && + element.namespaceURI === svgNamespace && + !svgHTMLIntegrationPoints[element.tagName] + ) { + return svgNamespace; + } else { + return null; + } } - function generateRemovedClass(className) { - var msg = " has been moved into a plugin: https://github.com/emberjs/ember-states"; + // The HTML spec allows for "omitted start tags". These tags are optional + // when their intended child is the first thing in the parent tag. For + // example, this is a tbody start tag: + // + // + // + // + // + // The tbody may be omitted, and the browser will accept and render: + // + //
    + // + // + // However, the omitted start tag will still be added to the DOM. Here + // we test the string and context to see if the browser is about to + // perform this cleanup. + // + // http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags + // describes which tags are omittable. The spec for tbody and colgroup + // explains this behavior: + // + // http://www.whatwg.org/specs/web-apps/current-work/multipage/tables.html#the-tbody-element + // http://www.whatwg.org/specs/web-apps/current-work/multipage/tables.html#the-colgroup-element + // - return { - extend: throwWithMessage(className + msg), - create: throwWithMessage(className + msg) - }; + var omittedStartTagChildTest = /<([\w:]+)/; + function detectOmittedStartTag(string, contextualElement){ + // Omitted start tags are only inside table tags. + if (contextualElement.tagName === 'TABLE') { + var omittedStartTagChildMatch = omittedStartTagChildTest.exec(string); + if (omittedStartTagChildMatch) { + var omittedStartTagChild = omittedStartTagChildMatch[1]; + // It is already asserted that the contextual element is a table + // and not the proper start tag. Just see if a tag was omitted. + return omittedStartTagChild === 'tr' || + omittedStartTagChild === 'col'; + } + } } - Ember.StateManager = generateRemovedClass("Ember.StateManager"); + function buildSVGDOM(html, dom){ + var div = dom.document.createElement('div'); + div.innerHTML = ''+html+''; + return div.firstChild.childNodes; + } - /** - This was exported to ember-states plugin for v 1.0.0 release. See: https://github.com/emberjs/ember-states + /* + * A class wrapping DOM functions to address environment compatibility, + * namespaces, contextual elements for morph un-escaped content + * insertion. + * + * When entering a template, a DOMHelper should be passed: + * + * template(context, { hooks: hooks, dom: new DOMHelper() }); + * + * TODO: support foreignObject as a passed contextual element. It has + * a namespace (svg) that does not match its internal namespace + * (xhtml). + * + * @class DOMHelper + * @constructor + * @param {HTMLDocument} _document The document DOM methods are proxied to + */ + function DOMHelper(_document){ + this.document = _document || window.document; + this.namespace = null; + } - @class StateManager - @namespace Ember - */ + var prototype = DOMHelper.prototype; + prototype.constructor = DOMHelper; - Ember.State = generateRemovedClass("Ember.State"); + prototype.insertBefore = function(element, childElement, referenceChild) { + return element.insertBefore(childElement, referenceChild); + }; - /** - This was exported to ember-states plugin for v 1.0.0 release. See: https://github.com/emberjs/ember-states + prototype.appendChild = function(element, childElement) { + return element.appendChild(childElement); + }; - @class State - @namespace Ember - */ - }); -define("metamorph", - [], - function() { - "use strict"; - // ========================================================================== - // Project: metamorph - // Copyright: ©2014 Tilde, Inc. All rights reserved. - // ========================================================================== - - var K = function() {}, - guid = 0, - disableRange = (function(){ - if ('undefined' !== typeof MetamorphENV) { - return MetamorphENV.DISABLE_RANGE_API; - } else if ('undefined' !== ENV) { - return ENV.DISABLE_RANGE_API; + prototype.appendText = function(element, text) { + return element.appendChild(this.document.createTextNode(text)); + }; + + prototype.setAttribute = function(element, name, value) { + element.setAttribute(name, value); + }; + + if (document.createElementNS) { + // Only opt into namespace detection if a contextualElement + // is passed. + prototype.createElement = function(tagName, contextualElement) { + var namespace = this.namespace; + if (contextualElement) { + if (tagName === 'svg') { + namespace = svgNamespace; } else { - return false; + namespace = interiorNamespace(contextualElement); } - })(), - - // Feature-detect the W3C range API, the extended check is for IE9 which only partially supports ranges - supportsRange = (!disableRange) && typeof document !== 'undefined' && ('createRange' in document) && (typeof Range !== 'undefined') && Range.prototype.createContextualFragment, - - // Internet Explorer prior to 9 does not allow setting innerHTML if the first element - // is a "zero-scope" element. This problem can be worked around by making - // the first node an invisible text node. We, like Modernizr, use ­ - needsShy = typeof document !== 'undefined' && (function() { - var testEl = document.createElement('div'); - testEl.innerHTML = "
    "; - testEl.firstChild.innerHTML = ""; - return testEl.firstChild.innerHTML === ''; - })(), - - - // IE 8 (and likely earlier) likes to move whitespace preceeding - // a script tag to appear after it. This means that we can - // accidentally remove whitespace when updating a morph. - movesWhitespace = document && (function() { - var testEl = document.createElement('div'); - testEl.innerHTML = "Test: Value"; - return testEl.childNodes[0].nodeValue === 'Test:' && - testEl.childNodes[2].nodeValue === ' Value'; - })(); - - // Constructor that supports either Metamorph('foo') or new - // Metamorph('foo'); - // - // Takes a string of HTML as the argument. + } + if (namespace) { + return this.document.createElementNS(namespace, tagName); + } else { + return this.document.createElement(tagName); + } + }; + } else { + prototype.createElement = function(tagName) { + return this.document.createElement(tagName); + }; + } - var Metamorph = function(html) { - var self; + prototype.setNamespace = function(ns) { + this.namespace = ns; + }; - if (this instanceof Metamorph) { - self = this; - } else { - self = new K(); - } + prototype.detectNamespace = function(element) { + this.namespace = interiorNamespace(element); + }; - self.innerHTML = html; - var myGuid = 'metamorph-'+(guid++); - self.start = myGuid + '-start'; - self.end = myGuid + '-end'; + prototype.createDocumentFragment = function(){ + return this.document.createDocumentFragment(); + }; - return self; + prototype.createTextNode = function(text){ + return this.document.createTextNode(text); }; - K.prototype = Metamorph.prototype; + prototype.repairClonedNode = function(element, blankChildTextNodes, isChecked){ + if (deletesBlankTextNodes && blankChildTextNodes.length > 0) { + for (var i=0, len=blankChildTextNodes.length;i\x3C/script>"; + // This helper is just to keep the templates good looking, + // passing integers instead of element references. + prototype.createMorphAt = function(parent, startIndex, endIndex, contextualElement){ + var childNodes = parent.childNodes, + start = startIndex === -1 ? null : childNodes[startIndex], + end = endIndex === -1 ? null : childNodes[endIndex]; + return this.createMorph(parent, start, end, contextualElement); }; - endTagFunc = function() { - /* - * We replace chevron by its hex code in order to prevent escaping problems. - * Check this thread for more explaination: - * http://stackoverflow.com/questions/8231048/why-use-x3c-instead-of-when-generating-html-from-javascript - */ - return "
    hi
    "; - * div.firstChild.firstChild.tagName //=> "" - * - * If our script markers are inside such a node, we need to find that - * node and use *it* as the marker. - */ - var realNode = function(start) { - while (start.parentNode.tagName === "") { - start = start.parentNode; + // When parsing innerHTML, the browser may set up DOM with some things + // not desired. For example, with a select element context and option + // innerHTML the first option will be marked selected. + // + // This method cleans up some of that, resetting those values back to + // their defaults. + // + function buildSafeDOM(html, contextualElement, dom) { + var childNodes = buildIESafeDOM(html, contextualElement, dom); + + if (contextualElement.tagName === 'SELECT') { + // Walk child nodes + for (var i = 0; childNodes[i]; i++) { + // Find and process the first option child node + if (childNodes[i].tagName === 'OPTION') { + if (detectAutoSelectedOption(childNodes[i].parentNode, childNodes[i], html)) { + // If the first node is selected but does not have an attribute, + // presume it is not really selected. + childNodes[i].parentNode.selectedIndex = -1; + } + break; + } } + } - return start; - }; + return childNodes; + } - /* - * When automatically adding a tbody, Internet Explorer inserts the - * tbody immediately before the first . Other browsers create it - * before the first node, no matter what. - * - * This means the the following code: - * - * div = document.createElement("div"); - * div.innerHTML = "
    hi
    - * - * Generates the following DOM in IE: - * - * + div - * + table - * - script id='first' - * + tbody - * + tr - * + td - * - "hi" - * - script id='last' - * - * Which means that the two script tags, even though they were - * inserted at the same point in the hierarchy in the original - * HTML, now have different parents. - * - * This code reparents the first script tag by making it the tbody's - * first child. - * - */ - var fixParentage = function(start, end) { - if (start.parentNode !== end.parentNode) { - end.parentNode.insertBefore(start, end.parentNode.firstChild); + var buildHTMLDOM; + if (needsIntegrationPointFix) { + buildHTMLDOM = function buildHTMLDOM(html, contextualElement, dom){ + if (svgHTMLIntegrationPoints[contextualElement.tagName]) { + return buildSafeDOM(html, document.createElement('div'), dom); + } else { + return buildSafeDOM(html, contextualElement, dom); } }; + } else { + buildHTMLDOM = buildSafeDOM; + } - htmlFunc = function(html, outerToo) { - // get the real starting node. see realNode for details. - var start = realNode(document.getElementById(this.start)); - var end = document.getElementById(this.end); - var parentNode = end.parentNode; - var node, nextSibling, last; - - // make sure that the start and end nodes share the same - // parent. If not, fix it. - fixParentage(start, end); - - // remove all of the nodes after the starting placeholder and - // before the ending placeholder. - node = start.nextSibling; - while (node) { - nextSibling = node.nextSibling; - last = node === end; - - // if this is the last node, and we want to remove it as well, - // set the `end` node to the next sibling. This is because - // for the rest of the function, we insert the new nodes - // before the end (note that insertBefore(node, null) is - // the same as appendChild(node)). - // - // if we do not want to remove it, just break. - if (last) { - if (outerToo) { end = node.nextSibling; } else { break; } - } + __exports__.buildHTMLDOM = buildHTMLDOM; + }); +enifed("morph/morph", + ["exports"], + function(__exports__) { + "use strict"; + var splice = Array.prototype.splice; - node.parentNode.removeChild(node); + function ensureStartEnd(start, end) { + if (start === null || end === null) { + throw new Error('a fragment parent must have boundary nodes in order to detect insertion'); + } + } - // if this is the last node and we didn't break before - // (because we wanted to remove the outer nodes), break - // now. - if (last) { break; } + function ensureContext(contextualElement) { + if (!contextualElement || contextualElement.nodeType !== 1) { + throw new Error('An element node must be provided for a contextualElement, you provided ' + + (contextualElement ? 'nodeType ' + contextualElement.nodeType : 'nothing')); + } + } - node = nextSibling; - } + // TODO: this is an internal API, this should be an assert + function Morph(parent, start, end, domHelper, contextualElement) { + if (parent.nodeType === 11) { + ensureStartEnd(start, end); + this.element = null; + } else { + this.element = parent; + } + this._parent = parent; + this.start = start; + this.end = end; + this.domHelper = domHelper; + ensureContext(contextualElement); + this.contextualElement = contextualElement; + this.reset(); + } - // get the first node for the HTML string, even in cases like - // tables and lists where a simple innerHTML on a div would - // swallow some of the content. - node = firstNodeFor(start.parentNode, html); + Morph.prototype.reset = function() { + this.text = null; + this.owner = null; + this.morphs = null; + this.before = null; + this.after = null; + this.escaped = true; + }; - if (outerToo) { - start.parentNode.removeChild(start); + Morph.prototype.parent = function () { + if (!this.element) { + var parent = this.start.parentNode; + if (this._parent !== parent) { + this.element = this._parent = parent; } + } + return this._parent; + }; - // copy the nodes for the HTML between the starting and ending - // placeholder. - while (node) { - nextSibling = node.nextSibling; - parentNode.insertBefore(node, end); - node = nextSibling; + Morph.prototype.destroy = function () { + if (this.owner) { + this.owner.removeMorph(this); + } else { + clear(this.element || this.parent(), this.start, this.end); + } + }; + + Morph.prototype.removeMorph = function (morph) { + var morphs = this.morphs; + for (var i=0, l=morphs.length; i 0 ? morphs[index-1] : null; + var after = index < morphs.length ? morphs[index] : null; + var start = before === null ? this.start : (before.end === null ? parent.lastChild : before.end.previousSibling); + var end = after === null ? this.end : (after.start === null ? parent.firstChild : after.start.nextSibling); + var morph = new Morph(parent, start, end, this.domHelper, this.contextualElement); - htmlFunc.call(this, html); + morph.owner = this; + morph._update(parent, node); - this.innerHTML = html; - }; + if (before !== null) { + morph.before = before; + before.end = start.nextSibling; + before.after = morph; + } + + if (after !== null) { + morph.after = after; + after.before = morph; + after.start = end.previousSibling; + } - Metamorph.prototype.replaceWith = function(html) { - this.checkRemoved(); - htmlFunc.call(this, html, true); + this.morphs.splice(index, 0, morph); + return morph; }; - Metamorph.prototype.remove = removeFunc; - Metamorph.prototype.outerHTML = outerHTMLFunc; - Metamorph.prototype.appendTo = appendToFunc; - Metamorph.prototype.after = afterFunc; - Metamorph.prototype.prepend = prependFunc; - Metamorph.prototype.startTag = startTagFunc; - Metamorph.prototype.endTag = endTagFunc; + Morph.prototype.replace = function (index, removedLength, addedNodes) { + if (this.morphs === null) this.morphs = []; + var parent = this.element || this.parent(); + var morphs = this.morphs; + var before = index > 0 ? morphs[index-1] : null; + var after = index+removedLength < morphs.length ? morphs[index+removedLength] : null; + var start = before === null ? this.start : (before.end === null ? parent.lastChild : before.end.previousSibling); + var end = after === null ? this.end : (after.start === null ? parent.firstChild : after.start.nextSibling); + var addedLength = addedNodes === undefined ? 0 : addedNodes.length; + var args, i, current; - Metamorph.prototype.isRemoved = function() { - var before = document.getElementById(this.start); - var after = document.getElementById(this.end); + if (removedLength > 0) { + clear(parent, start, end); + } - return !before || !after; - }; + if (addedLength === 0) { + if (before !== null) { + before.after = after; + before.end = end; + } + if (after !== null) { + after.before = before; + after.start = start; + } + morphs.splice(index, removedLength); + return; + } - Metamorph.prototype.checkRemoved = function() { - if (this.isRemoved()) { - throw new Error("Cannot perform operations on a Metamorph that is not in the DOM."); + args = new Array(addedLength+2); + if (addedLength > 0) { + for (i=0; i