Title: [223848] trunk
Revision
223848
Author
an...@apple.com
Date
2017-10-23 11:59:06 -0700 (Mon, 23 Oct 2017)

Log Message

Remember previous child renderer during render tree update
https://bugs.webkit.org/show_bug.cgi?id=178659

Reviewed by Zalan Bujtas.

Source/WebCore:

We shouldn't need to recompute the previous renderer, we know it already.

* style/RenderTreePosition.cpp:
(WebCore::RenderTreePosition::previousSiblingRenderer const): Deleted.

    No longer needed. This was also subtly wrong as doesn't take display:contents into account.

* style/RenderTreePosition.h:
* style/RenderTreeUpdater.cpp:
(WebCore::RenderTreeUpdater::updateRenderTree):
(WebCore::RenderTreeUpdater::textRendererIsNeeded):

    Use the saved previous renderer.

(WebCore::RenderTreeUpdater::updateTextRenderer):
(WebCore::RenderTreeUpdater::storePreviousRenderer):

    Save the previous renderere as we walk the tree.

(WebCore::textRendererIsNeeded): Deleted.
* style/RenderTreeUpdater.h:

LayoutTests:

* fast/block/float/float-not-removed-from-pre-block-expected.txt:
* platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (223847 => 223848)


--- trunk/LayoutTests/ChangeLog	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/LayoutTests/ChangeLog	2017-10-23 18:59:06 UTC (rev 223848)
@@ -1,3 +1,13 @@
+2017-10-23  Antti Koivisto  <an...@apple.com>
+
+        Remember previous child renderer during render tree update
+        https://bugs.webkit.org/show_bug.cgi?id=178659
+
+        Reviewed by Zalan Bujtas.
+
+        * fast/block/float/float-not-removed-from-pre-block-expected.txt:
+        * platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt:
+
 2017-10-23  Daniel Bates  <daba...@apple.com>
 
         Add tests to ensure spelling error dots are drawn in the correct place in bottom-to-top

Modified: trunk/LayoutTests/fast/block/float/float-not-removed-from-pre-block-expected.txt (223847 => 223848)


--- trunk/LayoutTests/fast/block/float/float-not-removed-from-pre-block-expected.txt	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/LayoutTests/fast/block/float/float-not-removed-from-pre-block-expected.txt	2017-10-23 18:59:06 UTC (rev 223848)
@@ -1,3 +1,3 @@
 Bug 101970: Heap-use-after-free in WebCore::RenderLayerModelObject::hasSelfPaintingLayer
 Test passes if it does not crash.
-    
+   

Modified: trunk/LayoutTests/platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt (223847 => 223848)


--- trunk/LayoutTests/platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/LayoutTests/platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt	2017-10-23 18:59:06 UTC (rev 223848)
@@ -24,7 +24,6 @@
               RenderText at (0,0) size 30x18
                 text run at (0,0) width 30: "after"
         RenderBlock (anonymous) at (1,77) size 782x18
