blob: 2e15cb6ca00dbac901c534512fd720a43a02f9e7 [file] [log] [blame]
description(
"This test checks the behavior of the intersectsNode() method on the Range object.<br>" +
"It covers all configurations of the node/Range relationship and some exception conditions."
);
var range = document.createRange();
var intersects = 0;
debug("1.1 Node starts before the range and ends before the range");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document.getElementById("b1"));
shouldBeFalse("intersects");
debug("");
debug("1.2 Node starts before the range, and range ends on a 1");
range.setStart(document.getElementById("b2"), 1);
range.setEnd(document.getElementById("c2"), 1);
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");
debug("1.3 Node starts before the range and ends within the range");
range.setStart(document.getElementById("b2"), 0);
range.setEnd(document.getElementById("c3"), 0);
intersects = range.intersectsNode(document.getElementById("a2"));
shouldBeTrue("intersects");
debug("");
debug("1.4 Range starts on 0, and node starts before range and ends in range");
range.setStart(document.getElementById("b2"), 0);
range.setEnd(document.getElementById("c2"), 1);
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");
debug("1.5 Node starts and ends in range");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");
debug("1.6 Node starts in the range, and the range ends on 1");
range.setStart(document.getElementById("b1"), 1);
range.setEnd(document.getElementById("c2"), 1);
intersects = range.intersectsNode( document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");
debug("1.7 Node starts in the range, and ends after the range");
range.setStart(document.getElementById("b1"), 1);
range.setEnd(document.getElementById("c2"), 0);
intersects = range.intersectsNode( document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");
debug("1.8 Range start on 1, node starts in range and ends after");
range.setStart(document.getElementById("b2"), 1);
range.setEnd(document.getElementById("c2"), 0);
intersects = range.intersectsNode( document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");
debug("1.9 Node starts on range start and ends on range end");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document.getElementById("a2"));
shouldBeTrue("intersects");
debug("");
debug("1.10 Node starts after range end and ends after range end");
range.selectNode(document.getElementById("b2"));
intersects = range.intersectsNode(document.getElementById("c3"));
shouldBeFalse("intersects");
debug("");
debug("1.11 Node starts before range start and ends after range end");
range.selectNode(document.getElementById("b2"));
intersects = range.intersectsNode(document.getElementById("a2"));
shouldBeTrue("intersects");
debug("");
debug("1.12 Node starts before range start and range begins and ends on 1");
range.setEnd(document.getElementById("c2"), 1);
range.setStart(document.getElementById("c2"), 1);
intersects = range.intersectsNode(document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");
debug("1.13 Range starts at 0 and ends at 1");
range.setStart(document.getElementById("b2"), 0);
range.setEnd(document.getElementById("b2"), 1);
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");
debug("2.1 Detached Range, attached node");
var detachedRange = document.createRange();
detachedRange.detach(); // No-op.
shouldBeFalse("detachedRange.intersectsNode(document.getElementById('a1'))");
debug("");
debug("2.2 attached range, detached node");
// firefox does not throw an exception but returns 0
range.selectNode(document.getElementById("a1"));
var node = document.getElementById("b1");
node.parentNode.removeChild(node);
intersects = range.intersectsNode(node);
shouldBeFalse("intersects");
debug("");
debug("2.3 Node has no parent");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document);
shouldBeTrue("intersects");
debug("");
debug("2.4 Range has no parent");
shouldThrow("range.selectNode(document)", '"InvalidNodeTypeError: Failed to execute \'selectNode\' on \'Range\': the given Node has no parent."');
debug("");
debug("2.5 Wrong documents");
// firefox does not throw an exception here instead it returns 0
var src1 = "<html>\n<head>\n<body>\n<div id=f1>f1</div>\n</body>\n</head>\n<html>";
window.frames['frame1'].document.open("text/html", "replace");
window.frames['frame1'].document.write(src1);
window.frames['frame1'].document.close();
var src2 = "<html>\n<head>\n<body>\n<div id=f2>f2</div>\n</body>\n</head>\n<html>";
window.frames['frame2'].document.open("text/html", "replace");
window.frames['frame2'].document.write(src2);
window.frames['frame2'].document.close();
var framerange = window.frames['frame1'].document.createRange();
var F1Div = window.frames['frame1'].document.getElementById("f1");
framerange.selectNode(F1Div);
intersects =framerange.intersectsNode(window.frames['frame2'].document.getElementById("f2"));
shouldBeFalse("intersects");
debug("");
debug("2.6 Node deleted");
range.selectNode(document.getElementById("a2"));
var node = null;
shouldThrow("range.intersectsNode(node)");
debug("");
if (window.testRunner)
testRunner.dumpAsText();