Changeset 224976 in webkit


Ignore:
Timestamp:
Nov 17, 2017 11:34:32 AM (6 years ago)
Author:
Antti Koivisto
Message:

Move destroyLeftoverChildren call to RenderObject::destroy
https://bugs.webkit.org/show_bug.cgi?id=179819

Reviewed by Zalan Bujtas.

This is currently called inconsistenly from various willBeDestroyed implementations.
We should always call it before invoking willBeDestroyed.

  • rendering/RenderBlockFlow.cpp:

(WebCore::RenderBlockFlow::willBeDestroyed):

  • rendering/RenderElement.cpp:

(WebCore::RenderElement::willBeDestroyed):

  • rendering/RenderElement.h:

(WebCore::RenderElement::setLastChild):

  • rendering/RenderInline.cpp:

(WebCore::RenderInline::willBeDestroyed):

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::~RenderLayer):

Add some release asserts verifying layer has been detached before destruction.
This would reveal cases where destroyLeftoverChildren was called too late.

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::destroy):

Call destroyLeftoverChildren.

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r224973 r224976  
     12017-11-17  Antti Koivisto  <antti@apple.com>
     2
     3        Move destroyLeftoverChildren call to RenderObject::destroy
     4        https://bugs.webkit.org/show_bug.cgi?id=179819
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        This is currently called inconsistenly from various willBeDestroyed implementations.
     9        We should always call it before invoking willBeDestroyed.
     10
     11        * rendering/RenderBlockFlow.cpp:
     12        (WebCore::RenderBlockFlow::willBeDestroyed):
     13        * rendering/RenderElement.cpp:
     14        (WebCore::RenderElement::willBeDestroyed):
     15        * rendering/RenderElement.h:
     16        (WebCore::RenderElement::setLastChild):
     17        * rendering/RenderInline.cpp:
     18        (WebCore::RenderInline::willBeDestroyed):
     19        * rendering/RenderLayer.cpp:
     20        (WebCore::RenderLayer::~RenderLayer):
     21
     22            Add some release asserts verifying layer has been detached before destruction.
     23            This would reveal cases where destroyLeftoverChildren was called too late.
     24
     25        * rendering/RenderObject.cpp:
     26        (WebCore::RenderObject::destroy):
     27
     28            Call destroyLeftoverChildren.
     29
    1302017-11-17  Said Abou-Hallawa  <sabouhallawa@apple.com>
    231
  • trunk/Source/WebCore/rendering/RenderBlockFlow.cpp

    r224933 r224976  
    133133void RenderBlockFlow::willBeDestroyed()
    134134{
    135     // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
    136     // properly dirty line boxes that they are removed from. Effects that do :before/:after only on hover could crash otherwise.
    137     destroyLeftoverChildren();
    138 
    139135    if (!renderTreeBeingDestroyed()) {
    140136        if (firstRootBox()) {
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r224933 r224976  
    11271127        view().frameView().removeSlowRepaintObject(this);
    11281128
    1129     destroyLeftoverChildren();
    1130 
    11311129    unregisterForVisibleInViewportCallback();
    11321130
  • trunk/Source/WebCore/rendering/RenderElement.h

    r224933 r224976  
    230230    void setIsFirstLetter() { m_isFirstLetter = true; }
    231231
     232    void destroyLeftoverChildren();
     233
    232234protected:
    233235    enum BaseTypeFlag {
     
    255257    void setFirstChild(RenderObject* child) { m_firstChild = child; }
    256258    void setLastChild(RenderObject* child) { m_lastChild = child; }
    257     void destroyLeftoverChildren();
    258259
    259260    virtual void styleWillChange(StyleDifference, const RenderStyle& newStyle);
  • trunk/Source/WebCore/rendering/RenderInline.cpp

    r224933 r224976  
    8585#endif
    8686
    87     // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
    88     // properly dirty line boxes that they are removed from.  Effects that do :before/:after only on hover could crash otherwise.
    89     destroyLeftoverChildren();
    90    
    9187    if (!renderTreeBeingDestroyed()) {
    9288        if (firstLineBox()) {
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r224712 r224976  
    436436
    437437    clearBacking(true);
     438
     439    // Layer and all its children should be removed from the tree before destruction.
     440    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(renderer().renderTreeBeingDestroyed() || !m_parent);
     441    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(renderer().renderTreeBeingDestroyed() || !m_first);
    438442}
    439443
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r224537 r224976  
    15201520    RELEASE_ASSERT(!m_bitfields.beingDestroyed());
    15211521
     1522    if (is<RenderElement>(*this))
     1523        downcast<RenderElement>(*this).destroyLeftoverChildren();
     1524
    15221525    m_bitfields.setBeingDestroyed(true);
    15231526
Note: See TracChangeset for help on using the changeset viewer.