-          RenderText {#text} at (0,0) size 0x0
           RenderText {#text} at (0,0) size 50x18
             text run at (0,0) width 50: "Details "
           RenderInline (generated) at (0,0) size 30x18

Modified: trunk/Source/WebCore/ChangeLog (223847 => 223848)


--- trunk/Source/WebCore/ChangeLog	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/Source/WebCore/ChangeLog	2017-10-23 18:59:06 UTC (rev 223848)
@@ -1,3 +1,32 @@
+2017-10-23  Antti Koivisto  <an...@apple.com>
+
+        Remember previous child renderer during render tree update
+        https://bugs.webkit.org/show_bug.cgi?id=178659
+
+        Reviewed by Zalan Bujtas.
+
+        We shouldn't need to recompute the previous renderer, we know it already.
+
+        * style/RenderTreePosition.cpp:
+        (WebCore::RenderTreePosition::previousSiblingRenderer const): Deleted.
+
+            No longer needed. This was also subtly wrong as doesn't take display:contents into account.
+
+        * style/RenderTreePosition.h:
+        * style/RenderTreeUpdater.cpp:
+        (WebCore::RenderTreeUpdater::updateRenderTree):
+        (WebCore::RenderTreeUpdater::textRendererIsNeeded):
+
+            Use the saved previous renderer.
+
+        (WebCore::RenderTreeUpdater::updateTextRenderer):
+        (WebCore::RenderTreeUpdater::storePreviousRenderer):
+
+            Save the previous renderere as we walk the tree.
+
+        (WebCore::textRendererIsNeeded): Deleted.
+        * style/RenderTreeUpdater.h:
+
 2017-10-23  Keith Miller  <keith_mil...@apple.com>
 
         Add Shared Modules files to the unified source build.

Modified: trunk/Source/WebCore/style/RenderTreePosition.cpp (223847 => 223848)


--- trunk/Source/WebCore/style/RenderTreePosition.cpp	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/Source/WebCore/style/RenderTreePosition.cpp	2017-10-23 18:59:06 UTC (rev 223848)
@@ -56,23 +56,6 @@
         m_hasValidNextSibling = false;
 }
 
-RenderObject* RenderTreePosition::previousSiblingRenderer(const Text& textNode) const
-{
-    if (textNode.renderer())
-        return textNode.renderer()->previousSibling();
-
-    auto* parentElement = m_parent.element();
-
-    auto composedChildren = composedTreeChildren(*parentElement);
-    for (auto it = composedChildren.at(textNode), end = composedChildren.end(); it != end; --it) {
-        if (auto* renderer = it->renderer())
-            return renderer;
-    }
-    if (auto* before = parentElement->beforePseudoElement())
-        return before->renderer();
-    return nullptr;
-}
-
 RenderObject* RenderTreePosition::nextSiblingRenderer(const Node& node) const
 {
     ASSERT(!node.renderer());

Modified: trunk/Source/WebCore/style/RenderTreePosition.h (223847 => 223848)


--- trunk/Source/WebCore/style/RenderTreePosition.h	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/Source/WebCore/style/RenderTreePosition.h	2017-10-23 18:59:06 UTC (rev 223848)
@@ -49,7 +49,6 @@
     void invalidateNextSibling() { m_hasValidNextSibling = false; }
     void invalidateNextSibling(const RenderObject&);
 
-    RenderObject* previousSiblingRenderer(const Text&) const;
     RenderObject* nextSiblingRenderer(const Node&) const;
 
 private:

Modified: trunk/Source/WebCore/style/RenderTreeUpdater.cpp (223847 => 223848)


--- trunk/Source/WebCore/style/RenderTreeUpdater.cpp	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.cpp	2017-10-23 18:59:06 UTC (rev 223848)
@@ -177,6 +177,7 @@
             if ((parent().updates && parent().updates->update.change == Style::Detach) || textUpdate || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
                 updateTextRenderer(text, textUpdate);
 
+            storePreviousRenderer(text);
             it.traverseNextSkippingChildren();
             continue;
         }
@@ -188,6 +189,7 @@
         // We hop through display: contents elements in findRenderingRoot, so
         // there may be other updates down the tree.
         if (!elementUpdates && !element.hasDisplayContents()) {
+            storePreviousRenderer(element);
             it.traverseNextSkippingChildren();
             continue;
         }
@@ -195,6 +197,8 @@
         if (elementUpdates)
             updateElementRenderer(element, elementUpdates->update);
 
+        storePreviousRenderer(element);
+
         bool mayHaveRenderedDescendants = element.renderer() || (element.hasDisplayContents() && shouldCreateRenderer(element, renderTreePosition().parent()));
         if (!mayHaveRenderedDescendants) {
             it.traverseNextSkippingChildren();
@@ -384,9 +388,9 @@
         cache->updateCacheAfterNodeIsAttached(&element);
 }
 
-static bool textRendererIsNeeded(const Text& textNode, const RenderTreePosition& renderTreePosition)
+bool RenderTreeUpdater::textRendererIsNeeded(const Text& textNode)
 {
-    const RenderElement& parentRenderer = renderTreePosition.parent();
+    const RenderElement& parentRenderer = renderTreePosition().parent();
     if (!parentRenderer.canHaveChildren())
         return false;
     if (parentRenderer.element() && !parentRenderer.element()->childShouldCreateRenderer(textNode))
@@ -403,7 +407,7 @@
     if (parentRenderer.style().preserveNewline()) // pre/pre-wrap/pre-line always make renderers.
         return true;
 
-    RenderObject* previousRenderer = renderTreePosition.previousSiblingRenderer(textNode);
+    auto* previousRenderer = parent().previousChildRenderer;
     if (previousRenderer && previousRenderer->isBR()) // <span><br/> <br/></span>
         return false;
 
@@ -418,7 +422,7 @@
         RenderObject* first = parentRenderer.firstChild();
         while (first && first->isFloatingOrOutOfFlowPositioned())
             first = first->nextSibling();
-        RenderObject* nextRenderer = textNode.renderer() ? textNode.renderer() : renderTreePosition.nextSiblingRenderer(textNode);
+        RenderObject* nextRenderer = textNode.renderer() ? textNode.renderer() :  renderTreePosition().nextSiblingRenderer(textNode);
         if (!first || nextRenderer == first) {
             // Whitespace at the start of a block just goes away. Don't even make a render object for this text.
             return false;
@@ -459,7 +463,7 @@
 void RenderTreeUpdater::updateTextRenderer(Text& text, const Style::TextUpdate* textUpdate)
 {
     auto* existingRenderer = text.renderer();
-    bool needsRenderer = textRendererIsNeeded(text, renderTreePosition());
+    bool needsRenderer = textRendererIsNeeded(text);
 
     if (existingRenderer && textUpdate && textUpdate->inheritedDisplayContentsStyle) {
         if (existingRenderer->inlineWrapperForDisplayContents() || *textUpdate->inheritedDisplayContentsStyle) {
@@ -511,6 +515,15 @@
     }
 }
 
+void RenderTreeUpdater::storePreviousRenderer(Node& node)
+{
+    auto* renderer = node.renderer();
+    if (!renderer)
+        return;
+    ASSERT(parent().previousChildRenderer != renderer);
+    parent().previousChildRenderer = renderer;
+}
+
 void RenderTreeUpdater::tearDownRenderers(Element& root)
 {
     tearDownRenderers(root, TeardownType::Full);

Modified: trunk/Source/WebCore/style/RenderTreeUpdater.h (223847 => 223848)


--- trunk/Source/WebCore/style/RenderTreeUpdater.h	2017-10-23 18:57:50 UTC (rev 223847)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.h	2017-10-23 18:59:06 UTC (rev 223848)
@@ -64,11 +64,14 @@
     void invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(Node&);
     void updateBeforeDescendants(Element&, const Style::ElementUpdates*);
     void updateAfterDescendants(Element&, const Style::ElementUpdates*);
+    bool textRendererIsNeeded(const Text& textNode);
+    void storePreviousRenderer(Node&);
 
     struct Parent {
         Element* element { nullptr };
         const Style::ElementUpdates* updates { nullptr };
         std::optional<RenderTreePosition> renderTreePosition;
+        RenderObject* previousChildRenderer { nullptr };
 
         Parent(ContainerNode& root);
         Parent(Element&, const Style::ElementUpdates*);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to