зеркало из https://github.com/mozilla/gecko-dev.git
380 строки
10 KiB
HTML
380 строки
10 KiB
HTML
|
<!DOCTYPE HTML>
|
||
|
<html>
|
||
|
<!--
|
||
|
https://bugzilla.mozilla.org/show_bug.cgi?id=409380
|
||
|
-->
|
||
|
<head>
|
||
|
<title>Test for Bug 409380</title>
|
||
|
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
|
||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||
|
</head>
|
||
|
<body>
|
||
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409380">Mozilla Bug 409380</a>
|
||
|
<p id="display"></p>
|
||
|
<div id="content" style="display: none">
|
||
|
|
||
|
</div>
|
||
|
<pre id="test">
|
||
|
<script class="testbody" type="text/javascript">
|
||
|
|
||
|
/** Test for Bug 409380 **/
|
||
|
|
||
|
function runRangeTest()
|
||
|
{
|
||
|
// Bug 336381
|
||
|
// This is a case which can't be supported (at least not at the moment)
|
||
|
// because DOM Range requires that when the start boundary point is text node,
|
||
|
// it must be splitted. But in this case boundary point doesn't have parent,
|
||
|
// so splitting doesn't work.
|
||
|
var zz = document.getElementById("connectedDiv").firstChild;
|
||
|
zz.parentNode.removeChild(zz);
|
||
|
var range = document.createRange();
|
||
|
var hadException = false;
|
||
|
try {
|
||
|
range.setStart(zz, 0);
|
||
|
range.setEnd(zz, 0);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException ,
|
||
|
"It should be possible to select text node even if the node is not in DOM.");
|
||
|
hadException = false;
|
||
|
try {
|
||
|
r.insertNode(document.createTextNode('5'));
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException,
|
||
|
"It shouldn't be possible to insert text node to a detached range.");
|
||
|
|
||
|
// Bug 409380
|
||
|
var element = document.createElement('div');
|
||
|
var elementContent = "This is the element content";
|
||
|
element.innerHTML = elementContent;
|
||
|
range = element.ownerDocument.createRange();
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.selectNodeContents(element);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException,
|
||
|
"It should be possible to select node contents of a detached element.");
|
||
|
ok(range.toString() == elementContent, "Wrong range selection");
|
||
|
|
||
|
// range.selectNode can't succeed because selectNode sets boundary points
|
||
|
// to be parentNode, which in this testcase is null.
|
||
|
element = document.createElement('div');
|
||
|
range = element.ownerDocument.createRange();
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.selectNode(element);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "It shouldn't be possible to select a detached element.");
|
||
|
|
||
|
// Testing contextual fragment.
|
||
|
range = element.ownerDocument.createRange();
|
||
|
var cf = null;
|
||
|
var testContent = "<span>foo</span><span>bar</span>";
|
||
|
try {
|
||
|
range.selectNodeContents(element);
|
||
|
cf = range.createContextualFragment(testContent);
|
||
|
element.appendChild(cf);
|
||
|
} catch (ex) {
|
||
|
}
|
||
|
ok(cf, "Creating contextual fragment didn't succeed!");
|
||
|
ok(element.innerHTML == testContent, "Wrong innerHTML!");
|
||
|
|
||
|
element = document.createElement('div');
|
||
|
element.textContent = "foobar";
|
||
|
range = element.ownerDocument.createRange();
|
||
|
try {
|
||
|
range.selectNodeContents(element);
|
||
|
element.firstChild.insertData(3, " ");
|
||
|
} catch (ex) {
|
||
|
}
|
||
|
ok(range.toString() == "foo bar");
|
||
|
|
||
|
// Testing contextual fragment, but inserting element to document
|
||
|
// after creating range.
|
||
|
element = document.createElement('div');
|
||
|
range = element.ownerDocument.createRange();
|
||
|
document.body.appendChild(element);
|
||
|
cf = null;
|
||
|
testContent = "<span>foo</span><span>bar</span>";
|
||
|
try {
|
||
|
range.selectNodeContents(element);
|
||
|
cf = range.createContextualFragment(testContent);
|
||
|
element.appendChild(cf);
|
||
|
} catch (ex) {
|
||
|
}
|
||
|
ok(cf, "Creating contextual fragment didn't succeed!");
|
||
|
ok(element.innerHTML == testContent, "Wrong innerHTML!");
|
||
|
|
||
|
// Testing contextual fragment, but inserting element to document
|
||
|
// before creating range.
|
||
|
element = document.createElement('div');
|
||
|
document.body.appendChild(element);
|
||
|
range = element.ownerDocument.createRange();
|
||
|
cf = null;
|
||
|
testContent = "<span>foo</span><span>bar</span>";
|
||
|
try {
|
||
|
range.selectNodeContents(element);
|
||
|
cf = range.createContextualFragment(testContent);
|
||
|
element.appendChild(cf);
|
||
|
} catch (ex) {
|
||
|
}
|
||
|
ok(cf, "Creating contextual fragment didn't succeed!");
|
||
|
ok(element.innerHTML == testContent, "Wrong innerHTML!");
|
||
|
|
||
|
element = document.createElement('div');
|
||
|
var range2 = element.ownerDocument.createRange();
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.selectNodeContents(element);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException,
|
||
|
"It should be possible to select node contents of a detached element.");
|
||
|
|
||
|
// Now the boundary points of range are in DOM, but boundary points of
|
||
|
// range2 aren't.
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.START_TO_START, range2);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.START_TO_END, range2);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.END_TO_START, range2);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.END_TO_END, range2);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.START_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.START_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.END_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.END_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
// range3 will be in document
|
||
|
element = document.createElement('div');
|
||
|
document.body.appendChild(element);
|
||
|
range3 = element.ownerDocument.createRange();
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range3.selectNodeContents(element);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException,
|
||
|
"It should be possible to select node contents of a detached element.");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range3.compareBoundaryPoints(range.START_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range3.compareBoundaryPoints(range.START_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range3.compareBoundaryPoints(range.END_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range3.compareBoundaryPoints(range.END_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
// range4 won't be in document
|
||
|
element = document.createElement('div');
|
||
|
var range4 = element.ownerDocument.createRange();
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range4.selectNodeContents(element);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException,
|
||
|
"It should be possible to select node contents of a detached element.");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range4.compareBoundaryPoints(range.START_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.START_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range4.compareBoundaryPoints(range.END_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range4.compareBoundaryPoints(range.END_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(hadException, "Should have got an exception!");
|
||
|
|
||
|
// Compare range to itself.
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.START_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.START_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.END_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range.compareBoundaryPoints(range.END_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
// Attach startContainer of range2 to document.
|
||
|
ok(range2.startContainer == range2.endContainer, "Wrong container?");
|
||
|
document.body.appendChild(range2.startContainer);
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.START_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.START_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.END_TO_START, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
hadException = false;
|
||
|
try {
|
||
|
range2.compareBoundaryPoints(range.END_TO_END, range);
|
||
|
} catch (ex) {
|
||
|
hadException = true;
|
||
|
}
|
||
|
ok(!hadException, "Shouldn't have got an exception!");
|
||
|
|
||
|
SimpleTest.finish();
|
||
|
}
|
||
|
|
||
|
SimpleTest.waitForExplicitFinish();
|
||
|
addLoadEvent(runRangeTest);
|
||
|
|
||
|
</script>
|
||
|
</pre>
|
||
|
<div id="connectedDiv">zz</div>
|
||
|
</body>
|
||
|
</html>
|
||
|
|