LayoutTests:
authorkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Sep 2006 01:28:11 +0000 (01:28 +0000)
committerkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Sep 2006 01:28:11 +0000 (01:28 +0000)
        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.

WebCore:

        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:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16338 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/dom/Range/range-intersectsNode-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/Range/range-intersectsNode.html [new file with mode: 0644]
LayoutTests/fast/dom/Range/resources/intersectsNode.js [new file with mode: 0644]
WebCore/ChangeLog
WebCore/dom/Range.cpp
WebCore/dom/Range.h
WebCore/dom/Range.idl

index b355409fe16e279f6db49e8ace21c80b8442d13b..f63293caa248f71c9396c66861542e1d965b9830 100644 (file)
@@ -1,3 +1,11 @@
+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.
diff --git a/LayoutTests/fast/dom/Range/range-intersectsNode-expected.txt b/LayoutTests/fast/dom/Range/range-intersectsNode-expected.txt
new file mode 100644 (file)
index 0000000..9c7682a
--- /dev/null
@@ -0,0 +1,66 @@
+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
diff --git a/LayoutTests/fast/dom/Range/range-intersectsNode.html b/LayoutTests/fast/dom/Range/range-intersectsNode.html
new file mode 100644 (file)
index 0000000..1de0782
--- /dev/null
@@ -0,0 +1,34 @@
+<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>
diff --git a/LayoutTests/fast/dom/Range/resources/intersectsNode.js b/LayoutTests/fast/dom/Range/resources/intersectsNode.js
new file mode 100644 (file)
index 0000000..26ee8d4
--- /dev/null
@@ -0,0 +1,149 @@
+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;
index 70c2c5ed1fb12a7a1a6721586f8aff91053f3a60..3a58f6e96f8e8ffa0407bb6325222faec9aa6e9f 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 2b4e8d2ad0e7c09bde6626302aa3832be6befd4d..1383f7854612347653067a5d0034e8c9be03e0cb 100644 (file)
@@ -543,6 +543,43 @@ void Range::deleteContents(ExceptionCode& ec) {
     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
index d6d4177b5be8e74a33866accccf167a82891fc37..f14ad3818a1a6b409c5a244af70634b787870416 100644 (file)
@@ -69,6 +69,7 @@ public:
     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&);
index 10e41528fe27352e59d90d417948a6a4248d95a7..995aa067b4354d7b5500ece262eaca460ecfc207 100644 (file)
@@ -67,21 +67,6 @@ module ranges {
                                                    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()
@@ -104,7 +89,28 @@ module ranges {
 
         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);
     };
 
 }