Reviewed by Richard
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Dec 2004 21:04:14 +0000 (21:04 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Dec 2004 21:04:14 +0000 (21:04 +0000)
        Fix for this bug:

        <rdar://problem/3857775> 8A293: Mail.app crashes converting copy-pasted text into plain text

        * khtml/xml/dom2_rangeimpl.cpp:
        (DOM::RangeImpl::commonAncestorContainer): Return the document element if no common ancestor container
        was found. This can happen in cases where the DOM was built from malformed markup (as in the case
        of this bug where there is content after the body tag). Did a little code clean up as well.
        (DOM::RangeImpl::compareBoundaryPoints): Made code more robust by adding some null checks.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/xml/dom2_rangeimpl.cpp

index e102fe0c28eb4a7cbb30bd482fffd664f619be7b..7fe50804767e6ced2606b1de1999809f8a7600b6 100644 (file)
@@ -1,3 +1,17 @@
+2004-12-02  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Richard
+
+        Fix for this bug:
+        
+        <rdar://problem/3857775> 8A293: Mail.app crashes converting copy-pasted text into plain text
+
+        * khtml/xml/dom2_rangeimpl.cpp:
+        (DOM::RangeImpl::commonAncestorContainer): Return the document element if no common ancestor container
+        was found. This can happen in cases where the DOM was built from malformed markup (as in the case
+        of this bug where there is content after the body tag). Did a little code clean up as well.
+        (DOM::RangeImpl::compareBoundaryPoints): Made code more robust by adding some null checks.
+
 2004-12-02  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Chris
index e83ae28d3ad1e6df661da70e9d817f3a83408543..82214c4c5ee772c0f61ce80b86a86c6cd5a7b441 100644 (file)
@@ -136,12 +136,15 @@ NodeImpl *RangeImpl::commonAncestorContainer(NodeImpl *containerA, NodeImpl *con
 
     for (parentStart = containerA; parentStart; parentStart = parentStart->parentNode()) {
         NodeImpl *parentEnd = containerB;
-        while( parentEnd && (parentStart != parentEnd) )
+        while (parentEnd && (parentStart != parentEnd))
             parentEnd = parentEnd->parentNode();
-
-        if(parentStart == parentEnd)  break;
+        if (parentStart == parentEnd)
+            break;
     }
 
+    if (!parentStart && containerA->getDocument())
+        return containerA->getDocument()->documentElement();
+        
     return parentStart;
 }
 
@@ -355,17 +358,21 @@ short RangeImpl::compareBoundaryPoints( NodeImpl *containerA, long offsetA, Node
     // ### we need to do a traversal here instead
     NodeImpl *cmnRoot = commonAncestorContainer(containerA,containerB);
     NodeImpl *childA = containerA;
-    while (childA->parentNode() != cmnRoot)
+    while (childA && childA->parentNode() != cmnRoot)
         childA = childA->parentNode();
+    if (!childA)
+        childA = cmnRoot;
     NodeImpl *childB = containerB;
-    while (childB->parentNode() != cmnRoot)
+    while (childB && childB->parentNode() != cmnRoot)
         childB = childB->parentNode();
+    if (!childB)
+        childB = cmnRoot;
 
     NodeImpl *n = cmnRoot->firstChild();
     int i = 0;
     int childAOffset = -1;
     int childBOffset = -1;
-    while (childAOffset < 0 || childBOffset < 0) {
+    while (n && (childAOffset < 0 || childBOffset < 0)) {
         if (n == childA)
             childAOffset = i;
         if (n == childB)