+2006-09-12 Kevin McCullough <KMcCullough@apple.com>
+
+ Reviewed by Andersca, Maciej, Brady.
+
+ * fast/dom/Range/range-intersectsNode-expected.txt: Added.
+ * fast/dom/Range/range-intersectsNode.html: Added.
+ * fast/dom/Range/resources/intersectsNode.js: Added.
+
2006-09-12 Nikolas Zimmermann <zimmermann@kde.org>
Reviewed by eseidel. Landed by eseidel.
--- /dev/null
+This test checks the behavior of the intersectsNode() method on the Range object.
+It covers all configurations of the node/Range relationship and some exception conditions.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+1.1 Node starts before the range and ends before the range
+PASS intersects is false
+
+1.2 Node starts before the range, and range ends on a 1
+PASS intersects is true
+
+1.3 Node starts before the range and ends within the range
+PASS intersects is true
+
+1.4 Range starts on 0, and node starts before range and ends in range
+PASS intersects is true
+
+1.5 Node starts and ends in range
+PASS intersects is true
+
+1.6 Node starts in the range, and the range ends on 1
+PASS intersects is true
+
+1.7 Node starts in the range, and ends after the range
+PASS intersects is true
+
+1.8 Range start on 1, node starts in range and ends after
+PASS intersects is true
+
+1.9 Node starts on range start and ends on range end
+PASS intersects is true
+
+1.10 Node starts after range end and ends after range end
+PASS intersects is false
+
+1.11 Node starts before range start and ends after range end
+PASS intersects is true
+
+1.12 Node starts before range start and range begins and ends on 1
+PASS intersects is true
+
+1.13 Range starts at 0 and ends at 1
+PASS intersects is true
+
+2.1 Detached Range, attached node
+PASS intersects is false
+
+2.2 attached range, detached node
+PASS intersects is false
+
+2.3 Node has no parent
+PASS range.intersectsNode(document) threw exception Error: NOT_FOUND_ERR: DOM Exception 8.
+
+2.4 Range has no parent
+PASS range.selectNode(document) threw exception Error: INVALID_NODE_TYPE_ERR: DOM Range Exception 2.
+
+2.5 Wrong documents
+PASS intersects is false
+
+2.6 Node deleted
+PASS range.intersectsNode(node) threw exception Error: NOT_FOUND_ERR: DOM Exception 8.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
\ No newline at end of file
--- /dev/null
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<title>Test for Range.intersectsNode()</title>
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<!-- hidden area to create the ranges being tested -->
+<div style="visibility: hidden">
+ <div id=a1>a1
+ <div id=b1>b1</div>
+ <div id=c1>c1</div>
+ </div>
+
+ <div id=a2>a2
+ <div id=b2>b2</div>
+ <div id=c2>c2</div>
+ </div>
+ <div id=a3>a3
+ <div id=b3>b3</div>
+ <div id=c3>c3</div>
+ </div>
+
+ <iframe name="frame1" style="border: 1px solid black;"></iframe>
+ <iframe name="frame2" style="border: 1px solid black;"></iframe>
+</div>
+ <script src="./resources/intersectsNode.js"></script>
+ <script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
--- /dev/null
+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();
+intersects = detachedRange.intersectsNode(document.getElementById("a1"));
+shouldBeFalse("intersects");
+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"));
+shouldThrow("range.intersectsNode(document)");
+debug("");
+
+debug("2.4 Range has no parent");
+shouldThrow("range.selectNode(document)");
+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.layoutTestController)
+ layoutTestController.dumpAsText();
+
+successfullyParsed = true;
+2006-09-11 Kevin McCullough <KMcCullough@apple.com>
+
+ Reviewed by Andersca, Maciej, Brady.
+
+ - Implemented intersectsNode in the Range Class
+ to be compliant with Mozilla standard
+
+ * dom/Range.cpp:
+ (WebCore::Range::intersectsNode):
+ * dom/Range.h:
+ * dom/Range.idl:
+
2006-09-12 Nikolas Zimmermann <zimmermann@kde.org>
Reviewed by eseidel. Landed by eseidel.
processContents(DELETE_CONTENTS,ec);
}
+bool Range::intersectsNode(Node* refNode, ExceptionCode& ec)
+{
+ // http://developer.mozilla.org/en/docs/DOM:range.intersectsNode
+ // Returns a bool if the node intersects the range.
+
+ if (!refNode) {
+ ec = NOT_FOUND_ERR;
+ return false;
+ }
+
+ if (m_detached && refNode->attached() ||
+ !m_detached && !refNode->attached() ||
+ refNode->document() != m_ownerDocument)
+ // firefox doesn't throw an exception for these case; it returns false
+ return false;
+
+ Node* parentNode = refNode->parentNode();
+ unsigned nodeIndex = refNode->nodeIndex();
+
+ if (!parentNode) {
+ // if the node is the top document we should return NODE_BEFORE_AND_AFTER
+ // but we throw to match firefox behavior
+ ec = NOT_FOUND_ERR;
+ return false;
+ }
+
+ if (comparePoint(parentNode, nodeIndex, ec) == -1 && // starts before start
+ comparePoint(parentNode, nodeIndex + 1, ec) == -1) { // ends before start
+ return false;
+ } else if(comparePoint(parentNode, nodeIndex, ec) == 1 && // starts after end
+ comparePoint(parentNode, nodeIndex + 1, ec) == 1) { // ends after end
+ return false;
+ }
+
+ return true; //all other cases
+}
+
PassRefPtr<DocumentFragment> Range::processContents ( ActionType action, ExceptionCode& ec)
{
// ### when mutation events are implemented, we will have to take into account
static short compareBoundaryPoints(Node* containerA, int offsetA, Node* containerB, int offsetB);
static short compareBoundaryPoints(const Position&, const Position&);
bool boundaryPointsValid() const;
+ bool intersectsNode(Node* refNode, ExceptionCode&);
void deleteContents(ExceptionCode&);
PassRefPtr<DocumentFragment> extractContents(ExceptionCode&);
PassRefPtr<DocumentFragment> cloneContents(ExceptionCode&);
in Range sourceRange)
raises(dom::DOMException);
- short compareNode(in Node refNode)
- raises(RangeException, dom::DOMException);
-
- // CompareResults
- const unsigned short NODE_BEFORE = 0;
- const unsigned short NODE_AFTER = 1;
- const unsigned short NODE_BEFORE_AND_AFTER = 2;
- const unsigned short NODE_INSIDE = 3;
-
- short comparePoint(in Node refNode,
- in long offset)
- raises(RangeException, dom::DOMException);
- boolean isPointInRange(in Node refNode,
- in long offset)
- raises(RangeException, dom::DOMException);
void deleteContents()
raises(dom::DOMException);
DocumentFragment extractContents()
DocumentFragment createContextualFragment(in DOMString html)
raises(dom::DOMException);
+
+ // WebKit extensions
+
+ boolean intersectsNode(in Node refNode)
+ raises(RangeException, dom::DOMException);
+ short compareNode(in Node refNode)
+ raises(RangeException, dom::DOMException);
+
+ // CompareResults
+ const unsigned short NODE_BEFORE = 0;
+ const unsigned short NODE_AFTER = 1;
+ const unsigned short NODE_BEFORE_AND_AFTER = 2;
+ const unsigned short NODE_INSIDE = 3;
+
+ short comparePoint(in Node refNode,
+ in long offset)
+ raises(RangeException, dom::DOMException);
+
+ boolean isPointInRange(in Node refNode,
+ in long offset)
+ raises(RangeException, dom::DOMException);
};
}