Title: [220646] trunk
Revision
220646
Author
[email protected]
Date
2017-08-14 00:10:17 -0700 (Mon, 14 Aug 2017)

Log Message

[Render Tree Mutation] First letter should not mutate the render tree while in layout.
https://bugs.webkit.org/show_bug.cgi?id=163848
Source/WebCore:

Reviewed by Zalan Bujtas.

RenderBlock::updateFirstLetter shouldn't be called during layout. Instead it should
be invoked by the RenderTreeUpdater.

With this future patches can move updateFirstLetter() and the related functions
completely out of the render tree.

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::layout):

    No more updateFirstLetter calls during layout...

(WebCore::RenderBlock::computePreferredLogicalWidths):

    ...or preferred width computation.

(WebCore::RenderBlock::updateFirstLetter):
* rendering/RenderBlock.h:
* 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:
* style/RenderTreeUpdater.cpp:
(WebCore::RenderTreeUpdater::popParent):

    Call updateFirstLetter when closing the element. All of of descedant renderers are known here
    so this can be resolved correctly.

LayoutTests:

<rdar://problem/33402718>

Reviewed by Zalan Bujtas.

* fast/text-autosizing/ios/first-letter-expected.html: Added.

    Turn into reftest for easier debugging and robustness.

* imported/blink/fast/css/first-letter-range-insert-expected.txt:

    This is crash-or-assert test and the output change here doesn't matter.

* platform/ios/fast/text-autosizing/ios/first-letter-expected.txt: Removed.
* platform/mac/fast/text-autosizing/ios/first-letter-expected.txt: Removed.

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (220645 => 220646)


--- trunk/LayoutTests/ChangeLog	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/LayoutTests/ChangeLog	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1,3 +1,22 @@
+2017-08-14  Antti Koivisto  <[email protected]>
+
+        [Render Tree Mutation] First letter should not mutate the render tree while in layout.
+        https://bugs.webkit.org/show_bug.cgi?id=163848
+        <rdar://problem/33402718>
+
+        Reviewed by Zalan Bujtas.
+
+        * fast/text-autosizing/ios/first-letter-expected.html: Added.
+
+            Turn into reftest for easier debugging and robustness.
+
+        * imported/blink/fast/css/first-letter-range-insert-expected.txt:
+
+            This is crash-or-assert test and the output change here doesn't matter.
+
+        * platform/ios/fast/text-autosizing/ios/first-letter-expected.txt: Removed.
+        * platform/mac/fast/text-autosizing/ios/first-letter-expected.txt: Removed.
+
 2017-08-13  Manuel Rego Casasnovas  <[email protected]>
 
         Composition underline color is always black

Added: trunk/LayoutTests/fast/text-autosizing/ios/first-letter-expected.html (0 => 220646)


--- trunk/LayoutTests/fast/text-autosizing/ios/first-letter-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text-autosizing/ios/first-letter-expected.html	2017-08-14 07:10:17 UTC (rev 220646)
@@ -0,0 +1,16 @@
+<html>
+<head>
+    <script>
+    if (window.internals) {
+        window.internals.settings.setTextAutosizingEnabled(true);
+        window.internals.settings.setTextAutosizingWindowSizeOverride(320, 480);
+    }
+    </script>
+</head>
+<body>
+    <p>The following lines should be identical.</p>
+    <p><span style="color:green">A</span>-Z</p>
+    <p><span style="color:green">A</span>-Z</p>
+    <p><span style="color:green">A</span>-Z</p>
+</body>
+</html>

Modified: trunk/LayoutTests/imported/blink/fast/css/first-letter-range-insert-expected.txt (220645 => 220646)


--- trunk/LayoutTests/imported/blink/fast/css/first-letter-range-insert-expected.txt	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/LayoutTests/imported/blink/fast/css/first-letter-range-insert-expected.txt	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1 +1,2 @@
+B
 

Deleted: trunk/LayoutTests/platform/ios/fast/text-autosizing/ios/first-letter-expected.txt (220645 => 220646)


