Changeset 228238 in webkit


Ignore:
Timestamp:
Feb 7, 2018 11:52:45 AM (6 years ago)
Author:
Alan Bujtas
Message:

[RenderTreeBuilder] Remove RenderElement::destroyLeftoverChildren.
https://bugs.webkit.org/show_bug.cgi?id=182518
<rdar://problem/37256035>

Reviewed by Antti Koivisto.

Remove leftover children before we call takeChild() on the parent (as opposed to when
we finally call destroy() on the parent).
This patch also explicitly destroys the top level pagination renderers.

Covered by existing tests.

  • rendering/RenderElement.cpp:

(WebCore::RenderElement::removeAndDestroyChild):
(WebCore::RenderElement::destroyLeftoverChildren): Deleted.

  • rendering/RenderElement.h:
  • rendering/RenderObject.cpp:

(WebCore::RenderObject::destroy):

  • rendering/updating/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::tearDownRenderers):
(WebCore::RenderTreeUpdater::tearDownLeftoverPaginationRenderersIfNeeded):

  • rendering/updating/RenderTreeUpdater.h:
Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r228231 r228238  
     12018-02-07  Zalan Bujtas  <zalan@apple.com>
     2
     3        [RenderTreeBuilder] Remove RenderElement::destroyLeftoverChildren.
     4        https://bugs.webkit.org/show_bug.cgi?id=182518
     5        <rdar://problem/37256035>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        Remove leftover children before we call takeChild() on the parent (as opposed to when
     10        we finally call destroy() on the parent).
     11        This patch also explicitly destroys the top level pagination renderers.
     12
     13        Covered by existing tests.
     14
     15        * rendering/RenderElement.cpp:
     16        (WebCore::RenderElement::removeAndDestroyChild):
     17        (WebCore::RenderElement::destroyLeftoverChildren): Deleted.
     18        * rendering/RenderElement.h:
     19        * rendering/RenderObject.cpp:
     20        (WebCore::RenderObject::destroy):
     21        * rendering/updating/RenderTreeUpdater.cpp:
     22        (WebCore::RenderTreeUpdater::tearDownRenderers):
     23        (WebCore::RenderTreeUpdater::tearDownLeftoverPaginationRenderersIfNeeded):
     24        * rendering/updating/RenderTreeUpdater.h:
     25
    1262018-02-07  Daniel Bates  <dabates@apple.com>
    227
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r228224 r228238  
    137137{
    138138    // Do not add any code here. Add it to willBeDestroyed() instead.
     139    ASSERT(!m_firstChild);
    139140}
    140141
     
    488489void RenderElement::removeAndDestroyChild(RenderTreeBuilder& builder, RenderObject& oldChild)
    489490{
     491    if (is<RenderElement>(oldChild)) {
     492        auto& child = downcast<RenderElement>(oldChild);
     493        while (child.firstChild()) {
     494            auto& firstChild = *child.firstChild();
     495            if (auto* node = firstChild.node())
     496                node->setRenderer(nullptr);
     497            child.removeAndDestroyChild(builder, firstChild);
     498        }
     499    }
    490500    auto toDestroy = takeChild(builder, oldChild);
    491 }
    492 
    493 void RenderElement::destroyLeftoverChildren()
    494 {
    495     while (m_firstChild) {
    496         if (auto* node = m_firstChild->node())
    497             node->setRenderer(nullptr);
    498         removeAndDestroyChild(*RenderTreeBuilder::current(), *m_firstChild);
    499     }
    500501}
    501502
  • trunk/Source/WebCore/rendering/RenderElement.h

    r228224 r228238  
    229229    void setIsFirstLetter() { m_isFirstLetter = true; }
    230230
    231     void destroyLeftoverChildren();
    232231    RenderObject* attachRendererInternal(RenderPtr<RenderObject> child, RenderObject* beforeChild);
    233232    RenderPtr<RenderObject> detachRendererInternal(RenderObject&);
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r227977 r228238  
    14781478    RELEASE_ASSERT(!m_bitfields.beingDestroyed());
    14791479
    1480     if (is<RenderElement>(*this))
    1481         downcast<RenderElement>(*this).destroyLeftoverChildren();
    1482 
    14831480    m_bitfields.setBeingDestroyed(true);
    14841481
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r224546 r228238  
    4848#include "RenderMultiColumnSpannerPlaceholder.h"
    4949#include "RenderQuote.h"
     50#include "RenderTreeBuilder.h"
    5051#include "RenderWidget.h"
    5152#include "ScrollbarTheme.h"
     
    614615{
    615616    RenderBlockFlow::willBeDestroyed();
     617    // FIXME: This is a workaround for leftover content (see webkit.org/b/182547).
     618    if (firstChild()) {
     619        RenderTreeBuilder builder(*this);
     620        while (firstChild())
     621            removeAndDestroyChild(builder, *firstChild());
     622    }
    616623
    617624    ASSERT_WITH_MESSAGE(m_rendererCount == 1, "All other renderers in this render tree should have been destroyed");
  • trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp

    r227928 r228238  
    580580
    581581    pop(0);
     582
     583    tearDownLeftoverPaginationRenderersIfNeeded(root);
    582584}
    583585
     
    589591    RenderTreeBuilder::current()->removeFromParentAndDestroyCleaningUpAnonymousWrappers(*renderer);
    590592    text.setRenderer(nullptr);
     593}
     594
     595void RenderTreeUpdater::tearDownLeftoverPaginationRenderersIfNeeded(Element& root)
     596{
     597    if (&root != root.document().documentElement())
     598        return;
     599    for (auto* child = root.document().renderView()->firstChild(); child;) {
     600        auto* nextSibling = child->nextSibling();
     601        if (is<RenderMultiColumnFlow>(*child) || is<RenderMultiColumnSet>(*child))
     602            RenderTreeBuilder::current()->removeFromParentAndDestroyCleaningUpAnonymousWrappers(*child);
     603        child = nextSibling;
     604    }
    591605}
    592606
  • trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.h

    r227570 r228238  
    9090    static void tearDownTextRenderer(Text&);
    9191    static void tearDownLeftoverShadowHostChildren(Element&);
     92    static void tearDownLeftoverPaginationRenderersIfNeeded(Element&);
    9293
    9394    RenderView& renderView();
Note: See TracChangeset for help on using the changeset viewer.