REGRESSION(r129186): Pressing enter at the end of a line deletes the line
authorleviw@chromium.org <leviw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Sep 2012 23:25:05 +0000 (23:25 +0000)
committerleviw@chromium.org <leviw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Sep 2012 23:25:05 +0000 (23:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=97763

Reviewed by Ryosuke Niwa.

r129186 exposed incorrect behavior in RenderText whereby RenderText's lines were
dirtied but the renderer wasn't marked for layout. Rich text editing in GMail exposed
this behavior. RenderText::setTextWithOffset is called with a text string identical
to the current text. It still dirties lines, then calls setText, which has a check
for the case when the strings are the same and returns early and doesn't mark us as
needing layout.

This change adds the same early bailing logic in setText to setTextWithOffset, but
forces setText to work its magic whenever we dirty lines there (and avoid double-
checking that the strings are equal).

* rendering/RenderText.cpp:
(WebCore::RenderText::setTextWithOffset):

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

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderText.cpp

index 28b0a2ec292cfe6c99b7c7e6e1561d708a2c6a84..d33fb8048d51eb31f6e4006d716cacf7089baf56 100644 (file)
@@ -1,3 +1,24 @@
+2012-09-27  Levi Weintraub  <leviw@chromium.org>
+
+        REGRESSION(r129186): Pressing enter at the end of a line deletes the line
+        https://bugs.webkit.org/show_bug.cgi?id=97763
+
+        Reviewed by Ryosuke Niwa.
+
+        r129186 exposed incorrect behavior in RenderText whereby RenderText's lines were
+        dirtied but the renderer wasn't marked for layout. Rich text editing in GMail exposed
+        this behavior. RenderText::setTextWithOffset is called with a text string identical
+        to the current text. It still dirties lines, then calls setText, which has a check
+        for the case when the strings are the same and returns early and doesn't mark us as
+        needing layout.
+
+        This change adds the same early bailing logic in setText to setTextWithOffset, but
+        forces setText to work its magic whenever we dirty lines there (and avoid double-
+        checking that the strings are equal).
+
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::setTextWithOffset):
+
 2012-09-27  Andrew Lo  <anlo@rim.com>
 
         requestAnimationFrame broken with subframes (DisplayRefreshMonitorManager::registerClient fails to register client)
 2012-09-27  Andrew Lo  <anlo@rim.com>
 
         requestAnimationFrame broken with subframes (DisplayRefreshMonitorManager::registerClient fails to register client)
index 4dc200c08f6a9a7f3321c879c28c2e99f7ab88aa..e194cd5464e0837ffcd39c9965d8101ec41c5c3f 100644 (file)
@@ -1256,6 +1256,9 @@ void RenderText::setSelectionState(SelectionState state)
 
 void RenderText::setTextWithOffset(PassRefPtr<StringImpl> text, unsigned offset, unsigned len, bool force)
 {
 
 void RenderText::setTextWithOffset(PassRefPtr<StringImpl> text, unsigned offset, unsigned len, bool force)
 {
+    if (!force && equal(m_text.impl(), text.get()))
+        return;
+
     unsigned oldLen = textLength();
     unsigned newLen = text->length();
     int delta = newLen - oldLen;
     unsigned oldLen = textLength();
     unsigned newLen = text->length();
     int delta = newLen - oldLen;
@@ -1328,7 +1331,7 @@ void RenderText::setTextWithOffset(PassRefPtr<StringImpl> text, unsigned offset,
     }
 
     m_linesDirty = dirtiedLines;
     }
 
     m_linesDirty = dirtiedLines;
-    setText(text, force);
+    setText(text, force || dirtiedLines);
 }
 
 void RenderText::transformText()
 }
 
 void RenderText::transformText()