Reviewed by Hyatt
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Sep 2004 23:57:47 +0000 (23:57 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Sep 2004 23:57:47 +0000 (23:57 +0000)
        Fix for this hitlist bug:

        <rdar://problem/3805486> REGRESSION (Mail): Empty block elements can cause the caret to get "stuck" in one spot

        * khtml/xml/dom_caretposition.cpp:
        (DOM::CaretPosition::isCandidate): You can no longer caret into empty blocks with no height.
        Also did a little clean up in this function.
        * layout-tests/editing/deleting/delete-3800834-fix-expected.txt: Regenerated expected results.
        This test was actually failing and had bogus results checked in!
        * layout-tests/editing/selection/select-all-003-expected.txt: Regenerated expected results.

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

LayoutTests/editing/deleting/delete-3800834-fix-expected.txt
LayoutTests/editing/selection/select-all-003-expected.txt
WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/visible_position.cpp
WebCore/khtml/xml/dom_caretposition.cpp

index 8cc4f31d4baff3ccf3dffe1677cf98dbbaadb6c7..0976f8e41afe4250d2566b23f59d7c22f33ef095 100644 (file)
@@ -3,16 +3,18 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
+      RenderBlock {DIV} at (0,0) size 784x80 [border: (2px solid #FF0000)]
         RenderBlock (anonymous) at (14,14) size 756x28
-          RenderInline {SPAN} at (0,0) size 37x28
-            RenderText {TEXT} at (0,0) size 37x28
-              text run at (0,0) width 37: "Foo"
-        RenderBlock (anonymous) at (14,42) size 756x0
-        RenderBlock (anonymous) at (14,42) size 756x0
+          RenderInline {SPAN} at (0,0) size 25x28
+            RenderText {TEXT} at (0,0) size 25x28
+              text run at (0,0) width 25: "Fo"
+            RenderBR {BR} at (0,0) size 0x0
+        RenderBlock (anonymous) at (14,66) size 756x0
+          RenderBlock {BLOCKQUOTE} at (40,0) size 676x0
+        RenderBlock (anonymous) at (14,66) size 756x0
           RenderInline {SPAN} at (0,0) size 0x0
           RenderText {TEXT} at (0,0) size 0x0
 selection is CARET:
-start:      position 3 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
-upstream:   position 3 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
-downstream: position 1 of child 3 {TEXT} of root {DIV}
+start:      position 2 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
+upstream:   position 2 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
+downstream: position 0 of child 2 {BR} of child 2 {SPAN} of root {DIV}
index f89c600af615d3bd2c54804cdffc9b1f19d8ec67..65d074a9d5c2daa97c3bdd45fc594bb3bc9e0211 100644 (file)
@@ -30,6 +30,6 @@ selection is RANGE:
 start:      position 0 of child 1 {BR} of root {BODY}
 upstream:   position 0 of  of root {BODY}
 downstream: position 0 of child 1 {BR} of root {BODY}
-end:        position 0 of child 9 {DIV} of root {BODY}
-upstream:   position 0 of child 9 {DIV} of root {BODY}
-downstream: position 1 of child 9 {DIV} of root {BODY}
+end:        position 1 of child 5 {BR} of root {BODY}
+upstream:   position 1 of child 5 {BR} of root {BODY}
+downstream: position 0 of child 7 {BR} of root {BODY}
index b506d78f4296313217d4c46585e91a6b98662881..8dcf5b3ebb36194300e02bf73cb8951fd1fd34b1 100644 (file)
@@ -1,3 +1,18 @@
+2004-09-22  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Hyatt
+
+        Fix for this hitlist bug:
+        
+        <rdar://problem/3805486> REGRESSION (Mail): Empty block elements can cause the caret to get "stuck" in one spot
+
+        * khtml/xml/dom_caretposition.cpp:
+        (DOM::CaretPosition::isCandidate): You can no longer caret into empty blocks with no height.
+        Also did a little clean up in this function.
+        * layout-tests/editing/deleting/delete-3800834-fix-expected.txt: Regenerated expected results. 
+        This test was actually failing and had bogus results checked in!
+        * layout-tests/editing/selection/select-all-003-expected.txt: Regenerated expected results.
+
 2004-09-22  Chris Blumenberg  <cblu@apple.com>
 
        Fixed: <rdar://problem/3812091> REGRESSION (Mail): double-clicked word is not smart inserted on drag
index 7bd01551f6687a7fcde7ea72549458b839ec15ad..f071529ca4e8a5fbfadb20688328cd5d21356942 100644 (file)
@@ -219,13 +219,19 @@ bool CaretPosition::isCandidate(const Position &pos)
     if (renderer->style()->visibility() != VISIBLE)
         return false;
 
-    if (renderer->isBR() && static_cast<RenderText *>(renderer)->firstTextBox()) {
+    if (renderer->isReplaced())
+        // return true for replaced elements
+        return pos.offset() == 0 || pos.offset() == 1;
+
+    if (renderer->isBR() && static_cast<RenderText *>(renderer)->firstTextBox())
+        // return true for offset 0 into BR element on a line by itself
         return pos.offset() == 0;
-    }
-    else if (renderer->isText()) {
+    
+    if (renderer->isText()) {
         RenderText *textRenderer = static_cast<RenderText *>(renderer);
         for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
             if (pos.offset() >= box->m_start && pos.offset() <= box->m_start + box->m_len) {
+                // return true if in a text node
                 return true;
             }
             else if (pos.offset() < box->m_start) {
@@ -236,11 +242,10 @@ bool CaretPosition::isCandidate(const Position &pos)
             }
         }
     }
-    else if (renderer->isReplaced() || (pos.node()->isBlockFlow() && !pos.node()->firstChild() && pos.offset() == 0)) {
-        // return true for replaced elements, for inline flows if they have a line box
-        // and for blocks if they are empty
-        return true;
-    }
+    
+    if (renderer->isBlockFlow() && !renderer->firstChild() && renderer->height())
+        // return true for offset 0 into rendered blocks that are empty of rendered kids, but have a height
+        return pos.offset() == 0;
     
     return false;
 }
index 7bd01551f6687a7fcde7ea72549458b839ec15ad..f071529ca4e8a5fbfadb20688328cd5d21356942 100644 (file)
@@ -219,13 +219,19 @@ bool CaretPosition::isCandidate(const Position &pos)
     if (renderer->style()->visibility() != VISIBLE)
         return false;
 
-    if (renderer->isBR() && static_cast<RenderText *>(renderer)->firstTextBox()) {
+    if (renderer->isReplaced())
+        // return true for replaced elements
+        return pos.offset() == 0 || pos.offset() == 1;
+
+    if (renderer->isBR() && static_cast<RenderText *>(renderer)->firstTextBox())
+        // return true for offset 0 into BR element on a line by itself
         return pos.offset() == 0;
-    }
-    else if (renderer->isText()) {
+    
+    if (renderer->isText()) {
         RenderText *textRenderer = static_cast<RenderText *>(renderer);
         for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
             if (pos.offset() >= box->m_start && pos.offset() <= box->m_start + box->m_len) {
+                // return true if in a text node
                 return true;
             }
             else if (pos.offset() < box->m_start) {
@@ -236,11 +242,10 @@ bool CaretPosition::isCandidate(const Position &pos)
             }
         }
     }
-    else if (renderer->isReplaced() || (pos.node()->isBlockFlow() && !pos.node()->firstChild() && pos.offset() == 0)) {
-        // return true for replaced elements, for inline flows if they have a line box
-        // and for blocks if they are empty
-        return true;
-    }
+    
+    if (renderer->isBlockFlow() && !renderer->firstChild() && renderer->height())
+        // return true for offset 0 into rendered blocks that are empty of rendered kids, but have a height
+        return pos.offset() == 0;
     
     return false;
 }