Title: [207804] trunk
Revision
207804
Author
za...@apple.com
Date
2016-10-24 21:19:09 -0700 (Mon, 24 Oct 2016)

Log Message

Do not update selection rect on dirty lineboxes.
https://bugs.webkit.org/show_bug.cgi?id=163862
<rdar://problem/28813156>

Reviewed by Simon Fraser.

Source/WebCore:

In certain cases RenderBlock::updateFirstLetter() triggers
unwanted render tree mutation while the caller assumes intact renderers.
This patch ensures that no renderers gets destroyed while computing the preferred widths
when we are outside of layout context.

Test: fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::computePreferredLogicalWidths):
(WebCore::RenderBlock::updateFirstLetter):
* rendering/RenderBlock.h:
* rendering/RenderListItem.cpp:
(WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded):
* rendering/RenderRubyRun.cpp:
(WebCore::RenderRubyRun::updateFirstLetter):
* rendering/RenderRubyRun.h:
* rendering/RenderTable.cpp:
(WebCore::RenderTable::updateFirstLetter):
* rendering/RenderTable.h:
* rendering/svg/RenderSVGText.cpp:
(WebCore::RenderSVGText::updateFirstLetter):
* rendering/svg/RenderSVGText.h:

LayoutTests:

* fast/css-generated-content/dynamic-first-letter-selection-clear-crash-expected.txt: Added.
* fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (207803 => 207804)


--- trunk/LayoutTests/ChangeLog	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/LayoutTests/ChangeLog	2016-10-25 04:19:09 UTC (rev 207804)
@@ -1,3 +1,14 @@
+2016-10-24  Zalan Bujtas  <za...@apple.com>
+
+        Do not update selection rect on dirty lineboxes.
+        https://bugs.webkit.org/show_bug.cgi?id=163862
+        <rdar://problem/28813156>
+
+        Reviewed by Simon Fraser.
+
+        * fast/css-generated-content/dynamic-first-letter-selection-clear-crash-expected.txt: Added.
+        * fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html: Added.
+
 2016-10-24  Ryan Haddad  <ryanhad...@apple.com>
 
         Unreviewed, rolling out r207795.

Added: trunk/LayoutTests/fast/css-generated-content/dynamic-first-letter-selection-clear-crash-expected.txt (0 => 207804)


--- trunk/LayoutTests/fast/css-generated-content/dynamic-first-letter-selection-clear-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-generated-content/dynamic-first-letter-selection-clear-crash-expected.txt	2016-10-25 04:19:09 UTC (rev 207804)
@@ -0,0 +1,2 @@
+Pass if
+no crash.

Added: trunk/LayoutTests/fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html (0 => 207804)


--- trunk/LayoutTests/fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html	2016-10-25 04:19:09 UTC (rev 207804)
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests that we can clear selection properly on dynamic content with first letter.</title>
+<style>
+.floatClass::first-letter {
+  float: right;
+}
+
+#innerBody {
+ column-count: 2;
+}
+
+</style>
+</head>
+<body>
+<li id=li style="float: right;">Pass if<span style="float: right;"></span></li><body id=innerBody style="height: 100px"><span id=span style="display: none;"></span>no crash.</body>
+<script>
+  if (window.testRunner)
+    testRunner.dumpAsText();
+  innerBody.style.webkitWritingMode = "vertical-rl";
+  innerBody.className = "floatClass";
+
+  document.getSelection().setBaseAndExtent(span, 0, innerBody, innerBody.childNodes.length);
+  window.getSelection().modify("extend", "left", "documentboundary");
+  innerBody.scrollIntoViewIfNeeded(true);
+  li.style.cssText = "float: right; height: 40px; width: 40px;";
+  document.body.offsetHeight;
+  li.style.cssText = "";
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (207803 => 207804)


--- trunk/Source/WebCore/ChangeLog	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/ChangeLog	2016-10-25 04:19:09 UTC (rev 207804)
@@ -1,3 +1,34 @@
+2016-10-24  Zalan Bujtas  <za...@apple.com>
+
+        Do not update selection rect on dirty lineboxes.
+        https://bugs.webkit.org/show_bug.cgi?id=163862
+        <rdar://problem/28813156>
+
+        Reviewed by Simon Fraser.
+
+        In certain cases RenderBlock::updateFirstLetter() triggers
+        unwanted render tree mutation while the caller assumes intact renderers.
+        This patch ensures that no renderers gets destroyed while computing the preferred widths
+        when we are outside of layout context.
+
+        Test: fast/css-generated-content/dynamic-first-letter-selection-clear-crash.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::computePreferredLogicalWidths):
+        (WebCore::RenderBlock::updateFirstLetter):
+        * rendering/RenderBlock.h:
+        * rendering/RenderListItem.cpp:
+        (WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded):
+        * rendering/RenderRubyRun.cpp:
+        (WebCore::RenderRubyRun::updateFirstLetter):
+        * rendering/RenderRubyRun.h:
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::updateFirstLetter):
+        * rendering/RenderTable.h:
+        * rendering/svg/RenderSVGText.cpp:
+        (WebCore::RenderSVGText::updateFirstLetter):
+        * rendering/svg/RenderSVGText.h:
+
 2016-10-24  Ryan Haddad  <ryanhad...@apple.com>
 
         Unreviewed, rolling out r207795.

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2016-10-25 04:19:09 UTC (rev 207804)
@@ -2755,7 +2755,9 @@
 {
     ASSERT(preferredLogicalWidthsDirty());
 
-    updateFirstLetter();
+    // FIXME: Do not even try to reshuffle first letter renderers when we are not in layout
+    // until after webkit.org/b/163848 is fixed.
+    updateFirstLetter(view().frameView().isInRenderTreeLayout() ? RenderTreeMutationIsAllowed::Yes : RenderTreeMutationIsAllowed::No);
 
     m_minPreferredLogicalWidth = 0;
     m_maxPreferredLogicalWidth = 0;
@@ -3305,7 +3307,7 @@
         firstLetterContainer = nullptr;
 }
 
