Title: [116895] releases/WebKitGTK/webkit-1.8
Revision
116895
Author
[email protected]
Date
2012-05-13 06:45:51 -0700 (Sun, 13 May 2012)

Log Message

Merge 110332 - Crash due to inserting letter into div with first-letter
https://bugs.webkit.org/show_bug.cgi?id=78534

Patch by Ken Buchanan <[email protected]> on 2012-03-09
Reviewed by David Hyatt.

Source/WebCore:

This fixes an issue in RenderTextFragment with setTextInternal
getting called with different intents. While most calls to it
are intended to change the underlying DOM node string, it can
also be called as a result of styleDidChange just for transforms
on the substring text fragment. This adds a mechanism for internal
callers to specify if the internal text is being updated without
a DOM node text change.

* rendering/RenderTextFragment.cpp:
(WebCore::RenderTextFragment::styleDidChange)
(WebCore::RenderTextFragment::setTextInternal)
* rendering/RenderTextFragment.h:
(WebCore::RenderTextFragment)

LayoutTests:

Test case to exercise the crashing condition in bug 78534. It inserts
a character in a first-letter div to induce an invalid RenderTextFragment
state.

* editing/inserting/insert-character-in-first-letter-crash-expected.txt: Added
* editing/inserting/insert-character-in-first-letter-crash.html: Added


Conflicts:

	Source/WebCore/rendering/RenderTextFragment.cpp

Modified Paths

Added Paths

Diff

Modified: releases/WebKitGTK/webkit-1.8/LayoutTests/ChangeLog (116894 => 116895)


--- releases/WebKitGTK/webkit-1.8/LayoutTests/ChangeLog	2012-05-13 13:45:32 UTC (rev 116894)
+++ releases/WebKitGTK/webkit-1.8/LayoutTests/ChangeLog	2012-05-13 13:45:51 UTC (rev 116895)
@@ -1,3 +1,17 @@
+2012-03-09  Ken Buchanan  <[email protected]>
+
+        Crash due to inserting letter into div with first-letter
+        https://bugs.webkit.org/show_bug.cgi?id=78534
+
+        Reviewed by David Hyatt.
+
+        Test case to exercise the crashing condition in bug 78534. It inserts
+        a character in a first-letter div to induce an invalid RenderTextFragment
+        state.
+
+        * editing/inserting/insert-character-in-first-letter-crash-expected.txt: Added
+        * editing/inserting/insert-character-in-first-letter-crash.html: Added
+
 2012-04-19  Dominik Röttsches  <[email protected]>
 
         [GTK] 3 fast/ layout tests failing after upgrading libsoup to 2.37.92

Added: releases/WebKitGTK/webkit-1.8/LayoutTests/editing/inserting/insert-character-in-first-letter-crash-expected.txt (0 => 116895)


--- releases/WebKitGTK/webkit-1.8/LayoutTests/editing/inserting/insert-character-in-first-letter-crash-expected.txt	                        (rev 0)
+++ releases/WebKitGTK/webkit-1.8/LayoutTests/editing/inserting/insert-character-in-first-letter-crash-expected.txt	2012-05-13 13:45:51 UTC (rev 116895)
@@ -0,0 +1,2 @@
+◦◦
+PASS if no assert or crash in debug.

Added: releases/WebKitGTK/webkit-1.8/LayoutTests/editing/inserting/insert-character-in-first-letter-crash.html (0 => 116895)


--- releases/WebKitGTK/webkit-1.8/LayoutTests/editing/inserting/insert-character-in-first-letter-crash.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-1.8/LayoutTests/editing/inserting/insert-character-in-first-letter-crash.html	2012-05-13 13:45:51 UTC (rev 116895)
@@ -0,0 +1,35 @@
+<html>
+  <head>
+    <style>
+      #div1 {
+        -webkit-text-security: circle;
+      }
+      #div1::first-letter {
+        display: table-row-group;
+      }
+      #div2 {
+        display: table;
+      }
+      #div2:last-child {
+        display: table-row;
+      }
+    </style>
+    <script>
+      window._onload_ = function() {
+        var div1 = document.getElementById('div1');
+        document.designMode='on';
+        document.execCommand('selectall');
+        document.execCommand('insertText', false, 'Z');
+        document.execCommand('Undo');
+        div1.appendChild(document.createElement('div'));
+        document.execCommand('selectall');
+
+        document.body.appendChild(document.createTextNode("PASS if no assert or crash in debug."));
+
+        if (window.layoutTestController)
+            layoutTestController.dumpAsText();
+     }
+    </script>
+  </head>
+  <body><div id=div1>AB<div id=div2></div></div></body>
+</html>

