Reviewed by Ken Kocienda.
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Dec 2004 18:22:03 +0000 (18:22 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Dec 2004 18:22:03 +0000 (18:22 +0000)
<rdar://problem/3834917> REGRESSION (Mail): double-clicking blank line selects end of previous line
Fixed originally reported bug plus the case of double-clicking whitespace at the beginning of a line, which has a similar result.

        * khtml/editing/visible_text.cpp:
        (khtml::SimplifiedBackwardsTextIterator::SimplifiedBackwardsTextIterator):
        (khtml::SimplifiedBackwardsTextIterator::handleTextNode):
        (khtml::SimplifiedBackwardsTextIterator::handleReplacedElement):
        (khtml::SimplifiedBackwardsTextIterator::handleNonTextNode):
        (khtml::SimplifiedBackwardsTextIterator::emitCharacter):
        Distinguish BR from whitespace.
        * khtml/editing/visible_text.h:
        Distinguish BR from whitespace.
        * khtml/editing/visible_units.cpp:
        (khtml::previousWordBoundary):
        Use UPSTREAM visible position now that SimplifiedBackwardsTextIterator distinguishes BR from whitespace.  Otherwise, double-clicking at end of line would result in caret selection at start of next line.

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

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

index b674941201adf2a6d611810c0ced536efe6cd0a3..0c9988212f5127a142b8ded8d17c6d895c3a33db 100644 (file)
@@ -1,3 +1,23 @@
+2004-12-02  David Harrison  <harrison@apple.com>
+
+        Reviewed by Ken Kocienda.
+
+               <rdar://problem/3834917> REGRESSION (Mail): double-clicking blank line selects end of previous line
+               Fixed originally reported bug plus the case of double-clicking whitespace at the beginning of a line, which has a similar result.
+
+        * khtml/editing/visible_text.cpp:
+        (khtml::SimplifiedBackwardsTextIterator::SimplifiedBackwardsTextIterator):
+        (khtml::SimplifiedBackwardsTextIterator::handleTextNode):
+        (khtml::SimplifiedBackwardsTextIterator::handleReplacedElement):
+        (khtml::SimplifiedBackwardsTextIterator::handleNonTextNode):
+        (khtml::SimplifiedBackwardsTextIterator::emitCharacter):
+        Distinguish BR from whitespace.
+        * khtml/editing/visible_text.h:
+        Distinguish BR from whitespace.
+        * khtml/editing/visible_units.cpp:
+        (khtml::previousWordBoundary):
+        Use UPSTREAM visible position now that SimplifiedBackwardsTextIterator distinguishes BR from whitespace.  Otherwise, double-clicking at end of line would result in caret selection at start of next line. 
+
 2004-12-02  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by John
index 7fb8f6a6d31cb5b8a2d4a608aa4b08da6dc2b93e..12cbaa36dfbce47bb4edd57c9d60090b4b29abe8 100644 (file)
@@ -470,6 +470,9 @@ SimplifiedBackwardsTextIterator::SimplifiedBackwardsTextIterator(const Range &r)
     m_positionNode = endNode;
 #endif
 
+    m_lastTextNode = 0;
+    m_lastCharacter = '\n';
+
     advance();
 }
 
@@ -538,6 +541,8 @@ void SimplifiedBackwardsTextIterator::advance()
 
 bool SimplifiedBackwardsTextIterator::handleTextNode()
 {
+    m_lastTextNode = m_node;
+
     RenderText *renderer = static_cast<RenderText *>(m_node->renderer());
     DOMString str = m_node->nodeValue();
 
@@ -553,6 +558,8 @@ bool SimplifiedBackwardsTextIterator::handleTextNode()
     m_textLength = m_positionEndOffset - m_positionStartOffset;
     m_textCharacters = str.unicode() + m_positionStartOffset;
 
+    m_lastCharacter = str[m_positionEndOffset - 1];
+
     return true;
 }
 
@@ -567,6 +574,8 @@ bool SimplifiedBackwardsTextIterator::handleReplacedElement()
     m_textCharacters = 0;
     m_textLength = 0;
 
+    m_lastCharacter = 0;
+
     return true;
 }
 
@@ -574,6 +583,19 @@ 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);
+            }
+            break;
+        }
+
         case ID_TD:
         case ID_TH:
         case ID_BLOCKQUOTE:
@@ -588,12 +610,12 @@ bool SimplifiedBackwardsTextIterator::handleNonTextNode()
         case ID_H5:
         case ID_H6:
         case ID_HR:
-        case ID_LI:
-        case ID_OL:
         case ID_P:
         case ID_PRE:
         case ID_TR:
+        case ID_OL:
         case ID_UL:
+        case ID_LI:
             // Emit a space to "break up" content. Any word break
             // character will do.
             emitCharacter(' ', m_node, 0, 0);
@@ -621,6 +643,7 @@ void SimplifiedBackwardsTextIterator::emitCharacter(QChar c, NodeImpl *node, lon
     m_positionEndOffset = endOffset;
     m_textCharacters = &m_singleCharacterBuffer;
     m_textLength = 1;
+    m_lastCharacter = c;
 }
 
 Range SimplifiedBackwardsTextIterator::range() const
index e5fb86f9c6d79d1ca8c24524eb02f45b374a23b9..079b1529db3bc81c224e119ed2956471f2333f6b 100644 (file)
@@ -136,6 +136,10 @@ private:
     long m_positionEndOffset;
     const QChar *m_textCharacters;
     long m_textLength;
+
+    // Used to do the whitespace logic.
+    DOM::NodeImpl *m_lastTextNode;    
+    QChar m_lastCharacter;
     
     // Used for whitespace characters that aren't in the DOM, so we can point at them.
     QChar m_singleCharacterBuffer;
index d9904d508692b7a5f1a435baecab28f0e6d2310c..801fc72fe14e1dbefe9d32ec83a7123e8752d272 100644 (file)
@@ -106,9 +106,8 @@ static VisiblePosition previousWordBoundary(const VisiblePosition &c, unsigned (
             pos = Position(node, it.range().startOffset());
         }
     }
-    // Use DOWNSTREAM here so that we don't jump past words at the start of lines.
-    // <rdar://problem/3765519> REGRESSION (Mail): word movement goes too far upstream at start of line
-    return VisiblePosition(pos);
+
+    return VisiblePosition(pos, UPSTREAM);
 }
 
 static VisiblePosition nextWordBoundary(const VisiblePosition &c, unsigned (*searchFunction)(const QChar *, unsigned))