Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inclusive morph #10413

Merged
merged 6 commits into from
Feb 12, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"express": "^4.5.0",
"github": "^0.2.3",
"glob": "~4.3.2",
"htmlbars": "0.10.0",
"htmlbars": "0.11.0",
"qunit-extras": "^1.3.0",
"qunitjs": "^1.16.0",
"route-recognizer": "0.1.5",
Expand Down
22 changes: 11 additions & 11 deletions packages/ember-metal-views/lib/renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -114,15 +113,15 @@ 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];
elements[level] = null;
}
}

this.insertElement(view, _parentView, element, insertAt);
this.insertElement(view, _parentView, element, _refMorph);

for (i=total-1; i>=0; i--) {
if (willInsert) {
Expand Down Expand Up @@ -171,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);
};

Expand Down Expand Up @@ -244,19 +248,15 @@ 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;
}

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);
}
}

Expand Down
8 changes: 3 additions & 5 deletions packages/ember-metal-views/tests/test_helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
8 changes: 4 additions & 4 deletions packages/ember-routing-htmlbars/lib/helpers/link-to.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
Expand All @@ -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);
}
}
};
Expand Down
7 changes: 2 additions & 5 deletions packages/ember-views/lib/system/render_buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions packages/ember-views/lib/system/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
11 changes: 6 additions & 5 deletions packages/ember-views/lib/views/container_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ var ContainerView = View.extend(MutableArray, {
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;
Expand Down Expand Up @@ -395,12 +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];
var refMorph = null;
for (var i = childViews.length-1; i >= 0; i--) {
var childView = childViews[i];
if (!childView._elementCreated) {
renderer.renderTree(childView, view, i);
renderer.renderTree(childView, view, refMorph);
}
refMorph = childView._morph;
}
}
});
Expand Down
2 changes: 1 addition & 1 deletion packages/ember-views/tests/views/container_view_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down