Modified: releases/WebKitGTK/webkit-1.8/Source/WebCore/ChangeLog (116894 => 116895)


--- releases/WebKitGTK/webkit-1.8/Source/WebCore/ChangeLog	2012-05-13 13:45:32 UTC (rev 116894)
+++ releases/WebKitGTK/webkit-1.8/Source/WebCore/ChangeLog	2012-05-13 13:45:51 UTC (rev 116895)
@@ -1,3 +1,24 @@
+2012-03-09  Ken Buchanan  <[email protected]>
+
+        Crash due to inserting letter into div with first-letter
+        https://bugs.webkit.org/show_bug.cgi?id=78534
+
+        Reviewed by David Hyatt.
+
+        This fixes an issue in RenderTextFragment with setTextInternal
+        getting called with different intents. While most calls to it
+        are intended to change the underlying DOM node string, it can
+        also be called as a result of styleDidChange just for transforms
+        on the substring text fragment. This adds a mechanism for internal
+        callers to specify if the internal text is being updated without
+        a DOM node text change.
+
+        * rendering/RenderTextFragment.cpp:
+        (WebCore::RenderTextFragment::styleDidChange)
+        (WebCore::RenderTextFragment::setTextInternal)
+        * rendering/RenderTextFragment.h:
+        (WebCore::RenderTextFragment)
+
 2012-03-13  Philip Rogers  <[email protected]>
 
         Fix the use of stale text fragments

Modified: releases/WebKitGTK/webkit-1.8/Source/WebCore/rendering/RenderTextFragment.cpp (116894 => 116895)


--- releases/WebKitGTK/webkit-1.8/Source/WebCore/rendering/RenderTextFragment.cpp	2012-05-13 13:45:32 UTC (rev 116894)
+++ releases/WebKitGTK/webkit-1.8/Source/WebCore/rendering/RenderTextFragment.cpp	2012-05-13 13:45:51 UTC (rev 116895)
@@ -33,6 +33,7 @@
     , m_start(startOffset)
     , m_end(length)
     , m_firstLetter(0)
+    , m_allowFragmentReset(true)
 {
 }
 
@@ -42,6 +43,7 @@
     , m_end(str ? str->length() : 0)
     , m_contentString(str)
     , m_firstLetter(0)
+    , m_allowFragmentReset(true)
 {
 }
 
@@ -60,7 +62,9 @@
 
 void RenderTextFragment::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
 {
+    m_allowFragmentReset = false;
     RenderText::styleDidChange(diff, oldStyle);
+    m_allowFragmentReset = true;
 
     if (RenderBlock* block = blockForAccompanyingFirstLetter()) {
         block->style()->removeCachedPseudoStyle(FIRST_LETTER);
@@ -77,16 +81,19 @@
 
 void RenderTextFragment::setText(PassRefPtr<StringImpl> text, bool force)
 {
-    RenderText::setText(text, force);
-    m_start = 0;
-    m_end = textLength();
-    if (m_firstLetter) {
-        ASSERT(!m_contentString);
-        m_firstLetter->destroy();
-        m_firstLetter = 0;
-        if (Node* t = node()) {
-            ASSERT(!t->renderer());
-            t->setRenderer(this);
+    RenderText::setTextInternal(text);
+
+    if (m_allowFragmentReset) {
+        m_start = 0;
+        m_end = textLength();
+        if (m_firstLetter) {
+            ASSERT(!m_contentString);
+            m_firstLetter->destroy();
+            m_firstLetter = 0;
+            if (Node* t = node()) {
+                ASSERT(!t->renderer());
+                t->setRenderer(this);
+            }
         }
     }
 }

Modified: releases/WebKitGTK/webkit-1.8/Source/WebCore/rendering/RenderTextFragment.h (116894 => 116895)


--- releases/WebKitGTK/webkit-1.8/Source/WebCore/rendering/RenderTextFragment.h	2012-05-13 13:45:32 UTC (rev 116894)
+++ releases/WebKitGTK/webkit-1.8/Source/WebCore/rendering/RenderTextFragment.h	2012-05-13 13:45:51 UTC (rev 116895)
@@ -64,6 +64,7 @@
     unsigned m_end;
     RefPtr<StringImpl> m_contentString;
     RenderObject* m_firstLetter;
+    bool m_allowFragmentReset;
 };
 
 inline RenderTextFragment* toRenderTextFragment(RenderObject* object)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to