Reviewed by Hyatt
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Oct 2004 18:52:39 +0000 (18:52 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Oct 2004 18:52:39 +0000 (18:52 +0000)
        Fix for this bug:

        <rdar://problem/3825289> REGRESSION (Mail): Crash in fontForSelection in empty window

        * khtml/editing/visible_position.cpp:
        (khtml::VisiblePosition::previousPosition): Switch to node iteration instead "leaf"
        iteration. I have been wanting to make this change for a long time, but couldn't
        since other code relied on the leaf behavior. That is no longer true. Plus, the
        bug fix requires the new behavior.
        (khtml::VisiblePosition::nextPosition): Ditto.
        (khtml::VisiblePosition::isCandidate): Empty blocks needed a height to be a candidate,
        but we make a special case for the body element. This fixes the bug.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/visible_position.cpp

index 6ca5d526a8c54619601ab70d75a658222cca1cbf..401a0c9fc840b670e1f04cbca2b8205fef86858e 100644 (file)
@@ -1,3 +1,20 @@
+2004-10-04  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Hyatt
+
+        Fix for this bug:
+        
+        <rdar://problem/3825289> REGRESSION (Mail): Crash in fontForSelection in empty window
+
+        * khtml/editing/visible_position.cpp:
+        (khtml::VisiblePosition::previousPosition): Switch to node iteration instead "leaf"
+        iteration. I have been wanting to make this change for a long time, but couldn't
+        since other code relied on the leaf behavior. That is no longer true. Plus, the
+        bug fix requires the new behavior.
+        (khtml::VisiblePosition::nextPosition): Ditto.
+        (khtml::VisiblePosition::isCandidate): Empty blocks needed a height to be a candidate,
+        but we make a special case for the body element. This fixes the bug.
+
 2004-10-04  Darin Adler  <darin@apple.com>
 
         Reviewed by Ken.
 2004-10-04  Darin Adler  <darin@apple.com>
 
         Reviewed by Ken.
index ef75c429497b8202c32b51d5016bac959435ab2f..18491940ef69a9d4ca46e2ccd83c31c88eabcaae 100644 (file)
@@ -208,7 +208,7 @@ Position VisiblePosition::previousPosition(const Position &pos)
     Position result;
 
     if (pos.offset() <= 0) {
     Position result;
 
     if (pos.offset() <= 0) {
-        NodeImpl *prevNode = pos.node()->previousLeafNode();
+        NodeImpl *prevNode = pos.node()->traversePreviousNode();
         if (prevNode)
             result = Position(prevNode, prevNode->maxOffset());
     }
         if (prevNode)
             result = Position(prevNode, prevNode->maxOffset());
     }
@@ -227,7 +227,7 @@ Position VisiblePosition::nextPosition(const Position &pos)
     Position result;
 
     if (pos.offset() >= pos.node()->maxOffset()) {
     Position result;
 
     if (pos.offset() >= pos.node()->maxOffset()) {
-        NodeImpl *nextNode = pos.node()->nextLeafNode();
+        NodeImpl *nextNode = pos.node()->traverseNextNode();
         if (nextNode)
             result = Position(nextNode, 0);
     }
         if (nextNode)
             result = Position(nextNode, 0);
     }
@@ -299,7 +299,7 @@ bool VisiblePosition::isCandidate(const Position &pos)
         }
     }
     
         }
     }
     
-    if (renderer->isBlockFlow() && !renderer->firstChild() && renderer->height())
+    if (renderer->isBlockFlow() && !renderer->firstChild() && (renderer->height() || pos.node()->id() == ID_BODY))
         // return true for offset 0 into rendered blocks that are empty of rendered kids, but have a height
         return pos.offset() == 0;
     
         // return true for offset 0 into rendered blocks that are empty of rendered kids, but have a height
         return pos.offset() == 0;