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
 
@@ -41388,6 +41612,36 @@ define("ember-runtime/tests/system/object/observer_test",
41388
41612
  equal(get(obj1, 'count'), 1, 'should not invoke again');
41389
41613
  equal(get(obj2, 'count'), 1, 'should invoke observer on obj2');
41390
41614
  });
41615
+
41616
+ testBoth('chain observer on class that has a reference to an uninitialized object will finish chains that reference it', function(get, set) {
41617
+ var changed = false;
41618
+
41619
+ var ChildClass = EmberObject.extend({
41620
+ parent: null,
41621
+ parentOneTwoDidChange: observer('parent.one.two', function() {
41622
+ changed = true;
41623
+ })
41624
+ });
41625
+
41626
+ var ParentClass = EmberObject.extend({
41627
+ one: {
41628
+ two: "old"
41629
+ },
41630
+ init: function () {
41631
+ this.child = ChildClass.create({
41632
+ parent: this
41633
+ });
41634
+ }
41635
+ });
41636
+
41637
+ var parent = new ParentClass();
41638
+
41639
+ equal(changed, false, 'precond');
41640
+
41641
+ parent.set('one.two', 'new');
41642
+
41643
+ equal(changed, true, 'child should have been notified of change to path');
41644
+ });
41391
41645
  });
