Reviewed by Hyatt
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Aug 2004 15:02:27 +0000 (15:02 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Aug 2004 15:02:27 +0000 (15:02 +0000)
        Fix for these bugs:

        <rdar://problem/3777629> REGRESSION (Mail): can't delete blank lines in quoted text in HTML mail replies
        <rdar://problem/3780309> REGRESSION (Mail): can't delete past an empty span in a particular test case
        <rdar://problem/3780315> REGRESSION (Mail): right arrow works incorrectly in a particular test case with an empty span
        <rdar://problem/3780320> REGRESSION (Mail): left arrow works incorrectly in a particular test case with an empty span
        <rdar://problem/3780336> REGRESSION (Mail): down arrow fails in a reduction of a Mail reply test case (seems to be inside a span)

        * khtml/xml/dom_position.cpp:
        (DOM::Position::upstream): If this position's node is a block, use it for the StayInBlock case, not the block's
        enclosing block.
        (DOM::Position::downstream): Ditto.
        (DOM::Position::inRenderedContent): Refine the case for non-text nodes. This was erroneously returning true
        for any empty element (like <span></span>).
        * khtml/xml/dom_positioniterator.cpp: Change the following four functions to consider all nodes, not just
        leaves of the DOM tree. This is a step towards making this iteration less cranky and unpredictable, and
        was necessary to do now to keep the inRenderedContent() change above from breaking editign layout tests.
        (DOM::PositionIterator::peekPrevious)
        (DOM::PositionIterator::peekNext)
        (DOM::PositionIterator::atStart)
        (DOM::PositionIterator::atEnd)
        * kwq/KWQKHTMLPart.mm:
        (KWQKHTMLPart::fontForCurrentPosition): Check that the position being checked is an element and that the
        element is in rendered content. I ran across some null-check failures while I was coding this fix, and
        the additions seem prudent.

        Updated these layout tests with new results.

        * layout-tests/editing/deleting/delete-3608430-fix-expected.txt:
        * layout-tests/editing/deleting/delete-3775172-fix-expected.txt:
        * layout-tests/editing/deleting/delete-block-contents-001-expected.txt:
        * layout-tests/editing/deleting/delete-block-contents-002-expected.txt:
        * layout-tests/editing/deleting/delete-block-contents-003-expected.txt:
        * layout-tests/editing/deleting/delete-image-004-expected.txt:
        * layout-tests/editing/deleting/delete-trailing-ws-001-expected.txt:
        * layout-tests/editing/editing.js:
        * layout-tests/editing/execCommand/boldSelection-expected.txt:
        * layout-tests/editing/execCommand/italicizeByCharacter-expected.txt:
        * layout-tests/editing/execCommand/modifyForeColorByCharacter-expected.txt:
        * layout-tests/editing/execCommand/print-expected.txt:
        * layout-tests/editing/execCommand/selectAll-expected.txt:
        * layout-tests/editing/selection/extend-by-character-002-expected.txt:
        * layout-tests/editing/selection/extend-by-character-004-expected.txt:
        * layout-tests/editing/selection/extend-by-character-005-expected.txt:
        * layout-tests/editing/selection/extend-by-character-006-expected.txt:
        * layout-tests/editing/selection/select-all-001-expected.txt:
        * layout-tests/editing/selection/select-all-002-expected.txt:
        * layout-tests/editing/selection/select-all-003-expected.txt:

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

25 files changed:
LayoutTests/editing/deleting/delete-3608430-fix-expected.txt
LayoutTests/editing/deleting/delete-3775172-fix-expected.txt
LayoutTests/editing/deleting/delete-block-contents-001-expected.txt
LayoutTests/editing/deleting/delete-block-contents-002-expected.txt
LayoutTests/editing/deleting/delete-block-contents-003-expected.txt
LayoutTests/editing/deleting/delete-image-004-expected.txt
LayoutTests/editing/deleting/delete-selection-001-expected.txt
LayoutTests/editing/deleting/delete-trailing-ws-001-expected.txt
LayoutTests/editing/editing.js
LayoutTests/editing/execCommand/boldSelection-expected.txt
LayoutTests/editing/execCommand/italicizeByCharacter-expected.txt
LayoutTests/editing/execCommand/modifyForeColorByCharacter-expected.txt
LayoutTests/editing/execCommand/print-expected.txt
LayoutTests/editing/execCommand/selectAll-expected.txt
LayoutTests/editing/selection/extend-by-character-002-expected.txt
LayoutTests/editing/selection/extend-by-character-004-expected.txt
LayoutTests/editing/selection/extend-by-character-005-expected.txt
LayoutTests/editing/selection/extend-by-character-006-expected.txt
LayoutTests/editing/selection/select-all-001-expected.txt
LayoutTests/editing/selection/select-all-002-expected.txt
LayoutTests/editing/selection/select-all-003-expected.txt
WebCore/ChangeLog-2005-08-23
WebCore/khtml/xml/dom_position.cpp
WebCore/khtml/xml/dom_positioniterator.cpp
WebCore/kwq/KWQKHTMLPart.mm

index abf85e2..ea8cae3 100644 (file)
@@ -10,5 +10,5 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is CARET:
 start:      position 0 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
index 3baa28f..ec7bc2f 100644 (file)
@@ -7,4 +7,4 @@ layer at (0,0) size 800x600
 selection is CARET:
 start:      position 0 of  of root {DIV}
 upstream:   position 0 of  of root {DIV}
-downstream: position 0 of  of root {DIV}
+downstream: position 1 of  of root {DIV}
index 658c9f7..214cc89 100644 (file)
@@ -7,4 +7,4 @@ layer at (0,0) size 800x600
 selection is CARET:
 start:      position 0 of  of root {DIV}
 upstream:   position 0 of  of root {DIV}
-downstream: position 0 of  of root {DIV}
+downstream: position 1 of  of root {DIV}
index 658c9f7..214cc89 100644 (file)
@@ -7,4 +7,4 @@ layer at (0,0) size 800x600
 selection is CARET:
 start:      position 0 of  of root {DIV}
 upstream:   position 0 of  of root {DIV}
-downstream: position 0 of  of root {DIV}
+downstream: position 1 of  of root {DIV}
index 73be1f5..8d33c08 100644 (file)
@@ -11,8 +11,7 @@ layer at (0,0) size 800x600
             text run at (89,14) width 34: "baz"
         RenderText {TEXT} at (0,0) size 0x0
       RenderBlock {DIV} at (0,56) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 0x0
 selection is CARET:
-start:      position 0 of child 1 {SPAN} of child 3 {DIV} of child 2 {BODY} of child 1 {HTML} of root {}
-upstream:   position 0 of child 1 {SPAN} of child 3 {DIV} of child 2 {BODY} of child 1 {HTML} of root {}
-downstream: position 1 of child 1 {SPAN} of child 3 {DIV} of child 2 {BODY} of child 1 {HTML} of root {}
+start:      position 0 of child 3 {DIV} of child 2 {BODY} of child 1 {HTML} of root {}
+upstream:   position 0 of child 3 {DIV} of child 2 {BODY} of child 1 {HTML} of root {}
+downstream: position 1 of child 3 {DIV} of child 2 {BODY} of child 1 {HTML} of root {}
index 658c9f7..214cc89 100644 (file)
@@ -7,4 +7,4 @@ layer at (0,0) size 800x600
 selection is CARET:
 start:      position 0 of  of root {DIV}
 upstream:   position 0 of  of root {DIV}
-downstream: position 0 of  of root {DIV}
+downstream: position 1 of  of root {DIV}
index 4e9adde..717d6d5 100644 (file)
@@ -11,5 +11,5 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is CARET:
 start:      position 2 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 2 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
index 4e9adde..717d6d5 100644 (file)
@@ -11,5 +11,5 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is CARET:
 start:      position 2 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 2 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
index 324ae32..17e0864 100644 (file)
@@ -99,6 +99,22 @@ function boldCommand() {
 
 //-------------------------------------------------------------------------------------------------------
 
+function execItalicCommand() {
+    document.execCommand("Italic");
+}
+function italicCommand() {
+    if (commandDelay > 0) {
+        window.setTimeout(execItalicCommand, commandCount * commandDelay);
+        commandCount++;
+    }
+    else {
+        execItalicCommand();
+    }
+}
+
+
+//-------------------------------------------------------------------------------------------------------
+
 function execInsertNewlineCommand() {
     document.execCommand("InsertNewline");
 }
index 9fea5d8..b4611b5 100644 (file)
@@ -80,7 +80,7 @@ layer at (0,0) size 800x600
           RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 1 {B} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 1 {B} of child 2 {SPAN} of root {DIV}
 end:        position 1 of child 21 {TEXT} of child 1 {B} of child 2 {SPAN} of root {DIV}
 upstream:   position 1 of child 21 {TEXT} of child 1 {B} of child 2 {SPAN} of root {DIV}
index bc211b9..1910f8a 100644 (file)
@@ -40,7 +40,7 @@ layer at (0,0) size 800x600
           RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
 end:        position 1 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
 upstream:   position 1 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
index 5672ad2..fa5c476 100644 (file)
@@ -40,7 +40,7 @@ layer at (0,0) size 800x600
           RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 1 {SPAN} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 1 {SPAN} of child 2 {SPAN} of root {DIV}
 end:        position 1 of child 1 {TEXT} of child 1 {SPAN} of child 2 {SPAN} of root {DIV}
 upstream:   position 1 of child 1 {TEXT} of child 1 {SPAN} of child 2 {SPAN} of root {DIV}
index a1fb704..cef0dac 100644 (file)
@@ -37,5 +37,5 @@ layer at (0,0) size 800x600
           RenderText {TEXT} at (0,0) size 0x0
 selection is CARET:
 start:      position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
index d1013cd..a0e99ad 100644 (file)
@@ -37,7 +37,7 @@ layer at (0,0) size 800x600
           RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
 end:        position 562 of child 1 {TEXT} of child 2 {P} of child 2 {SPAN} of root {DIV}
 upstream:   position 562 of child 1 {TEXT} of child 2 {P} of child 2 {SPAN} of root {DIV}
index a7dee82..a083054 100644 (file)
@@ -27,7 +27,7 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
 end:        position 6 of child 11 {TEXT} of child 2 {SPAN} of root {DIV}
 upstream:   position 6 of child 11 {TEXT} of child 2 {SPAN} of root {DIV}
index 8ac44f0..d8dddd6 100644 (file)
@@ -26,7 +26,7 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
 end:        position 1 of child 3 {TEXT} of child 2 {SPAN} of root {DIV}
 upstream:   position 1 of child 3 {TEXT} of child 2 {SPAN} of root {DIV}
index 9c75082..b576171 100644 (file)
@@ -25,7 +25,7 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
 end:        position 1 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
 upstream:   position 1 of child 1 {TEXT} of child 1 {I} of child 2 {SPAN} of root {DIV}
index 1dfbd17..f275653 100644 (file)
@@ -12,7 +12,7 @@ layer at (0,0) size 800x600
         RenderText {TEXT} at (0,0) size 0x0
 selection is RANGE:
 start:      position 1 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
+upstream:   position 0 of  of root {DIV}
 downstream: position 1 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
 end:        position 4 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
 upstream:   position 4 of child 1 {TEXT} of child 1 {SPAN} of root {DIV}
index 4abada4..fe5f86c 100644 (file)
@@ -21,7 +21,7 @@ layer at (0,0) size 820x900
             text run at (0,586) width 136: "created equal."
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
+upstream:   position 0 of child 2 {DIV} of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
 end:        position 736 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
 upstream:   position 736 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
index 6807e3d..b9a7d5d 100644 (file)
@@ -27,7 +27,7 @@ layer at (0,0) size 820x900
             text run at (0,586) width 571: "dedicated to the proposition that all men are created equal."
 selection is RANGE:
 start:      position 0 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
-upstream:   position 0 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
+upstream:   position 0 of child 2 {DIV} of root {DIV}
 downstream: position 0 of child 1 {TEXT} of child 2 {DIV} of root {DIV}
 end:        position 180 of child 7 {TEXT} of child 2 {DIV} of root {DIV}
 upstream:   position 180 of child 7 {TEXT} of child 2 {DIV} of root {DIV}
index 631cc3a..58ef861 100644 (file)
@@ -28,8 +28,8 @@ layer at (0,0) size 812x1044
       RenderBlock {DIV} at (74,842) size 600x0
 selection is RANGE:
 start:      position 0 of child 1 {BR} of root {BODY}
-upstream:   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 0 of child 9 {DIV} of root {BODY}
+end:        position 1 of child 7 {BR} of root {BODY}
+upstream:   position 1 of child 7 {BR} of root {BODY}
+downstream: position 1 of child 8 {TEXT} of root {BODY}
index 70faa16..e639a5f 100644 (file)
@@ -1,3 +1,56 @@
+2004-08-31  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Hyatt
+
+        Fix for these bugs:
+
+        <rdar://problem/3777629> REGRESSION (Mail): can't delete blank lines in quoted text in HTML mail replies
+        <rdar://problem/3780309> REGRESSION (Mail): can't delete past an empty span in a particular test case
+        <rdar://problem/3780315> REGRESSION (Mail): right arrow works incorrectly in a particular test case with an empty span
+        <rdar://problem/3780320> REGRESSION (Mail): left arrow works incorrectly in a particular test case with an empty span
+        <rdar://problem/3780336> REGRESSION (Mail): down arrow fails in a reduction of a Mail reply test case (seems to be inside a span)
+
+        * khtml/xml/dom_position.cpp:
+        (DOM::Position::upstream): If this position's node is a block, use it for the StayInBlock case, not the block's
+        enclosing block.
+        (DOM::Position::downstream): Ditto.
+        (DOM::Position::inRenderedContent): Refine the case for non-text nodes. This was erroneously returning true
+        for any empty element (like <span></span>).
+        * khtml/xml/dom_positioniterator.cpp: Change the following four functions to consider all nodes, not just
+        leaves of the DOM tree. This is a step towards making this iteration less cranky and unpredictable, and
+        was necessary to do now to keep the inRenderedContent() change above from breaking editign layout tests.
+        (DOM::PositionIterator::peekPrevious)
+        (DOM::PositionIterator::peekNext)
+        (DOM::PositionIterator::atStart)
+        (DOM::PositionIterator::atEnd)
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::fontForCurrentPosition): Check that the position being checked is an element and that the
+        element is in rendered content. I ran across some null-check failures while I was coding this fix, and
+        the additions seem prudent.
+        
+        Updated these layout tests with new results.
+        
+        * layout-tests/editing/deleting/delete-3608430-fix-expected.txt:
+        * layout-tests/editing/deleting/delete-3775172-fix-expected.txt:
+        * layout-tests/editing/deleting/delete-block-contents-001-expected.txt:
+        * layout-tests/editing/deleting/delete-block-contents-002-expected.txt:
+        * layout-tests/editing/deleting/delete-block-contents-003-expected.txt:
+        * layout-tests/editing/deleting/delete-image-004-expected.txt:
+        * layout-tests/editing/deleting/delete-trailing-ws-001-expected.txt:
+        * layout-tests/editing/editing.js:
+        * layout-tests/editing/execCommand/boldSelection-expected.txt:
+        * layout-tests/editing/execCommand/italicizeByCharacter-expected.txt:
+        * layout-tests/editing/execCommand/modifyForeColorByCharacter-expected.txt:
+        * layout-tests/editing/execCommand/print-expected.txt:
+        * layout-tests/editing/execCommand/selectAll-expected.txt:
+        * layout-tests/editing/selection/extend-by-character-002-expected.txt:
+        * layout-tests/editing/selection/extend-by-character-004-expected.txt:
+        * layout-tests/editing/selection/extend-by-character-005-expected.txt:
+        * layout-tests/editing/selection/extend-by-character-006-expected.txt:
+        * layout-tests/editing/selection/select-all-001-expected.txt:
+        * layout-tests/editing/selection/select-all-002-expected.txt:
+        * layout-tests/editing/selection/select-all-003-expected.txt:
+
 2004-08-30  Darin Adler  <darin@apple.com>
 
         Reviewed by John.
index c869a04..fb12d4b 100644 (file)
@@ -620,12 +620,12 @@ Position Position::upstream(bool stayInBlock) const
     if (!node())
         return Position();
 
-    NodeImpl *block = node()->enclosingBlockFlowElement();
+    NodeImpl *block = node()->isBlockFlow() ? node() : node()->enclosingBlockFlowElement();
     
     PositionIterator it(*this);            
     for (; !it.atStart(); it.previous()) {
         if (stayInBlock) {
-            NodeImpl *currentBlock = it.current().node()->enclosingBlockFlowElement();
+            NodeImpl *currentBlock = it.current().node()->isBlockFlow() ? it.current().node() : it.current().node()->enclosingBlockFlowElement();
             if (block != currentBlock)
                 return it.next();
         }
@@ -637,7 +637,7 @@ Position Position::upstream(bool stayInBlock) const
         if (renderer->style()->visibility() != khtml::VISIBLE)
             continue;
 
-        if (renderer->isBlockFlow() || renderer->isReplaced() || renderer->isBR()) {
+        if ((it.current().node() != node() && renderer->isBlockFlow()) || renderer->isReplaced() || renderer->isBR()) {
             if (it.current().offset() >= renderer->caretMaxOffset())
                 return Position(it.current().node(), renderer->caretMaxOffset());
             else
@@ -672,12 +672,12 @@ Position Position::downstream(bool stayInBlock) const
     if (!node())
         return Position();
 
-    NodeImpl *block = node()->enclosingBlockFlowElement();
+    NodeImpl *block = node()->isBlockFlow() ? node() : node()->enclosingBlockFlowElement();
     
     PositionIterator it(*this);            
     for (; !it.atEnd(); it.next()) {   
         if (stayInBlock) {
-            NodeImpl *currentBlock = it.current().node()->enclosingBlockFlowElement();
+            NodeImpl *currentBlock = it.current().node()->isBlockFlow() ? it.current().node() : it.current().node()->enclosingBlockFlowElement();
             if (block != currentBlock)
                 return it.previous();
         }
@@ -689,7 +689,7 @@ Position Position::downstream(bool stayInBlock) const
         if (renderer->style()->visibility() != khtml::VISIBLE)
             continue;
 
-        if (renderer->isBlockFlow() || renderer->isReplaced() || renderer->isBR()) {
+        if ((it.current().node() != node() && renderer->isBlockFlow()) || renderer->isReplaced() || renderer->isBR()) {
             if (it.current().offset() <= renderer->caretMinOffset())
                 return Position(it.current().node(), renderer->caretMinOffset());
             else
@@ -869,10 +869,9 @@ bool Position::inRenderedContent() const
         }
     }
     else if (offset() >= renderer->caretMinOffset() && offset() <= renderer->caretMaxOffset()) {
-        // don't return containing editable blocks unless they are empty
-        if (node()->enclosingBlockFlowElement() == node() && node()->firstChild())
-            return false;
-        return true;
+        // return true for blocks if they are empty
+        if (renderer->inlineBox() || (node()->isBlockFlow() && !node()->firstChild()))
+            return true;
     }
     
     return false;
index ce9562e..52621ea 100644 (file)
@@ -37,7 +37,7 @@ Position PositionIterator::peekPrevious() const
         return pos;
     
     if (pos.offset() <= 0) {
-        NodeImpl *prevNode = pos.node()->previousLeafNode();
+        NodeImpl *prevNode = pos.node()->traversePreviousNode();
         if (prevNode)
             pos = Position(prevNode, prevNode->maxOffset());
     }
@@ -56,7 +56,7 @@ Position PositionIterator::peekNext() const
         return pos;
     
     if (pos.offset() >= pos.node()->maxOffset()) {
-        NodeImpl *nextNode = pos.node()->nextLeafNode();
+        NodeImpl *nextNode = pos.node()->traverseNextNode();
         if (nextNode)
             pos = Position(nextNode, 0);
     }
@@ -73,7 +73,7 @@ bool PositionIterator::atStart() const
         return true;
 
     return m_current.offset() == 0 && 
-        m_current.node()->previousLeafNode() == 0;
+        m_current.node()->traversePreviousNode() == 0;
 }
 
 bool PositionIterator::atEnd() const
@@ -82,7 +82,7 @@ bool PositionIterator::atEnd() const
         return true;
 
     return m_current.offset() >= m_current.node()->maxOffset() && 
-        m_current.node()->nextLeafNode() == 0;
+        m_current.node()->traverseNextNode() == 0;
 }
 
 } // namespace DOM
index fb35848..2fa5019 100644 (file)
@@ -3336,6 +3336,13 @@ NSFont *KWQKHTMLPart::fontForCurrentPosition() const
     Position pos(range.startContainer().handle(), range.startOffset());
     ASSERT(pos.notEmpty());
     ElementImpl *elem = pos.element();
+    if (!elem)
+        return nil;
+    
+    pos = Position(elem, elem->caretMinOffset());
+    if (!pos.inRenderedContent())
+        return nil;
+    
     if (d->m_typingStyle) {
         if (!xmlDocImpl())
             return nil;