-void RenderBlock::updateFirstLetter()
+void RenderBlock::updateFirstLetter(RenderTreeMutationIsAllowed mutationAllowedOrNot)
 {
     RenderObject* firstLetterObj;
     RenderElement* firstLetterContainer;
@@ -3326,6 +3328,8 @@
     if (!is<RenderText>(*firstLetterObj))
         return;
 
+    if (mutationAllowedOrNot != RenderTreeMutationIsAllowed::Yes)
+        return;
     // Our layout state is not valid for the repaints we are going to trigger by
     // adding and removing children of firstLetterContainer.
     LayoutStateDisabler layoutStateDisabler(view());

Modified: trunk/Source/WebCore/rendering/RenderBlock.h (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2016-10-25 04:19:09 UTC (rev 207804)
@@ -245,7 +245,8 @@
     LayoutUnit collapsedMarginBeforeForChild(const RenderBox& child) const;
     LayoutUnit collapsedMarginAfterForChild(const RenderBox& child) const;
 
-    virtual void updateFirstLetter();
+    enum class RenderTreeMutationIsAllowed { Yes, No };
+    virtual void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes);
     void getFirstLetter(RenderObject*& firstLetter, RenderElement*& firstLetterContainer, RenderObject* skipObject = nullptr);
 
     virtual void scrollbarsChanged(bool /*horizontalScrollbarChanged*/, bool /*verticalScrollbarChanged*/) { }

Modified: trunk/Source/WebCore/rendering/RenderListItem.cpp (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderListItem.cpp	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderListItem.cpp	2016-10-25 04:19:09 UTC (rev 207804)
@@ -268,7 +268,7 @@
     if (!m_marker)
         return;
 
-    // FIXME: Do not even try reposition the marker when we are not in layout
+    // FIXME: Do not even try to reposition the marker when we are not in layout
     // until after we fixed webkit.org/b/163789.
     if (!view().frameView().isInRenderTreeLayout())
         return;

Modified: trunk/Source/WebCore/rendering/RenderRubyRun.cpp (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderRubyRun.cpp	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderRubyRun.cpp	2016-10-25 04:19:09 UTC (rev 207804)
@@ -101,7 +101,7 @@
     return 0;
 }
 
-void RenderRubyRun::updateFirstLetter()
+void RenderRubyRun::updateFirstLetter(RenderTreeMutationIsAllowed)
 {
 }
 

Modified: trunk/Source/WebCore/rendering/RenderRubyRun.h (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderRubyRun.h	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderRubyRun.h	2016-10-25 04:19:09 UTC (rev 207804)
@@ -61,7 +61,7 @@
     void removeChild(RenderObject&) override;
 
     RenderBlock* firstLineBlock() const override;
-    void updateFirstLetter() override;
+    void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes) override;
 
     void getOverhang(bool firstLine, RenderObject* startRenderer, RenderObject* endRenderer, float& startOverhang, float& endOverhang) const;
 

Modified: trunk/Source/WebCore/rendering/RenderTable.cpp (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderTable.cpp	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderTable.cpp	2016-10-25 04:19:09 UTC (rev 207804)
@@ -1458,7 +1458,7 @@
     return nullptr;
 }
 
-void RenderTable::updateFirstLetter()
+void RenderTable::updateFirstLetter(RenderTreeMutationIsAllowed)
 {
 }
 

Modified: trunk/Source/WebCore/rendering/RenderTable.h (207803 => 207804)


--- trunk/Source/WebCore/rendering/RenderTable.h	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/RenderTable.h	2016-10-25 04:19:09 UTC (rev 207804)
@@ -303,7 +303,7 @@
     void invalidateCachedColumnOffsets();
 
     RenderBlock* firstLineBlock() const final;
-    void updateFirstLetter() final;
+    void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes) final;
     
     void updateLogicalWidth() final;
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp (207803 => 207804)


--- trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp	2016-10-25 04:19:09 UTC (rev 207804)
@@ -545,7 +545,7 @@
 
 // Fix for <rdar://problem/8048875>. We should not render :first-letter CSS Style
 // in a SVG text element context.
-void RenderSVGText::updateFirstLetter()
+void RenderSVGText::updateFirstLetter(RenderTreeMutationIsAllowed)
 {
 }
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGText.h (207803 => 207804)


--- trunk/Source/WebCore/rendering/svg/RenderSVGText.h	2016-10-25 03:46:32 UTC (rev 207803)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGText.h	2016-10-25 04:19:09 UTC (rev 207804)
@@ -92,7 +92,7 @@
     std::unique_ptr<RootInlineBox> createRootInlineBox() override;
 
     RenderBlock* firstLineBlock() const override;
-    void updateFirstLetter() override;
+    void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes) override;
 
     bool shouldHandleSubtreeMutations() const;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to