Changeset 223848 in webkit


Ignore:
Timestamp:
Oct 23, 2017 11:59:06 AM (6 years ago)
Author:
Antti Koivisto
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:
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r223845 r223848  
     12017-10-23  Antti Koivisto  <antti@apple.com>
     2
     3        Remember previous child renderer during render tree update
     4        https://bugs.webkit.org/show_bug.cgi?id=178659
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        * fast/block/float/float-not-removed-from-pre-block-expected.txt:
     9        * platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt:
     10
    1112017-10-23  Daniel Bates  <dabates@apple.com>
    212
  • trunk/LayoutTests/fast/block/float/float-not-removed-from-pre-block-expected.txt

    r191011 r223848  
    11Bug 101970: Heap-use-after-free in WebCore::RenderLayerModelObject::hasSelfPaintingLayer
    22Test passes if it does not crash.
    3     
     3   
  • trunk/LayoutTests/platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt

    r190840 r223848  
    2525                text run at (0,0) width 30: "after"
    2626        RenderBlock (anonymous) at (1,77) size 782x18
    27           RenderText {#text} at (0,0) size 0x0
    2827          RenderText {#text} at (0,0) size 50x18
    2928            text run at (0,0) width 50: "Details "
  • trunk/Source/WebCore/ChangeLog

    r223847 r223848  
     12017-10-23  Antti Koivisto  <antti@apple.com>
     2
     3        Remember previous child renderer during render tree update
     4        https://bugs.webkit.org/show_bug.cgi?id=178659
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        We shouldn't need to recompute the previous renderer, we know it already.
     9
     10        * style/RenderTreePosition.cpp:
     11        (WebCore::RenderTreePosition::previousSiblingRenderer const): Deleted.
     12
     13            No longer needed. This was also subtly wrong as doesn't take display:contents into account.
     14
     15        * style/RenderTreePosition.h:
     16        * style/RenderTreeUpdater.cpp:
     17        (WebCore::RenderTreeUpdater::updateRenderTree):
     18        (WebCore::RenderTreeUpdater::textRendererIsNeeded):
     19
     20            Use the saved previous renderer.
     21
     22        (WebCore::RenderTreeUpdater::updateTextRenderer):
     23        (WebCore::RenderTreeUpdater::storePreviousRenderer):
     24
     25            Save the previous renderere as we walk the tree.
     26
     27        (WebCore::textRendererIsNeeded): Deleted.
     28        * style/RenderTreeUpdater.h:
     29
    1302017-10-23  Keith Miller  <keith_miller@apple.com>
    231
  • trunk/Source/WebCore/style/RenderTreePosition.cpp

    r223748 r223848  
    5555    if (m_nextSibling == &siblingRenderer)
    5656        m_hasValidNextSibling = false;
    57 }
    58 
    59 RenderObject* RenderTreePosition::previousSiblingRenderer(const Text& textNode) const
    60 {
    61     if (textNode.renderer())
    62         return textNode.renderer()->previousSibling();
    63 
    64     auto* parentElement = m_parent.element();
    65 
    66     auto composedChildren = composedTreeChildren(*parentElement);
    67     for (auto it = composedChildren.at(textNode), end = composedChildren.end(); it != end; --it) {
    68         if (auto* renderer = it->renderer())
    69             return renderer;
    70     }
    71     if (auto* before = parentElement->beforePseudoElement())
    72         return before->renderer();
    73     return nullptr;
    7457}
    7558
  • trunk/Source/WebCore/style/RenderTreePosition.h

    r223810 r223848  
    5050    void invalidateNextSibling(const RenderObject&);
    5151
    52     RenderObject* previousSiblingRenderer(const Text&) const;
    5352    RenderObject* nextSiblingRenderer(const Node&) const;
    5453
  • trunk/Source/WebCore/style/RenderTreeUpdater.cpp

    r223748 r223848  
    178178                updateTextRenderer(text, textUpdate);
    179179
     180            storePreviousRenderer(text);
    180181            it.traverseNextSkippingChildren();
    181182            continue;
     
    189190        // there may be other updates down the tree.
    190191        if (!elementUpdates && !element.hasDisplayContents()) {
     192            storePreviousRenderer(element);
    191193            it.traverseNextSkippingChildren();
    192194            continue;
     
    195197        if (elementUpdates)
    196198            updateElementRenderer(element, elementUpdates->update);
     199
     200        storePreviousRenderer(element);
    197201
    198202        bool mayHaveRenderedDescendants = element.renderer() || (element.hasDisplayContents() && shouldCreateRenderer(element, renderTreePosition().parent()));
     
    385389}
    386390
    387 static bool textRendererIsNeeded(const Text& textNode, const RenderTreePosition& renderTreePosition)
    388 {
    389     const RenderElement& parentRenderer = renderTreePosition.parent();
     391bool RenderTreeUpdater::textRendererIsNeeded(const Text& textNode)
     392{
     393    const RenderElement& parentRenderer = renderTreePosition().parent();
    390394    if (!parentRenderer.canHaveChildren())
    391395        return false;
     
    404408        return true;
    405409
    406     RenderObject* previousRenderer = renderTreePosition.previousSiblingRenderer(textNode);
     410    auto* previousRenderer = parent().previousChildRenderer;
    407411    if (previousRenderer && previousRenderer->isBR()) // <span><br/> <br/></span>
    408412        return false;
     
    419423        while (first && first->isFloatingOrOutOfFlowPositioned())
    420424            first = first->nextSibling();
    421         RenderObject* nextRenderer = textNode.renderer() ? textNode.renderer() : renderTreePosition.nextSiblingRenderer(textNode);
     425        RenderObject* nextRenderer = textNode.renderer() ? textNode.renderer() :  renderTreePosition().nextSiblingRenderer(textNode);
    422426        if (!first || nextRenderer == first) {
    423427            // Whitespace at the start of a block just goes away. Don't even make a render object for this text.
     
    460464{
    461465    auto* existingRenderer = text.renderer();
    462     bool needsRenderer = textRendererIsNeeded(text, renderTreePosition());
     466    bool needsRenderer = textRendererIsNeeded(text);
    463467
    464468    if (existingRenderer && textUpdate && textUpdate->inheritedDisplayContentsStyle) {
     
    512516}
    513517
     518void RenderTreeUpdater::storePreviousRenderer(Node& node)
     519{
     520    auto* renderer = node.renderer();
     521    if (!renderer)
     522        return;
     523    ASSERT(parent().previousChildRenderer != renderer);
     524    parent().previousChildRenderer = renderer;
     525}
     526
    514527void RenderTreeUpdater::tearDownRenderers(Element& root)
    515528{
  • trunk/Source/WebCore/style/RenderTreeUpdater.h

    r223604 r223848  
    6565    void updateBeforeDescendants(Element&, const Style::ElementUpdates*);
    6666    void updateAfterDescendants(Element&, const Style::ElementUpdates*);
     67    bool textRendererIsNeeded(const Text& textNode);
     68    void storePreviousRenderer(Node&);
    6769
    6870    struct Parent {
     
    7072        const Style::ElementUpdates* updates { nullptr };
    7173        std::optional<RenderTreePosition> renderTreePosition;
     74        RenderObject* previousChildRenderer { nullptr };
    7275
    7376        Parent(ContainerNode& root);
Note: See TracChangeset for help on using the changeset viewer.