diff --git a/packages/ui/domrange.js b/packages/ui/domrange.js index 2da5581aab..b66837c5b8 100644 --- a/packages/ui/domrange.js +++ b/packages/ui/domrange.js @@ -192,6 +192,9 @@ var DomRange = function (component) { _extend(DomRange.prototype, { getNodes: function () { + if (! this.parentNode()) + return []; + this.refresh(); var afterNode = this.end.nextSibling; @@ -203,6 +206,9 @@ _extend(DomRange.prototype, { return nodes; }, removeAll: function () { + if (! this.parentNode()) + return; + this.refresh(); // leave start and end @@ -494,6 +500,9 @@ _extend(DomRange.prototype, { // see `getInsertionPoint`. Adding multiple members // at once using `add(array)` is faster. refresh: function () { + var parentNode = this.parentNode(); + if (! parentNode) + return; // Using `eachMember`, do several things: // - Refresh all member ranges @@ -520,7 +529,6 @@ _extend(DomRange.prototype, { numMembers++; }); - var parentNode = this.parentNode(); var firstNode = null; var lastNode = null; diff --git a/packages/ui/domrange_tests.js b/packages/ui/domrange_tests.js index 2eafdef998..c3aba4973d 100644 --- a/packages/ui/domrange_tests.js +++ b/packages/ui/domrange_tests.js @@ -1027,6 +1027,8 @@ Tinytest.add("ui - DomRange - structural removal", function (test) { test.isTrue(f.isRemoved); test.isTrue(h.isRemoved); test.isTrue(k.isRemoved); + + r.removeAll(); } }); }); @@ -1039,26 +1041,46 @@ Tinytest.add("ui - DomRange - noticed removal", function (test) { Tinytest.add("ui - DomRange - jQuery removal", function (test) { inDocument(htmlRange("
"), function (r) { - var g = document.createElement("DIV"); - var h = new DomRange; - var i = document.createElement("DIV"); - var j = document.createElement("DIV"); - var k = new DomRange; - r.add('g', g); - DomRange.insert(h, g); - h.add(i); - DomRange.insert(k, j); - i.appendChild(j); - test.isFalse(h.isRemoved); - test.isFalse(k.isRemoved); + for (var scenario = 0; scenario < 3; scenario++) { + var f = document.createElement("DIV"); + var g = document.createElement("DIV"); + var h = new DomRange; + var i = document.createElement("DIV"); + var j = document.createElement("DIV"); + var k = new DomRange; + r.add(f); + f.appendChild(g); + DomRange.insert(h, g); + h.add(i); + DomRange.insert(k, j); + i.appendChild(j); + test.isFalse(h.isRemoved); + test.isFalse(k.isRemoved); - $(g).removeData(); - test.isFalse(h.isRemoved); - test.isFalse(k.isRemoved); + $(g).removeData(); + test.isFalse(h.isRemoved); + test.isFalse(k.isRemoved); - $(g).remove(); - test.isTrue(h.isRemoved); - test.isTrue(k.isRemoved); + if (scenario === 0) + $(g).remove(); + else if (scenario === 1) + $(f).empty(); + else if (scenario === 2) + $(f).html("