Reviewed by harrison
authorjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Oct 2006 23:25:05 +0000 (23:25 +0000)
committerjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Oct 2006 23:25:05 +0000 (23:25 +0000)
        <rdar://problem/4808375>
        REGRESSION: TextIterator slowed down, affecting Find on Page & Copy (etc.) (11460)

        * editing/TextIterator.cpp:
        (WebCore::TextIterator::exitNode): Only create VisiblePositions
        when we're going to use them to create a range for an emitted character.
        We should further speed TextIterators up by avoiding creating VisiblePositions
        for TIs that are only used for the characters they emit (like the one that
        plainText uses).

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

WebCore/ChangeLog
WebCore/editing/TextIterator.cpp

index f726e69..cc85e45 100644 (file)
@@ -1,3 +1,17 @@
+2006-10-30  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by harrison
+
+        <rdar://problem/4808375>
+        REGRESSION: TextIterator slowed down, affecting Find on Page & Copy (etc.) (11460)
+
+        * editing/TextIterator.cpp:
+        (WebCore::TextIterator::exitNode): Only create VisiblePositions
+        when we're going to use them to create a range for an emitted character.
+        We should further speed TextIterators up by avoiding creating VisiblePositions
+        for TIs that are only used for the characters they emit (like the one that 
+        plainText uses).
+
 2006-10-30  Sam Weinig  <sam.weinig@gmail.com>
 
         Reviewed by Mitz.
index fe2cecf..54c8942 100644 (file)
@@ -487,15 +487,15 @@ bool TextIterator::handleNonTextNode()
 
 void TextIterator::exitNode()
 {
-    VisiblePosition lastInNode(Position(m_node, maxDeepOffset(m_node)));
-    VisiblePosition next = lastInNode.next();
-    Position start = lastInNode.deepEquivalent();
-    Position end = next.isNull() ? start : next.deepEquivalent();
-    
     if (m_lastTextNode && shouldEmitNewlinesBeforeAndAfterNode(m_node)) {
         // use extra newline to represent margin bottom, as needed
         bool addNewline = shouldEmitExtraNewlineForNode(m_node);
         
+        VisiblePosition lastInNode(Position(m_node, maxDeepOffset(m_node)));
+        VisiblePosition next = lastInNode.next();
+        Position start = lastInNode.deepEquivalent();
+        Position end = next.isNull() ? start : next.deepEquivalent();
+        
         if (m_lastCharacter != '\n') {
 
             emitCharacter('\n', start, end);
@@ -507,8 +507,13 @@ void TextIterator::exitNode()
             // insert a newline with a position following this block
             emitCharacter('\n', start, end);
         }
-    } else if (shouldEmitSpaceBeforeAndAfterNode(m_node))
+    } else if (shouldEmitSpaceBeforeAndAfterNode(m_node)) {
+        VisiblePosition lastInNode(Position(m_node, maxDeepOffset(m_node)));
+        VisiblePosition next = lastInNode.next();
+        Position start = lastInNode.deepEquivalent();
+        Position end = next.isNull() ? start : next.deepEquivalent();
         emitCharacter(' ', start, end);
+    }
 }
 
 void TextIterator::emitCharacter(UChar c, const Position& start, const Position& end)