ember-source 1.10.0.beta.1 → 1.10.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

data/dist/ember.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 1.10.0-beta.1
8
+ * @version 1.10.0-beta.2
9
9
  */
10
10
 
11
11
  (function() {
@@ -4207,7 +4207,7 @@ enifed("ember-extension-support/container_debug_adapter",
4207
4207
 
4208
4208
  @class ContainerDebugAdapter
4209
4209
  @namespace Ember
4210
- @extends EmberObject
4210
+ @extends Ember.Object
4211
4211
  @since 1.5.0
4212
4212
  */
4213
4213
  __exports__["default"] = EmberObject.extend({
@@ -4769,47 +4769,51 @@ enifed("ember-extension-support/data_adapter",
4769
4769
  });
4770
4770
  });
4771
4771
  enifed("ember-htmlbars",
4772
- ["ember-metal/core","ember-htmlbars/hooks/content","ember-htmlbars/hooks/component","ember-htmlbars/hooks/element","ember-htmlbars/hooks/subexpr","ember-htmlbars/hooks/attribute","ember-htmlbars/hooks/concat","ember-htmlbars/hooks/get","ember-htmlbars/hooks/set","morph","ember-htmlbars/system/template","ember-htmlbars/system/compile","ember-htmlbars/system/make-view-helper","ember-htmlbars/system/make_bound_helper","ember-htmlbars/helpers","ember-htmlbars/helpers/binding","ember-htmlbars/helpers/view","ember-htmlbars/helpers/yield","ember-htmlbars/helpers/with","ember-htmlbars/helpers/log","ember-htmlbars/helpers/debugger","ember-htmlbars/helpers/bind-attr","ember-htmlbars/helpers/if_unless","ember-htmlbars/helpers/loc","ember-htmlbars/helpers/partial","ember-htmlbars/helpers/template","ember-htmlbars/helpers/input","ember-htmlbars/helpers/text_area","ember-htmlbars/helpers/collection","ember-htmlbars/helpers/each","ember-htmlbars/helpers/unbound","ember-htmlbars/system/bootstrap","ember-htmlbars/compat","exports"],
4773
- 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__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __dependency33__, __exports__) {
4772
+ ["ember-metal/core","ember-template-compiler","ember-htmlbars/hooks/content","ember-htmlbars/hooks/component","ember-htmlbars/hooks/element","ember-htmlbars/hooks/subexpr","ember-htmlbars/hooks/attribute","ember-htmlbars/hooks/concat","ember-htmlbars/hooks/get","ember-htmlbars/hooks/set","morph","ember-htmlbars/system/make-view-helper","ember-htmlbars/system/make_bound_helper","ember-htmlbars/helpers","ember-htmlbars/helpers/binding","ember-htmlbars/helpers/view","ember-htmlbars/helpers/yield","ember-htmlbars/helpers/with","ember-htmlbars/helpers/log","ember-htmlbars/helpers/debugger","ember-htmlbars/helpers/bind-attr","ember-htmlbars/helpers/if_unless","ember-htmlbars/helpers/loc","ember-htmlbars/helpers/partial","ember-htmlbars/helpers/template","ember-htmlbars/helpers/input","ember-htmlbars/helpers/text_area","ember-htmlbars/helpers/collection","ember-htmlbars/helpers/each","ember-htmlbars/helpers/unbound","ember-htmlbars/system/bootstrap","ember-htmlbars/compat","exports"],
4773
+ 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__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __exports__) {
4774
4774
  "use strict";
4775
4775
  var Ember = __dependency1__["default"];
4776
- var content = __dependency2__["default"];
4777
- var component = __dependency3__["default"];
4778
- var element = __dependency4__["default"];
4779
- var subexpr = __dependency5__["default"];
4780
- var attribute = __dependency6__["default"];
4781
- var concat = __dependency7__["default"];
4782
- var get = __dependency8__["default"];
4783
- var set = __dependency9__["default"];
4784
- var DOMHelper = __dependency10__.DOMHelper;
4785
- var template = __dependency11__["default"];
4786
- var compile = __dependency12__["default"];
4787
- var makeViewHelper = __dependency13__["default"];
4788
- var makeBoundHelper = __dependency14__["default"];
4789
-
4790
- var registerHelper = __dependency15__.registerHelper;
4791
- var helper = __dependency15__.helper;
4792
- var helpers = __dependency15__["default"];
4793
- var bindHelper = __dependency16__.bindHelper;
4794
- var viewHelper = __dependency17__.viewHelper;
4795
- var yieldHelper = __dependency18__.yieldHelper;
4796
- var withHelper = __dependency19__.withHelper;
4797
- var logHelper = __dependency20__.logHelper;
4798
- var debuggerHelper = __dependency21__.debuggerHelper;
4799
- var bindAttrHelper = __dependency22__.bindAttrHelper;
4800
- var bindAttrHelperDeprecated = __dependency22__.bindAttrHelperDeprecated;
4801
- var ifHelper = __dependency23__.ifHelper;
4802
- var unlessHelper = __dependency23__.unlessHelper;
4803
- var unboundIfHelper = __dependency23__.unboundIfHelper;
4804
- var boundIfHelper = __dependency23__.boundIfHelper;
4805
- var locHelper = __dependency24__.locHelper;
4806
- var partialHelper = __dependency25__.partialHelper;
4807
- var templateHelper = __dependency26__.templateHelper;
4808
- var inputHelper = __dependency27__.inputHelper;
4809
- var textareaHelper = __dependency28__.textareaHelper;
4810
- var collectionHelper = __dependency29__.collectionHelper;
4811
- var eachHelper = __dependency30__.eachHelper;
4812
- var unboundHelper = __dependency31__.unboundHelper;
4776
+
4777
+ var precompile = __dependency2__.precompile;
4778
+ var compile = __dependency2__.compile;
4779
+ var template = __dependency2__.template;
4780
+ var registerPlugin = __dependency2__.registerPlugin;
4781
+
4782
+ var content = __dependency3__["default"];
4783
+ var component = __dependency4__["default"];
4784
+ var element = __dependency5__["default"];
4785
+ var subexpr = __dependency6__["default"];
4786
+ var attribute = __dependency7__["default"];
4787
+ var concat = __dependency8__["default"];
4788
+ var get = __dependency9__["default"];
4789
+ var set = __dependency10__["default"];
4790
+ var DOMHelper = __dependency11__.DOMHelper;
4791
+ var makeViewHelper = __dependency12__["default"];
4792
+ var makeBoundHelper = __dependency13__["default"];
4793
+
4794
+ var registerHelper = __dependency14__.registerHelper;
4795
+ var helper = __dependency14__.helper;
4796
+ var helpers = __dependency14__["default"];
4797
+ var bindHelper = __dependency15__.bindHelper;
4798
+ var viewHelper = __dependency16__.viewHelper;
4799
+ var yieldHelper = __dependency17__.yieldHelper;
4800
+ var withHelper = __dependency18__.withHelper;
4801
+ var logHelper = __dependency19__.logHelper;
4802
+ var debuggerHelper = __dependency20__.debuggerHelper;
4803
+ var bindAttrHelper = __dependency21__.bindAttrHelper;
4804
+ var bindAttrHelperDeprecated = __dependency21__.bindAttrHelperDeprecated;
4805
+ var ifHelper = __dependency22__.ifHelper;
4806
+ var unlessHelper = __dependency22__.unlessHelper;
4807
+ var unboundIfHelper = __dependency22__.unboundIfHelper;
4808
+ var boundIfHelper = __dependency22__.boundIfHelper;
4809
+ var locHelper = __dependency23__.locHelper;
4810
+ var partialHelper = __dependency24__.partialHelper;
4811
+ var templateHelper = __dependency25__.templateHelper;
4812
+ var inputHelper = __dependency26__.inputHelper;
4813
+ var textareaHelper = __dependency27__.textareaHelper;
4814
+ var collectionHelper = __dependency28__.collectionHelper;
4815
+ var eachHelper = __dependency29__.eachHelper;
4816
+ var unboundHelper = __dependency30__.unboundHelper;
4813
4817
 
4814
4818
  // importing adds template bootstrapping
4815
4819
  // initializer to enable embedded templates
@@ -4847,8 +4851,10 @@ enifed("ember-htmlbars",
4847
4851
  _registerHelper: registerHelper,
4848
4852
  template: template,
4849
4853
  compile: compile,
4854
+ precompile: precompile,
4850
4855
  makeViewHelper: makeViewHelper,
4851
- makeBoundHelper: makeBoundHelper
4856
+ makeBoundHelper: makeBoundHelper,
4857
+ registerPlugin: registerPlugin
4852
4858
  };
4853
4859
 
4854
4860
 
@@ -4872,8 +4878,8 @@ enifed("ember-htmlbars",
4872
4878
  __exports__.defaultEnv = defaultEnv;
4873
4879
  });
4874
4880
  enifed("ember-htmlbars/attr_nodes",
4875
- ["ember-htmlbars/attr_nodes/quoted","ember-htmlbars/attr_nodes/unquoted","ember-htmlbars/attr_nodes/unquoted_nonproperty","ember-htmlbars/attr_nodes/quoted_class","ember-metal/platform","ember-htmlbars/attr_nodes/utils","exports"],
4876
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
4881
+ ["ember-htmlbars/attr_nodes/quoted","ember-htmlbars/attr_nodes/unquoted","ember-htmlbars/attr_nodes/unquoted_nonproperty","ember-views/system/sanitize_attribute_value","ember-htmlbars/attr_nodes/sanitized","ember-metal/platform","ember-htmlbars/attr_nodes/utils","exports"],
4882
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
4877
4883
  "use strict";
4878
4884
  /**
4879
4885
  @module ember
@@ -4883,9 +4889,10 @@ enifed("ember-htmlbars/attr_nodes",
4883
4889
  var QuotedAttrNode = __dependency1__["default"];
4884
4890
  var UnquotedAttrNode = __dependency2__["default"];
4885
4891
  var UnquotedNonpropertyAttrNode = __dependency3__["default"];
4886
- var QuotedClassAttrNode = __dependency4__["default"];
4887
- var o_create = __dependency5__.create;
4888
- var normalizeProperty = __dependency6__.normalizeProperty;
4892
+ var badAttributes = __dependency4__.badAttributes;
4893
+ var SanitizedAttrNode = __dependency5__["default"];
4894
+ var o_create = __dependency6__.create;
4895
+ var normalizeProperty = __dependency7__.normalizeProperty;
4889
4896
 
4890
4897
  var svgNamespaceURI = 'http://www.w3.org/2000/svg';
4891
4898
 
@@ -4893,7 +4900,11 @@ enifed("ember-htmlbars/attr_nodes",
4893
4900
  unquotedAttrNodeTypes['class'] = UnquotedNonpropertyAttrNode;
4894
4901
 
4895
4902
  var quotedAttrNodeTypes = o_create(null);
4896
- quotedAttrNodeTypes['class'] = QuotedClassAttrNode;
4903
+
4904
+ for (var attrName in badAttributes) {
4905
+ unquotedAttrNodeTypes[attrName] = SanitizedAttrNode;
4906
+ quotedAttrNodeTypes[attrName] = SanitizedAttrNode;
4907
+ }
4897
4908
 
4898
4909
  __exports__["default"] = function attrNodeTypeFor(attrName, element, quoted) {
4899
4910
  var result;
@@ -4994,7 +5005,7 @@ enifed("ember-htmlbars/attr_nodes/quoted",
4994
5005
 
4995
5006
  function QuotedAttrNode(element, attrName, attrValue, dom) {
4996
5007
  this.init(element, attrName, attrValue, dom);
4997
- }
5008
+ }
4998
5009
 
4999
5010
  QuotedAttrNode.prototype = o_create(SimpleAttrNode.prototype);
5000
5011
 
@@ -5004,118 +5015,35 @@ enifed("ember-htmlbars/attr_nodes/quoted",
5004
5015
 
5005
5016
  __exports__["default"] = QuotedAttrNode;
5006
5017
  });
5007
- enifed("ember-htmlbars/attr_nodes/quoted_class",
5008
- ["ember-metal/run_loop","ember-metal/streams/utils","exports"],
5009
- function(__dependency1__, __dependency2__, __exports__) {
5018
+ enifed("ember-htmlbars/attr_nodes/sanitized",
5019
+ ["./simple","ember-metal/platform","ember-metal/streams/utils","ember-views/system/sanitize_attribute_value","exports"],
5020
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
5010
5021
  "use strict";
5011
5022
  /**
5012
5023
  @module ember
5013
5024
  @submodule ember-htmlbars
5014
5025
  */
5015
5026
 
5016
- var run = __dependency1__["default"];
5017
- var read = __dependency2__.read;
5018
- var subscribe = __dependency2__.subscribe;
5019
-
5020
- var SPACES = /\s+/;
5021
- var ADD_LIST = [];
5022
- var REMOVE_LIST = [];
5023
-
5024
- // Dedupes and removes empty strings. It expects the array
5025
- // to be sorted.
5026
- // TODO: This could be done in-place instead of splicing.
5027
- function normalizeClasses(array) {
5028
- var i = 0;
5029
- while (i < array.length - 1) {
5030
- if (array[i] === array[i+1]) {
5031
- array.splice(i, 1);
5032
- } else {
5033
- i++;
5034
- }
5035
- }
5036
- if (array[0] === '') {
5037
- array.shift();
5038
- }
5039
- }
5040
-
5041
- function buildClasses(value) {
5042
- if (typeof value === 'string') {
5043
- return value.split(SPACES);
5044
- } else {
5045
- return [];
5046
- }
5047
- }
5027
+ var SimpleAttrNode = __dependency1__["default"];
5028
+ var o_create = __dependency2__.create;
5029
+ var chainStream = __dependency3__.chainStream;
5030
+ var read = __dependency3__.read;
5031
+ var sanitizeAttributeValue = __dependency4__["default"];
5048
5032
 
5049
- function QuotedClassAttrNode(element, attrName, attrValue, dom) {
5050
- this.element = element;
5051
- this.attrName = attrName;
5052
- this.dom = dom;
5053
- this.isDirty = false;
5033
+ function SanitizedAttrNode(element, attrName, attrValue, dom) {
5034
+ var sanitizedValue = chainStream(attrValue, function(){
5035
+ var unsafeValue = read(attrValue);
5036
+ var safeValue = sanitizeAttributeValue(element, attrName, unsafeValue);
5054
5037
 
5055
- this.classes = attrValue;
5056
- this.oldClasses = [];
5038
+ return safeValue;
5039
+ });
5057
5040
 
5058
- subscribe(attrValue, this.renderIfNeeded, this);
5059
- this.renderIfNeeded();
5041
+ this.init(element, attrName, sanitizedValue, dom);
5060
5042
  }
5061
5043
 
5062
- QuotedClassAttrNode.prototype.renderIfNeeded = function renderIfNeeded(){
5063
- this.isDirty = true;
5064
- run.schedule('render', this, this.scheduledRenderIfNeeded);
5065
- };
5066
-
5067
- QuotedClassAttrNode.prototype.scheduledRenderIfNeeded = function scheduledRenderIfNeeded(){
5068
- if (this.isDirty) {
5069
- this.isDirty = false;
5070
- this.render();
5071
- }
5072
- };
5073
-
5074
- QuotedClassAttrNode.prototype.render = function render(){
5075
- ADD_LIST.length = 0;
5076
- REMOVE_LIST.length = 0;
5077
-
5078
- var oldClasses = this.oldClasses;
5079
- var newClasses = buildClasses(read(this.classes));
5080
- newClasses.sort();
5081
- normalizeClasses(newClasses);
5082
-
5083
- var oldIndex = 0;
5084
- var oldLength = oldClasses.length;
5085
- var newIndex = 0;
5086
- var newLength = newClasses.length;
5087
-
5088
- while (oldIndex < oldLength || newIndex < newLength) {
5089
- var oldClass = oldClasses[oldIndex];
5090
- var newClass = newClasses[newIndex];
5091
-
5092
- if (oldIndex === oldLength) {
5093
- ADD_LIST.push(newClass);
5094
- newIndex++;
5095
- } else if (newIndex === newLength) {
5096
- REMOVE_LIST.push(oldClass);
5097
- oldIndex++;
5098
- } else {
5099
- if (oldClass === newClass) {
5100
- oldIndex++;
5101
- newIndex++;
5102
- } else if (oldClass < newClass) {
5103
- REMOVE_LIST.push(oldClass);
5104
- oldIndex++;
5105
- } else {
5106
- ADD_LIST.push(newClass);
5107
- newIndex++;
5108
- }
5109
- }
5110
- }
5111
-
5112
- this.oldClasses = newClasses;
5113
-
5114
- this.dom.addClasses(this.element, ADD_LIST);
5115
- this.dom.removeClasses(this.element, REMOVE_LIST);
5116
- };
5044
+ SanitizedAttrNode.prototype = o_create(SimpleAttrNode.prototype);
5117
5045
 
5118
- __exports__["default"] = QuotedClassAttrNode;
5046
+ __exports__["default"] = SanitizedAttrNode;
5119
5047
  });
5120
5048
  enifed("ember-htmlbars/attr_nodes/simple",
5121
5049
  ["ember-metal/run_loop","exports"],
@@ -5130,32 +5058,32 @@ enifed("ember-htmlbars/attr_nodes/simple",
5130
5058
 
5131
5059
  function SimpleAttrNode() {
5132
5060
  // abstract class
5133
- }
5061
+ }
5134
5062
 
5135
5063
  SimpleAttrNode.prototype.init = function init(element, attrName, simpleAttrValue, dom){
5136
5064
  this.element = element;
5137
5065
  this.attrName = attrName;
5138
5066
  this.attrValue = simpleAttrValue;
5139
5067
  this.dom = dom;
5140
- this.isDirty = false;
5068
+ this.isDirty = true;
5141
5069
  this.lastValue = null;
5142
5070
  this.currentValue = null;
5143
5071
 
5144
5072
  if (this.attrValue.isStream) {
5145
- this.attrValue.subscribe(this.renderIfNeeded, this);
5146
- this.renderIfNeeded();
5073
+ this.attrValue.subscribe(this.markDirty, this);
5074
+ this.renderIfDirty();
5147
5075
  } else {
5148
5076
  this.currentValue = simpleAttrValue;
5149
5077
  this.render();
5150
5078
  }
5151
5079
  };
5152
5080
 
5153
- SimpleAttrNode.prototype.renderIfNeeded = function renderIfNeeded(){
5081
+ SimpleAttrNode.prototype.markDirty = function markDirty(){
5154
5082
  this.isDirty = true;
5155
- run.schedule('render', this, this.scheduledRenderIfNeeded);
5083
+ run.schedule('render', this, this.renderIfDirty);
5156
5084
  };
5157
5085
 
5158
- SimpleAttrNode.prototype.scheduledRenderIfNeeded = function scheduledRenderIfNeeded(){
5086
+ SimpleAttrNode.prototype.renderIfDirty = function renderIfDirty(){
5159
5087
  if (this.isDirty) {
5160
5088
  this.isDirty = false;
5161
5089
  var value = this.attrValue.value();
@@ -5189,7 +5117,7 @@ enifed("ember-htmlbars/attr_nodes/unquoted",
5189
5117
  function UnquotedAttrNode(element, attrName, attrValue, dom) {
5190
5118
  var normalizedAttrName = normalizeProperty(element, attrName) || attrName;
5191
5119
  this.init(element, normalizedAttrName, attrValue, dom);
5192
- }
5120
+ }
5193
5121
 
5194
5122
  UnquotedAttrNode.prototype = o_create(SimpleAttrNode.prototype);
5195
5123
 
@@ -5209,7 +5137,7 @@ enifed("ember-htmlbars/attr_nodes/unquoted_nonproperty",
5209
5137
 
5210
5138
  function UnquotedNonpropertyAttrNode(element, attrName, attrValue, dom) {
5211
5139
  this.init(element, attrName, attrValue, dom);
5212
- }
5140
+ }
5213
5141
 
5214
5142
  UnquotedNonpropertyAttrNode.prototype = o_create(SimpleAttrNode.prototype);
5215
5143
 
@@ -5252,20 +5180,22 @@ enifed("ember-htmlbars/attr_nodes/utils",
5252
5180
  __exports__.normalizeProperty = normalizeProperty;
5253
5181
  });
5254
5182
  enifed("ember-htmlbars/compat",
5255
- ["ember-metal/core","ember-htmlbars/helpers","ember-htmlbars/system/template","ember-htmlbars/system/compile","ember-htmlbars/compat/helper","ember-htmlbars/compat/handlebars-get","ember-htmlbars/compat/make-bound-helper","ember-htmlbars/compat/register-bound-helper","ember-htmlbars/compat/precompile","ember-htmlbars/system/make-view-helper","exports"],
5183
+ ["ember-metal/core","ember-htmlbars/helpers","ember-template-compiler","ember-htmlbars/compat/helper","ember-htmlbars/compat/handlebars-get","ember-htmlbars/compat/make-bound-helper","ember-htmlbars/compat/register-bound-helper","ember-htmlbars/compat/precompile","ember-htmlbars/system/make-view-helper","ember-htmlbars/utils/string","exports"],
5256
5184
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
5257
5185
  "use strict";
5258
5186
  var Ember = __dependency1__["default"];
5259
5187
  var helpers = __dependency2__["default"];
5260
- var template = __dependency3__["default"];
5261
- var compile = __dependency4__["default"];
5262
- var compatRegisterHelper = __dependency5__.registerHandlebarsCompatibleHelper;
5263
- var compatHandlebarsHelper = __dependency5__.handlebarsHelper;
5264
- var compatHandlebarsGet = __dependency6__["default"];
5265
- var compatMakeBoundHelper = __dependency7__["default"];
5266
- var compatRegisterBoundHelper = __dependency8__["default"];
5267
- var compatPrecompile = __dependency9__["default"];
5268
- var makeViewHelper = __dependency10__["default"];
5188
+ var template = __dependency3__.template;
5189
+ var compile = __dependency3__.compile;
5190
+ var compatRegisterHelper = __dependency4__.registerHandlebarsCompatibleHelper;
5191
+ var compatHandlebarsHelper = __dependency4__.handlebarsHelper;
5192
+ var compatHandlebarsGet = __dependency5__["default"];
5193
+ var compatMakeBoundHelper = __dependency6__["default"];
5194
+ var compatRegisterBoundHelper = __dependency7__["default"];
5195
+ var compatPrecompile = __dependency8__["default"];
5196
+ var makeViewHelper = __dependency9__["default"];
5197
+ var SafeString = __dependency10__.SafeString;
5198
+ var escapeExpression = __dependency10__.escapeExpression;
5269
5199
 
5270
5200
  var EmberHandlebars;
5271
5201
 
@@ -5280,6 +5210,11 @@ enifed("ember-htmlbars/compat",
5280
5210
  EmberHandlebars.compile = compile;
5281
5211
  EmberHandlebars.template = template;
5282
5212
  EmberHandlebars.makeViewHelper = makeViewHelper;
5213
+
5214
+ EmberHandlebars.SafeString = SafeString;
5215
+ EmberHandlebars.Utils = {
5216
+ escapeExpression: escapeExpression
5217
+ };
5283
5218
 
5284
5219
 
5285
5220
  __exports__["default"] = EmberHandlebars;
@@ -5312,8 +5247,8 @@ enifed("ember-htmlbars/compat/handlebars-get",
5312
5247
  }
5313
5248
  });
5314
5249
  enifed("ember-htmlbars/compat/helper",
5315
- ["ember-metal/merge","ember-htmlbars/helpers","ember-views/views/view","ember-views/views/component","ember-htmlbars/system/make-view-helper","ember-htmlbars/compat/make-bound-helper","exports"],
5316
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
5250
+ ["ember-metal/merge","ember-htmlbars/helpers","ember-views/views/view","ember-views/views/component","ember-htmlbars/system/make-view-helper","ember-htmlbars/compat/make-bound-helper","ember-metal/streams/utils","exports"],
5251
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
5317
5252
  "use strict";
5318
5253
  /**
5319
5254
  @module ember
@@ -5326,6 +5261,7 @@ enifed("ember-htmlbars/compat/helper",
5326
5261
  var Component = __dependency4__["default"];
5327
5262
  var makeViewHelper = __dependency5__["default"];
5328
5263
  var makeBoundHelper = __dependency6__["default"];
5264
+ var isStream = __dependency7__.isStream;
5329
5265
 
5330
5266
  var slice = [].slice;
5331
5267
 
@@ -5347,7 +5283,7 @@ enifed("ember-htmlbars/compat/helper",
5347
5283
  for (var prop in hash) {
5348
5284
  param = hash[prop];
5349
5285
 
5350
- if (param.isStream) {
5286
+ if (isStream(param)) {
5351
5287
  handlebarsOptions.hash[prop] = param._label;
5352
5288
  } else {
5353
5289
  handlebarsOptions.hash[prop] = param;
@@ -5358,7 +5294,7 @@ enifed("ember-htmlbars/compat/helper",
5358
5294
  for (var i = 0, l = params.length; i < l; i++) {
5359
5295
  param = params[i];
5360
5296
 
5361
- if (param.isStream) {
5297
+ if (isStream(param)) {
5362
5298
  args[i] = param._label;
5363
5299
  } else {
5364
5300
  args[i] = param;
@@ -5397,8 +5333,8 @@ enifed("ember-htmlbars/compat/helper",
5397
5333
  __exports__.handlebarsHelper = handlebarsHelper;__exports__["default"] = HandlebarsCompatibleHelper;
5398
5334
  });
5399
5335
  enifed("ember-htmlbars/compat/make-bound-helper",
5400
- ["ember-metal/core","ember-metal/mixin","ember-views/views/simple_bound_view","ember-htmlbars/system/helper","ember-metal/streams/stream","ember-metal/streams/utils","exports"],
5401
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
5336
+ ["ember-metal/core","ember-metal/mixin","ember-htmlbars/system/helper","ember-metal/streams/stream","ember-metal/streams/utils","exports"],
5337
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
5402
5338
  "use strict";
5403
5339
  /**
5404
5340
  @module ember
@@ -5408,12 +5344,14 @@ enifed("ember-htmlbars/compat/make-bound-helper",
5408
5344
  var Ember = __dependency1__["default"];
5409
5345
  // Ember.FEATURES, Ember.assert, Ember.Handlebars, Ember.lookup
5410
5346
  var IS_BINDING = __dependency2__.IS_BINDING;
5411
- var appendSimpleBoundView = __dependency3__.appendSimpleBoundView;
5412
- var Helper = __dependency4__["default"];
5347
+ var Helper = __dependency3__["default"];
5413
5348
 
5414
- var Stream = __dependency5__["default"];
5415
- var readArray = __dependency6__.readArray;
5416
- var readHash = __dependency6__.readHash;
5349
+ var Stream = __dependency4__["default"];
5350
+ var readArray = __dependency5__.readArray;
5351
+ var scanArray = __dependency5__.scanArray;
5352
+ var scanHash = __dependency5__.scanHash;
5353
+ var readHash = __dependency5__.readHash;
5354
+ var isStream = __dependency5__.isStream;
5417
5355
 
5418
5356
  /**
5419
5357
  A helper function used by `registerBoundHelper`. Takes the
@@ -5450,6 +5388,7 @@ enifed("ember-htmlbars/compat/make-bound-helper",
5450
5388
  function helperFunc(params, hash, options, env) {
5451
5389
  var view = this;
5452
5390
  var numParams = params.length;
5391
+ var param;
5453
5392
 
5454
5393
  Ember.assert("registerBoundHelper-generated helpers do not support use with Handlebars blocks.", !options.template);
5455
5394
 
@@ -5466,7 +5405,7 @@ enifed("ember-htmlbars/compat/make-bound-helper",
5466
5405
  for (var i = 0, l = params.length; i < l; i++) {
5467
5406
  param = params[i];
5468
5407
 
5469
- if (param.isStream) {
5408
+ if (isStream(param)) {
5470
5409
  properties[i] = param._label;
5471
5410
  } else {
5472
5411
  properties[i] = param;
@@ -5480,25 +5419,25 @@ enifed("ember-htmlbars/compat/make-bound-helper",
5480
5419
  return fn.apply(view, args);
5481
5420
  }
5482
5421
 
5483
- if (env.data.isUnbound) {
5422
+ // If none of the hash parameters are bound, act as an unbound helper.
5423
+ // This prevents views from being unnecessarily created
5424
+ var hasStream = scanArray(params) || scanHash(hash);
5425
+
5426
+ if (env.data.isUnbound || !hasStream){
5484
5427
  return valueFn();
5485
5428
  } else {
5486
5429
  var lazyValue = new Stream(valueFn);
5487
5430
 
5488
- appendSimpleBoundView(this, options.morph, lazyValue);
5489
-
5490
- var param;
5491
-
5492
5431
  for (i = 0; i < numParams; i++) {
5493
5432
  param = params[i];
5494
- if (param && param.isStream) {
5433
+ if (isStream(param)) {
5495
5434
  param.subscribe(lazyValue.notify, lazyValue);
5496
5435
  }
5497
5436
  }
5498
5437
 
5499
5438
  for (prop in hash) {
5500
5439
  param = hash[prop];
5501
- if (param && param.isStream) {
5440
+ if (isStream(param)) {
5502
5441
  param.subscribe(lazyValue.notify, lazyValue);
5503
5442
  }
5504
5443
  }
@@ -5507,7 +5446,7 @@ enifed("ember-htmlbars/compat/make-bound-helper",
5507
5446
  var firstParam = params[0];
5508
5447
  // Only bother with subscriptions if the first argument
5509
5448
  // is a stream itself, and not a primitive.
5510
- if (firstParam && firstParam.isStream) {
5449
+ if (isStream(firstParam)) {
5511
5450
  var onDependentKeyNotify = function onDependentKeyNotify(stream) {
5512
5451
  stream.value();
5513
5452
  lazyValue.notify();
@@ -5519,6 +5458,8 @@ enifed("ember-htmlbars/compat/make-bound-helper",
5519
5458
  }
5520
5459
  }
5521
5460
  }
5461
+
5462
+ return lazyValue;
5522
5463
  }
5523
5464
  }
5524
5465
 
@@ -5675,30 +5616,32 @@ enifed("ember-htmlbars/compat/register-bound-helper",
5675
5616
  }
5676
5617
  });
5677
5618
  enifed("ember-htmlbars/helpers",
5678
- ["ember-views/views/view","ember-views/views/component","ember-htmlbars/system/make-view-helper","ember-htmlbars/system/helper","ember-htmlbars/system/make_bound_helper","exports"],
5679
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
5619
+ ["ember-metal/platform","ember-views/views/view","ember-views/views/component","ember-htmlbars/system/make-view-helper","ember-htmlbars/system/helper","ember-htmlbars/system/make_bound_helper","exports"],
5620
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
5680
5621
  "use strict";
5681
5622
  /**
5682
5623
  @module ember
5683
5624
  @submodule ember-htmlbars
5684
5625
  */
5685
5626
 
5627
+ var o_create = __dependency1__.create;
5628
+
5686
5629
  /**
5687
5630
  @private
5688
5631
  @property helpers
5689
5632
  */
5690
- var helpers = { };
5633
+ var helpers = o_create(null);
5691
5634
 
5692
5635
  /**
5693
5636
  @module ember
5694
5637
  @submodule ember-htmlbars
5695
5638
  */
5696
5639
 
5697
- var View = __dependency1__["default"];
5698
- var Component = __dependency2__["default"];
5699
- var makeViewHelper = __dependency3__["default"];
5700
- var Helper = __dependency4__["default"];
5701
- var makeBoundHelper = __dependency5__["default"];
5640
+ var View = __dependency2__["default"];
5641
+ var Component = __dependency3__["default"];
5642
+ var makeViewHelper = __dependency4__["default"];
5643
+ var Helper = __dependency5__["default"];
5644
+ var makeBoundHelper = __dependency6__["default"];
5702
5645
 
5703
5646
  /**
5704
5647
  Register a bound helper or custom view helper.
@@ -5876,8 +5819,8 @@ enifed("ember-htmlbars/helpers",
5876
5819
  __exports__.registerBoundHelper = registerBoundHelper;__exports__["default"] = helpers;
5877
5820
  });
5878
5821
  enifed("ember-htmlbars/helpers/bind-attr",
5879
- ["ember-metal/core","ember-runtime/system/string","ember-htmlbars/attr_nodes/quoted_class","ember-htmlbars/attr_nodes/legacy_bind","ember-views/views/view","ember-metal/streams/stream","ember-metal/keys","ember-htmlbars/helpers","ember-htmlbars/hooks/concat","exports"],
5880
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
5822
+ ["ember-metal/core","ember-runtime/system/string","ember-htmlbars/attr_nodes/quoted","ember-htmlbars/attr_nodes/legacy_bind","ember-views/system/sanitize_attribute_value","ember-htmlbars/attr_nodes/sanitized","ember-metal/keys","ember-htmlbars/helpers","ember-metal/enumerable_utils","ember-metal/streams/utils","ember-views/streams/class_name_binding","exports"],
5823
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
5881
5824
  "use strict";
5882
5825
  /**
5883
5826
  @module ember
@@ -5888,13 +5831,16 @@ enifed("ember-htmlbars/helpers/bind-attr",
5888
5831
  // Ember.assert
5889
5832
 
5890
5833
  var fmt = __dependency2__.fmt;
5891
- var QuotedClassAttrNode = __dependency3__["default"];
5834
+ var QuotedAttrNode = __dependency3__["default"];
5892
5835
  var LegacyBindAttrNode = __dependency4__["default"];
5893
- var View = __dependency5__["default"];
5894
- var Stream = __dependency6__["default"];
5836
+ var badAttributes = __dependency5__.badAttributes;
5837
+ var SanitizedAttrNode = __dependency6__["default"];
5895
5838
  var keys = __dependency7__["default"];
5896
5839
  var helpers = __dependency8__["default"];
5897
- var concat = __dependency9__["default"];
5840
+ var map = __dependency9__.map;
5841
+ var isStream = __dependency10__.isStream;
5842
+ var concat = __dependency10__.concat;
5843
+ var streamifyClassNameBinding = __dependency11__.streamifyClassNameBinding;
5898
5844
 
5899
5845
  /**
5900
5846
  `bind-attr` allows you to create a binding between DOM element attributes and
@@ -6027,10 +5973,14 @@ enifed("ember-htmlbars/helpers/bind-attr",
6027
5973
  var view = this;
6028
5974
 
6029
5975
  // Handle classes differently, as we can bind multiple classes
6030
- var classBindings = hash['class'];
6031
- if (classBindings != null) {
6032
- var attrValue = streamifyClassBindings(view, classBindings);
6033
- new QuotedClassAttrNode(element, 'class', attrValue, env.dom);
5976
+ var classNameBindings = hash['class'];
5977
+ if (classNameBindings !== null && classNameBindings !== undefined) {
5978
+ if (isStream(classNameBindings)) {
5979
+ new QuotedAttrNode(element, 'class', classNameBindings, env.dom);
5980
+ } else {
5981
+ var classNameBindingsStream = applyClassNameBindings(classNameBindings, view);
5982
+ new QuotedAttrNode(element, 'class', classNameBindingsStream, env.dom);
5983
+ }
6034
5984
  delete hash['class'];
6035
5985
  }
6036
5986
 
@@ -6040,7 +5990,7 @@ enifed("ember-htmlbars/helpers/bind-attr",
6040
5990
  for (var i=0, l=attrKeys.length;i<l;i++) {
6041
5991
  attr = attrKeys[i];
6042
5992
  path = hash[attr];
6043
- if (path.isStream) {
5993
+ if (isStream(path)) {
6044
5994
  lazyValue = path;
6045
5995
  } else {
6046
5996
  Ember.assert(
@@ -6050,10 +6000,23 @@ enifed("ember-htmlbars/helpers/bind-attr",
6050
6000
  );
6051
6001
  lazyValue = view.getStream(path);
6052
6002
  }
6053
- new LegacyBindAttrNode(element, attr, lazyValue, env.dom);
6003
+ if (badAttributes[attr]) {
6004
+ new SanitizedAttrNode(element, attr, lazyValue, env.dom);
6005
+ } else {
6006
+ new LegacyBindAttrNode(element, attr, lazyValue, env.dom);
6007
+ }
6054
6008
  }
6055
6009
  }
6056
6010
 
6011
+ function applyClassNameBindings(classNameBindings, view) {
6012
+ var arrayOfClassNameBindings = classNameBindings.split(' ');
6013
+ var boundClassNameBindings = map(arrayOfClassNameBindings, function(classNameBinding) {
6014
+ return streamifyClassNameBinding(view, classNameBinding);
6015
+ });
6016
+ var concatenatedClassNames = concat(boundClassNameBindings, ' ');
6017
+ return concatenatedClassNames;
6018
+ }
6019
+
6057
6020
  /**
6058
6021
  See `bind-attr`
6059
6022
 
@@ -6070,65 +6033,13 @@ enifed("ember-htmlbars/helpers/bind-attr",
6070
6033
  return helpers['bind-attr'].apply(this, arguments);
6071
6034
  }
6072
6035
 
6073
- /**
6074
- Helper that, given a space-separated string of property paths and a context,
6075
- returns an array of class names. Calling this method also has the side
6076
- effect of setting up observers at those property paths, such that if they
6077
- change, the correct class name will be reapplied to the DOM element.
6078
-
6079
- For example, if you pass the string "fooBar", it will first look up the
6080
- "fooBar" value of the context. If that value is true, it will add the
6081
- "foo-bar" class to the current element (i.e., the dasherized form of
6082
- "fooBar"). If the value is a string, it will add that string as the class.
6083
- Otherwise, it will not add any new class name.
6084
-
6085
- @private
6086
- @method bindClasses
6087
- @for Ember.Handlebars
6088
- @param {String} classBindings A string, space-separated, of class bindings
6089
- to use
6090
- @param {View} view The view in which observers should look for the
6091
- element to update
6092
- @return {Array} An array of class names to add
6093
- */
6094
- function streamifyClassBindings(view, classBindingsString) {
6095
- var classBindings = classBindingsString.split(' ');
6096
- var streamified = [];
6097
-
6098
- var parsedPath;
6099
- for (var i=0, l=classBindings.length;i<l;i++) {
6100
- parsedPath = View._parsePropertyPath(classBindings[i]);
6101
-
6102
- if (parsedPath.path === '') {
6103
- streamified.push(classStringForParsedPath(parsedPath, true) + " ");
6104
- } else {
6105
- (function(){
6106
- var lazyValue = view.getStream(parsedPath.path);
6107
- var _parsedPath = parsedPath;
6108
- var classNameBound = new Stream(function(){
6109
- var value = lazyValue.value();
6110
- return classStringForParsedPath(_parsedPath, value) + " ";
6111
- });
6112
- lazyValue.subscribe(classNameBound.notify, classNameBound);
6113
- streamified.push(classNameBound);
6114
- })(); // jshint ignore:line
6115
- }
6116
- }
6117
-
6118
- return concat(streamified);
6119
- }
6120
-
6121
- function classStringForParsedPath(parsedPath, value) {
6122
- return View._classStringForValue(parsedPath.path, value, parsedPath.className, parsedPath.falsyClassName);
6123
- }
6124
-
6125
6036
  __exports__["default"] = bindAttrHelper;
6126
6037
 
6127
6038
  __exports__.bindAttrHelper = bindAttrHelper;
6128
6039
  __exports__.bindAttrHelperDeprecated = bindAttrHelperDeprecated;
6129
6040
  });
6130
6041
  enifed("ember-htmlbars/helpers/binding",
6131
- ["ember-metal/is_none","ember-metal/run_loop","ember-metal/property_get","ember-metal/streams/simple","ember-views/views/bound_view","ember-views/views/simple_bound_view","exports"],
6042
+ ["ember-metal/is_none","ember-metal/run_loop","ember-metal/property_get","ember-metal/streams/simple","ember-views/views/bound_view","ember-metal/streams/utils","exports"],
6132
6043
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
6133
6044
  "use strict";
6134
6045
  /**
@@ -6141,7 +6052,7 @@ enifed("ember-htmlbars/helpers/binding",
6141
6052
  var get = __dependency3__.get;
6142
6053
  var SimpleStream = __dependency4__["default"];
6143
6054
  var BoundView = __dependency5__["default"];
6144
- var appendSimpleBoundView = __dependency6__.appendSimpleBoundView;
6055
+ var isStream = __dependency6__.isStream;
6145
6056
 
6146
6057
  function exists(value) {
6147
6058
  return !isNone(value);
@@ -6150,7 +6061,7 @@ enifed("ember-htmlbars/helpers/binding",
6150
6061
  // Binds a property into the DOM. This will create a hook in DOM that the
6151
6062
  // KVO system will look for and update if the property changes.
6152
6063
  function bind(property, hash, options, env, preserveContext, shouldDisplay, valueNormalizer, childProperties, _viewClass) {
6153
- var valueStream = property.isStream ? property : this.getStream(property);
6064
+ var valueStream = isStream(property) ? property : this.getStream(property);
6154
6065
  var lazyValue;
6155
6066
 
6156
6067
  if (childProperties) {
@@ -6239,7 +6150,7 @@ enifed("ember-htmlbars/helpers/binding",
6239
6150
  Ember.deprecate("The block form of bind, {{#bind foo}}{{/bind}}, has been deprecated and will be removed.");
6240
6151
  bind.call(this, property, hash, options, env, false, exists);
6241
6152
  } else {
6242
- appendSimpleBoundView(this, options.morph, property);
6153
+ return property;
6243
6154
  }
6244
6155
  }
6245
6156
 
@@ -6247,8 +6158,8 @@ enifed("ember-htmlbars/helpers/binding",
6247
6158
  __exports__.bindHelper = bindHelper;
6248
6159
  });
6249
6160
  enifed("ember-htmlbars/helpers/collection",
6250
- ["ember-metal/core","ember-metal/mixin","ember-runtime/system/string","ember-metal/property_get","ember-metal/streams/simple","ember-htmlbars/helpers/view","ember-views/views/view","ember-views/views/collection_view","ember-views/streams/utils","exports"],
6251
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
6161
+ ["ember-metal/core","ember-metal/mixin","ember-runtime/system/string","ember-metal/property_get","ember-htmlbars/helpers/view","ember-views/views/collection_view","ember-views/streams/utils","ember-metal/enumerable_utils","ember-views/streams/class_name_binding","ember-metal/binding","exports"],
6162
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
6252
6163
  "use strict";
6253
6164
  /**
6254
6165
  @module ember
@@ -6260,11 +6171,12 @@ enifed("ember-htmlbars/helpers/collection",
6260
6171
  var IS_BINDING = __dependency2__.IS_BINDING;
6261
6172
  var fmt = __dependency3__.fmt;
6262
6173
  var get = __dependency4__.get;
6263
- var SimpleStream = __dependency5__["default"];
6264
- var ViewHelper = __dependency6__.ViewHelper;
6265
- var View = __dependency7__["default"];
6266
- var CollectionView = __dependency8__["default"];
6267
- var readViewFactory = __dependency9__.readViewFactory;
6174
+ var ViewHelper = __dependency5__.ViewHelper;
6175
+ var CollectionView = __dependency6__["default"];
6176
+ var readViewFactory = __dependency7__.readViewFactory;
6177
+ var map = __dependency8__.map;
6178
+ var streamifyClassNameBinding = __dependency9__.streamifyClassNameBinding;
6179
+ var Binding = __dependency10__.Binding;
6268
6180
 
6269
6181
  /**
6270
6182
  `{{collection}}` is a `Ember.Handlebars` helper for adding instances of
@@ -6406,7 +6318,8 @@ enifed("ember-htmlbars/helpers/collection",
6406
6318
  view = data.view,
6407
6319
  // This should be deterministic, and should probably come from a
6408
6320
  // parent view and not the controller.
6409
- container = (view.controller && view.controller.container ? view.controller.container : view.container);
6321
+ controller = get(view, 'controller'),
6322
+ container = (controller && controller.container ? controller.container : view.container);
6410
6323
 
6411
6324
  // If passed a path string, convert that into an object.
6412
6325
  // Otherwise, just default to the standard class.
@@ -6482,27 +6395,18 @@ enifed("ember-htmlbars/helpers/collection",
6482
6395
  if (emptyViewClass) { hash.emptyView = emptyViewClass; }
6483
6396
 
6484
6397
  if (hash.keyword) {
6485
- itemHash._contextBinding = '_parentView.context';
6398
+ itemHash._contextBinding = Binding.oneWay('_parentView.context');
6486
6399
  } else {
6487
- itemHash._contextBinding = 'content';
6400
+ itemHash._contextBinding = Binding.oneWay('content');
6488
6401
  }
6489
6402
 
6490
6403
  var viewOptions = ViewHelper.propertiesFromHTMLOptions(itemHash, {}, { data: data });
6491
6404
 
6492
6405
  if (hash.itemClassBinding) {
6493
6406
  var itemClassBindings = hash.itemClassBinding.split(' ');
6494
-
6495
- for (var i = 0; i < itemClassBindings.length; i++) {
6496
- var parsedPath = View._parsePropertyPath(itemClassBindings[i]);
6497
- if (parsedPath.path === '') {
6498
- parsedPath.stream = new SimpleStream(true);
6499
- } else {
6500
- parsedPath.stream = view.getStream(parsedPath.path);
6501
- }
6502
- itemClassBindings[i] = parsedPath;
6503
- }
6504
-
6505
- viewOptions.classNameBindings = itemClassBindings;
6407
+ viewOptions.classNameBindings = map(itemClassBindings, function(classBinding){
6408
+ return streamifyClassNameBinding(view, classBinding);
6409
+ });
6506
6410
  }
6507
6411
 
6508
6412
  hash.itemViewClass = itemViewClass;
@@ -6883,6 +6787,7 @@ enifed("ember-htmlbars/helpers/if_unless",
6883
6787
  options.helperName = options.helperName || ('if ');
6884
6788
 
6885
6789
  if (env.data.isUnbound) {
6790
+ env.data.isUnbound = false;
6886
6791
  return env.helpers.unboundIf.helperFunction.call(this, params, hash, options, env);
6887
6792
  } else {
6888
6793
  return env.helpers.boundIf.helperFunction.call(this, params, hash, options, env);
@@ -6910,6 +6815,7 @@ enifed("ember-htmlbars/helpers/if_unless",
6910
6815
  options.helperName = options.helperName || helperName;
6911
6816
 
6912
6817
  if (env.data.isUnbound) {
6818
+ env.data.isUnbound = false;
6913
6819
  return env.helpers.unboundIf.helperFunction.call(this, params, hash, options, env);
6914
6820
  } else {
6915
6821
  return env.helpers.boundIf.helperFunction.call(this, params, hash, options, env);
@@ -7235,14 +7141,15 @@ enifed("ember-htmlbars/helpers/log",
7235
7141
  __exports__.logHelper = logHelper;
7236
7142
  });
7237
7143
  enifed("ember-htmlbars/helpers/partial",
7238
- ["ember-metal/core","ember-metal/is_none","./binding","exports"],
7239
- function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
7144
+ ["ember-metal/core","ember-metal/is_none","./binding","ember-metal/streams/utils","exports"],
7145
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
7240
7146
  "use strict";
7241
7147
  var Ember = __dependency1__["default"];
7242
7148
  // Ember.assert
7243
7149
 
7244
7150
  var isNone = __dependency2__["default"];
7245
7151
  var bind = __dependency3__.bind;
7152
+ var isStream = __dependency4__.isStream;
7246
7153
 
7247
7154
  /**
7248
7155
  @module ember
@@ -7294,7 +7201,7 @@ enifed("ember-htmlbars/helpers/partial",
7294
7201
 
7295
7202
  var name = params[0];
7296
7203
 
7297
- if (name && name.isStream) {
7204
+ if (isStream(name)) {
7298
7205
  options.template = createPartialTemplate(name);
7299
7206
  bind.call(this, name, hash, options, env, true, exists);
7300
7207
  } else {
@@ -7642,8 +7549,8 @@ enifed("ember-htmlbars/helpers/unbound",
7642
7549
  __exports__.unboundHelper = unboundHelper;
7643
7550
  });
7644
7551
  enifed("ember-htmlbars/helpers/view",
7645
- ["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/keys","ember-metal/mixin","ember-metal/streams/utils","ember-views/streams/utils","ember-views/views/view","ember-metal/streams/simple","exports"],
7646
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
7552
+ ["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/streams/simple","ember-metal/keys","ember-metal/mixin","ember-metal/streams/utils","ember-views/streams/utils","ember-views/views/view","ember-metal/enumerable_utils","ember-views/streams/class_name_binding","exports"],
7553
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
7647
7554
  "use strict";
7648
7555
  /**
7649
7556
  @module ember
@@ -7655,13 +7562,16 @@ enifed("ember-htmlbars/helpers/view",
7655
7562
 
7656
7563
  var EmberObject = __dependency2__["default"];
7657
7564
  var get = __dependency3__.get;
7658
- var keys = __dependency4__["default"];
7659
- var IS_BINDING = __dependency5__.IS_BINDING;
7660
- var read = __dependency6__.read;
7661
- var isStream = __dependency6__.isStream;
7662
- var readViewFactory = __dependency7__.readViewFactory;
7663
- var View = __dependency8__["default"];
7664
- var SimpleStream = __dependency9__["default"];
7565
+ var SimpleStream = __dependency4__["default"];
7566
+ var keys = __dependency5__["default"];
7567
+ var IS_BINDING = __dependency6__.IS_BINDING;
7568
+ var read = __dependency7__.read;
7569
+ var isStream = __dependency7__.isStream;
7570
+ var readViewFactory = __dependency8__.readViewFactory;
7571
+ var View = __dependency9__["default"];
7572
+
7573
+ var map = __dependency10__.map;
7574
+ var streamifyClassNameBinding = __dependency11__.streamifyClassNameBinding;
7665
7575
 
7666
7576
  function makeBindings(hash, options, view) {
7667
7577
  for (var prop in hash) {
@@ -7751,17 +7661,17 @@ enifed("ember-htmlbars/helpers/view",
7751
7661
  }
7752
7662
  }
7753
7663
 
7754
- var classNameBindings = extensions.classNameBindings;
7755
- if (classNameBindings) {
7756
- for (var j = 0; j < classNameBindings.length; j++) {
7757
- var parsedPath = View._parsePropertyPath(classNameBindings[j]);
7758
- if (parsedPath.path === '') {
7759
- parsedPath.stream = new SimpleStream(true);
7664
+ if (extensions.classNameBindings) {
7665
+ extensions.classNameBindings = map(extensions.classNameBindings, function(classNameBinding){
7666
+ var binding = streamifyClassNameBinding(view, classNameBinding);
7667
+ if (isStream(binding)) {
7668
+ return binding;
7760
7669
  } else {
7761
- parsedPath.stream = view.getStream(parsedPath.path);
7670
+ // returning a stream informs the classNameBindings logic
7671
+ // in views/view that this value is already processed.
7672
+ return new SimpleStream(binding);
7762
7673
  }
7763
- classNameBindings[j] = parsedPath;
7764
- }
7674
+ });
7765
7675
  }
7766
7676
 
7767
7677
  return extensions;
@@ -7770,12 +7680,18 @@ enifed("ember-htmlbars/helpers/view",
7770
7680
  helper: function(newView, hash, options, env) {
7771
7681
  var data = env.data;
7772
7682
  var template = options.template;
7683
+ var newViewProto;
7773
7684
 
7774
7685
  makeBindings(hash, options, env.data.view);
7775
7686
 
7776
7687
  var viewOptions = this.propertiesFromHTMLOptions(hash, options, env);
7777
7688
  var currentView = data.view;
7778
- var newViewProto = newView.proto();
7689
+
7690
+ if (View.detectInstance(newView)) {
7691
+ newViewProto = newView;
7692
+ } else {
7693
+ newViewProto = newView.proto();
7694
+ }
7779
7695
 
7780
7696
  if (template) {
7781
7697
  Ember.assert(
@@ -8111,7 +8027,7 @@ enifed("ember-htmlbars/helpers/with",
8111
8027
 
8112
8028
  var preserveContext;
8113
8029
 
8114
- if (hash.keywordName || options.blockParams) {
8030
+ if (options.blockParams) {
8115
8031
  preserveContext = true;
8116
8032
  } else {
8117
8033
  Ember.deprecate(
@@ -8245,8 +8161,8 @@ enifed("ember-htmlbars/helpers/yield",
8245
8161
  __exports__.yieldHelper = yieldHelper;
8246
8162
  });
8247
8163
  enifed("ember-htmlbars/hooks/attribute",
8248
- ["ember-htmlbars/attr_nodes","ember-metal/error","ember-metal/streams/utils","exports"],
8249
- function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
8164
+ ["ember-htmlbars/attr_nodes","ember-metal/error","ember-metal/streams/utils","ember-views/system/sanitize_attribute_value","exports"],
8165
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
8250
8166
  "use strict";
8251
8167
  /**
8252
8168
  @module ember
@@ -8256,6 +8172,7 @@ enifed("ember-htmlbars/hooks/attribute",
8256
8172
  var attrNodeTypeFor = __dependency1__["default"];
8257
8173
  var EmberError = __dependency2__["default"];
8258
8174
  var isStream = __dependency3__.isStream;
8175
+ var sanitizeAttributeValue = __dependency4__["default"];
8259
8176
 
8260
8177
  var boundAttributesEnabled = false;
8261
8178
 
@@ -8268,7 +8185,8 @@ enifed("ember-htmlbars/hooks/attribute",
8268
8185
  if (isStream(attrValue)) {
8269
8186
  throw new EmberError('Bound attributes are not yet supported in Ember.js');
8270
8187
  } else {
8271
- env.dom.setAttribute(element, attrName, attrValue);
8188
+ var sanitizedValue = sanitizeAttributeValue(element, attrName, attrValue);
8189
+ env.dom.setAttribute(element, attrName, sanitizedValue);
8272
8190
  }
8273
8191
  }
8274
8192
  }
@@ -8295,51 +8213,23 @@ enifed("ember-htmlbars/hooks/component",
8295
8213
  }
8296
8214
  });
8297
8215
  enifed("ember-htmlbars/hooks/concat",
8298
- ["ember-metal/streams/stream","ember-metal/streams/utils","exports"],
8299
- function(__dependency1__, __dependency2__, __exports__) {
8216
+ ["ember-metal/streams/utils","exports"],
8217
+ function(__dependency1__, __exports__) {
8300
8218
  "use strict";
8301
8219
  /**
8302
8220
  @module ember
8303
8221
  @submodule ember-htmlbars
8304
8222
  */
8305
8223
 
8306
- var Stream = __dependency1__["default"];
8307
- var isStream = __dependency2__.isStream;
8308
- var readArray = __dependency2__.readArray;
8309
- var subscribe = __dependency2__.subscribe;
8224
+ var streamConcat = __dependency1__.concat;
8310
8225
 
8311
- // TODO: Create subclass ConcatStream < Stream. Defer
8312
- // subscribing to streams until the value() is called.
8313
8226
  __exports__["default"] = function concat(params) {
8314
- var i;
8315
- var isStatic = true;
8316
-
8317
- for (i = 0; i < params.length; i++) {
8318
- if (isStream(params[i])) {
8319
- isStatic = false;
8320
- break;
8321
- }
8322
- }
8323
-
8324
- if (isStatic) {
8325
- return params.join('');
8326
- } else {
8327
- var stream = new Stream(function() {
8328
- return readArray(params).join('');
8329
- });
8330
-
8331
- for (i = 0; i < params.length; i++) {
8332
- subscribe(params[i], stream.notify, stream);
8333
- }
8334
-
8335
- return stream;
8336
- }
8337
-
8227
+ return streamConcat(params, '');
8338
8228
  }
8339
8229
  });
8340
8230
  enifed("ember-htmlbars/hooks/content",
8341
- ["ember-htmlbars/hooks/subexpr","ember-views/views/simple_bound_view","exports"],
8342
- function(__dependency1__, __dependency2__, __exports__) {
8231
+ ["ember-htmlbars/hooks/subexpr","ember-views/views/simple_bound_view","ember-metal/streams/utils","exports"],
8232
+ function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
8343
8233
  "use strict";
8344
8234
  /**
8345
8235
  @module ember
@@ -8348,11 +8238,12 @@ enifed("ember-htmlbars/hooks/content",
8348
8238
 
8349
8239
  var subexpr = __dependency1__["default"];
8350
8240
  var appendSimpleBoundView = __dependency2__.appendSimpleBoundView;
8241
+ var isStream = __dependency3__.isStream;
8351
8242
 
8352
8243
  __exports__["default"] = function content(morph, path, view, params, hash, options, env) {
8353
8244
  var result = subexpr(path, view, params, hash, options, env);
8354
8245
 
8355
- if (result && result.isStream) {
8246
+ if (isStream(result)) {
8356
8247
  appendSimpleBoundView(view, morph, result);
8357
8248
  } else {
8358
8249
  morph.update(result);
@@ -8431,120 +8322,8 @@ enifed("ember-htmlbars/hooks/subexpr",
8431
8322
  }
8432
8323
  }
8433
8324
  });
8434
- enifed("ember-htmlbars/plugins/transform-each-in-to-hash",
8435
- ["htmlbars-syntax/walker","htmlbars-syntax/builders","exports"],
8436
- function(__dependency1__, __dependency2__, __exports__) {
8437
- "use strict";
8438
- var Walker = __dependency1__["default"];
8439
- var b = __dependency2__["default"];
8440
-
8441
- /**
8442
- An HTMLBars AST transformation that replaces all instances of
8443
-
8444
- ```handlebars
8445
- {{#each item in items}}
8446
- {{/each}}
8447
- ```
8448
-
8449
- with
8450
-
8451
- ```handlebars
8452
- {{#each items keyword="item"}}
8453
- {{/each}}
8454
- ```
8455
-
8456
- @private
8457
- @param {AST} The AST to be transformed.
8458
- */
8459
- __exports__["default"] = function(ast) {
8460
- var walker = new Walker();
8461
-
8462
- walker.visit(ast, function(node) {
8463
- if (validate(node)) {
8464
- var removedParams = node.sexpr.params.splice(0, 2);
8465
- var keyword = removedParams[0].original;
8466
-
8467
- // TODO: This may not be necessary.
8468
- if (!node.sexpr.hash) {
8469
- node.sexpr.hash = b.hash();
8470
- }
8471
-
8472
- node.sexpr.hash.pairs.push(b.pair(
8473
- 'keyword',
8474
- b.string(keyword)
8475
- ));
8476
- }
8477
- });
8478
-
8479
- return ast;
8480
- }
8481
-
8482
- function validate(node) {
8483
- return (node.type === 'BlockStatement' || node.type === 'MustacheStatement') &&
8484
- node.sexpr.path.original === 'each' &&
8485
- node.sexpr.params.length === 3 &&
8486
- node.sexpr.params[1].type === 'PathExpression' &&
8487
- node.sexpr.params[1].original === 'in';
8488
- }
8489
- });
8490
- enifed("ember-htmlbars/plugins/transform-with-as-to-hash",
8491
- ["htmlbars-syntax/walker","htmlbars-syntax/builders","exports"],
8492
- function(__dependency1__, __dependency2__, __exports__) {
8493
- "use strict";
8494
- var Walker = __dependency1__["default"];
8495
- var b = __dependency2__["default"];
8496
-
8497
- /**
8498
- An HTMLBars AST transformation that replaces all instances of
8499
-
8500
- ```handlebars
8501
- {{#with foo.bar as bar}}
8502
- {{/with}}
8503
- ```
8504
-
8505
- with
8506
-
8507
- ```handlebars
8508
- {{#with foo.bar keywordName="bar"}}
8509
- {{/with}}
8510
- ```
8511
-
8512
- @private
8513
- @param {AST} The AST to be transformed.
8514
- */
8515
- __exports__["default"] = function(ast) {
8516
- var walker = new Walker();
8517
-
8518
- walker.visit(ast, function(node) {
8519
- if (validate(node)) {
8520
- var removedParams = node.sexpr.params.splice(1, 2);
8521
- var keyword = removedParams[1].original;
8522
-
8523
- // TODO: This may not be necessary.
8524
- if (!node.sexpr.hash) {
8525
- node.sexpr.hash = b.hash();
8526
- }
8527
-
8528
- node.sexpr.hash.pairs.push(b.pair(
8529
- 'keywordName',
8530
- b.string(keyword)
8531
- ));
8532
- }
8533
- });
8534
-
8535
- return ast;
8536
- }
8537
-
8538
- function validate(node) {
8539
- return node.type === 'BlockStatement' &&
8540
- node.sexpr.path.original === 'with' &&
8541
- node.sexpr.params.length === 3 &&
8542
- node.sexpr.params[1].type === 'PathExpression' &&
8543
- node.sexpr.params[1].original === 'as';
8544
- }
8545
- });
8546
8325
  enifed("ember-htmlbars/system/bootstrap",
8547
- ["ember-metal/core","ember-views/component_lookup","ember-views/system/jquery","ember-metal/error","ember-runtime/system/lazy_load","ember-htmlbars/system/compile","exports"],
8326
+ ["ember-metal/core","ember-views/component_lookup","ember-views/system/jquery","ember-metal/error","ember-runtime/system/lazy_load","ember-template-compiler/system/compile","exports"],
8548
8327
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
8549
8328
  "use strict";
8550
8329
  /*globals Handlebars */
@@ -8650,48 +8429,6 @@ enifed("ember-htmlbars/system/bootstrap",
8650
8429
 
8651
8430
  __exports__["default"] = bootstrap;
8652
8431
  });
8653
- enifed("ember-htmlbars/system/compile",
8654
- ["ember-metal/core","htmlbars-compiler/compiler","ember-htmlbars/system/template","ember-htmlbars/plugins/transform-each-in-to-hash","ember-htmlbars/plugins/transform-with-as-to-hash","exports"],
8655
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
8656
- "use strict";
8657
- /**
8658
- @module ember
8659
- @submodule ember-htmlbars
8660
- */
8661
-
8662
- var Ember = __dependency1__["default"];
8663
- var compile = __dependency2__.compile;
8664
- var template = __dependency3__["default"];
8665
-
8666
- var transformEachInToHash = __dependency4__["default"];
8667
- var transformWithAsToHash = __dependency5__["default"];
8668
-
8669
- var disableComponentGeneration = true;
8670
-
8671
- /**
8672
- Uses HTMLBars `compile` function to process a string into a compiled template.
8673
-
8674
- This is not present in production builds.
8675
-
8676
- @private
8677
- @method template
8678
- @param {String} templateString This is the string to be compiled by HTMLBars.
8679
- */
8680
- __exports__["default"] = function(templateString) {
8681
- var templateSpec = compile(templateString, {
8682
- disableComponentGeneration: disableComponentGeneration,
8683
-
8684
- plugins: {
8685
- ast: [
8686
- transformEachInToHash,
8687
- transformWithAsToHash
8688
- ]
8689
- }
8690
- });
8691
-
8692
- return template(templateSpec);
8693
- }
8694
- });
8695
8432
  enifed("ember-htmlbars/system/helper",
8696
8433
  ["exports"],
8697
8434
  function(__exports__) {
@@ -8755,8 +8492,9 @@ enifed("ember-htmlbars/system/lookup-helper",
8755
8492
  @return {Handlebars Helper}
8756
8493
  */
8757
8494
  __exports__["default"] = function lookupHelper(name, view, env) {
8758
- if (env.helpers[name]) {
8759
- return env.helpers[name];
8495
+ var helper = env.helpers[name];
8496
+ if (helper) {
8497
+ return helper;
8760
8498
  }
8761
8499
 
8762
8500
  var container = view.container;
@@ -8766,7 +8504,7 @@ enifed("ember-htmlbars/system/lookup-helper",
8766
8504
  }
8767
8505
 
8768
8506
  var helperName = 'helper:' + name;
8769
- var helper = container.lookup(helperName);
8507
+ helper = container.lookup(helperName);
8770
8508
  if (!helper) {
8771
8509
  var componentLookup = container.lookup('component-lookup:main');
8772
8510
  Ember.assert("Could not find 'component-lookup:main' on the provided container," +
@@ -8824,8 +8562,8 @@ enifed("ember-htmlbars/system/make-view-helper",
8824
8562
  }
8825
8563
  });
8826
8564
  enifed("ember-htmlbars/system/make_bound_helper",
8827
- ["ember-metal/core","ember-metal/mixin","ember-views/views/simple_bound_view","ember-htmlbars/system/helper","ember-metal/streams/stream","ember-metal/streams/utils","exports"],
8828
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
8565
+ ["ember-metal/core","ember-htmlbars/system/helper","ember-metal/streams/stream","ember-metal/streams/utils","exports"],
8566
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
8829
8567
  "use strict";
8830
8568
  /**
8831
8569
  @module ember
@@ -8834,14 +8572,14 @@ enifed("ember-htmlbars/system/make_bound_helper",
8834
8572
 
8835
8573
  var Ember = __dependency1__["default"];
8836
8574
  // Ember.FEATURES, Ember.assert, Ember.Handlebars, Ember.lookup
8837
- var IS_BINDING = __dependency2__.IS_BINDING;
8838
- var appendSimpleBoundView = __dependency3__.appendSimpleBoundView;
8839
- var Helper = __dependency4__["default"];
8575
+ var Helper = __dependency2__["default"];
8840
8576
 
8841
- var Stream = __dependency5__["default"];
8842
- var readArray = __dependency6__.readArray;
8843
- var readHash = __dependency6__.readHash;
8844
- var subscribe = __dependency6__.subscribe;
8577
+ var Stream = __dependency3__["default"];
8578
+ var readArray = __dependency4__.readArray;
8579
+ var readHash = __dependency4__.readHash;
8580
+ var subscribe = __dependency4__.subscribe;
8581
+ var scanHash = __dependency4__.scanHash;
8582
+ var scanArray = __dependency4__.scanArray;
8845
8583
 
8846
8584
  /**
8847
8585
  Create a bound helper. Accepts a function that receives the ordered and hash parameters
@@ -8851,9 +8589,9 @@ enifed("ember-htmlbars/system/make_bound_helper",
8851
8589
 
8852
8590
  * `params` - An array of resolved ordered parameters.
8853
8591
  * `hash` - An object containing the hash parameters.
8854
-
8592
+
8855
8593
  For example:
8856
-
8594
+
8857
8595
  * With an unqouted ordered parameter:
8858
8596
 
8859
8597
  ```javascript
@@ -8864,7 +8602,7 @@ enifed("ember-htmlbars/system/make_bound_helper",
8864
8602
  an empty hash as its second.
8865
8603
 
8866
8604
  * With a quoted ordered parameter:
8867
-
8605
+
8868
8606
  ```javascript
8869
8607
  {{x-capitalize "foo"}}
8870
8608
  ```
@@ -8872,7 +8610,7 @@ enifed("ember-htmlbars/system/make_bound_helper",
8872
8610
  The bound helper would receive `["foo"]` as its first argument, and an empty hash as its second.
8873
8611
 
8874
8612
  * With an unquoted hash parameter:
8875
-
8613
+
8876
8614
  ```javascript
8877
8615
  {{x-repeat "foo" count=repeatCount}}
8878
8616
  ```
@@ -8889,30 +8627,25 @@ enifed("ember-htmlbars/system/make_bound_helper",
8889
8627
  __exports__["default"] = function makeBoundHelper(fn) {
8890
8628
  function helperFunc(params, hash, options, env) {
8891
8629
  var view = this;
8630
+ var numParams = params.length;
8631
+ var param, prop;
8892
8632
 
8893
8633
  Ember.assert("makeBoundHelper generated helpers do not support use with blocks", !options.template);
8894
8634
 
8895
- for (var prop in hash) {
8896
- if (IS_BINDING.test(prop)) {
8897
- hash[prop.slice(0, -7)] = view._getBindingForStream(hash[prop]);
8898
-
8899
- delete hash[prop];
8900
- }
8901
- }
8902
-
8903
8635
  function valueFn() {
8904
8636
  return fn.call(view, readArray(params), readHash(hash), options, env);
8905
8637
  }
8906
8638
 
8907
- if (env.data.isUnbound) {
8639
+ // If none of the hash parameters are bound, act as an unbound helper.
8640
+ // This prevents views from being unnecessarily created
8641
+ var hasStream = scanArray(params) || scanHash(hash);
8642
+
8643
+ if (env.data.isUnbound || !hasStream) {
8908
8644
  return valueFn();
8909
8645
  } else {
8910
8646
  var lazyValue = new Stream(valueFn);
8911
8647
 
8912
- appendSimpleBoundView(this, options.morph, lazyValue);
8913
-
8914
- var param;
8915
- for (var i = 0, l = params.length; i < l; i++) {
8648
+ for (var i = 0; i < numParams; i++) {
8916
8649
  param = params[i];
8917
8650
  subscribe(param, lazyValue.notify, lazyValue);
8918
8651
  }
@@ -8921,39 +8654,50 @@ enifed("ember-htmlbars/system/make_bound_helper",
8921
8654
  param = hash[prop];
8922
8655
  subscribe(param, lazyValue.notify, lazyValue);
8923
8656
  }
8657
+
8658
+ return lazyValue;
8924
8659
  }
8925
8660
  }
8926
8661
 
8927
8662
  return new Helper(helperFunc);
8928
8663
  }
8929
8664
  });
8930
- enifed("ember-htmlbars/system/template",
8931
- ["exports"],
8932
- function(__exports__) {
8665
+ enifed("ember-htmlbars/templates/component",
8666
+ ["ember-template-compiler/system/template","exports"],
8667
+ function(__dependency1__, __exports__) {
8933
8668
  "use strict";
8934
- /**
8935
- @module ember
8936
- @submodule ember-htmlbars
8937
- */
8938
-
8939
- /**
8940
- Augments the detault precompiled output of an HTMLBars template with
8941
- additional information needed by Ember.
8942
-
8943
- @private
8944
- @method template
8945
- @param {Function} templateSpec This is the compiled HTMLBars template spec.
8946
- */
8947
-
8948
- __exports__["default"] = function(templateSpec) {
8949
- templateSpec.isTop = true;
8950
- templateSpec.isMethod = false;
8951
-
8952
- return templateSpec;
8953
- }
8669
+ var template = __dependency1__["default"];
8670
+ var t = (function() {
8671
+ return {
8672
+ isHTMLBars: true,
8673
+ cachedFragment: null,
8674
+ build: function build(dom) {
8675
+ var el0 = dom.createDocumentFragment();
8676
+ var el1 = dom.createTextNode("");
8677
+ dom.appendChild(el0, el1);
8678
+ var el1 = dom.createTextNode("");
8679
+ dom.appendChild(el0, el1);
8680
+ return el0;
8681
+ },
8682
+ render: function render(context, env, contextualElement) {
8683
+ var dom = env.dom;
8684
+ var hooks = env.hooks, content = hooks.content;
8685
+ dom.detectNamespace(contextualElement);
8686
+ if (this.cachedFragment === null) {
8687
+ this.cachedFragment = this.build(dom);
8688
+ }
8689
+ var fragment = dom.cloneNode(this.cachedFragment, true);
8690
+ dom.repairClonedNode(fragment,[0,1]);
8691
+ var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
8692
+ content(morph0, "yield", context, [], {}, {morph: morph0}, env);
8693
+ return fragment;
8694
+ }
8695
+ };
8696
+ }());
8697
+ __exports__["default"] = template(t);
8954
8698
  });
8955
8699
  enifed("ember-htmlbars/templates/select",
8956
- ["ember-htmlbars/system/template","exports"],
8700
+ ["ember-template-compiler/system/template","exports"],
8957
8701
  function(__dependency1__, __exports__) {
8958
8702
  "use strict";
8959
8703
  var template = __dependency1__["default"];
@@ -9487,8 +9231,8 @@ enifed("ember-metal-views/renderer",
9487
9231
  __exports__["default"] = Renderer;
9488
9232
  });
9489
9233
  enifed("ember-metal",
9490
- ["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/cache","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/computed_macros","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","ember-metal/is_present","ember-metal/keys","exports"],
9491
- 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__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __dependency33__, __dependency34__, __dependency35__, __dependency36__, __exports__) {
9234
+ ["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/cache","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/computed_macros","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","ember-metal/is_present","ember-metal/keys","backburner","exports"],
9235
+ 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__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __dependency33__, __dependency34__, __dependency35__, __dependency36__, __dependency37__, __exports__) {
9492
9236
  "use strict";
9493
9237
  /**
9494
9238
  Ember Metal
@@ -9620,6 +9364,7 @@ enifed("ember-metal",
9620
9364
  var isBlank = __dependency34__["default"];
9621
9365
  var isPresent = __dependency35__["default"];
9622
9366
  var keys = __dependency36__["default"];
9367
+ var Backburner = __dependency37__["default"];
9623
9368
 
9624
9369
  // END IMPORTS
9625
9370
 
@@ -9764,6 +9509,13 @@ enifed("ember-metal",
9764
9509
 
9765
9510
  Ember.run = run;
9766
9511
 
9512
+ /**
9513
+ * @class Backburner
9514
+ * @for Ember
9515
+ * @private
9516
+ */
9517
+ Ember.Backburner = Backburner;
9518
+
9767
9519
  Ember.libraries = new Libraries();
9768
9520
  Ember.libraries.registerCoreLibrary('Ember', Ember.VERSION);
9769
9521
 
@@ -12324,7 +12076,7 @@ enifed("ember-metal/core",
12324
12076
 
12325
12077
  @class Ember
12326
12078
  @static
12327
- @version 1.10.0-beta.1
12079
+ @version 1.10.0-beta.2
12328
12080
  */
12329
12081
 
12330
12082
  if ('undefined' === typeof Ember) {
@@ -12351,10 +12103,10 @@ enifed("ember-metal/core",
12351
12103
  /**
12352
12104
  @property VERSION
12353
12105
  @type String
12354
- @default '1.10.0-beta.1'
12106
+ @default '1.10.0-beta.2'
12355
12107
  @static
12356
12108
  */
12357
- Ember.VERSION = '1.10.0-beta.1';
12109
+ Ember.VERSION = '1.10.0-beta.2';
12358
12110
 
12359
12111
  /**
12360
12112
  Standard environmental variables. You can define these in a global `EmberENV`
@@ -13505,17 +13257,16 @@ enifed("ember-metal/get_properties",
13505
13257
  }
13506
13258
  });
13507
13259
  enifed("ember-metal/injected_property",
13508
- ["ember-metal/core","ember-metal/computed","ember-metal/properties","ember-metal/platform","ember-metal/utils","ember-metal/error","exports"],
13260
+ ["ember-metal/core","ember-metal/computed","ember-metal/alias","ember-metal/properties","ember-metal/platform","ember-metal/utils","exports"],
13509
13261
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
13510
13262
  "use strict";
13511
13263
  var Ember = __dependency1__["default"];
13512
13264
  // Ember.assert
13513
13265
  var ComputedProperty = __dependency2__.ComputedProperty;
13514
- var Descriptor = __dependency3__.Descriptor;
13515
- var create = __dependency4__.create;
13516
- var meta = __dependency5__.meta;
13517
- var inspect = __dependency5__.inspect;
13518
- var EmberError = __dependency6__["default"];
13266
+ var AliasedProperty = __dependency3__.AliasedProperty;
13267
+ var Descriptor = __dependency4__.Descriptor;
13268
+ var create = __dependency5__.create;
13269
+ var meta = __dependency6__.meta;
13519
13270
 
13520
13271
  /**
13521
13272
  Read-only property that returns the result of a container lookup.
@@ -13533,7 +13284,7 @@ enifed("ember-metal/injected_property",
13533
13284
  this.name = name;
13534
13285
 
13535
13286
  this._super$Constructor(injectedPropertyGet);
13536
- this.readOnly();
13287
+ AliasedPropertyPrototype.oneWay.call(this);
13537
13288
  }
13538
13289
 
13539
13290
  function injectedPropertyGet(keyName) {
@@ -13546,22 +13297,17 @@ enifed("ember-metal/injected_property",
13546
13297
  return this.container.lookup(desc.type + ':' + (desc.name || keyName));
13547
13298
  }
13548
13299
 
13549
- function injectedPropertySet(obj, keyName) {
13550
- throw new EmberError("Cannot set injected property '" + keyName + "' on object: " + inspect(obj));
13551
- }
13552
-
13553
13300
  InjectedProperty.prototype = create(Descriptor.prototype);
13554
13301
 
13555
13302
  var InjectedPropertyPrototype = InjectedProperty.prototype;
13556
13303
  var ComputedPropertyPrototype = ComputedProperty.prototype;
13304
+ var AliasedPropertyPrototype = AliasedProperty.prototype;
13557
13305
 
13558
13306
  InjectedPropertyPrototype._super$Constructor = ComputedProperty;
13559
13307
 
13560
13308
  InjectedPropertyPrototype.get = ComputedPropertyPrototype.get;
13561
13309
  InjectedPropertyPrototype.readOnly = ComputedPropertyPrototype.readOnly;
13562
13310
 
13563
- InjectedPropertyPrototype.set = injectedPropertySet;
13564
-
13565
13311
  InjectedPropertyPrototype.teardown = ComputedPropertyPrototype.teardown;
13566
13312
 
13567
13313
  __exports__["default"] = InjectedProperty;
@@ -13656,6 +13402,11 @@ enifed("ember-metal/instrumentation",
13656
13402
  @param {Object} binding Context that instrument function is called with.
13657
13403
  */
13658
13404
  function instrument(name, _payload, callback, binding) {
13405
+ if (arguments.length <= 3 && typeof _payload === 'function') {
13406
+ binding = callback;
13407
+ callback = _payload;
13408
+ _payload = undefined;
13409
+ }
13659
13410
  if (subscribers.length === 0) {
13660
13411
  return callback.call(binding);
13661
13412
  }
@@ -14800,8 +14551,8 @@ enifed("ember-metal/merge",
14800
14551
  }
14801
14552
  });
14802
14553
  enifed("ember-metal/mixin",
14803
- ["ember-metal/core","ember-metal/merge","ember-metal/array","ember-metal/platform","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/expand_properties","ember-metal/properties","ember-metal/computed","ember-metal/binding","ember-metal/observer","ember-metal/events","exports"],
14804
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) {
14554
+ ["ember-metal/core","ember-metal/merge","ember-metal/array","ember-metal/platform","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/expand_properties","ember-metal/properties","ember-metal/computed","ember-metal/binding","ember-metal/observer","ember-metal/events","ember-metal/streams/utils","exports"],
14555
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __exports__) {
14805
14556
  // Remove "use strict"; from transpiled module until
14806
14557
  // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed
14807
14558
  //
@@ -14838,6 +14589,7 @@ enifed("ember-metal/mixin",
14838
14589
  var _suspendObserver = __dependency12__._suspendObserver;
14839
14590
  var addListener = __dependency13__.addListener;
14840
14591
  var removeListener = __dependency13__.removeListener;
14592
+ var isStream = __dependency14__.isStream;
14841
14593
 
14842
14594
  var REQUIRED;
14843
14595
  var a_slice = [].slice;
@@ -15150,7 +14902,7 @@ enifed("ember-metal/mixin",
15150
14902
  binding = bindings[key];
15151
14903
  if (binding) {
15152
14904
  to = key.slice(0, -7); // strip Binding off end
15153
- if (binding.isStream) {
14905
+ if (isStream(binding)) {
15154
14906
  connectStreamBinding(obj, to, binding);
15155
14907
  continue;
15156
14908
  } else if (binding instanceof Binding) {
@@ -15926,7 +15678,7 @@ enifed("ember-metal/path_cache",
15926
15678
 
15927
15679
  var isGlobalCache = new Cache(1000, function(key) { return IS_GLOBAL.test(key); });
15928
15680
  var isGlobalPathCache = new Cache(1000, function(key) { return IS_GLOBAL_PATH.test(key); });
15929
- var hasThisCache = new Cache(1000, function(key) { return key.indexOf(HAS_THIS) !== -1; });
15681
+ var hasThisCache = new Cache(1000, function(key) { return key.lastIndexOf(HAS_THIS, 0) === 0; });
15930
15682
  var firstDotIndexCache = new Cache(1000, function(key) { return key.indexOf('.'); });
15931
15683
 
15932
15684
  var firstKeyCache = new Cache(1000, function(path) {
@@ -16200,6 +15952,13 @@ enifed("ember-metal/platform/define_property",
16200
15952
  // Object.defineProperty once accessors have already been set.
16201
15953
  if (obj.a !== true) return;
16202
15954
 
15955
+ // Detects a bug in Android <3 where redefining a property without a value changes the value
15956
+ // Object.defineProperty once accessors have already been set.
15957
+ defineProperty(obj, 'a', {
15958
+ enumerable: false
15959
+ });
15960
+ if (obj.a !== true) return;
15961
+
16203
15962
  // defineProperty is compliant
16204
15963
  return defineProperty;
16205
15964
  } catch (e) {
@@ -16960,13 +16719,15 @@ enifed("ember-metal/property_set",
16960
16719
  if (isUnknown && 'function' === typeof obj.setUnknownProperty) {
16961
16720
  obj.setUnknownProperty(keyName, value);
16962
16721
  } else if (meta && meta.watching[keyName] > 0) {
16963
-
16964
- if (hasPropertyAccessors) {
16965
- currentValue = meta.values[keyName];
16966
- } else {
16967
- currentValue = obj[keyName];
16968
- }
16969
- // only trigger a change if the value has changed
16722
+ if (meta.proto !== obj) {
16723
+
16724
+ if (hasPropertyAccessors) {
16725
+ currentValue = meta.values[keyName];
16726
+ } else {
16727
+ currentValue = obj[keyName];
16728
+ }
16729
+ }
16730
+ // only trigger a change if the value has changed
16970
16731
  if (value !== currentValue) {
16971
16732
  propertyWillChange(obj, keyName);
16972
16733
 
@@ -17088,7 +16849,7 @@ enifed("ember-metal/run_loop",
17088
16849
 
17089
16850
  ```javascript
17090
16851
  run(function() {
17091
- // code to be execute within a RunLoop
16852
+ // code to be executed within a RunLoop
17092
16853
  });
17093
16854
  ```
17094
16855
 
@@ -17214,7 +16975,7 @@ enifed("ember-metal/run_loop",
17214
16975
 
17215
16976
  ```javascript
17216
16977
  run.begin();
17217
- // code to be execute within a RunLoop
16978
+ // code to be executed within a RunLoop
17218
16979
  run.end();
17219
16980
  ```
17220
16981
 
@@ -17232,7 +16993,7 @@ enifed("ember-metal/run_loop",
17232
16993
 
17233
16994
  ```javascript
17234
16995
  run.begin();
17235
- // code to be execute within a RunLoop
16996
+ // code to be executed within a RunLoop
17236
16997
  run.end();
17237
16998
  ```
17238
16999
 
@@ -17722,12 +17483,13 @@ enifed("ember-metal/streams/simple",
17722
17483
  var Stream = __dependency2__["default"];
17723
17484
  var create = __dependency3__.create;
17724
17485
  var read = __dependency4__.read;
17486
+ var isStream = __dependency4__.isStream;
17725
17487
 
17726
17488
  function SimpleStream(source) {
17727
17489
  this.init();
17728
17490
  this.source = source;
17729
17491
 
17730
- if (source && source.isStream) {
17492
+ if (isStream(source)) {
17731
17493
  source.subscribe(this._didChange, this);
17732
17494
  }
17733
17495
  }
@@ -17742,7 +17504,7 @@ enifed("ember-metal/streams/simple",
17742
17504
  setValue: function(value) {
17743
17505
  var source = this.source;
17744
17506
 
17745
- if (source && source.isStream) {
17507
+ if (isStream(source)) {
17746
17508
  source.setValue(value);
17747
17509
  }
17748
17510
  },
@@ -17750,11 +17512,11 @@ enifed("ember-metal/streams/simple",
17750
17512
  setSource: function(nextSource) {
17751
17513
  var prevSource = this.source;
17752
17514
  if (nextSource !== prevSource) {
17753
- if (prevSource && prevSource.isStream) {
17515
+ if (isStream(prevSource)) {
17754
17516
  prevSource.unsubscribe(this._didChange, this);
17755
17517
  }
17756
17518
 
17757
- if (nextSource && nextSource.isStream) {
17519
+ if (isStream(nextSource)) {
17758
17520
  nextSource.subscribe(this._didChange, this);
17759
17521
  }
17760
17522
 
@@ -17771,7 +17533,7 @@ enifed("ember-metal/streams/simple",
17771
17533
 
17772
17534
  destroy: function() {
17773
17535
  if (this._super$destroy()) {
17774
- if (this.source && this.source.isStream) {
17536
+ if (isStream(this.source)) {
17775
17537
  this.source.unsubscribe(this._didChange, this);
17776
17538
  }
17777
17539
  this.source = undefined;
@@ -17911,7 +17673,7 @@ enifed("ember-metal/streams/stream",
17911
17673
  children[key].destroy();
17912
17674
  }
17913
17675
 
17914
- return true;
17676
+ return true;
17915
17677
  }
17916
17678
  },
17917
17679
 
@@ -18011,9 +17773,11 @@ enifed("ember-metal/streams/stream_binding",
18011
17773
  __exports__["default"] = StreamBinding;
18012
17774
  });
18013
17775
  enifed("ember-metal/streams/utils",
18014
- ["exports"],
18015
- function(__exports__) {
17776
+ ["./stream","exports"],
17777
+ function(__dependency1__, __exports__) {
18016
17778
  "use strict";
17779
+ var Stream = __dependency1__["default"];
17780
+
18017
17781
  function isStream(object) {
18018
17782
  return object && object.isStream;
18019
17783
  }
@@ -18055,7 +17819,74 @@ enifed("ember-metal/streams/utils",
18055
17819
  return ret;
18056
17820
  }
18057
17821
 
18058
- __exports__.readHash = readHash;
17822
+ __exports__.readHash = readHash;/**
17823
+ * @function scanArray
17824
+ * @param array Array array given to a handlebars helper
17825
+ * @return Boolean whether the array contains a stream/bound value
17826
+ */
17827
+ function scanArray(array) {
17828
+ var length = array.length;
17829
+ var containsStream = false;
17830
+
17831
+ for (var i = 0; i < length; i++){
17832
+ if (isStream(array[i])) {
17833
+ containsStream = true;
17834
+ break;
17835
+ }
17836
+ }
17837
+
17838
+ return containsStream;
17839
+ }
17840
+
17841
+ __exports__.scanArray = scanArray;/**
17842
+ * @function scanHash
17843
+ * @param Object hash "hash" argument given to a handlebars helper
17844
+ * @return Boolean whether the object contains a stream/bound value
17845
+ */
17846
+ function scanHash(hash) {
17847
+ var containsStream = false;
17848
+
17849
+ for (var prop in hash) {
17850
+ if (isStream(hash[prop])) {
17851
+ containsStream = true;
17852
+ break;
17853
+ }
17854
+ }
17855
+
17856
+ return containsStream;
17857
+ }
17858
+
17859
+ __exports__.scanHash = scanHash;// TODO: Create subclass ConcatStream < Stream. Defer
17860
+ // subscribing to streams until the value() is called.
17861
+ function concat(array, key) {
17862
+ var hasStream = scanArray(array);
17863
+ if (hasStream) {
17864
+ var i, l;
17865
+ var stream = new Stream(function() {
17866
+ return readArray(array).join(key);
17867
+ });
17868
+
17869
+ for (i = 0, l=array.length; i < l; i++) {
17870
+ subscribe(array[i], stream.notify, stream);
17871
+ }
17872
+
17873
+ return stream;
17874
+ } else {
17875
+ return array.join(key);
17876
+ }
17877
+ }
17878
+
17879
+ __exports__.concat = concat;function chainStream(value, fn) {
17880
+ if (isStream(value)) {
17881
+ var stream = new Stream(fn);
17882
+ subscribe(value, stream.notify, stream);
17883
+ return stream;
17884
+ } else {
17885
+ return fn();
17886
+ }
17887
+ }
17888
+
17889
+ __exports__.chainStream = chainStream;
18059
17890
  });
18060
17891
  enifed("ember-metal/utils",
18061
17892
  ["ember-metal/core","ember-metal/platform","ember-metal/array","exports"],
@@ -19235,8 +19066,8 @@ enifed("ember-routing-htmlbars",
19235
19066
  __exports__["default"] = Ember;
19236
19067
  });
19237
19068
  enifed("ember-routing-htmlbars/helpers/action",
19238
- ["ember-metal/core","ember-metal/utils","ember-metal/run_loop","ember-views/streams/utils","ember-views/system/utils","ember-views/system/action_manager","ember-metal/array","exports"],
19239
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
19069
+ ["ember-metal/core","ember-metal/utils","ember-metal/run_loop","ember-views/streams/utils","ember-views/system/utils","ember-views/system/action_manager","ember-metal/array","ember-metal/streams/utils","exports"],
19070
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
19240
19071
  "use strict";
19241
19072
  /**
19242
19073
  @module ember
@@ -19251,6 +19082,7 @@ enifed("ember-routing-htmlbars/helpers/action",
19251
19082
  var isSimpleClick = __dependency5__.isSimpleClick;
19252
19083
  var ActionManager = __dependency6__["default"];
19253
19084
  var indexOf = __dependency7__.indexOf;
19085
+ var isStream = __dependency8__.isStream;
19254
19086
 
19255
19087
  function actionArgs(parameters, actionName) {
19256
19088
  var ret, i, l;
@@ -19336,7 +19168,7 @@ enifed("ember-routing-htmlbars/helpers/action",
19336
19168
 
19337
19169
  var actionName;
19338
19170
 
19339
- if (actionNameOrStream.isStream) {
19171
+ if (isStream(actionNameOrStream)) {
19340
19172
  actionName = actionNameOrStream.value();
19341
19173
 
19342
19174
  Ember.assert("You specified a quoteless path to the {{action}} helper " +
@@ -19533,7 +19365,7 @@ enifed("ember-routing-htmlbars/helpers/action",
19533
19365
  var target;
19534
19366
  if (!hash.target) {
19535
19367
  target = this.getStream('controller');
19536
- } else if (hash.target.isStream) {
19368
+ } else if (isStream(hash.target)) {
19537
19369
  target = hash.target;
19538
19370
  } else {
19539
19371
  target = this.getStream(hash.target);
@@ -20358,6 +20190,22 @@ enifed("ember-routing-views/views/link",
20358
20190
  **/
20359
20191
  rel: null,
20360
20192
 
20193
+ /**
20194
+ Sets the `tabindex` attribute of the `LinkView`'s HTML element.
20195
+
20196
+ @property tabindex
20197
+ @default null
20198
+ **/
20199
+ tabindex: null,
20200
+
20201
+ /**
20202
+ Sets the `target` attribute of the `LinkView`'s HTML element.
20203
+
20204
+ @property target
20205
+ @default null
20206
+ **/
20207
+ target: null,
20208
+
20361
20209
  /**
20362
20210
  The CSS class to apply to `LinkView`'s element when its `active`
20363
20211
  property is `true`.
@@ -20406,7 +20254,7 @@ enifed("ember-routing-views/views/link",
20406
20254
 
20407
20255
  @property attributeBindings
20408
20256
  @type Array | String
20409
- @default ['href', 'title', 'rel']
20257
+ @default ['href', 'title', 'rel', 'tabindex', 'target']
20410
20258
  **/
20411
20259
  attributeBindings: ['href', 'title', 'rel', 'tabindex'],
20412
20260
 
@@ -21159,13 +21007,28 @@ enifed("ember-routing/ext/controller",
21159
21007
  ```javascript
21160
21008
  aController.transitionToRoute('/');
21161
21009
  aController.transitionToRoute('/blog/post/1/comment/13');
21010
+ aController.transitionToRoute('/blog/posts?sort=title');
21011
+ ```
21012
+
21013
+ An options hash with a `queryParams` property may be provided as
21014
+ the final argument to add query parameters to the destination URL.
21015
+
21016
+ ```javascript
21017
+ aController.transitionToRoute('blogPost', 1, {
21018
+ queryParams: {showComments: 'true'}
21019
+ });
21020
+
21021
+ // if you just want to transition the query parameters without changing the route
21022
+ aController.transitionToRoute({queryParams: {sort: 'date'}});
21162
21023
  ```
21163
21024
 
21164
21025
  See also [replaceRoute](/api/classes/Ember.ControllerMixin.html#method_replaceRoute).
21165
21026
 
21166
21027
  @param {String} name the name of the route or a URL
21167
21028
  @param {...Object} models the model(s) or identifier(s) to be used
21168
- while transitioning to the route.
21029
+ while transitioning to the route.
21030
+ @param {Object} [options] optional hash with a queryParams property
21031
+ containing a mapping of query parameters
21169
21032
  @for Ember.ControllerMixin
21170
21033
  @method transitionToRoute
21171
21034
  */
@@ -23451,7 +23314,7 @@ enifed("ember-routing/system/route",
23451
23314
  _actions: {
23452
23315
 
23453
23316
  queryParamsDidChange: function(changed, totalPresent, removed) {
23454
- var qpMap = this.get('_qp').map;
23317
+ var qpMap = get(this, '_qp').map;
23455
23318
 
23456
23319
  var totalChanged = keys(changed).concat(keys(removed));
23457
23320
  for (var i = 0, len = totalChanged.length; i < len; ++i) {
@@ -23618,6 +23481,19 @@ enifed("ember-routing/system/route",
23618
23481
  ```javascript
23619
23482
  this.transitionTo('/');
23620
23483
  this.transitionTo('/blog/post/1/comment/13');
23484
+ this.transitionTo('/blog/posts?sort=title');
23485
+ ```
23486
+
23487
+ An options hash with a `queryParams` property may be provided as
23488
+ the final argument to add query parameters to the destination URL.
23489
+
23490
+ ```javascript
23491
+ this.transitionTo('blogPost', 1, {
23492
+ queryParams: {showComments: 'true'}
23493
+ });
23494
+
23495
+ // if you just want to transition the query parameters without changing the route
23496
+ this.transitionTo({queryParams: {sort: 'date'}});
23621
23497
  ```
23622
23498
 
23623
23499
  See also 'replaceWith'.
@@ -23685,10 +23561,30 @@ enifed("ember-routing/system/route",
23685
23561
  });
23686
23562
  ```
23687
23563
 
23564
+ Nested Route with Query String Example
23565
+
23566
+ ```javascript
23567
+ App.Router.map(function() {
23568
+ this.resource('fruits', function() {
23569
+ this.route('apples');
23570
+ });
23571
+ });
23572
+
23573
+ App.IndexRoute = Ember.Route.extend({
23574
+ actions: {
23575
+ transitionToApples: function() {
23576
+ this.transitionTo('fruits.apples', {queryParams: {color: 'red'}});
23577
+ }
23578
+ }
23579
+ });
23580
+ ```
23581
+
23688
23582
  @method transitionTo
23689
23583
  @param {String} name the name of the route or a URL
23690
23584
  @param {...Object} models the model(s) or identifier(s) to be used while
23691
23585
  transitioning to the route.
23586
+ @param {Object} [options] optional hash with a queryParams property
23587
+ containing a mapping of query parameters
23692
23588
  @return {Transition} the transition object associated with this
23693
23589
  attempted transition
23694
23590
  */
@@ -23931,7 +23827,7 @@ enifed("ember-routing/system/route",
23931
23827
  // convert the reject into a resolve and the
23932
23828
  // transition would continue. To propagate the
23933
23829
  // error so that it'd be handled by the `error`
23934
- // hook, you would have to either
23830
+ // hook, you would have to
23935
23831
  return Ember.RSVP.reject(e);
23936
23832
  });
23937
23833
  }
@@ -23941,7 +23837,6 @@ enifed("ember-routing/system/route",
23941
23837
 
23942
23838
  @method beforeModel
23943
23839
  @param {Transition} transition
23944
- @param {Object} queryParams the active query params for this route
23945
23840
  @return {Promise} if the value returned from this hook is
23946
23841
  a promise, the transition will pause until the transition
23947
23842
  resolves. Otherwise, non-promise return values are not
@@ -23975,7 +23870,6 @@ enifed("ember-routing/system/route",
23975
23870
  @param {Object} resolvedModel the value returned from `model`,
23976
23871
  or its resolved value if it was a promise
23977
23872
  @param {Transition} transition
23978
- @param {Object} queryParams the active query params for this handler
23979
23873
  @return {Promise} if the value returned from this hook is
23980
23874
  a promise, the transition will pause until the transition
23981
23875
  resolves. Otherwise, non-promise return values are not
@@ -24080,7 +23974,6 @@ enifed("ember-routing/system/route",
24080
23974
  @method model
24081
23975
  @param {Object} params the parameters extracted from the URL
24082
23976
  @param {Transition} transition
24083
- @param {Object} queryParams the query params for this route
24084
23977
  @return {Object|Promise} the model for this route. If
24085
23978
  a promise is returned, the transition will pause until
24086
23979
  the promise resolves, and the resolved value of the promise
@@ -24568,19 +24461,19 @@ enifed("ember-routing/system/route",
24568
24461
  @param {String} [options.model] the model object to set on `options.controller`
24569
24462
  Defaults to the return value of the Route's model hook
24570
24463
  */
24571
- render: function(name, options) {
24464
+ render: function(_name, options) {
24572
24465
  Ember.assert("The name in the given arguments is undefined", arguments.length > 0 ? !isNone(arguments[0]) : true);
24573
24466
 
24574
- var namePassed = typeof name === 'string' && !!name;
24467
+ var namePassed = typeof _name === 'string' && !!_name;
24468
+ var name;
24575
24469
 
24576
- if (typeof name === 'object' && !options) {
24577
- options = name;
24470
+ if (typeof _name === 'object' && !options) {
24578
24471
  name = this.routeName;
24472
+ options = _name;
24473
+ } else {
24474
+ name = _name;
24579
24475
  }
24580
24476
 
24581
- options = options || {};
24582
- options.namePassed = namePassed;
24583
-
24584
24477
  var templateName;
24585
24478
 
24586
24479
  if (name) {
@@ -24591,30 +24484,43 @@ enifed("ember-routing/system/route",
24591
24484
  templateName = this.templateName || name;
24592
24485
  }
24593
24486
 
24594
- var viewName = options.view || namePassed && name || this.viewName || name;
24487
+ var renderOptions = buildRenderOptions(this, namePassed, name, options);
24595
24488
 
24596
- var container = this.container;
24597
- var view = container.lookup('view:' + viewName);
24598
- var template = view ? view.get('template') : null;
24599
-
24600
- if (!template) {
24601
- template = container.lookup('template:' + templateName);
24602
- }
24489
+ var LOG_VIEW_LOOKUPS = get(this.router, 'namespace.LOG_VIEW_LOOKUPS');
24490
+ var viewName = options && options.view || namePassed && name || this.viewName || name;
24491
+ var view, template;
24603
24492
 
24604
- if (!view && !template) {
24605
- Ember.assert("Could not find \"" + name + "\" template or view.", Ember.isEmpty(arguments[0]));
24606
- if (get(this.router, 'namespace.LOG_VIEW_LOOKUPS')) {
24607
- Ember.Logger.info("Could not find \"" + name + "\" template or view. Nothing will be rendered", { fullName: 'template:' + name });
24493
+ var ViewClass = this.container.lookupFactory('view:' + viewName);
24494
+ if (ViewClass) {
24495
+ view = setupView(ViewClass, renderOptions);
24496
+ if (!get(view, 'template')) {
24497
+ view.set('template', this.container.lookup('template:' + templateName));
24498
+ }
24499
+ if (LOG_VIEW_LOOKUPS) {
24500
+ Ember.Logger.info("Rendering " + renderOptions.name + " with " + view, { fullName: 'view:' + renderOptions.name });
24501
+ }
24502
+ } else {
24503
+ template = this.container.lookup('template:' + templateName);
24504
+ if (!template) {
24505
+ Ember.assert("Could not find \"" + name + "\" template or view.", arguments.length === 0 || Ember.isEmpty(arguments[0]));
24506
+ if (LOG_VIEW_LOOKUPS) {
24507
+ Ember.Logger.info("Could not find \"" + name + "\" template or view. Nothing will be rendered", { fullName: 'template:' + name });
24508
+ }
24509
+ return;
24510
+ }
24511
+ var defaultView = renderOptions.into ? 'view:default' : 'view:toplevel';
24512
+ ViewClass = this.container.lookupFactory(defaultView);
24513
+ view = setupView(ViewClass, renderOptions);
24514
+ if (!get(view, 'template')) {
24515
+ view.set('template', template);
24516
+ }
24517
+ if (LOG_VIEW_LOOKUPS) {
24518
+ Ember.Logger.info("Rendering " + renderOptions.name + " with default view " + view, { fullName: 'view:' + renderOptions.name });
24608
24519
  }
24609
- return;
24610
24520
  }
24611
24521
 
24612
- options = normalizeOptions(this, name, template, options);
24613
- view = setupView(view, container, options);
24614
-
24615
- if (options.outlet === 'main') { this.lastRenderedTemplate = name; }
24616
-
24617
- appendView(this, view, options);
24522
+ if (renderOptions.outlet === 'main') { this.lastRenderedTemplate = name; }
24523
+ appendView(this, view, renderOptions);
24618
24524
  },
24619
24525
 
24620
24526
  /**
@@ -24737,25 +24643,15 @@ enifed("ember-routing/system/route",
24737
24643
  }
24738
24644
  }
24739
24645
 
24740
- function normalizeOptions(route, name, template, options) {
24741
- options = options || {};
24742
- options.into = options.into ? options.into.replace(/\//g, '.') : parentTemplate(route);
24743
- options.outlet = options.outlet || 'main';
24744
- options.name = name;
24745
- options.template = template;
24746
- options.LOG_VIEW_LOOKUPS = get(route.router, 'namespace.LOG_VIEW_LOOKUPS');
24747
-
24748
- Ember.assert("An outlet ("+options.outlet+") was specified but was not found.", options.outlet === 'main' || options.into);
24646
+ function buildRenderOptions(route, namePassed, name, options) {
24647
+ var controller = options && options.controller;
24749
24648
 
24750
- var controller = options.controller;
24751
- var model = options.model;
24752
-
24753
- if (options.controller) {
24754
- controller = options.controller;
24755
- } else if (options.namePassed) {
24756
- controller = route.container.lookup('controller:' + name) || route.controllerName || route.routeName;
24757
- } else {
24758
- controller = route.controllerName || route.container.lookup('controller:' + name);
24649
+ if (!controller) {
24650
+ if (namePassed) {
24651
+ controller = route.container.lookup('controller:' + name) || route.controllerName || route.routeName;
24652
+ } else {
24653
+ controller = route.controllerName || route.container.lookup('controller:' + name);
24654
+ }
24759
24655
  }
24760
24656
 
24761
24657
  if (typeof controller === 'string') {
@@ -24766,38 +24662,28 @@ enifed("ember-routing/system/route",
24766
24662
  }
24767
24663
  }
24768
24664
 
24769
- if (model) {
24770
- controller.set('model', model);
24771
- }
24772
-
24773
- options.controller = controller;
24774
-
24775
- return options;
24776
- }
24777
-
24778
- function setupView(view, container, options) {
24779
- if (view) {
24780
- if (options.LOG_VIEW_LOOKUPS) {
24781
- Ember.Logger.info("Rendering " + options.name + " with " + view, { fullName: 'view:' + options.name });
24782
- }
24783
- } else {
24784
- var defaultView = options.into ? 'view:default' : 'view:toplevel';
24785
- view = container.lookup(defaultView);
24786
- if (options.LOG_VIEW_LOOKUPS) {
24787
- Ember.Logger.info("Rendering " + options.name + " with default view " + view, { fullName: 'view:' + options.name });
24788
- }
24665
+ if (options && options.model) {
24666
+ controller.set('model', options.model);
24789
24667
  }
24790
24668
 
24791
- if (!get(view, 'templateName')) {
24792
- set(view, 'template', options.template);
24669
+ var renderOptions = {
24670
+ into: options && options.into ? options.into.replace(/\//g, '.') : parentTemplate(route),
24671
+ outlet: (options && options.outlet) || 'main',
24672
+ name: name,
24673
+ controller: controller
24674
+ };
24793
24675
 
24794
- set(view, '_debugTemplateName', options.name);
24795
- }
24676
+ Ember.assert("An outlet ("+renderOptions.outlet+") was specified but was not found.", renderOptions.outlet === 'main' || renderOptions.into);
24796
24677
 
24797
- set(view, 'renderedName', options.name);
24798
- set(view, 'controller', options.controller);
24678
+ return renderOptions;
24679
+ }
24799
24680
 
24800
- return view;
24681
+ function setupView(ViewClass, options) {
24682
+ return ViewClass.create({
24683
+ _debugTemplateName: options.name,
24684
+ renderedName: options.name,
24685
+ controller: options.controller
24686
+ });
24801
24687
  }
24802
24688
 
24803
24689
  function appendView(route, view, options) {
@@ -24808,7 +24694,7 @@ enifed("ember-routing/system/route",
24808
24694
  replace(route.teardownOutletViews, 0, 0, [teardownOutletView]);
24809
24695
  parentView.connectOutlet(options.outlet, view);
24810
24696
  } else {
24811
- var rootElement = get(route, 'router.namespace.rootElement');
24697
+ var rootElement = get(route.router, 'namespace.rootElement');
24812
24698
  // tear down view if one is already rendered
24813
24699
  if (route.teardownTopLevelView) {
24814
24700
  route.teardownTopLevelView();
@@ -24921,6 +24807,7 @@ enifed("ember-routing/system/router",
24921
24807
  @class Router
24922
24808
  @namespace Ember
24923
24809
  @extends Ember.Object
24810
+ @uses Ember.Evented
24924
24811
  */
24925
24812
  var EmberRouter = EmberObject.extend(Evented, {
24926
24813
  /**
@@ -28812,7 +28699,6 @@ enifed("ember-runtime/ext/rsvp",
28812
28699
  Ember.onerror(error);
28813
28700
  } else {
28814
28701
  Logger.error(error.stack);
28815
- Ember.assert(error, false);
28816
28702
  }
28817
28703
  }
28818
28704
  };
@@ -36759,6 +36645,301 @@ enifed("ember-runtime/system/tracked_array",
36759
36645
  this.rangeStart = rangeStart;
36760
36646
  }
36761
36647
  });
36648
+ enifed("ember-template-compiler",
36649
+ ["ember-metal/core","ember-template-compiler/system/precompile","ember-template-compiler/system/compile","ember-template-compiler/system/template","ember-template-compiler/plugins","ember-template-compiler/plugins/transform-each-in-to-hash","ember-template-compiler/plugins/transform-with-as-to-hash","exports"],
36650
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
36651
+ "use strict";
36652
+ var _Ember = __dependency1__["default"];
36653
+ var precompile = __dependency2__["default"];
36654
+ var compile = __dependency3__["default"];
36655
+ var template = __dependency4__["default"];
36656
+ var registerPlugin = __dependency5__.registerPlugin;
36657
+
36658
+ var TransformEachInToHash = __dependency6__["default"];
36659
+ var TransformWithAsToHash = __dependency7__["default"];
36660
+
36661
+ registerPlugin('ast', TransformWithAsToHash);
36662
+ registerPlugin('ast', TransformEachInToHash);
36663
+
36664
+ __exports__._Ember = _Ember;
36665
+ __exports__.precompile = precompile;
36666
+ __exports__.compile = compile;
36667
+ __exports__.template = template;
36668
+ __exports__.registerPlugin = registerPlugin;
36669
+ });
36670
+ enifed("ember-template-compiler/plugins",
36671
+ ["exports"],
36672
+ function(__exports__) {
36673
+ "use strict";
36674
+ /**
36675
+ @module ember
36676
+ @submodule ember-template-compiler
36677
+ */
36678
+
36679
+ /**
36680
+ @private
36681
+ @property helpers
36682
+ */
36683
+ var plugins = {
36684
+ ast: [ ]
36685
+ };
36686
+
36687
+ /**
36688
+ Adds an AST plugin to be used by Ember.HTMLBars.compile.
36689
+
36690
+ @private
36691
+ @method registerASTPlugin
36692
+ */
36693
+ function registerPlugin(type, Plugin) {
36694
+ if (!plugins[type]) {
36695
+ throw new Error('Attempting to register "' + Plugin + '" as "' + type + '" which is not a valid HTMLBars plugin type.');
36696
+ }
36697
+
36698
+ plugins[type].push(Plugin);
36699
+ }
36700
+
36701
+ __exports__.registerPlugin = registerPlugin;__exports__["default"] = plugins;
36702
+ });
36703
+ enifed("ember-template-compiler/plugins/transform-each-in-to-hash",
36704
+ ["exports"],
36705
+ function(__exports__) {
36706
+ "use strict";
36707
+ /**
36708
+ @module ember
36709
+ @submodule ember-htmlbars
36710
+ */
36711
+
36712
+
36713
+ /**
36714
+ An HTMLBars AST transformation that replaces all instances of
36715
+
36716
+ ```handlebars
36717
+ {{#each item in items}}
36718
+ {{/each}}
36719
+ ```
36720
+
36721
+ with
36722
+
36723
+ ```handlebars
36724
+ {{#each items keyword="item"}}
36725
+ {{/each}}
36726
+ ```
36727
+
36728
+ @class TransformEachInToHash
36729
+ @private
36730
+ */
36731
+ function TransformEachInToHash() {
36732
+ // set later within HTMLBars to the syntax package
36733
+ this.syntax = null;
36734
+ }
36735
+
36736
+ /**
36737
+ @private
36738
+ @method transform
36739
+ @param {AST} The AST to be transformed.
36740
+ */
36741
+ TransformEachInToHash.prototype.transform = function TransformEachInToHash_transform(ast) {
36742
+ var pluginContext = this;
36743
+ var walker = new pluginContext.syntax.Walker();
36744
+ var b = pluginContext.syntax.builders;
36745
+
36746
+ walker.visit(ast, function(node) {
36747
+ if (pluginContext.validate(node)) {
36748
+ var removedParams = node.sexpr.params.splice(0, 2);
36749
+ var keyword = removedParams[0].original;
36750
+
36751
+ // TODO: This may not be necessary.
36752
+ if (!node.sexpr.hash) {
36753
+ node.sexpr.hash = b.hash();
36754
+ }
36755
+
36756
+ node.sexpr.hash.pairs.push(b.pair(
36757
+ 'keyword',
36758
+ b.string(keyword)
36759
+ ));
36760
+ }
36761
+ });
36762
+
36763
+ return ast;
36764
+ };
36765
+
36766
+ TransformEachInToHash.prototype.validate = function TransformEachInToHash_validate(node) {
36767
+ return (node.type === 'BlockStatement' || node.type === 'MustacheStatement') &&
36768
+ node.sexpr.path.original === 'each' &&
36769
+ node.sexpr.params.length === 3 &&
36770
+ node.sexpr.params[1].type === 'PathExpression' &&
36771
+ node.sexpr.params[1].original === 'in';
36772
+ };
36773
+
36774
+ __exports__["default"] = TransformEachInToHash;
36775
+ });
36776
+ enifed("ember-template-compiler/plugins/transform-with-as-to-hash",
36777
+ ["exports"],
36778
+ function(__exports__) {
36779
+ "use strict";
36780
+ /**
36781
+ @module ember
36782
+ @submodule ember-htmlbars
36783
+ */
36784
+
36785
+ /**
36786
+ An HTMLBars AST transformation that replaces all instances of
36787
+
36788
+ ```handlebars
36789
+ {{#with foo.bar as bar}}
36790
+ {{/with}}
36791
+ ```
36792
+
36793
+ with
36794
+
36795
+ ```handlebars
36796
+ {{#with foo.bar as |bar|}}
36797
+ {{/with}}
36798
+ ```
36799
+
36800
+ @private
36801
+ @class TransformWithAsToHash
36802
+ */
36803
+ function TransformWithAsToHash() {
36804
+ // set later within HTMLBars to the syntax package
36805
+ this.syntax = null;
36806
+ }
36807
+
36808
+ /**
36809
+ @private
36810
+ @method transform
36811
+ @param {AST} The AST to be transformed.
36812
+ */
36813
+ TransformWithAsToHash.prototype.transform = function TransformWithAsToHash_transform(ast) {
36814
+ var pluginContext = this;
36815
+ var walker = new pluginContext.syntax.Walker();
36816
+
36817
+ walker.visit(ast, function(node) {
36818
+ if (pluginContext.validate(node)) {
36819
+ var removedParams = node.sexpr.params.splice(1, 2);
36820
+ var keyword = removedParams[1].original;
36821
+ node.program.blockParams = [ keyword ];
36822
+ }
36823
+ });
36824
+
36825
+ return ast;
36826
+ };
36827
+
36828
+ TransformWithAsToHash.prototype.validate = function TransformWithAsToHash_validate(node) {
36829
+ return node.type === 'BlockStatement' &&
36830
+ node.sexpr.path.original === 'with' &&
36831
+ node.sexpr.params.length === 3 &&
36832
+ node.sexpr.params[1].type === 'PathExpression' &&
36833
+ node.sexpr.params[1].original === 'as';
36834
+ };
36835
+
36836
+ __exports__["default"] = TransformWithAsToHash;
36837
+ });
36838
+ enifed("ember-template-compiler/system/compile",
36839
+ ["htmlbars-compiler/compiler","ember-template-compiler/system/compile_options","ember-template-compiler/system/template","exports"],
36840
+ function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
36841
+ "use strict";
36842
+ /**
36843
+ @module ember
36844
+ @submodule ember-template-compiler
36845
+ */
36846
+
36847
+ var compile = __dependency1__.compile;
36848
+ var compileOptions = __dependency2__["default"];
36849
+ var template = __dependency3__["default"];
36850
+
36851
+ /**
36852
+ Uses HTMLBars `compile` function to process a string into a compiled template.
36853
+
36854
+ This is not present in production builds.
36855
+
36856
+ @private
36857
+ @method compile
36858
+ @param {String} templateString This is the string to be compiled by HTMLBars.
36859
+ */
36860
+ __exports__["default"] = function(templateString) {
36861
+ var templateSpec = compile(templateString, compileOptions());
36862
+
36863
+ return template(templateSpec);
36864
+ }
36865
+ });
36866
+ enifed("ember-template-compiler/system/compile_options",
36867
+ ["ember-metal/core","ember-template-compiler/plugins","exports"],
36868
+ function(__dependency1__, __dependency2__, __exports__) {
36869
+ "use strict";
36870
+ /**
36871
+ @module ember
36872
+ @submodule ember-template-compiler
36873
+ */
36874
+
36875
+ var Ember = __dependency1__["default"];
36876
+ var plugins = __dependency2__["default"];
36877
+
36878
+ /**
36879
+ @private
36880
+ @property compileOptions
36881
+ */
36882
+ __exports__["default"] = function() {
36883
+ var disableComponentGeneration = true;
36884
+
36885
+ return {
36886
+ disableComponentGeneration: disableComponentGeneration,
36887
+
36888
+ plugins: plugins
36889
+ };
36890
+ }
36891
+ });
36892
+ enifed("ember-template-compiler/system/precompile",
36893
+ ["htmlbars-compiler/compiler","ember-template-compiler/system/compile_options","exports"],
36894
+ function(__dependency1__, __dependency2__, __exports__) {
36895
+ "use strict";
36896
+ /**
36897
+ @module ember
36898
+ @submodule ember-template-compiler
36899
+ */
36900
+
36901
+ var compileSpec = __dependency1__.compileSpec;
36902
+ var compileOptions = __dependency2__["default"];
36903
+
36904
+ /**
36905
+ Uses HTMLBars `compile` function to process a string into a compiled template string.
36906
+ The returned string must be passed through `Ember.HTMLBars.template`.
36907
+
36908
+ This is not present in production builds.
36909
+
36910
+ @private
36911
+ @method precompile
36912
+ @param {String} templateString This is the string to be compiled by HTMLBars.
36913
+ */
36914
+ __exports__["default"] = function(templateString) {
36915
+ return compileSpec(templateString, compileOptions());
36916
+ }
36917
+ });
36918
+ enifed("ember-template-compiler/system/template",
36919
+ ["exports"],
36920
+ function(__exports__) {
36921
+ "use strict";
36922
+ /**
36923
+ @module ember
36924
+ @submodule ember-template-compiler
36925
+ */
36926
+
36927
+ /**
36928
+ Augments the detault precompiled output of an HTMLBars template with
36929
+ additional information needed by Ember.
36930
+
36931
+ @private
36932
+ @method template
36933
+ @param {Function} templateSpec This is the compiled HTMLBars template spec.
36934
+ */
36935
+
36936
+ __exports__["default"] = function(templateSpec) {
36937
+ templateSpec.isTop = true;
36938
+ templateSpec.isMethod = false;
36939
+
36940
+ return templateSpec;
36941
+ }
36942
+ });
36762
36943
  enifed("ember-testing",
36763
36944
  ["ember-metal/core","ember-testing/initializers","ember-testing/support","ember-testing/setup_for_testing","ember-testing/test","ember-testing/adapters/adapter","ember-testing/adapters/qunit","ember-testing/helpers"],
36764
36945
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__) {
@@ -38585,6 +38766,151 @@ enifed("ember-views/mixins/view_target_action_support",
38585
38766
  actionContext: alias('context')
38586
38767
  });
38587
38768
  });
38769
+ enifed("ember-views/streams/class_name_binding",
38770
+ ["ember-metal/streams/utils","ember-metal/property_get","ember-runtime/system/string","ember-metal/utils","exports"],
38771
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
38772
+ "use strict";
38773
+ var chainStream = __dependency1__.chainStream;
38774
+ var read = __dependency1__.read;
38775
+ var get = __dependency2__.get;
38776
+ var dasherize = __dependency3__.dasherize;
38777
+ var isArray = __dependency4__.isArray;
38778
+
38779
+ /**
38780
+ Parse a path and return an object which holds the parsed properties.
38781
+
38782
+ For example a path like "content.isEnabled:enabled:disabled" will return the
38783
+ following object:
38784
+
38785
+ ```javascript
38786
+ {
38787
+ path: "content.isEnabled",
38788
+ className: "enabled",
38789
+ falsyClassName: "disabled",
38790
+ classNames: ":enabled:disabled"
38791
+ }
38792
+ ```
38793
+
38794
+ @method parsePropertyPath
38795
+ @static
38796
+ @private
38797
+ */
38798
+ function parsePropertyPath(path) {
38799
+ var split = path.split(':');
38800
+ var propertyPath = split[0];
38801
+ var classNames = "";
38802
+ var className, falsyClassName;
38803
+
38804
+ // check if the property is defined as prop:class or prop:trueClass:falseClass
38805
+ if (split.length > 1) {
38806
+ className = split[1];
38807
+ if (split.length === 3) {
38808
+ falsyClassName = split[2];
38809
+ }
38810
+
38811
+ classNames = ':' + className;
38812
+ if (falsyClassName) {
38813
+ classNames += ":" + falsyClassName;
38814
+ }
38815
+ }
38816
+
38817
+ return {
38818
+ path: propertyPath,
38819
+ classNames: classNames,
38820
+ className: (className === '') ? undefined : className,
38821
+ falsyClassName: falsyClassName
38822
+ };
38823
+ }
38824
+
38825
+ __exports__.parsePropertyPath = parsePropertyPath;/**
38826
+ Get the class name for a given value, based on the path, optional
38827
+ `className` and optional `falsyClassName`.
38828
+
38829
+ - if a `className` or `falsyClassName` has been specified:
38830
+ - if the value is truthy and `className` has been specified,
38831
+ `className` is returned
38832
+ - if the value is falsy and `falsyClassName` has been specified,
38833
+ `falsyClassName` is returned
38834
+ - otherwise `null` is returned
38835
+ - if the value is `true`, the dasherized last part of the supplied path
38836
+ is returned
38837
+ - if the value is not `false`, `undefined` or `null`, the `value`
38838
+ is returned
38839
+ - if none of the above rules apply, `null` is returned
38840
+
38841
+ @method classStringForValue
38842
+ @param path
38843
+ @param val
38844
+ @param className
38845
+ @param falsyClassName
38846
+ @static
38847
+ @private
38848
+ */
38849
+ function classStringForValue(path, val, className, falsyClassName) {
38850
+ if(isArray(val)) {
38851
+ val = get(val, 'length') !== 0;
38852
+ }
38853
+
38854
+ // When using the colon syntax, evaluate the truthiness or falsiness
38855
+ // of the value to determine which className to return
38856
+ if (className || falsyClassName) {
38857
+ if (className && !!val) {
38858
+ return className;
38859
+
38860
+ } else if (falsyClassName && !val) {
38861
+ return falsyClassName;
38862
+
38863
+ } else {
38864
+ return null;
38865
+ }
38866
+
38867
+ // If value is a Boolean and true, return the dasherized property
38868
+ // name.
38869
+ } else if (val === true) {
38870
+ // Normalize property path to be suitable for use
38871
+ // as a class name. For exaple, content.foo.barBaz
38872
+ // becomes bar-baz.
38873
+ var parts = path.split('.');
38874
+ return dasherize(parts[parts.length-1]);
38875
+
38876
+ // If the value is not false, undefined, or null, return the current
38877
+ // value of the property.
38878
+ } else if (val !== false && val != null) {
38879
+ return val;
38880
+
38881
+ // Nothing to display. Return null so that the old class is removed
38882
+ // but no new class is added.
38883
+ } else {
38884
+ return null;
38885
+ }
38886
+ }
38887
+
38888
+ __exports__.classStringForValue = classStringForValue;function streamifyClassNameBinding(view, classNameBinding, prefix){
38889
+ prefix = prefix || '';
38890
+ 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']", classNameBinding.indexOf(' ') === -1);
38891
+ var parsedPath = parsePropertyPath(classNameBinding);
38892
+ if (parsedPath.path === '') {
38893
+ return classStringForValue(
38894
+ parsedPath.path,
38895
+ true,
38896
+ parsedPath.className,
38897
+ parsedPath.falsyClassName
38898
+ );
38899
+ } else {
38900
+ var pathValue = view.getStream(prefix+parsedPath.path);
38901
+ return chainStream(pathValue, function(){
38902
+ return classStringForValue(
38903
+ parsedPath.path,
38904
+ read(pathValue),
38905
+ parsedPath.className,
38906
+ parsedPath.falsyClassName
38907
+ );
38908
+ });
38909
+ }
38910
+ }
38911
+
38912
+ __exports__.streamifyClassNameBinding = streamifyClassNameBinding;
38913
+ });
38588
38914
  enifed("ember-views/streams/conditional_stream",
38589
38915
  ["ember-metal/streams/stream","ember-metal/streams/utils","ember-metal/platform","exports"],
38590
38916
  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
@@ -38695,6 +39021,7 @@ enifed("ember-views/streams/key_stream",
38695
39021
  var removeObserver = __dependency6__.removeObserver;
38696
39022
  var Stream = __dependency7__["default"];
38697
39023
  var read = __dependency8__.read;
39024
+ var isStream = __dependency8__.isStream;
38698
39025
 
38699
39026
  function KeyStream(source, key) {
38700
39027
  Ember.assert("KeyStream error: key must be a non-empty string", typeof key === 'string' && key.length > 0);
@@ -38705,7 +39032,7 @@ enifed("ember-views/streams/key_stream",
38705
39032
  this.obj = undefined;
38706
39033
  this.key = key;
38707
39034
 
38708
- if (source && source.isStream) {
39035
+ if (isStream(source)) {
38709
39036
  source.subscribe(this._didChange, this);
38710
39037
  }
38711
39038
  }
@@ -38746,11 +39073,11 @@ enifed("ember-views/streams/key_stream",
38746
39073
  var prevSource = this.source;
38747
39074
 
38748
39075
  if (nextSource !== prevSource) {
38749
- if (prevSource && prevSource.isStream) {
39076
+ if (isStream(prevSource)) {
38750
39077
  prevSource.unsubscribe(this._didChange, this);
38751
39078
  }
38752
39079
 
38753
- if (nextSource && nextSource.isStream) {
39080
+ if (isStream(nextSource)) {
38754
39081
  nextSource.subscribe(this._didChange, this);
38755
39082
  }
38756
39083
 
@@ -38767,7 +39094,7 @@ enifed("ember-views/streams/key_stream",
38767
39094
 
38768
39095
  destroy: function() {
38769
39096
  if (this._super$destroy()) {
38770
- if (this.source && this.source.isStream) {
39097
+ if (isStream(this.source)) {
38771
39098
  this.source.unsubscribe(this._didChange, this);
38772
39099
  }
38773
39100
 
@@ -38800,6 +39127,7 @@ enifed("ember-views/streams/utils",
38800
39127
  var isGlobal = __dependency3__.isGlobal;
38801
39128
  var fmt = __dependency4__.fmt;
38802
39129
  var read = __dependency5__.read;
39130
+ var isStream = __dependency5__.isStream;
38803
39131
  var View = __dependency6__["default"];
38804
39132
  var ControllerMixin = __dependency7__["default"];
38805
39133
 
@@ -38819,13 +39147,13 @@ enifed("ember-views/streams/utils",
38819
39147
  viewClass = value;
38820
39148
  }
38821
39149
 
38822
- Ember.assert(fmt(value+" must be a subclass of Ember.View, not %@", [viewClass]), View.detect(viewClass));
39150
+ Ember.assert(fmt(value+" must be a subclass or an instance of Ember.View, not %@", [viewClass]), View.detect(viewClass) || View.detectInstance(viewClass));
38823
39151
 
38824
39152
  return viewClass;
38825
39153
  }
38826
39154
 
38827
39155
  __exports__.readViewFactory = readViewFactory;function readUnwrappedModel(object) {
38828
- if (object && object.isStream) {
39156
+ if (isStream(object)) {
38829
39157
  var result = object.value();
38830
39158
 
38831
39159
  // If the path is exactly `controller` then we don't unwrap it.
@@ -39498,15 +39826,15 @@ enifed("ember-views/system/render_buffer",
39498
39826
  @chainable
39499
39827
  */
39500
39828
  push: function(content) {
39501
- if (content.nodeType) {
39502
- Ember.assert("A fragment cannot be pushed into a buffer that contains content", !this.buffer);
39503
- this.buffer = content;
39504
- } else {
39829
+ if (typeof content === 'string') {
39505
39830
  if (this.buffer === null) {
39506
39831
  this.buffer = '';
39507
39832
  }
39508
39833
  Ember.assert("A string cannot be pushed into the buffer after a fragment", !this.buffer.nodeType);
39509
39834
  this.buffer += content;
39835
+ } else {
39836
+ Ember.assert("A fragment cannot be pushed into a buffer that contains content", !this.buffer);
39837
+ this.buffer = content;
39510
39838
  }
39511
39839
  return this;
39512
39840
  },
@@ -39654,7 +39982,6 @@ enifed("ember-views/system/render_buffer",
39654
39982
  }
39655
39983
 
39656
39984
  var element = this.dom.createElement(tagString, this.outerContextualElement());
39657
- var $element = jQuery(element);
39658
39985
 
39659
39986
  if (id) {
39660
39987
  this.dom.setAttribute(element, 'id', id);
@@ -39668,9 +39995,7 @@ enifed("ember-views/system/render_buffer",
39668
39995
 
39669
39996
  if (style) {
39670
39997
  for (prop in style) {
39671
- if (style.hasOwnProperty(prop)) {
39672
- styleBuffer += (prop + ':' + style[prop] + ';');
39673
- }
39998
+ styleBuffer += (prop + ':' + style[prop] + ';');
39674
39999
  }
39675
40000
 
39676
40001
  this.dom.setAttribute(element, 'style', styleBuffer);
@@ -39680,9 +40005,7 @@ enifed("ember-views/system/render_buffer",
39680
40005
 
39681
40006
  if (attrs) {
39682
40007
  for (attr in attrs) {
39683
- if (attrs.hasOwnProperty(attr)) {
39684
- this.dom.setAttribute(element, attr, attrs[attr]);
39685
- }
40008
+ this.dom.setAttribute(element, attr, attrs[attr]);
39686
40009
  }
39687
40010
 
39688
40011
  this.elementAttributes = null;
@@ -39690,9 +40013,7 @@ enifed("ember-views/system/render_buffer",
39690
40013
 
39691
40014
  if (props) {
39692
40015
  for (prop in props) {
39693
- if (props.hasOwnProperty(prop)) {
39694
- $element.prop(prop, props[prop]);
39695
- }
40016
+ this.dom.setProperty(element, prop, props[prop]);
39696
40017
  }
39697
40018
 
39698
40019
  this.elementProperties = null;
@@ -39730,7 +40051,10 @@ enifed("ember-views/system/render_buffer",
39730
40051
  this._element.appendChild(nodes[0]);
39731
40052
  }
39732
40053
  }
39733
- this.hydrateMorphs(contextualElement);
40054
+ // This should only happen with legacy string buffers
40055
+ if (this.childViews.length > 0) {
40056
+ this.hydrateMorphs(contextualElement);
40057
+ }
39734
40058
 
39735
40059
  return this._element;
39736
40060
  },
@@ -39793,8 +40117,8 @@ enifed("ember-views/system/render_buffer",
39793
40117
  };
39794
40118
  });
39795
40119
  enifed("ember-views/system/renderer",
39796
- ["ember-metal/core","ember-metal-views/renderer","ember-metal/platform","ember-views/system/render_buffer","ember-metal/run_loop","ember-metal/property_set","ember-metal/instrumentation","exports"],
39797
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
40120
+ ["ember-metal/core","ember-metal-views/renderer","ember-metal/platform","ember-views/system/render_buffer","ember-metal/run_loop","ember-metal/property_set","ember-metal/property_get","ember-metal/instrumentation","exports"],
40121
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
39798
40122
  "use strict";
39799
40123
  var Ember = __dependency1__["default"];
39800
40124
  var Renderer = __dependency2__["default"];
@@ -39802,8 +40126,9 @@ enifed("ember-views/system/renderer",
39802
40126
  var renderBuffer = __dependency4__["default"];
39803
40127
  var run = __dependency5__["default"];
39804
40128
  var set = __dependency6__.set;
39805
- var _instrumentStart = __dependency7__._instrumentStart;
39806
- var subscribers = __dependency7__.subscribers;
40129
+ var get = __dependency7__.get;
40130
+ var _instrumentStart = __dependency8__._instrumentStart;
40131
+ var subscribers = __dependency8__.subscribers;
39807
40132
 
39808
40133
  function EmberRenderer() {
39809
40134
  this.buffer = renderBuffer();
@@ -39831,8 +40156,12 @@ enifed("ember-views/system/renderer",
39831
40156
  // provided buffer operation (for example, `insertAfter` will
39832
40157
  // insert a new buffer after the "parent buffer").
39833
40158
  var tagName = view.tagName;
40159
+ if (tagName === undefined) {
40160
+ tagName = get(view, 'tagName');
40161
+ Ember.deprecate('In the future using a computed property to define tagName will not be permitted. That value will be respected, but changing it will not update the element.', !tagName);
40162
+ }
39834
40163
  var classNameBindings = view.classNameBindings;
39835
- var taglessViewWithClassBindings = tagName === '' && classNameBindings.length > 0;
40164
+ var taglessViewWithClassBindings = tagName === '' && (classNameBindings && classNameBindings.length > 0);
39836
40165
 
39837
40166
  if (tagName === null || tagName === undefined) {
39838
40167
  tagName = 'div';
@@ -39866,9 +40195,7 @@ enifed("ember-views/system/renderer",
39866
40195
 
39867
40196
  view.buffer = null;
39868
40197
  if (element && element.nodeType === 1) {
39869
- // We have hooks, we shouldn't make element observable
39870
- // consider just doing view.element = element
39871
- set(view, 'element', element);
40198
+ view.element = element;
39872
40199
  }
39873
40200
  return element;
39874
40201
  };
@@ -39928,6 +40255,60 @@ enifed("ember-views/system/renderer",
39928
40255
 
39929
40256
  __exports__["default"] = EmberRenderer;
39930
40257
  });
40258
+ enifed("ember-views/system/sanitize_attribute_value",
40259
+ ["exports"],
40260
+ function(__exports__) {
40261
+ "use strict";
40262
+ /* jshint scripturl:true */
40263
+
40264
+ var parsingNode;
40265
+ var badProtocols = {
40266
+ 'javascript:': true,
40267
+ 'vbscript:': true
40268
+ };
40269
+
40270
+ var badTags = {
40271
+ 'A': true,
40272
+ 'BODY': true,
40273
+ 'LINK': true,
40274
+ 'IMG': true,
40275
+ 'IFRAME': true
40276
+ };
40277
+
40278
+ var badAttributes = {
40279
+ 'href': true,
40280
+ 'src': true,
40281
+ 'background': true
40282
+ };
40283
+ __exports__.badAttributes = badAttributes;
40284
+ __exports__["default"] = function sanitizeAttributeValue(element, attribute, value) {
40285
+ var tagName;
40286
+
40287
+ if (!parsingNode) {
40288
+ parsingNode = document.createElement('a');
40289
+ }
40290
+
40291
+ if (!element) {
40292
+ tagName = null;
40293
+ } else {
40294
+ tagName = element.tagName;
40295
+ }
40296
+
40297
+ if (value && value.toHTML) {
40298
+ return value.toHTML();
40299
+ }
40300
+
40301
+ if ((tagName === null || badTags[tagName]) && badAttributes[attribute]) {
40302
+ parsingNode.href = value;
40303
+
40304
+ if (badProtocols[parsingNode.protocol] === true) {
40305
+ return 'unsafe:' + value;
40306
+ }
40307
+ }
40308
+
40309
+ return value;
40310
+ }
40311
+ });
39931
40312
  enifed("ember-views/system/utils",
39932
40313
  ["exports"],
39933
40314
  function(__exports__) {
@@ -40709,8 +41090,8 @@ enifed("ember-views/views/collection_view",
40709
41090
  __exports__["default"] = CollectionView;
40710
41091
  });
40711
41092
  enifed("ember-views/views/component",
40712
- ["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"],
40713
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
41093
+ ["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","ember-htmlbars/templates/component","exports"],
41094
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
40714
41095
  "use strict";
40715
41096
  var Ember = __dependency1__["default"];
40716
41097
  // Ember.assert, Ember.Handlebars
@@ -40724,6 +41105,7 @@ enifed("ember-views/views/component",
40724
41105
  var isNone = __dependency7__["default"];
40725
41106
 
40726
41107
  var computed = __dependency8__.computed;
41108
+ var defaultComponentLayout = __dependency9__["default"];
40727
41109
 
40728
41110
  var a_slice = Array.prototype.slice;
40729
41111
 
@@ -40831,12 +41213,7 @@ enifed("ember-views/views/component",
40831
41213
  set(this, 'controller', this);
40832
41214
  },
40833
41215
 
40834
- defaultLayout: function(context, options){
40835
-
40836
- // ES6TODO: must use global here, to prevent circular require issue
40837
- // remove and replace with standard import once we have lazy binding
40838
- Ember.HTMLBars.helpers.yield.helperFunction.call(context, [], {}, options, { data: { view: context }});
40839
- },
41216
+ defaultLayout: defaultComponentLayout,
40840
41217
 
40841
41218
  /**
40842
41219
  A components template property is set by passing a block
@@ -41501,7 +41878,8 @@ enifed("ember-views/views/core_view",
41501
41878
 
41502
41879
  init: function() {
41503
41880
  this._super();
41504
- this._transitionTo('preRender');
41881
+ this._state = 'preRender';
41882
+ this.currentState = this._states.preRender;
41505
41883
  this._isVisible = get(this, 'isVisible');
41506
41884
  },
41507
41885
 
@@ -42460,6 +42838,7 @@ enifed("ember-views/views/simple_bound_view",
42460
42838
  SimpleBoundView.prototype = {
42461
42839
  isVirtual: true,
42462
42840
  isView: true,
42841
+ tagName: '',
42463
42842
 
42464
42843
  destroy: function () {
42465
42844
  if (this.updateId) {
@@ -42818,8 +43197,10 @@ enifed("ember-views/views/states/in_dom",
42818
43197
  View.views[view.elementId] = view;
42819
43198
  }
42820
43199
 
42821
- addBeforeObserver(view, 'elementId', function() {
42822
- throw new EmberError("Changing a view's elementId after creation is not allowed");
43200
+ Ember.runInDebug(function() {
43201
+ addBeforeObserver(view, 'elementId', function() {
43202
+ throw new EmberError("Changing a view's elementId after creation is not allowed");
43203
+ });
42823
43204
  });
42824
43205
  },
42825
43206
 
@@ -43031,8 +43412,8 @@ enifed("ember-views/views/text_field",
43031
43412
  });
43032
43413
  });
43033
43414
  enifed("ember-views/views/view",
43034
- ["ember-metal/core","ember-metal/platform","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/streams/simple","ember-views/streams/key_stream","ember-metal/streams/stream_binding","ember-views/streams/context_stream","ember-metal/is_none","ember-metal/deprecate_property","ember-runtime/system/native_array","ember-runtime/system/string","ember-metal/enumerable_utils","ember-metal/property_events","ember-views/system/jquery","ember-views/system/ext","ember-views/views/core_view","exports"],
43035
- 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__) {
43415
+ ["ember-metal/core","ember-metal/platform","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/streams/simple","ember-views/streams/key_stream","ember-metal/streams/stream_binding","ember-views/streams/context_stream","ember-metal/is_none","ember-metal/deprecate_property","ember-runtime/system/native_array","ember-views/streams/class_name_binding","ember-metal/enumerable_utils","ember-metal/property_events","ember-views/system/jquery","ember-views/system/ext","ember-views/views/core_view","ember-metal/streams/utils","ember-views/system/sanitize_attribute_value","exports"],
43416
+ 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__, __dependency29__, __exports__) {
43036
43417
  "use strict";
43037
43418
  // Ember.assert, Ember.deprecate, Ember.warn, Ember.TEMPLATES,
43038
43419
  // jQuery, Ember.lookup,
@@ -43060,13 +43441,12 @@ enifed("ember-views/views/view",
43060
43441
  var ContextStream = __dependency18__["default"];
43061
43442
 
43062
43443
  var typeOf = __dependency12__.typeOf;
43063
- var isArray = __dependency12__.isArray;
43064
43444
  var isNone = __dependency19__["default"];
43065
43445
  var Mixin = __dependency14__.Mixin;
43066
43446
  var deprecateProperty = __dependency20__.deprecateProperty;
43067
43447
  var emberA = __dependency21__.A;
43068
43448
 
43069
- var dasherize = __dependency22__.dasherize;
43449
+ var streamifyClassNameBinding = __dependency22__.streamifyClassNameBinding;
43070
43450
 
43071
43451
  // ES6TODO: functions on EnumerableUtils should get their own export
43072
43452
  var forEach = __dependency23__.forEach;
@@ -43082,6 +43462,10 @@ enifed("ember-views/views/view",
43082
43462
  // for the side effect of extending Ember.run.queues
43083
43463
 
43084
43464
  var CoreView = __dependency27__["default"];
43465
+ var subscribe = __dependency28__.subscribe;
43466
+ var read = __dependency28__.read;
43467
+ var isStream = __dependency28__.isStream;
43468
+ var sanitizeAttributeValue = __dependency29__["default"];
43085
43469
 
43086
43470
  function K() { return this; }
43087
43471
 
@@ -43796,6 +44180,8 @@ enifed("ember-views/views/view",
43796
44180
  return template || get(this, 'defaultTemplate');
43797
44181
  }),
43798
44182
 
44183
+ _controller: null,
44184
+
43799
44185
  /**
43800
44186
  The controller managing this view. If this property is set, it will be
43801
44187
  made available for use by the template.
@@ -43803,7 +44189,16 @@ enifed("ember-views/views/view",
43803
44189
  @property controller
43804
44190
  @type Object
43805
44191
  */
43806
- controller: computed('_parentView', function(key) {
44192
+ controller: computed(function(key, value) {
44193
+ if (arguments.length === 2) {
44194
+ this._controller = value;
44195
+ return value;
44196
+ }
44197
+
44198
+ if (this._controller) {
44199
+ return this._controller;
44200
+ }
44201
+
43807
44202
  var parentView = get(this, '_parentView');
43808
44203
  return parentView ? get(parentView, 'controller') : null;
43809
44204
  }),
@@ -43902,7 +44297,11 @@ enifed("ember-views/views/view",
43902
44297
  @property _context
43903
44298
  @private
43904
44299
  */
43905
- _context: computed(function(key) {
44300
+ _context: computed(function(key, value) {
44301
+ if (arguments.length === 2) {
44302
+ return value;
44303
+ }
44304
+
43906
44305
  var parentView, controller;
43907
44306
 
43908
44307
  if (controller = get(this, 'controller')) {
@@ -44180,18 +44579,11 @@ enifed("ember-views/views/view",
44180
44579
  // ('content.isUrgent')
44181
44580
  forEach(classBindings, function(binding) {
44182
44581
 
44183
- var parsedPath;
44184
-
44185
- if (typeof binding === 'string') {
44186
- 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);
44187
- parsedPath = View._parsePropertyPath(binding);
44188
- if (parsedPath.path === '') {
44189
- parsedPath.stream = new SimpleStream(true);
44190
- } else {
44191
- parsedPath.stream = this.getStream('_view.' + parsedPath.path);
44192
- }
44582
+ var boundBinding;
44583
+ if (isStream(binding)) {
44584
+ boundBinding = binding;
44193
44585
  } else {
44194
- parsedPath = binding;
44586
+ boundBinding = streamifyClassNameBinding(this, binding, '_view.');
44195
44587
  }
44196
44588
 
44197
44589
  // Variable in which the old class value is saved. The observer function
@@ -44203,8 +44595,8 @@ enifed("ember-views/views/view",
44203
44595
  // class name.
44204
44596
  var observer = this._wrapAsScheduled(function() {
44205
44597
  // Get the current value of the property
44206
- newClass = this._classStringForProperty(parsedPath);
44207
44598
  elem = this.$();
44599
+ newClass = read(boundBinding);
44208
44600
 
44209
44601
  // If we had previously added a class to the element, remove it.
44210
44602
  if (oldClass) {
@@ -44225,7 +44617,7 @@ enifed("ember-views/views/view",
44225
44617
  });
44226
44618
 
44227
44619
  // Get the class name for the property at its current value
44228
- dasherizedClass = this._classStringForProperty(parsedPath);
44620
+ dasherizedClass = read(boundBinding);
44229
44621
 
44230
44622
  if (dasherizedClass) {
44231
44623
  // Ensure that it gets into the classNames array
@@ -44238,7 +44630,7 @@ enifed("ember-views/views/view",
44238
44630
  oldClass = dasherizedClass;
44239
44631
  }
44240
44632
 
44241
- parsedPath.stream.subscribe(observer, this);
44633
+ subscribe(boundBinding, observer, this);
44242
44634
  // Remove className so when the view is rerendered,
44243
44635
  // the className is added based on binding reevaluation
44244
44636
  this.one('willClearRender', function() {
@@ -44433,7 +44825,7 @@ enifed("ember-views/views/view",
44433
44825
  /**
44434
44826
  Replaces the content of the specified parent element with this view's
44435
44827
  element. If the view does not have an HTML representation yet,
44436
- `createElement()` will be called automatically.
44828
+ the element will be generated automatically.
44437
44829
 
44438
44830
  Note that this method just schedules the view to be appended; the DOM
44439
44831
  element will not be appended to the given element until all bindings have
@@ -44456,8 +44848,8 @@ enifed("ember-views/views/view",
44456
44848
 
44457
44849
  /**
44458
44850
  Appends the view's element to the document body. If the view does
44459
- not have an HTML representation yet, `createElement()` will be called
44460
- automatically.
44851
+ not have an HTML representation yet
44852
+ the element will be generated automatically.
44461
44853
 
44462
44854
  If your application uses the `rootElement` property, you must append
44463
44855
  the view within that element. Rendering views outside of the `rootElement`
@@ -44489,6 +44881,22 @@ enifed("ember-views/views/view",
44489
44881
  if (!this.removedFromDOM) { this.destroyElement(); }
44490
44882
  },
44491
44883
 
44884
+ /**
44885
+ The HTML `id` of the view's element in the DOM. You can provide this
44886
+ value yourself but it must be unique (just as in HTML):
44887
+
44888
+ ```handlebars
44889
+ {{my-component elementId="a-really-cool-id"}}
44890
+ ```
44891
+
44892
+ If not manually set a default value will be provided by the framework.
44893
+
44894
+ Once rendered an element's `elementId` is considered immutable and you
44895
+ should never change it.
44896
+
44897
+ @property elementId
44898
+ @type String
44899
+ */
44492
44900
  elementId: null,
44493
44901
 
44494
44902
  /**
@@ -44609,7 +45017,7 @@ enifed("ember-views/views/view",
44609
45017
  applyAttributesToBuffer: function(buffer) {
44610
45018
  // Creates observers for all registered class name and attribute bindings,
44611
45019
  // then adds them to the element.
44612
- var classNameBindings = get(this, 'classNameBindings');
45020
+ var classNameBindings = this.classNameBindings;
44613
45021
  if (classNameBindings.length) {
44614
45022
  this._applyClassNameBindings(classNameBindings);
44615
45023
  }
@@ -44617,7 +45025,7 @@ enifed("ember-views/views/view",
44617
45025
  // Pass the render buffer so the method can apply attributes directly.
44618
45026
  // This isn't needed for class name bindings because they use the
44619
45027
  // existing classNames infrastructure.
44620
- var attributeBindings = get(this, 'attributeBindings');
45028
+ var attributeBindings = this.attributeBindings;
44621
45029
  if (attributeBindings.length) {
44622
45030
  this._applyAttributeBindings(buffer, attributeBindings);
44623
45031
  }
@@ -45078,7 +45486,7 @@ enifed("ember-views/views/view",
45078
45486
  }
45079
45487
 
45080
45488
  var path = pathOrStream;
45081
- if (pathOrStream.isStream) {
45489
+ if (isStream(pathOrStream)) {
45082
45490
  path = pathOrStream._label;
45083
45491
 
45084
45492
  if (!path) {
@@ -45165,115 +45573,6 @@ enifed("ember-views/views/view",
45165
45573
  // once the view has been inserted into the DOM, legal manipulations
45166
45574
  // are done on the DOM element.
45167
45575
 
45168
- View.reopenClass({
45169
-
45170
- /**
45171
- Parse a path and return an object which holds the parsed properties.
45172
-
45173
- For example a path like "content.isEnabled:enabled:disabled" will return the
45174
- following object:
45175
-
45176
- ```javascript
45177
- {
45178
- path: "content.isEnabled",
45179
- className: "enabled",
45180
- falsyClassName: "disabled",
45181
- classNames: ":enabled:disabled"
45182
- }
45183
- ```
45184
-
45185
- @method _parsePropertyPath
45186
- @static
45187
- @private
45188
- */
45189
- _parsePropertyPath: function(path) {
45190
- var split = path.split(':');
45191
- var propertyPath = split[0];
45192
- var classNames = "";
45193
- var className, falsyClassName;
45194
-
45195
- // check if the property is defined as prop:class or prop:trueClass:falseClass
45196
- if (split.length > 1) {
45197
- className = split[1];
45198
- if (split.length === 3) { falsyClassName = split[2]; }
45199
-
45200
- classNames = ':' + className;
45201
- if (falsyClassName) { classNames += ":" + falsyClassName; }
45202
- }
45203
-
45204
- return {
45205
- stream: undefined,
45206
- path: propertyPath,
45207
- classNames: classNames,
45208
- className: (className === '') ? undefined : className,
45209
- falsyClassName: falsyClassName
45210
- };
45211
- },
45212
-
45213
- /**
45214
- Get the class name for a given value, based on the path, optional
45215
- `className` and optional `falsyClassName`.
45216
-
45217
- - if a `className` or `falsyClassName` has been specified:
45218
- - if the value is truthy and `className` has been specified,
45219
- `className` is returned
45220
- - if the value is falsy and `falsyClassName` has been specified,
45221
- `falsyClassName` is returned
45222
- - otherwise `null` is returned
45223
- - if the value is `true`, the dasherized last part of the supplied path
45224
- is returned
45225
- - if the value is not `false`, `undefined` or `null`, the `value`
45226
- is returned
45227
- - if none of the above rules apply, `null` is returned
45228
-
45229
- @method _classStringForValue
45230
- @param path
45231
- @param val
45232
- @param className
45233
- @param falsyClassName
45234
- @static
45235
- @private
45236
- */
45237
- _classStringForValue: function(path, val, className, falsyClassName) {
45238
- if(isArray(val)) {
45239
- val = get(val, 'length') !== 0;
45240
- }
45241
-
45242
- // When using the colon syntax, evaluate the truthiness or falsiness
45243
- // of the value to determine which className to return
45244
- if (className || falsyClassName) {
45245
- if (className && !!val) {
45246
- return className;
45247
-
45248
- } else if (falsyClassName && !val) {
45249
- return falsyClassName;
45250
-
45251
- } else {
45252
- return null;
45253
- }
45254
-
45255
- // If value is a Boolean and true, return the dasherized property
45256
- // name.
45257
- } else if (val === true) {
45258
- // Normalize property path to be suitable for use
45259
- // as a class name. For exaple, content.foo.barBaz
45260
- // becomes bar-baz.
45261
- var parts = path.split('.');
45262
- return dasherize(parts[parts.length-1]);
45263
-
45264
- // If the value is not false, undefined, or null, return the current
45265
- // value of the property.
45266
- } else if (val !== false && val != null) {
45267
- return val;
45268
-
45269
- // Nothing to display. Return null so that the old class is removed
45270
- // but no new class is added.
45271
- } else {
45272
- return null;
45273
- }
45274
- }
45275
- });
45276
-
45277
45576
  var mutation = EmberObject.extend(Evented).create();
45278
45577
  // TODO MOVE TO RENDERER HOOKS
45279
45578
  View.addMutationListener = function(callback) {
@@ -45305,7 +45604,8 @@ enifed("ember-views/views/view",
45305
45604
  View.childViewsProperty = childViewsProperty;
45306
45605
 
45307
45606
  // Used by Handlebars helpers, view element attributes
45308
- View.applyAttributeBindings = function(elem, name, value) {
45607
+ View.applyAttributeBindings = function(elem, name, initialValue) {
45608
+ var value = sanitizeAttributeValue(elem[0], name, initialValue);
45309
45609
  var type = typeOf(value);
45310
45610
 
45311
45611
  // if this changes, also change the logic in ember-handlebars/lib/helpers/binding.js
@@ -45352,11 +45652,8 @@ enifed("ember-views/views/with_view",
45352
45652
  init: function() {
45353
45653
  apply(this, this._super, arguments);
45354
45654
 
45355
- var keywordName = this.templateHash.keywordName;
45356
45655
  var controllerName = this.templateHash.controller;
45357
45656
 
45358
- this._blockArguments = [this.lazyValue];
45359
-
45360
45657
  if (controllerName) {
45361
45658
  var previousContext = this.previousContext;
45362
45659
  var controller = this.container.lookupFactory('controller:'+controllerName).create({
@@ -45367,7 +45664,7 @@ enifed("ember-views/views/with_view",
45367
45664
  this._generatedController = controller;
45368
45665
 
45369
45666
  if (this.preserveContext) {
45370
- this._keywords[keywordName] = controller;
45667
+ this._blockArguments = [ controller ];
45371
45668
  this.lazyValue.subscribe(function(modelStream) {
45372
45669
  set(controller, 'model', modelStream.value());
45373
45670
  });
@@ -45382,7 +45679,7 @@ enifed("ember-views/views/with_view",
45382
45679
  set(controller, 'model', this.lazyValue.value());
45383
45680
  } else {
45384
45681
  if (this.preserveContext) {
45385
- this._keywords[keywordName] = this.lazyValue;
45682
+ this._blockArguments = [ this.lazyValue ];
45386
45683
  }
45387
45684
  }
45388
45685
  },
@@ -48227,8 +48524,8 @@ enifed("htmlbars-syntax/node-handlers",
48227
48524
  __exports__["default"] = nodeHandlers;
48228
48525
  });
48229
48526
  enifed("htmlbars-syntax/parser",
48230
- ["./handlebars/compiler/base","../simple-html-tokenizer","../simple-html-tokenizer/entity-parser","../simple-html-tokenizer/char-refs/full","./node-handlers","./token-handlers","exports"],
48231
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
48527
+ ["./handlebars/compiler/base","../simple-html-tokenizer","../simple-html-tokenizer/entity-parser","../simple-html-tokenizer/char-refs/full","./node-handlers","./token-handlers","../htmlbars-syntax","exports"],
48528
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
48232
48529
  "use strict";
48233
48530
  var parse = __dependency1__.parse;
48234
48531
  var Tokenizer = __dependency2__.Tokenizer;
@@ -48237,13 +48534,23 @@ enifed("htmlbars-syntax/parser",
48237
48534
  var nodeHandlers = __dependency5__["default"];
48238
48535
  var tokenHandlers = __dependency6__["default"];
48239
48536
 
48537
+ // this should be:
48538
+ // `import * from "../htmlbars-syntax";
48539
+ //
48540
+ // But this version of the transpiler does not support it properly
48541
+ var syntax = __dependency7__;
48542
+
48240
48543
  function preprocess(html, options) {
48241
48544
  var ast = (typeof html === 'object') ? html : parse(html);
48242
48545
  var combined = new HTMLProcessor(html, options).acceptNode(ast);
48243
48546
 
48244
48547
  if (options && options.plugins && options.plugins.ast) {
48245
48548
  for (var i = 0, l = options.plugins.ast.length; i < l; i++) {
48246
- combined = options.plugins.ast[i](combined);
48549
+ var plugin = new options.plugins.ast[i]();
48550
+
48551
+ plugin.syntax = syntax;
48552
+
48553
+ combined = plugin.transform(combined);
48247
48554
  }
48248
48555
  }
48249
48556
 
@@ -48399,19 +48706,39 @@ enifed("htmlbars-syntax/token-handlers",
48399
48706
  var token = this.tokenizer.token;
48400
48707
 
48401
48708
  switch(state) {
48709
+ // Tag helpers
48710
+ case "tagName":
48711
+ token.addTagHelper(mustache.sexpr);
48712
+ this.tokenizer.state = "beforeAttributeName";
48713
+ return;
48714
+ case "beforeAttributeName":
48715
+ token.addTagHelper(mustache.sexpr);
48716
+ return;
48717
+ case "attributeName":
48718
+ case "afterAttributeName":
48719
+ this.tokenizer.finalizeAttributeValue();
48720
+ token.addTagHelper(mustache.sexpr);
48721
+ this.tokenizer.state = "beforeAttributeName";
48722
+ return;
48723
+ case "afterAttributeValueQuoted":
48724
+ token.addTagHelper(mustache.sexpr);
48725
+ this.tokenizer.state = "beforeAttributeName";
48726
+ return;
48727
+
48728
+ // Attribute values
48402
48729
  case "beforeAttributeValue":
48403
- this.tokenizer.state = 'attributeValueUnquoted';
48404
48730
  token.markAttributeQuoted(false);
48405
48731
  token.addToAttributeValue(mustache);
48732
+ this.tokenizer.state = 'attributeValueUnquoted';
48406
48733
  return;
48407
48734
  case "attributeValueDoubleQuoted":
48408
48735
  case "attributeValueSingleQuoted":
48409
48736
  case "attributeValueUnquoted":
48410
48737
  token.addToAttributeValue(mustache);
48411
48738
  return;
48412
- case "beforeAttributeName":
48413
- token.addTagHelper(mustache.sexpr);
48414
- return;
48739
+
48740
+ // TODO: Only append child when the tokenizer state makes
48741
+ // sense to do so, otherwise throw an error.
48415
48742
  default:
48416
48743
  appendChild(this.currentElement(), mustache);
48417
48744
  }
@@ -49091,6 +49418,10 @@ enifed("morph/dom-helper",
49091
49418
  var prototype = DOMHelper.prototype;
49092
49419
  prototype.constructor = DOMHelper;
49093
49420
 
49421
+ prototype.getElementById = function(id) {
49422
+ return this.document.getElementById(id);
49423
+ };
49424
+
49094
49425
  prototype.insertBefore = function(element, childElement, referenceChild) {
49095
49426
  return element.insertBefore(childElement, referenceChild);
49096
49427
  };