Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Dec 2004 17:57:54 +0000 (17:57 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Dec 2004 17:57:54 +0000 (17:57 +0000)
        Fix for this bug:

        <rdar://problem/3917929> REGRESSION (Mail): Command-left-arrow leaves insertion point too high after specific steps

        * khtml/editing/visible_text.cpp:
        (khtml::SimplifiedBackwardsTextIterator::advance): Add new check for leaving a text node and iterating
        backwards into a different block that is an descendent of the block containing the text node (as in leaving
        the "bar" node in this example: <p>foo</p>bar).
        (khtml::SimplifiedBackwardsTextIterator::handleNonTextNode): Call new emitNewlineForBROrText helper.
        (khtml::SimplifiedBackwardsTextIterator::emitNewlineForBROrText): Factor out code from handleNonTextNode, since
        it is called from there, and now also from advance().

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

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

index ce806bd..75e1636 100644 (file)
@@ -1,3 +1,19 @@
+2004-12-16  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/3917929> REGRESSION (Mail): Command-left-arrow leaves insertion point too high after specific steps
+
+        * khtml/editing/visible_text.cpp:
+        (khtml::SimplifiedBackwardsTextIterator::advance): Add new check for leaving a text node and iterating
+        backwards into a different block that is an descendent of the block containing the text node (as in leaving 
+        the "bar" node in this example: <p>foo</p>bar).
+        (khtml::SimplifiedBackwardsTextIterator::handleNonTextNode): Call new emitNewlineForBROrText helper.
+        (khtml::SimplifiedBackwardsTextIterator::emitNewlineForBROrText): Factor out code from handleNonTextNode, since
+        it is called from there, and now also from advance().
+
 2004-12-15  Darin Adler  <darin@apple.com>
 
         Reviewed by Ken.
index 894c1a0..67deb1d 100644 (file)
@@ -543,6 +543,13 @@ void SimplifiedBackwardsTextIterator::advance()
             }
         }
         
+        // Handle case where markup looks like this: <p>foo</p>bar.
+        // Must emit newline when leaving node containing "bar".
+        NodeImpl *block = m_node->enclosingBlockFlowElement();
+        NodeImpl *nextBlock = next->enclosingBlockFlowElement();
+        if (block && nextBlock && nextBlock->isAncestor(block))
+            emitNewlineForBROrText();
+        
         m_node = next;
         if (m_node)
             m_offset = m_node->caretMaxOffset();
@@ -600,19 +607,8 @@ bool SimplifiedBackwardsTextIterator::handleNonTextNode()
 {
     switch (m_node->id()) {
         case ID_BR:
-        {
-            long offset;
-    
-            if (m_lastTextNode) {
-                offset = m_lastTextNode->nodeIndex();
-                emitCharacter('\n', m_lastTextNode->parentNode(), offset, offset + 1);
-            } else {
-                offset = m_node->nodeIndex();
-                emitCharacter('\n', m_node->parentNode(), offset, offset + 1);
-            }
+            emitNewlineForBROrText();
             break;
-        }
-
         case ID_TD:
         case ID_TH:
         case ID_BLOCKQUOTE:
@@ -663,6 +659,19 @@ void SimplifiedBackwardsTextIterator::emitCharacter(QChar c, NodeImpl *node, lon
     m_lastCharacter = c;
 }
 
+void SimplifiedBackwardsTextIterator::emitNewlineForBROrText()
+{
+    long offset;
+    
+    if (m_lastTextNode) {
+        offset = m_lastTextNode->nodeIndex();
+        emitCharacter('\n', m_lastTextNode->parentNode(), offset, offset + 1);
+    } else {
+        offset = m_node->nodeIndex();
+        emitCharacter('\n', m_node->parentNode(), offset, offset + 1);
+    }
+}
+
 Range SimplifiedBackwardsTextIterator::range() const
 {
     if (m_positionNode) {