Reviewed by levi
authorjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Jul 2006 01:18:15 +0000 (01:18 +0000)
committerjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Jul 2006 01:18:15 +0000 (01:18 +0000)
        <rdar://problem/4621728>
        REGRESSION: Selecting by dragging down creates selection in wrong direction, with certain steps
        <rdar://problem/4604932>
        REGRESSION: Dragging too far left on a line will select all lines above it.

        No layout test because of 9980.

        * rendering/RenderBlock.cpp:
        (WebCore::RenderBlock::positionForCoordinates): Don't return positions inside editable roots
        for coordinates outside those roots, except for coordinates outside a document that is entirely
        editable.

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

WebCore/ChangeLog
WebCore/rendering/RenderBlock.cpp

index 4e5897f4132b4fe9bd48fb5746e8dd2f30384406..c24b24aefadd66051fe4d9e1292994abbb8cdac9 100644 (file)
@@ -1,3 +1,19 @@
+2006-07-17  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by levi
+        
+        <rdar://problem/4621728>
+        REGRESSION: Selecting by dragging down creates selection in wrong direction, with certain steps
+        <rdar://problem/4604932>
+        REGRESSION: Dragging too far left on a line will select all lines above it.
+        No layout test because of 9980.
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::positionForCoordinates): Don't return positions inside editable roots
+        for coordinates outside those roots, except for coordinates outside a document that is entirely 
+        editable.
+
 2006-07-17  Timothy Hatcher  <timothy@apple.com>
 
         Reviewed by Darin.
index b413cf3fe497ea98ea4fef4d75e865194a6e54d4..ebc411f2fd3cce5ca376e3f6f43408d0cab03dc2 100644 (file)
@@ -2616,8 +2616,10 @@ VisiblePosition RenderBlock::positionForCoordinates(int x, int y)
     int right = left + contentWidth();
 
     Node* n = element();
-
-    bool isEditableRoot = n && n->rootEditableElement() == n;
+    
+    // Don't return positions inside editable roots for coordinates outside those roots, except for coordinates outside
+    // a document that is entirely editable.
+    bool isEditableRoot = n && n->rootEditableElement() == n && !n->hasTagName(bodyTag) && !n->hasTagName(htmlTag);
 
     if (y < top || (isEditableRoot && (y < bottom && x < left))) {
         if (!isEditableRoot)
@@ -2683,8 +2685,7 @@ VisiblePosition RenderBlock::positionForCoordinates(int x, int y)
         return VisiblePosition(n, 0, DOWNSTREAM);
     }
     
-    // see if any child blocks exist at this y coordinate
-    RenderObject* lastVisibleChild = 0;
+    // See if any child blocks exist at this y coordinate.
     for (RenderObject* renderer = firstChild(); renderer; renderer = renderer->nextSibling()) {
         if (renderer->height() == 0 || renderer->style()->visibility() != VISIBLE || renderer->isFloatingOrPositioned())
             continue;
@@ -2698,7 +2699,6 @@ VisiblePosition RenderBlock::positionForCoordinates(int x, int y)
             bottom = top + contentHeight();
         if (y >= top && y < bottom)
             return renderer->positionForCoordinates(x, y);
-        lastVisibleChild = renderer;
     }
     
     return RenderFlow::positionForCoordinates(x, y);