41392
41646
  define("ember-runtime/tests/system/object/observer_test.jshint",
41393
41647
  [],
@@ -45428,9 +45682,28 @@ define("ember-views/tests/system/render_buffer_test",
45428
45682
  //
45429
45683
  QUnit.module("RenderBuffer");
45430
45684
 
45431
- test("RenderBuffers combine strings", function() {
45685
+ test("RenderBuffers raise a deprecation warning without a contextualElement", function() {
45432
45686
  var buffer = new RenderBuffer('div');
45433
45687
  buffer.generateElement();
45688
+ expectDeprecation(function(){
45689
+ var el = buffer.element();
45690
+ equal(el.tagName.toLowerCase(), 'div');
45691
+ }, /buffer.element expects a contextualElement to exist/);
45692
+ });
45693
+
45694
+ test("reset RenderBuffers raise a deprecation warning without a contextualElement", function() {
45695
+ var buffer = new RenderBuffer('div', document.body);
45696
+ buffer.reset('span');
45697
+ buffer.generateElement();
45698
+ expectDeprecation(function(){
45699
+ var el = buffer.element();
45700
+ equal(el.tagName.toLowerCase(), 'span');
45701
+ }, /buffer.element expects a contextualElement to exist/);
45702
+ });
45703
+
45704
+ test("RenderBuffers combine strings", function() {
45705
+ var buffer = new RenderBuffer('div', document.body);
45706
+ buffer.generateElement();
45434
45707
 
45435
45708
  buffer.push('a');
45436
45709
  buffer.push('b');
@@ -45442,7 +45715,7 @@ define("ember-views/tests/system/render_buffer_test",
45442
45715
 
45443
45716
  test("value of 0 is included in output", function() {
45444
45717
  var buffer, el;
45445
- buffer = new RenderBuffer('input');
45718
+ buffer = new RenderBuffer('input', document.body);
45446
45719
  buffer.prop('value', 0);
45447
45720
  buffer.generateElement();
45448
45721
  el = buffer.element();
@@ -45450,7 +45723,7 @@ define("ember-views/tests/system/render_buffer_test",
45450
45723
  });
45451
45724
 
45452
45725
  test("prevents XSS injection via `id`", function() {
45453
- var buffer = new RenderBuffer('div');
45726
+ var buffer = new RenderBuffer('div', document.body);
45454
45727
 
45455
45728
  buffer.id('hacked" megahax="yes');
45456
45729
  buffer.generateElement();
@@ -45460,7 +45733,7 @@ define("ember-views/tests/system/render_buffer_test",
45460
45733
  });
45461
45734
 
45462
45735
  test("prevents XSS injection via `attr`", function() {
45463
- var buffer = new RenderBuffer('div');
45736
+ var buffer = new RenderBuffer('div', document.body);
45464
45737
 
45465
45738
  buffer.attr('id', 'trololol" onmouseover="pwn()');
45466
45739
  buffer.attr('class', "hax><img src=\"trollface.png\"");
@@ -45474,7 +45747,7 @@ define("ember-views/tests/system/render_buffer_test",
45474
45747
  });
45475
45748
 
45476
45749
  test("prevents XSS injection via `addClass`", function() {
45477
- var buffer = new RenderBuffer('div');
45750
+ var buffer = new RenderBuffer('div', document.body);
45478
45751
 
45479
45752
  buffer.addClass('megahax" xss="true');
45480
45753
  buffer.generateElement();
@@ -45484,7 +45757,7 @@ define("ember-views/tests/system/render_buffer_test",
45484
45757
  });
45485
45758
 
45486
45759
  test("prevents XSS injection via `style`", function() {
45487
- var buffer = new RenderBuffer('div');
45760
+ var buffer = new RenderBuffer('div', document.body);
45488
45761
 
45489
45762
  buffer.style('color', 'blue;" xss="true" style="color:red');
45490
45763
  buffer.generateElement();
@@ -45503,25 +45776,25 @@ define("ember-views/tests/system/render_buffer_test",
45503
45776
  });
45504
45777
 
45505
45778
  test("prevents XSS injection via `tagName`", function() {
45506
- var buffer = new RenderBuffer('cool-div><div xss="true"');
45779
+ var buffer = new RenderBuffer('cool-div><div xss="true"', document.body);
45507
45780
  try {
45508
45781
  buffer.generateElement();
45509
- equal(buffer.string(), '<cool-divdivxsstrue></cool-divdivxsstrue>');
45782
+ equal(buffer.element().childNodes.length, 0, 'no extra nodes created');
45510
45783
  } catch (e) {
45511
45784
  ok(true, 'dom exception');
45512
45785
  }
45513
45786
  });
45514
45787
 
45515
45788
  test("handles null props - Issue #2019", function() {
45516
- var buffer = new RenderBuffer('div');
45789
+ var buffer = new RenderBuffer('div', document.body);
45517
45790
 
45518
45791
  buffer.prop('value', null);
45519
45792
  buffer.generateElement();
45520
- equal(buffer.string(), '<div></div>');
45793
+ equal(buffer.element().tagName, 'DIV', 'div exists');
45521
45794
  });
45522
45795
 
45523
45796
  test("handles browsers like Firefox < 11 that don't support outerHTML Issue #1952", function() {
45524
- var buffer = new RenderBuffer('div');
45797
+ var buffer = new RenderBuffer('div', document.body);
45525
45798
  buffer.generateElement();
45526
45799
  // Make sure element.outerHTML is falsy to trigger the fallback.
45527
45800
  var elementStub = '<div></div>';
@@ -45531,20 +45804,78 @@ define("ember-views/tests/system/render_buffer_test",
45531
45804
  });
45532
45805
 
45533
45806
  test("lets `setClasses` and `addClass` work together", function() {
45534
- var buffer = new RenderBuffer('div');
45807
+ var buffer = new RenderBuffer('div', document.body);
45535
45808
  buffer.setClasses(['foo', 'bar']);
45536
45809
  buffer.addClass('baz');
45537
45810
  buffer.generateElement();
45538
45811
 
45539
45812
  var el = buffer.element();
45540
- equal(el.tagName.toLowerCase(), 'div');
45813
+ equal(el.tagName, 'DIV');
45541
45814
  equal(el.getAttribute('class'), 'foo bar baz');
45542
45815
  });
45543
45816
 
45817
+ test("generates text and a div and text", function() {
45818
+ var div = document.createElement('div');
45819
+ var buffer = new RenderBuffer(undefined, div);
45820
+ buffer.buffer = 'Howdy<div>Nick</div>Cage';
45821
+
45822
+ var el = buffer.element();
45823
+ equal(el.childNodes[0].data, 'Howdy');
45824
+ equal(el.childNodes[1].tagName, 'DIV');
45825
+ equal(el.childNodes[1].childNodes[0].data, 'Nick');
45826
+ equal(el.childNodes[2].data, 'Cage');
45827
+ });
45828
+
45829
+
45830
+ test("generates a tr from a tr innerString", function() {
45831
+ var table = document.createElement('table');
45832
+ var buffer = new RenderBuffer(undefined, table);
45833
+ buffer.buffer = '<tr></tr>';
45834
+
45835
+ var el = buffer.element();
45836
+ equal(el.childNodes[0].tagName.toLowerCase(), 'tr');
45837
+ });
45838
+
45839
+ test("generates a tr from a tr innerString with leading <script", function() {
45840
+ var table = document.createElement('table');
45841
+ var buffer = new RenderBuffer(undefined, table);
45842
+ buffer.buffer = '<script></script><tr></tr>';
45843
+
45844
+ var el = buffer.element();
45845
+ equal(el.childNodes[1].tagName.toLowerCase(), 'tr');
45846
+ });
45847
+
45848
+ test("generates a tr from a tr innerString with leading comment", function() {
45849
+ var table = document.createElement('table');
45850
+ var buffer = new RenderBuffer(undefined, table);
45851
+ buffer.buffer = '<!-- blargh! --><tr></tr>';
45852
+
45853
+ var el = buffer.element();
45854
+ equal(el.childNodes[1].tagName, 'TR');
45855
+ });
45856
+
45857
+ test("generates a tbody from a tbody innerString", function() {
45858
+ var table = document.createElement('table');
45859
+ var buffer = new RenderBuffer(undefined, table);
45860
+ buffer.buffer = '<tbody><tr></tr></tbody>';
45861
+
45862
+ var el = buffer.element();
45863
+ equal(el.childNodes[0].tagName, 'TBODY');
45864
+ });
45865
+
45866
+ test("generates a col from a col innerString", function() {
45867
+ var table = document.createElement('table');
45868
+ var buffer = new RenderBuffer(undefined, table);
45869
+ buffer.buffer = '<col></col>';
45870
+
45871
+ var el = buffer.element();
45872
+ equal(el.childNodes[0].tagName, 'COL');
45873
+ });
45874
+
45544
45875
  QUnit.module("RenderBuffer - without tagName");
45545
45876
 
45546
45877
  test("It is possible to create a RenderBuffer without a tagName", function() {
45547
- var buffer = new RenderBuffer();
45878
+ var buffer = new RenderBuffer(undefined, document.body);
45548
45879
  buffer.push('a');
45549
45880
  buffer.push('b');
45550
45881
  buffer.push('c');
@@ -45559,7 +45890,7 @@ define("ember-views/tests/system/render_buffer_test",
45559
45890
  QUnit.module("RenderBuffer#element");
45560
45891
 
45561
45892
  test("properly handles old IE's zero-scope bug", function() {
45562
- var buffer = new RenderBuffer('div');
45893
+ var buffer = new RenderBuffer('div', document.body);
45563
45894
  buffer.generateElement();
45564
45895
  buffer.push('<script></script>foo');
45565
45896
 
@@ -48794,13 +49125,14 @@ define("ember-views/tests/views/view/create_child_view_test.jshint",
48794
49125
  });
48795
49126
  });
48796
49127
  define("ember-views/tests/views/view/create_element_test",
48797
- ["ember-metal/property_get","ember-metal/run_loop","ember-views/views/view","ember-views/views/container_view"],
48798
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
49128
+ ["ember-metal/property_get","ember-metal/run_loop","ember-views/views/view","ember-views/views/container_view","ember-metal-views/tests/test_helpers"],
49129
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
48799
49130
  "use strict";
48800
49131
  var get = __dependency1__.get;
48801
49132
  var run = __dependency2__["default"];
48802
49133
  var EmberView = __dependency3__["default"];
48803
49134
  var ContainerView = __dependency4__["default"];
49135
+ var equalHTML = __dependency5__.equalHTML;
48804
49136
 
48805
49137
  var view;
48806
49138
 
@@ -48845,6 +49177,61 @@ define("ember-views/tests/views/view/create_element_test",
48845
49177
  equal(elem.tagName.toString().toLowerCase(), 'span', 'has tagName from view');
48846
49178
  });
48847
49179
 
49180
+ test("calls render and parses the buffer string in the right context", function() {
49181
+ view = ContainerView.create({
49182
+ tagName: 'table',
49183
+ childViews: [ EmberView.create({
49184
+ tagName: '',
49185
+ render: function(buffer) {
49186
+ // Emulate a metamorph
49187
+ buffer.push("<script></script><tr><td>snorfblax</td></tr>");
49188
+ }
49189
+ })]
49190
+ });
49191
+
49192
+ equal(get(view, 'element'), null, 'precondition - has no element');
49193
+ run(function() {
49194
+ view.createElement();
49195
+ });
49196
+
49197
+
49198
+ var elem = get(view, 'element');
49199
+ ok(elem, 'has element now');
49200
+ equalHTML(elem.childNodes, '<script></script><tr><td>snorfblax</td></tr>', 'has innerHTML from context');
49201
+ equal(elem.tagName.toString().toLowerCase(), 'table', 'has tagName from view');
49202
+ });
49203
+
49204
+ test("does not wrap many tr children in tbody elements", function() {
49205
+ view = ContainerView.create({
49206
+ tagName: 'table',
49207
+ childViews: [
49208
+ EmberView.create({
49209
+ tagName: '',
49210
+ render: function(buffer) {
49211
+ // Emulate a metamorph
49212
+ buffer.push("<script></script><tr><td>snorfblax</td></tr>");
49213
+ } }),
49214
+ EmberView.create({
49215
+ tagName: '',
49216
+ render: function(buffer) {
49217
+ // Emulate a metamorph
49218
+ buffer.push("<script></script><tr><td>snorfblax</td></tr>");
49219
+ } })
49220
+ ]
49221
+ });
49222
+
49223
+ equal(get(view, 'element'), null, 'precondition - has no element');
49224
+ run(function() {
49225
+ view.createElement();
49226
+ });
49227
+
49228
+
49229
+ var elem = get(view, 'element');
49230
+ ok(elem, 'has element now');
49231
+ equalHTML(elem.childNodes, '<script></script><tr><td>snorfblax</td></tr><script></script><tr><td>snorfblax</td></tr>', 'has innerHTML from context');
49232
+ equal(elem.tagName.toString().toLowerCase(), 'table', 'has tagName from view');
49233
+ });
49234
+
48848
49235
  test("generated element include HTML from child views as well", function() {
48849
49236
  view = ContainerView.create({
48850
49237
  childViews: [ EmberView.create({ elementId: "foo" })]
@@ -49744,6 +50131,62 @@ define("ember-views/tests/views/view/nearest_of_type_test.jshint",
49744
50131
  ok(true, 'ember-views/tests/views/view/nearest_of_type_test.js should pass jshint.');
49745
50132
  });
49746
50133
  });
50134
+ define("ember-views/tests/views/view/nested_view_ordering_test",
50135
+ ["container","ember-metal/run_loop","ember-views/views/view","ember-handlebars-compiler"],
50136
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
50137
+ "use strict";
50138
+ var Container = __dependency1__["default"];
50139
+ var run = __dependency2__["default"];
50140
+
50141
+ var EmberView = __dependency3__["default"];
50142
+ var EmberHandlebars = __dependency4__["default"];
50143
+
50144
+ var container, view;
50145
+
50146
+ QUnit.module("EmberView - Nested View Ordering", {
50147
+ setup: function() {
50148
+ container = new Container();
50149
+ },
50150
+ teardown: function() {
50151
+ run(function() {
50152
+ if (view) { view.destroy(); }
50153
+ });
50154
+ }
50155
+ });
50156
+
50157
+ test("should call didInsertElement on child views before parent", function() {
50158
+ var insertedLast;
50159
+
50160
+ view = EmberView.create({
50161
+ didInsertElement: function(){
50162
+ insertedLast = "outer";
50163
+ },
50164
+ container: container,
50165
+ template: EmberHandlebars.compile("{{view \"inner\"}}")
50166
+ });
50167
+
50168
+ container.register("view:inner", EmberView.extend({
50169
+ didInsertElement: function(){
50170
+ insertedLast = "inner";
50171
+ }
50172
+ }));
50173
+
50174
+ run(function() {
50175
+ view.append();
50176
+ });
50177
+
50178
+ equal(insertedLast, "outer", "didInsertElement called on outer view after inner view");
50179
+ });
50180
+ });
50181
+ define("ember-views/tests/views/view/nested_view_ordering_test.jshint",
50182
+ [],
50183
+ function() {
50184
+ "use strict";
50185
+ module('JSHint - ember-views/tests/views/view');
50186
+ test('ember-views/tests/views/view/nested_view_ordering_test.js should pass jshint', function() {
50187
+ ok(true, 'ember-views/tests/views/view/nested_view_ordering_test.js should pass jshint.');
50188
+ });
50189
+ });
49747
50190
  define("ember-views/tests/views/view/parse_property_path_test",
49748
50191
  ["ember-views/views/view"],
49749
50192
  function(__dependency1__) {