From 3c49cf2be64a5909b223baf0dcb9bff8f753b615 Mon Sep 17 00:00:00 2001 From: Kris Selden Date: Tue, 10 Feb 2015 00:46:29 -0800 Subject: [PATCH 1/6] adjust container view --- packages/ember-metal-views/lib/renderer.js | 15 +++++---------- packages/ember-views/lib/views/container_view.js | 12 +++++++----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/ember-metal-views/lib/renderer.js b/packages/ember-metal-views/lib/renderer.js index faeba6a9602..58f1a3a41f5 100755 --- a/packages/ember-metal-views/lib/renderer.js +++ b/packages/ember-metal-views/lib/renderer.js @@ -17,10 +17,9 @@ function Renderer(_helper, _destinedForDOM) { this._destinedForDOM = _destinedForDOM === undefined ? true : _destinedForDOM; } -function Renderer_renderTree(_view, _parentView, _insertAt) { +function Renderer_renderTree(_view, _parentView, _refMorph) { var views = this._views; views[0] = _view; - var insertAt = _insertAt === undefined ? -1 : _insertAt; var index = 0; var total = 1; var levelBase = _parentView ? _parentView._level+1 : 0; @@ -114,7 +113,7 @@ function Renderer_renderTree(_view, _parentView, _insertAt) { parentIndex = parents[level]; parent = parentIndex === -1 ? _parentView : views[parentIndex]; - this.insertElement(view, parent, element, -1); + this.insertElement(view, parent, element, null); index = queue[--length]; view = views[index]; element = elements[level]; @@ -122,7 +121,7 @@ function Renderer_renderTree(_view, _parentView, _insertAt) { } } - this.insertElement(view, _parentView, element, insertAt); + this.insertElement(view, _parentView, element, _refMorph); for (i=total-1; i>=0; i--) { if (willInsert) { @@ -244,7 +243,7 @@ function Renderer_remove(_view, shouldDestroy, reset) { } } -function Renderer_insertElement(view, parentView, element, index) { +function Renderer_insertElement(view, parentView, element, refMorph) { if (element === null || element === undefined) { return; } @@ -252,11 +251,7 @@ function Renderer_insertElement(view, parentView, element, index) { if (view._morph) { view._morph.setContent(element); } else if (parentView) { - if (index === -1) { - view._morph = parentView._childViewsMorph.append(element); - } else { - view._morph = parentView._childViewsMorph.insert(index, element); - } + view._morph = parentView._childViewsMorph.insertContentBeforeMorph(element, refMorph); } } diff --git a/packages/ember-views/lib/views/container_view.js b/packages/ember-views/lib/views/container_view.js index 4b8de17fbe3..b183102cb74 100644 --- a/packages/ember-views/lib/views/container_view.js +++ b/packages/ember-views/lib/views/container_view.js @@ -395,11 +395,13 @@ merge(states.hasElement, { var childViews = view._childViews; var renderer = view._renderer; - var i, len, childView; - for (i = 0, len = childViews.length; i < len; i++) { - childView = childViews[i]; - if (!childView._elementCreated) { - renderer.renderTree(childView, view, i); + var refMorph = null; + for (var i = childViews.length-1; i >= 0; i--) { + var childView = childViews[i]; + if (childView._elementCreated) { + refMorph = childView._morph; + } else { + renderer.renderTree(childView, view, refMorph); } } } From a9422f48228f5943886999d5ae3025464c18c409 Mon Sep 17 00:00:00 2001 From: Kris Selden Date: Tue, 10 Feb 2015 01:34:29 -0800 Subject: [PATCH 2/6] adjust morph usage to be inclusive --- packages/ember-metal-views/lib/renderer.js | 7 ++++++- packages/ember-metal-views/tests/test_helpers.js | 8 +++----- packages/ember-views/lib/system/render_buffer.js | 7 ++----- packages/ember-views/lib/system/utils.js | 4 ++-- packages/ember-views/lib/views/container_view.js | 8 +------- 5 files changed, 14 insertions(+), 20 deletions(-) diff --git a/packages/ember-metal-views/lib/renderer.js b/packages/ember-metal-views/lib/renderer.js index 58f1a3a41f5..27ecda277cc 100755 --- a/packages/ember-metal-views/lib/renderer.js +++ b/packages/ember-metal-views/lib/renderer.js @@ -170,7 +170,12 @@ Renderer.prototype.appendAttrTo = Renderer.prototype.replaceIn = function Renderer_replaceIn(view, target) { - var morph = this._dom.createMorph(target, null, null); + var morph; + if (target.firstNode) { + morph = this._dom.createMorph(target, target.firstNode, target.lastNode); + } else { + morph = this._dom.appendMorph(target); + } this.scheduleInsert(view, morph); }; diff --git a/packages/ember-metal-views/tests/test_helpers.js b/packages/ember-metal-views/tests/test_helpers.js index 42c3d7b4d5e..62654740bbb 100755 --- a/packages/ember-metal-views/tests/test_helpers.js +++ b/packages/ember-metal-views/tests/test_helpers.js @@ -47,15 +47,13 @@ MetalRenderer.prototype.createElement = function (view, contextualElement) { } } if (view.childViews) { - view._childViewsMorph = this._dom.createMorph(el, null, null); + view._childViewsMorph = this._dom.appendMorph(el); } else if (view.textContent) { setElementText(el, view.textContent); } else if (view.innerHTML) { this._dom.detectNamespace(el); - var nodes = this._dom.parseHTML(view.innerHTML, el); - while (nodes[0]) { - el.appendChild(nodes[0]); - } + var frag = this._dom.parseHTML(view.innerHTML, el); + el.appendChild(frag); } return el; }; diff --git a/packages/ember-views/lib/system/render_buffer.js b/packages/ember-views/lib/system/render_buffer.js index 8e4bb18b039..54ec3f2b9a6 100644 --- a/packages/ember-views/lib/system/render_buffer.js +++ b/packages/ember-views/lib/system/render_buffer.js @@ -528,11 +528,8 @@ RenderBuffer.prototype = { if (content.nodeType) { this._element.appendChild(content); } else { - var nodes; - nodes = this.dom.parseHTML(content, contextualElement); - while (nodes[0]) { - this._element.appendChild(nodes[0]); - } + var frag = this.dom.parseHTML(content, contextualElement); + this._element.appendChild(frag); } // This should only happen with legacy string buffers diff --git a/packages/ember-views/lib/system/utils.js b/packages/ember-views/lib/system/utils.js index fbe2d974cff..649453f5f33 100644 --- a/packages/ember-views/lib/system/utils.js +++ b/packages/ember-views/lib/system/utils.js @@ -17,8 +17,8 @@ export function isSimpleClick(event) { */ function getViewRange(view) { var range = document.createRange(); - range.setStartAfter(view._morph.start); - range.setEndBefore(view._morph.end); + range.setStartBefore(view._morph.firstNode); + range.setEndAfter(view._morph.lastNode); return range; } diff --git a/packages/ember-views/lib/views/container_view.js b/packages/ember-views/lib/views/container_view.js index b183102cb74..ecc9765a379 100644 --- a/packages/ember-views/lib/views/container_view.js +++ b/packages/ember-views/lib/views/container_view.js @@ -267,13 +267,7 @@ var ContainerView = View.extend(MutableArray, { var element = buffer.element(); var dom = buffer.dom; - if (this.tagName === '') { - element = dom.createDocumentFragment(); - buffer._element = element; - this._childViewsMorph = dom.appendMorph(element, this._morph.contextualElement); - } else { - this._childViewsMorph = dom.createMorph(element, element.lastChild, null); - } + this._childViewsMorph = dom.appendMorph(element); return element; }, From c5c0c1f431fc66e773ba2dd45df83d8a88e795e9 Mon Sep 17 00:00:00 2001 From: Kris Selden Date: Tue, 10 Feb 2015 03:21:32 -0800 Subject: [PATCH 3/6] fixes most remaining tests, only 14 failing --- package.json | 2 +- packages/ember-views/lib/views/container_view.js | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 221b3a27704..2c2df232e56 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "express": "^4.5.0", "github": "^0.2.3", "glob": "~4.3.2", - "htmlbars": "0.10.0", + "htmlbars": "tildeio/htmlbars#master", "qunit-extras": "^1.3.0", "qunitjs": "^1.16.0", "route-recognizer": "0.1.5", diff --git a/packages/ember-views/lib/views/container_view.js b/packages/ember-views/lib/views/container_view.js index ecc9765a379..bb5ae7a4654 100644 --- a/packages/ember-views/lib/views/container_view.js +++ b/packages/ember-views/lib/views/container_view.js @@ -267,7 +267,13 @@ var ContainerView = View.extend(MutableArray, { var element = buffer.element(); var dom = buffer.dom; - this._childViewsMorph = dom.appendMorph(element); + if (this.tagName === '') { + element = dom.createDocumentFragment(); + buffer._element = element; + this._childViewsMorph = dom.appendMorph(element, this._morph.contextualElement); + } else { + this._childViewsMorph = dom.appendMorph(element); + } return element; }, @@ -392,11 +398,10 @@ merge(states.hasElement, { var refMorph = null; for (var i = childViews.length-1; i >= 0; i--) { var childView = childViews[i]; - if (childView._elementCreated) { - refMorph = childView._morph; - } else { + if (!childView._elementCreated) { renderer.renderTree(childView, view, refMorph); } + refMorph = childView._morph; } } }); From 6fcb15191ed634dd7d08b22dfe087162f0cb58fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Mu=C3=B1oz?= Date: Tue, 10 Feb 2015 19:57:31 -0500 Subject: [PATCH 4/6] Relax ContainerView test to accept comment nodes as empty --- packages/ember-views/tests/views/container_view_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ember-views/tests/views/container_view_test.js b/packages/ember-views/tests/views/container_view_test.js index a5483ae6817..1c322c65ae0 100644 --- a/packages/ember-views/tests/views/container_view_test.js +++ b/packages/ember-views/tests/views/container_view_test.js @@ -263,7 +263,7 @@ QUnit.test("views that are removed from a ContainerView should have their child container.removeObject(view); }); equal(get(view, 'childViews.length'), 0, "child views are cleared when removed from container view"); - equal(container.$().html(), '', "the child view is removed from the DOM"); + equal(container.$().text(), '', "the child view is removed from the DOM"); }); QUnit.test("if a ContainerView starts with an empty currentView, nothing is displayed", function() { From 87251db173af196bd369cda784e7ccb82724c538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Mu=C3=B1oz?= Date: Tue, 10 Feb 2015 20:15:20 -0500 Subject: [PATCH 5/6] Morph escaping is now handled by the `parseTextAsHTML` property --- packages/ember-routing-htmlbars/lib/helpers/link-to.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/ember-routing-htmlbars/lib/helpers/link-to.js b/packages/ember-routing-htmlbars/lib/helpers/link-to.js index ed083675ce8..5d898bd7b6e 100644 --- a/packages/ember-routing-htmlbars/lib/helpers/link-to.js +++ b/packages/ember-routing-htmlbars/lib/helpers/link-to.js @@ -302,7 +302,7 @@ function linkToHelper(params, hash, options, env) { if (!options.template) { var linkTitle = params.shift(); - var shouldEscape = options.morph.escaped; + var parseTextAsHTML = options.morph.parseTextAsHTML; if (isStream(linkTitle)) { hash.linkTitle = { stream: linkTitle }; @@ -312,10 +312,10 @@ function linkToHelper(params, hash, options, env) { isHTMLBars: true, render: function(view, env) { var value = read(linkTitle) || ""; - if (shouldEscape) { - return env.dom.createTextNode(value); - } else { + if (parseTextAsHTML) { return value; + } else { + return env.dom.createTextNode(value); } } }; From 36f8358377982fe719ea7a9fec5b8e72f74258d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Mu=C3=B1oz?= Date: Wed, 11 Feb 2015 16:06:30 -0500 Subject: [PATCH 6/6] Update htmlbars to 0.11.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2c2df232e56..bde6b9bbe16 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "express": "^4.5.0", "github": "^0.2.3", "glob": "~4.3.2", - "htmlbars": "tildeio/htmlbars#master", + "htmlbars": "0.11.0", "qunit-extras": "^1.3.0", "qunitjs": "^1.16.0", "route-recognizer": "0.1.5",