--- trunk/LayoutTests/platform/ios/fast/text-autosizing/ios/first-letter-expected.txt	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/LayoutTests/platform/ios/fast/text-autosizing/ios/first-letter-expected.txt	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1,26 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  RenderBlock {HTML} at (0,0) size 800x600
-    RenderBody {BODY} at (8,8) size 784x576
-      RenderBlock {P} at (0,0) size 784x27
-        RenderText {#text} at (0,0) size 366x26
-          text run at (0,0) width 366: "The following lines should be identical."
-      RenderBlock {P} at (0,43) size 784x27
-        RenderInline {SPAN} at (0,0) size 17x26 [color=#008000]
-          RenderText {#text} at (0,0) size 17x26
-            text run at (0,0) width 17: "A"
-        RenderText {#text} at (16,0) size 23x26
-          text run at (16,0) width 23: "-Z"
-      RenderBlock {P} at (0,86) size 784x27
-        RenderInline (generated) at (0,0) size 17x26 [color=#008000]
-          RenderText {#text} at (0,0) size 17x26
-            text run at (0,0) width 17: "A"
-        RenderText {#text} at (16,0) size 23x26
-          text run at (16,0) width 23: "-Z"
-      RenderBlock {P} at (0,129) size 784x27
-        RenderBlock (floating) at (0,0) size 17x27 [color=#008000]
-          RenderText {#text} at (0,0) size 17x26
-            text run at (0,0) width 17: "A"
-        RenderText {#text} at (16,0) size 23x26
-          text run at (16,0) width 23: "-Z"

Deleted: trunk/LayoutTests/platform/mac/fast/text-autosizing/ios/first-letter-expected.txt (220645 => 220646)


--- trunk/LayoutTests/platform/mac/fast/text-autosizing/ios/first-letter-expected.txt	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/LayoutTests/platform/mac/fast/text-autosizing/ios/first-letter-expected.txt	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1,26 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  RenderBlock {HTML} at (0,0) size 800x600
-    RenderBody {BODY} at (8,8) size 784x576
-      RenderBlock {P} at (0,0) size 784x26
-        RenderText {#text} at (0,0) size 366x26
-          text run at (0,0) width 366: "The following lines should be identical."
-      RenderBlock {P} at (0,42) size 784x26
-        RenderInline {SPAN} at (0,0) size 17x26 [color=#008000]
-          RenderText {#text} at (0,0) size 17x26
-            text run at (0,0) width 17: "A"
-        RenderText {#text} at (16,0) size 23x26
-          text run at (16,0) width 23: "-Z"
-      RenderBlock {P} at (0,84) size 784x26
-        RenderInline (generated) at (0,0) size 17x26 [color=#008000]
-          RenderText {#text} at (0,0) size 17x26
-            text run at (0,0) width 17: "A"
-        RenderText {#text} at (16,0) size 23x26
-          text run at (16,0) width 23: "-Z"
-      RenderBlock {P} at (0,126) size 784x26
-        RenderBlock (floating) at (0,0) size 17x26 [color=#008000]
-          RenderText {#text} at (0,0) size 17x26
-            text run at (0,0) width 17: "A"
-        RenderText {#text} at (16,0) size 23x26
-          text run at (16,0) width 23: "-Z"

Modified: trunk/Source/WebCore/ChangeLog (220645 => 220646)


--- trunk/Source/WebCore/ChangeLog	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/ChangeLog	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1,3 +1,42 @@
+2017-08-14  Antti Koivisto  <[email protected]>
+
+        [Render Tree Mutation] First letter should not mutate the render tree while in layout.
+        https://bugs.webkit.org/show_bug.cgi?id=163848
+
+        Reviewed by Zalan Bujtas.
+
+        RenderBlock::updateFirstLetter shouldn't be called during layout. Instead it should
+        be invoked by the RenderTreeUpdater.
+
+        With this future patches can move updateFirstLetter() and the related functions
+        completely out of the render tree.
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::layout):
+
+            No more updateFirstLetter calls during layout...
+
+        (WebCore::RenderBlock::computePreferredLogicalWidths):
+
+            ...or preferred width computation.
+
+        (WebCore::RenderBlock::updateFirstLetter):
+        * rendering/RenderBlock.h:
+        * 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:
+        * style/RenderTreeUpdater.cpp:
+        (WebCore::RenderTreeUpdater::popParent):
+
+            Call updateFirstLetter when closing the element. All of of descedant renderers are known here
+            so this can be resolved correctly.
+
 2017-08-13  Manuel Rego Casasnovas  <[email protected]>
 
         Composition underline color is always black

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1060,9 +1060,6 @@
     StackStats::LayoutCheckPoint layoutCheckPoint;
     OverflowEventDispatcher dispatcher(this);
 
-    // Update our first letter info now.
-    updateFirstLetter();
-
     // Table cells call layoutBlock directly, so don't add any logic here.  Put code into
     // layoutBlock().
     layoutBlock(false);
@@ -2743,10 +2740,6 @@
 {
     ASSERT(preferredLogicalWidthsDirty());
 
-    // 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;
 
@@ -3342,8 +3335,10 @@
         firstLetterContainer = nullptr;
 }
 
-void RenderBlock::updateFirstLetter(RenderTreeMutationIsAllowed mutationAllowedOrNot)
+void RenderBlock::updateFirstLetter()
 {
+    ASSERT_WITH_SECURITY_IMPLICATION(!view().layoutState());
+
     RenderObject* firstLetterObj;
     RenderElement* firstLetterContainer;
     // FIXME: The first letter might be composed of a variety of code units, and therefore might
@@ -3363,12 +3358,6 @@
     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());
-
     createFirstLetterRenderer(firstLetterContainer, downcast<RenderText>(firstLetterObj));
 }
 

Modified: trunk/Source/WebCore/rendering/RenderBlock.h (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2017-08-14 07:10:17 UTC (rev 220646)
@@ -263,8 +263,7 @@
     LayoutUnit collapsedMarginBeforeForChild(const RenderBox& child) const;
     LayoutUnit collapsedMarginAfterForChild(const RenderBox& child) const;
 
-    enum class RenderTreeMutationIsAllowed { Yes, No };
-    virtual void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes);
+    virtual void updateFirstLetter();
     void getFirstLetter(RenderObject*& firstLetter, RenderElement*& firstLetterContainer, RenderObject* skipObject = nullptr);
 
     virtual void scrollbarsChanged(bool /*horizontalScrollbarChanged*/, bool /*verticalScrollbarChanged*/) { }

Modified: trunk/Source/WebCore/rendering/RenderRubyRun.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderRubyRun.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderRubyRun.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -101,7 +101,7 @@
     return 0;
 }
 
-void RenderRubyRun::updateFirstLetter(RenderTreeMutationIsAllowed)
+void RenderRubyRun::updateFirstLetter()
 {
 }
 

Modified: trunk/Source/WebCore/rendering/RenderRubyRun.h (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderRubyRun.h	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderRubyRun.h	2017-08-14 07:10:17 UTC (rev 220646)
@@ -60,7 +60,7 @@
     void removeChild(RenderObject&) override;
 
     RenderBlock* firstLineBlock() const override;
-    void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes) override;
+    void updateFirstLetter() override;
 
     void getOverhang(bool firstLine, RenderObject* startRenderer, RenderObject* endRenderer, float& startOverhang, float& endOverhang) const;
 

Modified: trunk/Source/WebCore/rendering/RenderTable.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderTable.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderTable.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -1485,7 +1485,7 @@
     return nullptr;
 }
 
-void RenderTable::updateFirstLetter(RenderTreeMutationIsAllowed)
+void RenderTable::updateFirstLetter()
 {
 }
 

Modified: trunk/Source/WebCore/rendering/RenderTable.h (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderTable.h	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderTable.h	2017-08-14 07:10:17 UTC (rev 220646)
@@ -302,7 +302,7 @@
     void invalidateCachedColumnOffsets();
 
     RenderBlock* firstLineBlock() const final;
-    void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes) final;
+    void updateFirstLetter() final;
     
     void updateLogicalWidth() final;
 

Modified: trunk/Source/WebCore/rendering/RenderTableCell.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderTableCell.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderTableCell.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -260,7 +260,6 @@
 void RenderTableCell::layout()
 {
     StackStats::LayoutCheckPoint layoutCheckPoint;
-    updateFirstLetter();
 
     int oldCellBaseline = cellBaselinePosition();
     layoutBlock(cellWidthChanged());

Modified: trunk/Source/WebCore/rendering/RenderTextFragment.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/RenderTextFragment.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/RenderTextFragment.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -68,10 +68,8 @@
 {
     RenderText::styleDidChange(diff, oldStyle);
 
-    if (RenderBlock* block = blockForAccompanyingFirstLetter()) {
+    if (RenderBlock* block = blockForAccompanyingFirstLetter())
         block->mutableStyle().removeCachedPseudoStyle(FIRST_LETTER);
-        block->updateFirstLetter();
-    }
 }
 
 void RenderTextFragment::willBeDestroyed()

Modified: trunk/Source/WebCore/rendering/TextAutoSizing.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/TextAutoSizing.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/TextAutoSizing.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -32,8 +32,10 @@
 #include "Document.h"
 #include "FontCascade.h"
 #include "Logging.h"
+#include "RenderBlock.h"
 #include "RenderListMarker.h"
 #include "RenderText.h"
+#include "RenderTextFragment.h"
 #include "StyleResolver.h"
 
 namespace WebCore {
@@ -155,6 +157,17 @@
         parentRenderer->setStyle(WTFMove(newParentStyle));
     }
 
+    // FIXME: All render tree mutations should be done via RenderTreeUpdater.
+    for (auto& node : m_autoSizedNodes) {
+        auto& textRenderer = *node->renderer();
+        if (!is<RenderTextFragment>(textRenderer))
+            continue;
+        auto* block = downcast<RenderTextFragment>(textRenderer).blockForAccompanyingFirstLetter();
+        if (!block)
+            continue;
+        block->updateFirstLetter();
+    }
+
     return stillHasNodes;
 }
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp (220645 => 220646)


--- trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -544,7 +544,7 @@
 
 // Fix for <rdar://problem/8048875>. We should not render :first-letter CSS Style
 // in a SVG text element context.
-void RenderSVGText::updateFirstLetter(RenderTreeMutationIsAllowed)
+void RenderSVGText::updateFirstLetter()
 {
 }
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGText.h (220645 => 220646)


--- trunk/Source/WebCore/rendering/svg/RenderSVGText.h	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGText.h	2017-08-14 07:10:17 UTC (rev 220646)
@@ -91,7 +91,7 @@
     std::unique_ptr<RootInlineBox> createRootInlineBox() override;
 
     RenderBlock* firstLineBlock() const override;
-    void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes) override;
+    void updateFirstLetter() override;
 
     bool shouldHandleSubtreeMutations() const;
 

Modified: trunk/Source/WebCore/style/RenderTreeUpdater.cpp (220645 => 220646)


--- trunk/Source/WebCore/style/RenderTreeUpdater.cpp	2017-08-14 06:55:11 UTC (rev 220645)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.cpp	2017-08-14 07:10:17 UTC (rev 220646)
@@ -232,7 +232,11 @@
     if (parent.element) {
         updateBeforeOrAfterPseudoElement(*parent.element, AFTER);
 
-        if (parent.element->hasCustomStyleResolveCallbacks() && parent.styleChange == Style::Detach && parent.element->renderer())
+        auto* renderer = parent.element->renderer();
+        if (is<RenderBlock>(renderer))
+            downcast<RenderBlock>(*renderer).updateFirstLetter();
+
+        if (parent.element->hasCustomStyleResolveCallbacks() && parent.styleChange == Style::Detach && renderer)
             parent.element->didAttachRenderers();
     }
     m_parentStack.removeLast();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to