ember-source 1.8.0.beta.2 → 1.8.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.8.0-beta.2
8
+ * @version 1.8.0-beta.3
9
9
  */
10
10
 
11
11
  (function() {
@@ -13358,9 +13358,8 @@ define("ember-metal-views/tests/main_test",
13358
13358
  ["ember-metal-views/tests/test_helpers"],
13359
13359
  function(__dependency1__) {
13360
13360
  "use strict";
13361
- /*globals HTMLElement */
13362
-
13363
13361
  var testsFor = __dependency1__.testsFor;
13362
+ var setElementText = __dependency1__.setElementText;
13364
13363
  var equalHTML = __dependency1__.equalHTML;
13365
13364
  var appendTo = __dependency1__.appendTo;
13366
13365
 
@@ -13373,6 +13372,7 @@ define("ember-metal-views/tests/main_test",
13373
13372
  }
13374
13373
  });
13375
13374
 
13375
+ // Test the behavior of the helper createElement stub
13376
13376
  test("by default, view renders as a div", function() {
13377
13377
  view = {isView: true};
13378
13378
 
@@ -13380,6 +13380,7 @@ define("ember-metal-views/tests/main_test",
13380
13380
  equalHTML('qunit-fixture', "<div></div>");
13381
13381
  });
13382
13382
 
13383
+ // Test the behavior of the helper createElement stub
13383
13384
  test("tagName can be specified", function() {
13384
13385
  view = {
13385
13386
  isView: true,
@@ -13391,6 +13392,7 @@ define("ember-metal-views/tests/main_test",
13391
13392
  equalHTML('qunit-fixture', "<span></span>");
13392
13393
  });
13393
13394
 
13395
+ // Test the behavior of the helper createElement stub
13394
13396
  test("textContent can be specified", function() {
13395
13397
  view = {
13396
13398
  isView: true,
@@ -13402,6 +13404,7 @@ define("ember-metal-views/tests/main_test",
13402
13404
  equalHTML('qunit-fixture', "<div>ohai &lt;a&gt;derp&lt;/a&gt;</div>");
13403
13405
  });
13404
13406
 
13407
+ // Test the behavior of the helper createElement stub
13405
13408
  test("innerHTML can be specified", function() {
13406
13409
  view = {
13407
13410
  isView: true,
@@ -13413,6 +13416,20 @@ define("ember-metal-views/tests/main_test",
13413
13416
  equalHTML('qunit-fixture', "<div>ohai <a>derp</a></div>");
13414
13417
  });
13415
13418
 
13419
+ // Test the behavior of the helper createElement stub
13420
+ test("innerHTML tr can be specified", function() {
13421
+ view = {
13422
+ isView: true,
13423
+ tagName: 'table',
13424
+ innerHTML: '<tr><td>ohai</td></tr>'
13425
+ };
13426
+
13427
+ appendTo(view);
13428
+
13429
+ equalHTML('qunit-fixture', "<table><tr><td>ohai</td></tr></table>");
13430
+ });
13431
+
13432
+ // Test the behavior of the helper createElement stub
13416
13433
  test("element can be specified", function() {
13417
13434
  view = {
13418
13435
  isView: true,
@@ -13431,9 +13448,9 @@ define("ember-metal-views/tests/main_test",
13431
13448
  isView: true,
13432
13449
 
13433
13450
  willInsertElement: function(el) {
13434
- ok(this.element instanceof HTMLElement, "We have an element");
13451
+ ok(this.element && this.element.nodeType === 1, "We have an element");
13435
13452
  equal(this.element.parentElement, null, "The element is parentless");
13436
- this.element.textContent = 'you gone and done inserted that element';
13453
+ setElementText(this.element, 'you gone and done inserted that element');
13437
13454
  }
13438
13455
  };
13439
13456
 
@@ -13449,9 +13466,9 @@ define("ember-metal-views/tests/main_test",
13449
13466
  isView: true,
13450
13467
 
13451
13468
  didInsertElement: function() {
13452
- ok(this.element instanceof HTMLElement, "We have an element");
13469
+ ok(this.element && this.element.nodeType === 1, "We have an element");
13453
13470
  equal(this.element.parentElement, document.getElementById('qunit-fixture'), "The element's parent is correct");
13454
- this.element.textContent = 'you gone and done inserted that element';
13471
+ setElementText(this.element, 'you gone and done inserted that element');
13455
13472
  }
13456
13473
  };
13457
13474
 
@@ -13501,9 +13518,9 @@ define("ember-metal-views/tests/test_helpers",
13501
13518
  var renderer;
13502
13519
 
13503
13520
  function MetalRenderer () {
13504
- MetalRenderer["super"].call(this);
13521
+ MetalRenderer._super.call(this);
13505
13522
  }
13506
- MetalRenderer["super"] = Renderer;
13523
+ MetalRenderer._super = Renderer;
13507
13524
  MetalRenderer.prototype = Object.create(Renderer.prototype, {
13508
13525
  constructor: {
13509
13526
  value: MetalRenderer,
@@ -13518,12 +13535,12 @@ define("ember-metal-views/tests/test_helpers",
13518
13535
  };
13519
13536
  MetalRenderer.prototype.willCreateElement = function(view) {
13520
13537
  };
13521
- MetalRenderer.prototype.createElement = function (view) {
13538
+ MetalRenderer.prototype.createElement = function (view, contextualElement) {
13522
13539
  var el;
13523
13540
  if (view.element) {
13524
13541
  el = view.element;
13525
13542
  } else {
13526
- el = view.element = document.createElement(view.tagName || 'div');
13543
+ el = view.element = this._dom.createElement(view.tagName || 'div');
13527
13544
  }
13528
13545
  var classNames = view.classNames;
13529
13546
  if (typeof classNames === 'string') {
@@ -13546,9 +13563,12 @@ define("ember-metal-views/tests/test_helpers",
13546
13563
  if (view.childViews) {
13547
13564
  view._childViewsMorph = this._dom.createMorph(el, null, null);
13548
13565
  } else if (view.textContent) {
13549
- el.textContent = view.textContent;
13566
+ setElementText(el, view.textContent);
13550
13567
  } else if (view.innerHTML) {
13551
- el.innerHTML = view.innerHTML;
13568
+ var nodes = this._dom.parseHTML(view.innerHTML, el);
13569
+ while (nodes[0]) {
13570
+ el.appendChild(nodes[0]);
13571
+ }
13552
13572
  }
13553
13573
  return el;
13554
13574
  };
@@ -13586,15 +13606,41 @@ define("ember-metal-views/tests/test_helpers",
13586
13606
  return renderer;
13587
13607
  }
13588
13608
 
13589
- __exports__.subject = subject;function equalHTML(element, expectedHTML, message) {
13609
+ __exports__.subject = subject;var supportsTextContent = ('textContent' in document.createElement('div'));
13610
+ var setElementText;
13611
+ if (supportsTextContent) {
13612
+ setElementText = function setElementText(element, text) {
13613
+ element.textContent = text;
13614
+ };
13615
+ } else {
13616
+ setElementText = function setElementText(element, text) {
13617
+ element.innerText = text;
13618
+ };
13619
+ }
13620
+ __exports__.setElementText = setElementText;
13621
+
13622
+ function equalHTML(element, expectedHTML, message) {
13590
13623
  var html;
13591
13624
  if (typeof element === 'string') {
13592
13625
  html = document.getElementById(element).innerHTML;
13593
13626
  } else {
13594
- html = element.outerHTML;
13627
+ if (element instanceof window.NodeList) {
13628
+ var fragment = document.createElement('div');
13629
+ while (element[0]) {
13630
+ fragment.appendChild(element[0]);
13631
+ }
13632
+ html = fragment.innerHTML;
13633
+ } else {
13634
+ html = element.outerHTML;
13635
+ }
13595
13636
  }
13596
13637
 
13597
13638
  var actualHTML = html.replace(/ id="[^"]+"/gmi, '');
13639
+ actualHTML = actualHTML.replace(/<\/?([A-Z]+)/gi, function(tag){
13640
+ return tag.toLowerCase();
13641
+ });
13642
+ actualHTML = actualHTML.replace(/\r\n/gm, '');
13643
+ actualHTML = actualHTML.replace(/ $/, '');
13598
13644
  equal(actualHTML, expectedHTML, message || "HTML matches");
13599
13645
  }
13600
13646
 
@@ -17456,7 +17502,13 @@ define("ember-metal/tests/map_test",
17456
17502
  mapHasLength(entries.length, theMap);
17457
17503
  };
17458
17504
 
17459
- test("add", function() {
17505
+ var unboundThis;
17506
+
17507
+ (function() {
17508
+ unboundThis = this;
17509
+ }());
17510
+
17511
+ test("set", function() {
17460
17512
  map.set(object, "winning");
17461
17513
  map.set(number, "winning");
17462
17514
  map.set(string, "winning");
@@ -17477,8 +17529,46 @@ define("ember-metal/tests/map_test",
17477
17529
  [ string, "losing" ]
17478
17530
  ]);
17479
17531
 
17480
- equal(map.has("nope"), false);
17481
- equal(map.has({}), false);
17532
+ equal(map.has("nope"), false, "expected the key `nope` to not be present");
17533
+ equal(map.has({}), false, "expected they key `{}` to not be present");
17534
+ });
17535
+
17536
+ test("set chaining", function() {
17537
+ map.set(object, "winning").
17538
+ set(number, "winning").
17539
+ set(string, "winning");
17540
+
17541
+ mapHasEntries([
17542
+ [ object, "winning" ],
17543
+ [ number, "winning" ],
17544
+ [ string, "winning" ]
17545
+ ]);
17546
+
17547
+ map.set(object, "losing").
17548
+ set(number, "losing").
17549
+ set(string, "losing");
17550
+
17551
+ mapHasEntries([
17552
+ [ object, "losing" ],
17553
+ [ number, "losing" ],
17554
+ [ string, "losing" ]
17555
+ ]);
17556
+
17557
+ equal(map.has("nope"), false, "expected the key `nope` to not be present");
17558
+ equal(map.has({}), false, "expected they key `{}` to not be present");
17559
+ });
17560
+
17561
+ test("with key with undefined value", function() {
17562
+ map.set("foo", undefined);
17563
+
17564
+ map.forEach(function(value, key) {
17565
+ equal(value, undefined);
17566
+ equal(key, 'foo');
17567
+ });
17568
+
17569
+ ok(map.has("foo"), "has key foo, even with undefined value");
17570
+
17571
+ equal(map.size, 1);
17482
17572
  });
17483
17573
 
17484
17574
  test("remove", function() {
@@ -17540,37 +17630,169 @@ define("ember-metal/tests/map_test",
17540
17630
  mapHasEntries([ ], map2);
17541
17631
  });
17542
17632
 
17543
- test("length", function() {
17633
+ test("size", function() {
17544
17634
  //Add a key twice
17545
- equal(map.length, 0);
17635
+ equal(map.size, 0);
17546
17636
  map.set(string, "a string");
17547
- equal(map.length, 1);
17637
+ equal(map.size, 1);
17548
17638
  map.set(string, "the same string");
17549
- equal(map.length, 1);
17639
+ equal(map.size, 1);
17550
17640
 
17551
17641
  //Add another
17552
17642
  map.set(number, "a number");
17553
- equal(map.length, 2);
17643
+ equal(map.size, 2);
17554
17644
 
17555
17645
  //Remove one that doesn't exist
17556
17646
  map.remove('does not exist');
17557
- equal(map.length, 2);
17647
+ equal(map.size, 2);
17558
17648
 
17559
17649
  //Check copy
17560
17650
  var copy = map.copy();
17561
- equal(copy.length, 2);
17651
+ equal(copy.size, 2);
17562
17652
 
17563
17653
  //Remove a key twice
17564
17654
  map.remove(number);
17565
- equal(map.length, 1);
17655
+ equal(map.size, 1);
17566
17656
  map.remove(number);
17567
- equal(map.length, 1);
17657
+ equal(map.size, 1);
17568
17658
 
17569
17659
  //Remove the last key
17570
17660
  map.remove(string);
17571
- equal(map.length, 0);
17661
+ equal(map.size, 0);
17572
17662
  map.remove(string);
17573
- equal(map.length, 0);
17663
+ equal(map.size, 0);
17664
+ });
17665
+
17666
+ test("forEach without proper callback", function() {
17667
+ QUnit["throws"](function() {
17668
+ map.forEach();
17669
+ }, '[object Undefined] is not a function');
17670
+
17671
+ QUnit["throws"](function() {
17672
+ map.forEach(undefined);
17673
+ }, '[object Undefined] is not a function');
17674
+
17675
+ QUnit["throws"](function() {
17676
+ map.forEach(1);
17677
+ }, '[object Number] is not a function');
17678
+
17679
+ QUnit["throws"](function() {
17680
+ map.forEach({});
17681
+ }, '[object Object] is not a function');
17682
+ });
17683
+
17684
+ test("forEach basic", function() {
17685
+ map.set("a", 1);
17686
+ map.set("b", 2);
17687
+ map.set("c", 3);
17688
+
17689
+ var iteration = 0;
17690
+
17691
+ var expectations = [
17692
+ { value: 1, key: "a", context: unboundThis },
17693
+ { value: 2, key: "b", context: unboundThis },
17694
+ { value: 3, key: "c", context: unboundThis },
17695
+ ];
17696
+
17697
+ map.forEach(function(value, key) {
17698
+ var expectation = expectations[iteration];
17699
+
17700
+ equal(value, expectation.value, 'value should be correct');
17701
+ equal(key, expectation.key, 'key should be correct');
17702
+ equal(this, expectation.context, 'context should be as if it was unbound');
17703
+
17704
+ iteration++;
17705
+ });
17706
+
17707
+ equal(iteration, 3, 'expected 3 iterations');
17708
+
17709
+ });
17710
+
17711
+ test("forEach basic /w context", function() {
17712
+ map.set("a", 1);
17713
+ map.set("b", 2);
17714
+ map.set("c", 3);
17715
+
17716
+ var iteration = 0;
17717
+ var context = {};
17718
+ var expectations = [
17719
+ { value: 1, key: "a", context: context },
17720
+ { value: 2, key: "b", context: context },
17721
+ { value: 3, key: "c", context: context },
17722
+ ];
17723
+
17724
+ map.forEach(function(value, key) {
17725
+ var expectation = expectations[iteration];
17726
+
17727
+ equal(value, expectation.value, 'value should be correct');
17728
+ equal(key, expectation.key, 'key should be correct');
17729
+ equal(this, expectation.context, 'context should be as if it was unbound');
17730
+
17731
+ iteration++;
17732
+
17733
+ }, context);
17734
+
17735
+ equal(iteration, 3, 'expected 3 iterations');
17736
+ });
17737
+
17738
+ test("forEach basic /w deletion while enumerating", function() {
17739
+ map.set("a", 1);
17740
+ map.set("b", 2);
17741
+ map.set("c", 3);
17742
+
17743
+ var iteration = 0;
17744
+
17745
+ var expectations = [
17746
+ { value: 1, key: "a", context: unboundThis },
17747
+ { value: 2, key: "b", context: unboundThis }
17748
+ ];
17749
+
17750
+ map.forEach(function(value, key) {
17751
+ if (iteration === 0) {
17752
+ map["delete"]("c");
17753
+ }
17754
+
17755
+ var expectation = expectations[iteration];
17756
+
17757
+ equal(value, expectation.value, 'value should be correct');
17758
+ equal(key, expectation.key, 'key should be correct');
17759
+ equal(this, expectation.context, 'context should be as if it was unbound');
17760
+
17761
+ iteration++;
17762
+ });
17763
+
17764
+ equal(iteration, 2, 'expected 3 iterations');
17765
+ });
17766
+
17767
+ test("forEach basic /w addition while enumerating", function() {
17768
+ map.set("a", 1);
17769
+ map.set("b", 2);
17770
+ map.set("c", 3);
17771
+
17772
+ var iteration = 0;
17773
+
17774
+ var expectations = [
17775
+ { value: 1, key: "a", context: unboundThis },
17776
+ { value: 2, key: "b", context: unboundThis },
17777
+ { value: 3, key: "c", context: unboundThis },
17778
+ { value: 4, key: "d", context: unboundThis },
17779
+ ];
17780
+
17781
+ map.forEach(function(value, key) {
17782
+ if (iteration === 0) {
17783
+ map.set('d', 4);
17784
+ }
17785
+
17786
+ var expectation = expectations[iteration];
17787
+
17788
+ equal(value, expectation.value, 'value should be correct');
17789
+ equal(key, expectation.key, 'key should be correct');
17790
+ equal(this, expectation.context, 'context should be as if it was unbound');
17791
+
17792
+ iteration++;
17793
+ });
17794
+
17795
+ equal(iteration, 4, 'expected 3 iterations');
17574
17796
  });
17575
17797
  }
17576
17798
 
@@ -21631,19 +21853,8 @@ define("ember-metal/tests/utils/meta_test",
21631
21853
  });
21632
21854
 
21633
21855
  QUnit.module("Ember.meta enumerable");
21634
- // Tests fix for https://github.com/emberjs/ember.js/issues/344
21635
- // This is primarily for older browsers such as IE8
21856
+
21636
21857
  if (canDefineNonEnumerableProperties) {
21637
- if (Ember.imports.jQuery) {
21638
- test("meta is not jQuery.isPlainObject", function () {
21639
- var proto, obj;
21640
- proto = {foo: 'bar'};
21641
- equal(jQuery.isPlainObject(meta(proto)), false, 'meta should not be isPlainObject when meta property cannot be marked as enumerable: false');
21642
- obj = create(proto);
21643
- equal(jQuery.isPlainObject(meta(obj)), false, 'meta should not be isPlainObject when meta property cannot be marked as enumerable: false');
21644
- });
21645
- }
21646
- } else {
21647
21858
  test("meta is not enumerable", function () {
21648
21859
  var proto, obj, props, prop;
21649
21860
  proto = {foo: 'bar'};
@@ -21664,6 +21875,18 @@ define("ember-metal/tests/utils/meta_test",
21664
21875
  }
21665
21876
  }
21666
21877
  });
21878
+ } else {
21879
+ // Tests fix for https://github.com/emberjs/ember.js/issues/344
21880
+ // This is primarily for older browsers such as IE8
21881
+ if (Ember.imports.jQuery) {
21882
+ test("meta is not jQuery.isPlainObject", function () {
21883
+ var proto, obj;
21884
+ proto = {foo: 'bar'};
21885
+ equal(jQuery.isPlainObject(meta(proto)), false, 'meta should not be isPlainObject when meta property cannot be marked as enumerable: false');
21886
+ obj = create(proto);
21887
+ equal(jQuery.isPlainObject(meta(obj)), false, 'meta should not be isPlainObject when meta property cannot be marked as enumerable: false');
21888
+ });
21889
+ }
21667
21890
  }
21668
21891
  });
21669
21892
  define("ember-metal/tests/utils/meta_test.jshint",
@@ -22713,7 +22936,7 @@ define("ember-routing-handlebars/tests/helpers/action_test",
22713
22936
  boundText: "inner",
22714
22937
  truthy: true,
22715
22938
  obj: {},
22716
- layout: EmberHandlebars.compile("<p>{{boundText}}</p><p>{{#if truthy}}{{#with obj}}{{yield}}{{/with}}{{/if}}</p>")
22939
+ layout: EmberHandlebars.compile("<div>{{boundText}}</div><div>{{#if truthy}}{{#with obj}}{{yield}}{{/with}}{{/if}}</div>")
22717
22940
  });
22718
22941
 
22719
22942
  view = EmberView.create({
@@ -22729,7 +22952,7 @@ define("ember-routing-handlebars/tests/helpers/action_test",
22729
22952
  boundText: 'insideWith'
22730
22953
  }
22731
22954
  },
22732
- template: EmberHandlebars.compile('{{#with obj}}{{#if truthy}}{{#view component}}{{#if truthy}}<p {{action "wat"}} class="wat">{{boundText}}</p>{{/if}}{{/view}}{{/if}}{{/with}}')
22955
+ template: EmberHandlebars.compile('{{#with obj}}{{#if truthy}}{{#view component}}{{#if truthy}}<div {{action "wat"}} class="wat">{{boundText}}</div>{{/if}}{{/view}}{{/if}}{{/with}}')
22733
22956
  });
22734
22957
 
22735
22958
  appendView();
@@ -24602,7 +24825,7 @@ define("ember-routing-handlebars/tests/helpers/render_test",
24602
24825
  run(function() {
24603
24826
  view.connectOutlet('main', EmberView.create({
24604
24827
  controller: controller.create(),
24605
- template: compile("<p>1{{render 'home'}}</p>")
24828
+ template: compile("<div>1{{render 'home'}}</div>")
24606
24829
  }));
24607
24830
  });
24608
24831
 
@@ -24611,7 +24834,7 @@ define("ember-routing-handlebars/tests/helpers/render_test",
24611
24834
  run(function() {
24612
24835
  view.connectOutlet('main', EmberView.create({
24613
24836
  controller: controller.create(),
24614
- template: compile("<p>2{{render 'home'}}</p>")
24837
+ template: compile("<div>2{{render 'home'}}</div>")
24615
24838
  }));
24616
24839
  });
24617
24840
 
@@ -40318,8 +40541,8 @@ define("ember-runtime/tests/system/object/computed_test.jshint",
40318
40541
  });
40319
40542
  });
40320
40543
  define("ember-runtime/tests/system/object/create_test",
40321
- ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/run_loop","ember-metal/events","ember-runtime/system/object"],
40322
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__) {
40544
+ ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/run_loop","ember-metal/events","ember-runtime/system/object","ember-metal/keys"],
40545
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__) {
40323
40546
  "use strict";
40324
40547
  var Ember = __dependency1__["default"];
40325
40548
  var get = __dependency2__.get;
@@ -40332,6 +40555,7 @@ define("ember-runtime/tests/system/object/create_test",
40332
40555
  var run = __dependency7__["default"];
40333
40556
  var on = __dependency8__.on;
40334
40557
  var EmberObject = __dependency9__["default"];
40558
+ var keys = __dependency10__["default"];
40335
40559
 
40336
40560
  var moduleOptions, originalLookup;
40337
40561
 
@@ -41414,6 +41638,36 @@ define("ember-runtime/tests/system/object/observer_test",
41414
41638
  equal(get(obj1, 'count'), 1, 'should not invoke again');
41415
41639
  equal(get(obj2, 'count'), 1, 'should invoke observer on obj2');
41416
41640
  });
41641
+
41642
+ testBoth('chain observer on class that has a reference to an uninitialized object will finish chains that reference it', function(get, set) {
41643
+ var changed = false;
41644
+
41645
+ var ChildClass = EmberObject.extend({
41646
+ parent: null,
41647
+ parentOneTwoDidChange: observer('parent.one.two', function() {
41648
+ changed = true;
41649
+ })
41650
+ });
41651
+
41652
+ var ParentClass = EmberObject.extend({
41653
+ one: {
41654
+ two: "old"
41655
+ },
41656
+ init: function () {
41657
+ this.child = ChildClass.create({
41658
+ parent: this
41659
+ });
41660
+ }
41661
+ });
41662
+
41663
+ var parent = new ParentClass();
41664
+
41665
+ equal(changed, false, 'precond');
41666
+
41667
+ parent.set('one.two', 'new');
41668
+
41669
+ equal(changed, true, 'child should have been notified of change to path');
41670
+ });
41417
41671
  });
41418
41672
  define("ember-runtime/tests/system/object/observer_test.jshint",
41419
41673
  [],
@@ -45454,9 +45708,28 @@ define("ember-views/tests/system/render_buffer_test",
45454
45708
  //
45455
45709
  QUnit.module("RenderBuffer");
45456
45710
 
45457
- test("RenderBuffers combine strings", function() {
45711
+ test("RenderBuffers raise a deprecation warning without a contextualElement", function() {
45458
45712
  var buffer = new RenderBuffer('div');
45459
45713
  buffer.generateElement();
45714
+ expectDeprecation(function(){
45715
+ var el = buffer.element();
45716
+ equal(el.tagName.toLowerCase(), 'div');
45717
+ }, /buffer.element expects a contextualElement to exist/);
45718
+ });
45719
+
45720
+ test("reset RenderBuffers raise a deprecation warning without a contextualElement", function() {
45721
+ var buffer = new RenderBuffer('div', document.body);
45722
+ buffer.reset('span');
45723
+ buffer.generateElement();
45724
+ expectDeprecation(function(){
45725
+ var el = buffer.element();
45726
+ equal(el.tagName.toLowerCase(), 'span');
45727
+ }, /buffer.element expects a contextualElement to exist/);
45728
+ });
45729
+
45730
+ test("RenderBuffers combine strings", function() {
45731
+ var buffer = new RenderBuffer('div', document.body);
45732
+ buffer.generateElement();
45460
45733
 
45461
45734
  buffer.push('a');
45462
45735
  buffer.push('b');
@@ -45468,7 +45741,7 @@ define("ember-views/tests/system/render_buffer_test",
45468
45741
 
45469
45742
  test("value of 0 is included in output", function() {
45470
45743
  var buffer, el;
45471
- buffer = new RenderBuffer('input');
45744
+ buffer = new RenderBuffer('input', document.body);
45472
45745
  buffer.prop('value', 0);
45473
45746
  buffer.generateElement();
45474
45747
  el = buffer.element();
@@ -45476,7 +45749,7 @@ define("ember-views/tests/system/render_buffer_test",
45476
45749
  });
45477
45750
 
45478
45751
  test("prevents XSS injection via `id`", function() {
45479
- var buffer = new RenderBuffer('div');
45752
+ var buffer = new RenderBuffer('div', document.body);
45480
45753
 
45481
45754
  buffer.id('hacked" megahax="yes');
45482
45755
  buffer.generateElement();
@@ -45486,7 +45759,7 @@ define("ember-views/tests/system/render_buffer_test",
45486
45759
  });
45487
45760
 
45488
45761
  test("prevents XSS injection via `attr`", function() {
45489
- var buffer = new RenderBuffer('div');
45762
+ var buffer = new RenderBuffer('div', document.body);
45490
45763
 
45491
45764
  buffer.attr('id', 'trololol" onmouseover="pwn()');
45492
45765
  buffer.attr('class', "hax><img src=\"trollface.png\"");
@@ -45500,7 +45773,7 @@ define("ember-views/tests/system/render_buffer_test",
45500
45773
  });
45501
45774
 
45502
45775
  test("prevents XSS injection via `addClass`", function() {
45503
- var buffer = new RenderBuffer('div');
45776
+ var buffer = new RenderBuffer('div', document.body);
45504
45777
 
45505
45778
  buffer.addClass('megahax" xss="true');
45506
45779
  buffer.generateElement();
@@ -45510,7 +45783,7 @@ define("ember-views/tests/system/render_buffer_test",
45510
45783
  });
45511
45784
 
45512
45785
  test("prevents XSS injection via `style`", function() {
45513
- var buffer = new RenderBuffer('div');
45786
+ var buffer = new RenderBuffer('div', document.body);
45514
45787
 
45515
45788
  buffer.style('color', 'blue;" xss="true" style="color:red');
45516
45789
  buffer.generateElement();
@@ -45529,25 +45802,25 @@ define("ember-views/tests/system/render_buffer_test",
45529
45802
  });
45530
45803
 
45531
45804
  test("prevents XSS injection via `tagName`", function() {
45532
- var buffer = new RenderBuffer('cool-div><div xss="true"');
45805
+ var buffer = new RenderBuffer('cool-div><div xss="true"', document.body);
45533
45806
  try {
45534
45807
  buffer.generateElement();
45535
- equal(buffer.string(), '<cool-divdivxsstrue></cool-divdivxsstrue>');
45808
+ equal(buffer.element().childNodes.length, 0, 'no extra nodes created');
45536
45809
  } catch (e) {
45537
45810
  ok(true, 'dom exception');
45538
45811
  }
45539
45812
  });
45540
45813
 
45541
45814
  test("handles null props - Issue #2019", function() {
45542
- var buffer = new RenderBuffer('div');
45815
+ var buffer = new RenderBuffer('div', document.body);
45543
45816
 
45544
45817
  buffer.prop('value', null);
45545
45818
  buffer.generateElement();
45546
- equal(buffer.string(), '<div></div>');
45819
+ equal(buffer.element().tagName, 'DIV', 'div exists');
45547
45820
  });
45548
45821
 
45549
45822
  test("handles browsers like Firefox < 11 that don't support outerHTML Issue #1952", function() {
45550
- var buffer = new RenderBuffer('div');
45823
+ var buffer = new RenderBuffer('div', document.body);
45551
45824
  buffer.generateElement();
45552
45825
  // Make sure element.outerHTML is falsy to trigger the fallback.
45553
45826
  var elementStub = '<div></div>';
@@ -45557,20 +45830,78 @@ define("ember-views/tests/system/render_buffer_test",
45557
45830
  });
45558
45831
 
45559
45832
  test("lets `setClasses` and `addClass` work together", function() {
45560
- var buffer = new RenderBuffer('div');
45833
+ var buffer = new RenderBuffer('div', document.body);
45561
45834
  buffer.setClasses(['foo', 'bar']);
45562
45835
  buffer.addClass('baz');
45563
45836
  buffer.generateElement();
45564
45837
 
45565
45838
  var el = buffer.element();
45566
- equal(el.tagName.toLowerCase(), 'div');
45839
+ equal(el.tagName, 'DIV');
45567
45840
  equal(el.getAttribute('class'), 'foo bar baz');
45568
45841
  });
45569
45842
 
45843
+ test("generates text and a div and text", function() {
45844
+ var div = document.createElement('div');
45845
+ var buffer = new RenderBuffer(undefined, div);
45846
+ buffer.buffer = 'Howdy<div>Nick</div>Cage';
45847
+
45848
+ var el = buffer.element();
45849
+ equal(el.childNodes[0].data, 'Howdy');
45850
+ equal(el.childNodes[1].tagName, 'DIV');
45851
+ equal(el.childNodes[1].childNodes[0].data, 'Nick');
45852
+ equal(el.childNodes[2].data, 'Cage');
45853
+ });
45854
+
45855
+
45856
+ test("generates a tr from a tr innerString", function() {
45857
+ var table = document.createElement('table');
45858
+ var buffer = new RenderBuffer(undefined, table);
45859
+ buffer.buffer = '<tr></tr>';
45860
+
45861
+ var el = buffer.element();
45862
+ equal(el.childNodes[0].tagName.toLowerCase(), 'tr');
45863
+ });
45864
+
45865
+ test("generates a tr from a tr innerString with leading <script", function() {
45866
+ var table = document.createElement('table');
45867
+ var buffer = new RenderBuffer(undefined, table);
45868
+ buffer.buffer = '<script></script><tr></tr>';
45869
+
45870
+ var el = buffer.element();
45871
+ equal(el.childNodes[1].tagName.toLowerCase(), 'tr');
45872
+ });
45873
+
45874
+ test("generates a tr from a tr innerString with leading comment", function() {
45875
+ var table = document.createElement('table');
45876
+ var buffer = new RenderBuffer(undefined, table);
45877
+ buffer.buffer = '<!-- blargh! --><tr></tr>';
45878
+
45879
+ var el = buffer.element();
45880
+ equal(el.childNodes[1].tagName, 'TR');
45881
+ });
45882
+
45883
+ test("generates a tbody from a tbody innerString", function() {
45884
+ var table = document.createElement('table');
45885
+ var buffer = new RenderBuffer(undefined, table);
45886
+ buffer.buffer = '<tbody><tr></tr></tbody>';
45887
+
45888
+ var el = buffer.element();
45889
+ equal(el.childNodes[0].tagName, 'TBODY');
45890
+ });
45891
+
45892
+ test("generates a col from a col innerString", function() {
45893
+ var table = document.createElement('table');
45894
+ var buffer = new RenderBuffer(undefined, table);
45895
+ buffer.buffer = '<col></col>';
45896
+
45897
+ var el = buffer.element();
45898
+ equal(el.childNodes[0].tagName, 'COL');
45899
+ });
45900
+
45570
45901
  QUnit.module("RenderBuffer - without tagName");
45571
45902
 
45572
45903
  test("It is possible to create a RenderBuffer without a tagName", function() {
45573
- var buffer = new RenderBuffer();
45904
+ var buffer = new RenderBuffer(undefined, document.body);
45574
45905
  buffer.push('a');
45575
45906
  buffer.push('b');
45576
45907
  buffer.push('c');
@@ -45585,7 +45916,7 @@ define("ember-views/tests/system/render_buffer_test",
45585
45916
  QUnit.module("RenderBuffer#element");
45586
45917
 
45587
45918
  test("properly handles old IE's zero-scope bug", function() {
45588
- var buffer = new RenderBuffer('div');
45919
+ var buffer = new RenderBuffer('div', document.body);
45589
45920
  buffer.generateElement();
45590
45921
  buffer.push('<script></script>foo');
45591
45922
 
@@ -48820,13 +49151,14 @@ define("ember-views/tests/views/view/create_child_view_test.jshint",
48820
49151
  });
48821
49152
  });
48822
49153
  define("ember-views/tests/views/view/create_element_test",
48823
- ["ember-metal/property_get","ember-metal/run_loop","ember-views/views/view","ember-views/views/container_view"],
48824
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
49154
+ ["ember-metal/property_get","ember-metal/run_loop","ember-views/views/view","ember-views/views/container_view","ember-metal-views/tests/test_helpers"],
49155
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
48825
49156
  "use strict";
48826
49157
  var get = __dependency1__.get;
48827
49158
  var run = __dependency2__["default"];
48828
49159
  var EmberView = __dependency3__["default"];
48829
49160
  var ContainerView = __dependency4__["default"];
49161
+ var equalHTML = __dependency5__.equalHTML;
48830
49162
 
48831
49163
  var view;
48832
49164
 
@@ -48871,6 +49203,61 @@ define("ember-views/tests/views/view/create_element_test",
48871
49203
  equal(elem.tagName.toString().toLowerCase(), 'span', 'has tagName from view');
48872
49204
  });
48873
49205
 
49206
+ test("calls render and parses the buffer string in the right context", function() {
49207
+ view = ContainerView.create({
49208
+ tagName: 'table',
49209
+ childViews: [ EmberView.create({
49210
+ tagName: '',
49211
+ render: function(buffer) {
49212
+ // Emulate a metamorph
49213
+ buffer.push("<script></script><tr><td>snorfblax</td></tr>");
49214
+ }
49215
+ })]
49216
+ });
49217
+
49218
+ equal(get(view, 'element'), null, 'precondition - has no element');
49219
+ run(function() {
49220
+ view.createElement();
49221
+ });
49222
+
49223
+
49224
+ var elem = get(view, 'element');
49225
+ ok(elem, 'has element now');
49226
+ equalHTML(elem.childNodes, '<script></script><tr><td>snorfblax</td></tr>', 'has innerHTML from context');
49227
+ equal(elem.tagName.toString().toLowerCase(), 'table', 'has tagName from view');
49228
+ });
49229
+
49230
+ test("does not wrap many tr children in tbody elements", function() {
49231
+ view = ContainerView.create({
49232
+ tagName: 'table',
49233
+ childViews: [
49234
+ EmberView.create({
49235
+ tagName: '',
49236
+ render: function(buffer) {
49237
+ // Emulate a metamorph
49238
+ buffer.push("<script></script><tr><td>snorfblax</td></tr>");
49239
+ } }),
49240
+ EmberView.create({
49241
+ tagName: '',
49242
+ render: function(buffer) {
49243
+ // Emulate a metamorph
49244
+ buffer.push("<script></script><tr><td>snorfblax</td></tr>");
49245
+ } })
49246
+ ]
49247
+ });
49248
+
49249
+ equal(get(view, 'element'), null, 'precondition - has no element');
49250
+ run(function() {
49251
+ view.createElement();
49252
+ });
49253
+
49254
+
49255
+ var elem = get(view, 'element');
49256
+ ok(elem, 'has element now');
49257
+ equalHTML(elem.childNodes, '<script></script><tr><td>snorfblax</td></tr><script></script><tr><td>snorfblax</td></tr>', 'has innerHTML from context');
49258
+ equal(elem.tagName.toString().toLowerCase(), 'table', 'has tagName from view');
49259
+ });
49260
+
48874
49261
  test("generated element include HTML from child views as well", function() {
48875
49262
  view = ContainerView.create({
48876
49263
  childViews: [ EmberView.create({ elementId: "foo" })]
@@ -49770,6 +50157,62 @@ define("ember-views/tests/views/view/nearest_of_type_test.jshint",
49770
50157
  ok(true, 'ember-views/tests/views/view/nearest_of_type_test.js should pass jshint.');
49771
50158
  });
49772
50159
  });
50160
+ define("ember-views/tests/views/view/nested_view_ordering_test",
50161
+ ["container","ember-metal/run_loop","ember-views/views/view","ember-handlebars-compiler"],
50162
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
50163
+ "use strict";
50164
+ var Container = __dependency1__["default"];
50165
+ var run = __dependency2__["default"];
50166
+
50167
+ var EmberView = __dependency3__["default"];
50168
+ var EmberHandlebars = __dependency4__["default"];
50169
+
50170
+ var container, view;
50171
+
50172
+ QUnit.module("EmberView - Nested View Ordering", {
50173
+ setup: function() {
50174
+ container = new Container();
50175
+ },
50176
+ teardown: function() {
50177
+ run(function() {
50178
+ if (view) { view.destroy(); }
50179
+ });
50180
+ }
50181
+ });
50182
+
50183
+ test("should call didInsertElement on child views before parent", function() {
50184
+ var insertedLast;
50185
+
50186
+ view = EmberView.create({
50187
+ didInsertElement: function(){
50188
+ insertedLast = "outer";
50189
+ },
50190
+ container: container,
50191
+ template: EmberHandlebars.compile("{{view \"inner\"}}")
50192
+ });
50193
+
50194
+ container.register("view:inner", EmberView.extend({
50195
+ didInsertElement: function(){
50196
+ insertedLast = "inner";
50197
+ }
50198
+ }));
50199
+
50200
+ run(function() {
50201
+ view.append();
50202
+ });
50203
+
50204
+ equal(insertedLast, "outer", "didInsertElement called on outer view after inner view");
50205
+ });
50206
+ });
50207
+ define("ember-views/tests/views/view/nested_view_ordering_test.jshint",
50208
+ [],
50209
+ function() {
50210
+ "use strict";
50211
+ module('JSHint - ember-views/tests/views/view');
50212
+ test('ember-views/tests/views/view/nested_view_ordering_test.js should pass jshint', function() {
50213
+ ok(true, 'ember-views/tests/views/view/nested_view_ordering_test.js should pass jshint.');
50214
+ });
50215
+ });
49773
50216
  define("ember-views/tests/views/view/parse_property_path_test",
49774
50217
  ["ember-views/views/view"],
49775
50218
  function(__dependency1__) {