Reviewed by Anders Carlsson.
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Mar 2009 20:35:57 +0000 (20:35 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Mar 2009 20:35:57 +0000 (20:35 +0000)
        - fix <rdar://problem/6725042> BidiResolver::createBidiRunsForLine can
          create runs extending beyond the end

        No test because Safari does not use this version of
        createBidiRunsForLine() with the end iterator not pointing to the end
        of the text run.

        * platform/text/BidiResolver.h:
        (WebCore::BidiResolver::appendRun): Cap the end of the run at the end
        of the line and set the reachedEndOfLine flag. This mirrors the logic
        in the specialized version of appendRun() in bidi.cpp, which is why the
        problem did not show up in HTML. Also avoid creating empty runs.

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

WebCore/ChangeLog
WebCore/platform/text/BidiResolver.h

index bf0c2fb..e8994f0 100644 (file)
@@ -1,3 +1,20 @@
+2009-03-26  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        - fix <rdar://problem/6725042> BidiResolver::createBidiRunsForLine can
+          create runs extending beyond the end
+
+        No test because Safari does not use this version of
+        createBidiRunsForLine() with the end iterator not pointing to the end
+        of the text run.
+
+        * platform/text/BidiResolver.h:
+        (WebCore::BidiResolver::appendRun): Cap the end of the run at the end
+        of the line and set the reachedEndOfLine flag. This mirrors the logic
+        in the specialized version of appendRun() in bidi.cpp, which is why the
+        problem did not show up in HTML. Also avoid creating empty runs.
+
 2009-03-26  Simon Fraser  <simon.fraser@apple.com>
 
         Reviewed by Dave Hyatt
index 599f67f..8288be4 100644 (file)
@@ -254,7 +254,16 @@ template <class Iterator, class Run>
 void BidiResolver<Iterator, Run>::appendRun()
 {
     if (!emptyRun && !eor.atEnd()) {
-        addRun(new Run(sor.offset(), eor.offset() + 1, context(), m_direction));
+        unsigned startOffset = sor.offset();
+        unsigned endOffset = eor.offset();
+
+        if (!endOfLine.atEnd() && endOffset >= endOfLine.offset()) {
+            reachedEndOfLine = true;
+            endOffset = endOfLine.offset();
+        }
+
+        if (endOffset >= startOffset)
+            addRun(new Run(startOffset, endOffset + 1, context(), m_direction));
 
         eor.increment();
         sor = eor;