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 f726e697bf426dc3fb99649bba6278669eaee1e0..cc85e45132eafb0f555b4c6455b24e4d1f1d8eff 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 fe2cecf02ca277e5e33c265ace8e7c39787dc159..54c89429c9e10a0262153f18fa906a86d0f640bd 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)