Changeset 214173 in webkit


Ignore:
Timestamp:
Mar 20, 2017 10:28:55 AM (7 years ago)
Author:
Simon Fraser
Message:

Move code out of renderer destructors into willBeDestroyed()
https://bugs.webkit.org/show_bug.cgi?id=169650

Reviewed by Antti Koivisto.

This is done for four reasons. First, code in willBeDestroyed() is able to call
virtual functions on derived classes. Second, this code will run before we've destroyed
the renderer's rareData, so can safely access it. Third, RenderWidget is special, and can have
its lifetime extended via manual ref-counting, and we want all cleanup to complete
before it goes into this weird zombie state. Fourth, in a shiny future where we have
ref-counted RenderObjects, we want cleanup code to be run explicitly and not tied
to object lifetime, and this is a step in that direction.

For all classes that derive from RenderObject, move code from the destructor into
willBeDestroyed(). New willBeDestroyed() implementations must call the base class.

RenderBlock and RenderBlockFlow are special; RenderBlockFlow::willBeDestroyed()
skips over RenderBlock::willBeDestroyed(), but they both need to run some code, which
I moved into RenderBlock::blockWillBeDestroyed().

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::~RenderBlock):
(WebCore::RenderBlock::willBeDestroyed):
(WebCore::RenderBlock::blockWillBeDestroyed):

  • rendering/RenderBlock.h:
  • rendering/RenderBlockFlow.cpp:

(WebCore::RenderBlockFlow::~RenderBlockFlow):
(WebCore::RenderBlockFlow::willBeDestroyed):

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::~RenderBox):
(WebCore::RenderBox::willBeDestroyed):

  • rendering/RenderBox.h:
  • rendering/RenderBoxModelObject.cpp:

(WebCore::RenderBoxModelObject::~RenderBoxModelObject):

  • rendering/RenderCounter.cpp:

(WebCore::RenderCounter::~RenderCounter):
(WebCore::RenderCounter::willBeDestroyed):

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

(WebCore::RenderElement::~RenderElement):
(WebCore::RenderElement::willBeDestroyed):

  • rendering/RenderEmbeddedObject.cpp:

(WebCore::RenderEmbeddedObject::~RenderEmbeddedObject):
(WebCore::RenderEmbeddedObject::willBeDestroyed):

  • rendering/RenderEmbeddedObject.h:
  • rendering/RenderImage.cpp:

(WebCore::RenderImage::~RenderImage):
(WebCore::RenderImage::willBeDestroyed):

  • rendering/RenderImage.h:
  • rendering/RenderLayerModelObject.cpp:

(WebCore::RenderLayerModelObject::~RenderLayerModelObject):
(WebCore::RenderLayerModelObject::willBeDestroyed):

  • rendering/RenderLayerModelObject.h:
  • rendering/RenderLineBreak.cpp:

(WebCore::RenderLineBreak::~RenderLineBreak):
(WebCore::RenderLineBreak::willBeDestroyed):

  • rendering/RenderLineBreak.h:
  • rendering/RenderListBox.cpp:

(WebCore::RenderListBox::~RenderListBox):
(WebCore::RenderListBox::willBeDestroyed):

  • rendering/RenderListBox.h:
  • rendering/RenderListItem.cpp:

(WebCore::RenderListItem::~RenderListItem):
(WebCore::RenderListItem::willBeDestroyed):

  • rendering/RenderListItem.h:
  • rendering/RenderListMarker.cpp:

(WebCore::RenderListMarker::~RenderListMarker):
(WebCore::RenderListMarker::willBeDestroyed):

  • rendering/RenderListMarker.h:
  • rendering/RenderMenuList.cpp:

(WebCore::RenderMenuList::~RenderMenuList):
(WebCore::RenderMenuList::willBeDestroyed):

  • rendering/RenderMenuList.h:
  • rendering/RenderNamedFlowThread.cpp:

(WebCore::RenderNamedFlowThread::~RenderNamedFlowThread):
(WebCore::RenderNamedFlowThread::willBeDestroyed):

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

(WebCore::RenderObject::willBeDestroyed):

  • rendering/RenderQuote.cpp:

(WebCore::RenderQuote::~RenderQuote):
(WebCore::RenderQuote::willBeDestroyed):

  • rendering/RenderQuote.h:
  • rendering/RenderSearchField.cpp:

(WebCore::RenderSearchField::~RenderSearchField):
(WebCore::RenderSearchField::willBeDestroyed):

  • rendering/RenderSearchField.h:
  • rendering/RenderSnapshottedPlugIn.cpp:

(WebCore::RenderSnapshottedPlugIn::~RenderSnapshottedPlugIn):
(WebCore::RenderSnapshottedPlugIn::willBeDestroyed):

  • rendering/RenderSnapshottedPlugIn.h:
  • rendering/RenderText.cpp:

(WebCore::RenderText::~RenderText):
(WebCore::RenderText::willBeDestroyed):

  • rendering/RenderTextControlMultiLine.cpp:

(WebCore::RenderTextControlMultiLine::~RenderTextControlMultiLine):
(WebCore::RenderTextControlMultiLine::willBeDestroyed):

  • rendering/RenderTextControlMultiLine.h:
  • rendering/RenderVideo.cpp:

(WebCore::RenderVideo::~RenderVideo):
(WebCore::RenderVideo::willBeDestroyed):

  • rendering/RenderVideo.h:
  • rendering/RenderWidget.h:
  • rendering/svg/RenderSVGImage.cpp:

(WebCore::RenderSVGImage::~RenderSVGImage):
(WebCore::RenderSVGImage::willBeDestroyed):

  • rendering/svg/RenderSVGImage.h:
  • rendering/svg/RenderSVGResourceContainer.cpp:

(WebCore::RenderSVGResourceContainer::~RenderSVGResourceContainer):
(WebCore::RenderSVGResourceContainer::willBeDestroyed):

Location:
trunk/Source/WebCore
Files:
42 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r214170 r214173  
     12017-03-20  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Move code out of renderer destructors into willBeDestroyed()
     4        https://bugs.webkit.org/show_bug.cgi?id=169650
     5
     6        Reviewed by Antti Koivisto.
     7
     8        This is done for four reasons. First, code in willBeDestroyed() is able to call
     9        virtual functions on derived classes. Second, this code will run before we've destroyed
     10        the renderer's rareData, so can safely access it. Third, RenderWidget is special, and can have
     11        its lifetime extended via manual ref-counting, and we want all cleanup to complete
     12        before it goes into this weird zombie state. Fourth, in a shiny future where we have
     13        ref-counted RenderObjects, we want cleanup code to be run explicitly and not tied
     14        to object lifetime, and this is a step in that direction.
     15
     16        For all classes that derive from RenderObject, move code from the destructor into
     17        willBeDestroyed(). New willBeDestroyed() implementations must call the base class.
     18
     19        RenderBlock and RenderBlockFlow are special; RenderBlockFlow::willBeDestroyed()
     20        skips over RenderBlock::willBeDestroyed(), but they both need to run some code, which
     21        I moved into RenderBlock::blockWillBeDestroyed().
     22
     23        * rendering/RenderBlock.cpp:
     24        (WebCore::RenderBlock::~RenderBlock):
     25        (WebCore::RenderBlock::willBeDestroyed):
     26        (WebCore::RenderBlock::blockWillBeDestroyed):
     27        * rendering/RenderBlock.h:
     28        * rendering/RenderBlockFlow.cpp:
     29        (WebCore::RenderBlockFlow::~RenderBlockFlow):
     30        (WebCore::RenderBlockFlow::willBeDestroyed):
     31        * rendering/RenderBox.cpp:
     32        (WebCore::RenderBox::~RenderBox):
     33        (WebCore::RenderBox::willBeDestroyed):
     34        * rendering/RenderBox.h:
     35        * rendering/RenderBoxModelObject.cpp:
     36        (WebCore::RenderBoxModelObject::~RenderBoxModelObject):
     37        * rendering/RenderCounter.cpp:
     38        (WebCore::RenderCounter::~RenderCounter):
     39        (WebCore::RenderCounter::willBeDestroyed):
     40        * rendering/RenderCounter.h:
     41        * rendering/RenderElement.cpp:
     42        (WebCore::RenderElement::~RenderElement):
     43        (WebCore::RenderElement::willBeDestroyed):
     44        * rendering/RenderEmbeddedObject.cpp:
     45        (WebCore::RenderEmbeddedObject::~RenderEmbeddedObject):
     46        (WebCore::RenderEmbeddedObject::willBeDestroyed):
     47        * rendering/RenderEmbeddedObject.h:
     48        * rendering/RenderImage.cpp:
     49        (WebCore::RenderImage::~RenderImage):
     50        (WebCore::RenderImage::willBeDestroyed):
     51        * rendering/RenderImage.h:
     52        * rendering/RenderLayerModelObject.cpp:
     53        (WebCore::RenderLayerModelObject::~RenderLayerModelObject):
     54        (WebCore::RenderLayerModelObject::willBeDestroyed):
     55        * rendering/RenderLayerModelObject.h:
     56        * rendering/RenderLineBreak.cpp:
     57        (WebCore::RenderLineBreak::~RenderLineBreak):
     58        (WebCore::RenderLineBreak::willBeDestroyed):
     59        * rendering/RenderLineBreak.h:
     60        * rendering/RenderListBox.cpp:
     61        (WebCore::RenderListBox::~RenderListBox):
     62        (WebCore::RenderListBox::willBeDestroyed):
     63        * rendering/RenderListBox.h:
     64        * rendering/RenderListItem.cpp:
     65        (WebCore::RenderListItem::~RenderListItem):
     66        (WebCore::RenderListItem::willBeDestroyed):
     67        * rendering/RenderListItem.h:
     68        * rendering/RenderListMarker.cpp:
     69        (WebCore::RenderListMarker::~RenderListMarker):
     70        (WebCore::RenderListMarker::willBeDestroyed):
     71        * rendering/RenderListMarker.h:
     72        * rendering/RenderMenuList.cpp:
     73        (WebCore::RenderMenuList::~RenderMenuList):
     74        (WebCore::RenderMenuList::willBeDestroyed):
     75        * rendering/RenderMenuList.h:
     76        * rendering/RenderNamedFlowThread.cpp:
     77        (WebCore::RenderNamedFlowThread::~RenderNamedFlowThread):
     78        (WebCore::RenderNamedFlowThread::willBeDestroyed):
     79        * rendering/RenderNamedFlowThread.h:
     80        * rendering/RenderObject.cpp:
     81        (WebCore::RenderObject::willBeDestroyed):
     82        * rendering/RenderQuote.cpp:
     83        (WebCore::RenderQuote::~RenderQuote):
     84        (WebCore::RenderQuote::willBeDestroyed):
     85        * rendering/RenderQuote.h:
     86        * rendering/RenderSearchField.cpp:
     87        (WebCore::RenderSearchField::~RenderSearchField):
     88        (WebCore::RenderSearchField::willBeDestroyed):
     89        * rendering/RenderSearchField.h:
     90        * rendering/RenderSnapshottedPlugIn.cpp:
     91        (WebCore::RenderSnapshottedPlugIn::~RenderSnapshottedPlugIn):
     92        (WebCore::RenderSnapshottedPlugIn::willBeDestroyed):
     93        * rendering/RenderSnapshottedPlugIn.h:
     94        * rendering/RenderText.cpp:
     95        (WebCore::RenderText::~RenderText):
     96        (WebCore::RenderText::willBeDestroyed):
     97        * rendering/RenderTextControlMultiLine.cpp:
     98        (WebCore::RenderTextControlMultiLine::~RenderTextControlMultiLine):
     99        (WebCore::RenderTextControlMultiLine::willBeDestroyed):
     100        * rendering/RenderTextControlMultiLine.h:
     101        * rendering/RenderVideo.cpp:
     102        (WebCore::RenderVideo::~RenderVideo):
     103        (WebCore::RenderVideo::willBeDestroyed):
     104        * rendering/RenderVideo.h:
     105        * rendering/RenderWidget.h:
     106        * rendering/svg/RenderSVGImage.cpp:
     107        (WebCore::RenderSVGImage::~RenderSVGImage):
     108        (WebCore::RenderSVGImage::willBeDestroyed):
     109        * rendering/svg/RenderSVGImage.h:
     110        * rendering/svg/RenderSVGResourceContainer.cpp:
     111        (WebCore::RenderSVGResourceContainer::~RenderSVGResourceContainer):
     112        (WebCore::RenderSVGResourceContainer::willBeDestroyed):
     113
    11142017-03-20  Jon Lee  <jonlee@apple.com>
    2115
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r214082 r214173  
    257257
    258258typedef HashMap<const RenderBlock*, std::unique_ptr<RenderBlockRareData>> RenderBlockRareDataMap;
    259 static RenderBlockRareDataMap* gRareDataMap = 0;
     259static RenderBlockRareDataMap* gRareDataMap;
    260260
    261261// This class helps dispatching the 'overflow' event on layout change. overflow can be set on RenderBoxes, yet the existing code
     
    334334RenderBlock::~RenderBlock()
    335335{
    336     removeFromUpdateScrollInfoAfterLayoutTransaction();
    337 
     336    // Blocks can be added to gRareDataMap during willBeDestroyed(), so this code can't move there.
    338337    if (gRareDataMap)
    339338        gRareDataMap->remove(this);
    340     removeBlockFromPercentageDescendantAndContainerMaps(this);
    341     positionedDescendantsMap().removeContainingBlock(*this);
    342 }
    343 
     339
     340    // Do not add any more code here. Add it to willBeDestroyed() instead.
     341}
     342
     343// Note that this is not called for RenderBlockFlows.
    344344void RenderBlock::willBeDestroyed()
    345345{
     
    349349    }
    350350
     351    blockWillBeDestroyed();
     352
    351353    RenderBox::willBeDestroyed();
     354}
     355
     356void RenderBlock::blockWillBeDestroyed()
     357{
     358    removeFromUpdateScrollInfoAfterLayoutTransaction();
     359
     360    removeBlockFromPercentageDescendantAndContainerMaps(this);
     361    positionedDescendantsMap().removeContainingBlock(*this);
    352362}
    353363
     
    10681078}
    10691079
    1070 static RenderBlockRareData* getBlockRareData(const RenderBlock* block)
    1071 {
    1072     return gRareDataMap ? gRareDataMap->get(block) : nullptr;
    1073 }
    1074 
    1075 static RenderBlockRareData& ensureBlockRareData(const RenderBlock* block)
     1080static RenderBlockRareData* getBlockRareData(const RenderBlock& block)
     1081{
     1082    return gRareDataMap ? gRareDataMap->get(&block) : nullptr;
     1083}
     1084
     1085static RenderBlockRareData& ensureBlockRareData(const RenderBlock& block)
    10761086{
    10771087    if (!gRareDataMap)
    10781088        gRareDataMap = new RenderBlockRareDataMap;
    10791089   
    1080     auto& rareData = gRareDataMap->add(block, nullptr).iterator->value;
     1090    auto& rareData = gRareDataMap->add(&block, nullptr).iterator->value;
    10811091    if (!rareData)
    10821092        rareData = std::make_unique<RenderBlockRareData>();
     
    33653375RenderFlowThread* RenderBlock::cachedFlowThreadContainingBlock() const
    33663376{
    3367     RenderBlockRareData* rareData = getBlockRareData(this);
     3377    RenderBlockRareData* rareData = getBlockRareData(*this);
    33683378
    33693379    if (!rareData || !rareData->m_flowThreadContainingBlock)
     
    33753385bool RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate() const
    33763386{
    3377     RenderBlockRareData* rareData = getBlockRareData(this);
     3387    RenderBlockRareData* rareData = getBlockRareData(*this);
    33783388
    33793389    if (!rareData || !rareData->m_flowThreadContainingBlock)
     
    33853395void RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate()
    33863396{
    3387     RenderBlockRareData& rareData = ensureBlockRareData(this);
     3397    RenderBlockRareData& rareData = ensureBlockRareData(*this);
    33883398    rareData.m_flowThreadContainingBlock = std::nullopt;
    33893399}
     
    33913401RenderFlowThread* RenderBlock::updateCachedFlowThreadContainingBlock(RenderFlowThread* flowThread) const
    33923402{
    3393     RenderBlockRareData& rareData = ensureBlockRareData(this);
     3403    RenderBlockRareData& rareData = ensureBlockRareData(*this);
    33943404    rareData.m_flowThreadContainingBlock = flowThread;
    33953405
     
    33993409RenderFlowThread* RenderBlock::locateFlowThreadContainingBlock() const
    34003410{
    3401     RenderBlockRareData* rareData = getBlockRareData(this);
     3411    RenderBlockRareData* rareData = getBlockRareData(*this);
    34023412    if (!rareData || !rareData->m_flowThreadContainingBlock)
    34033413        return updateCachedFlowThreadContainingBlock(RenderBox::locateFlowThreadContainingBlock());
     
    34313441LayoutUnit RenderBlock::paginationStrut() const
    34323442{
    3433     RenderBlockRareData* rareData = getBlockRareData(this);
     3443    RenderBlockRareData* rareData = getBlockRareData(*this);
    34343444    return rareData ? rareData->m_paginationStrut : LayoutUnit();
    34353445}
     
    34373447LayoutUnit RenderBlock::pageLogicalOffset() const
    34383448{
    3439     RenderBlockRareData* rareData = getBlockRareData(this);
     3449    RenderBlockRareData* rareData = getBlockRareData(*this);
    34403450    return rareData ? rareData->m_pageLogicalOffset : LayoutUnit();
    34413451}
     
    34433453void RenderBlock::setPaginationStrut(LayoutUnit strut)
    34443454{
    3445     RenderBlockRareData* rareData = getBlockRareData(this);
     3455    RenderBlockRareData* rareData = getBlockRareData(*this);
    34463456    if (!rareData) {
    34473457        if (!strut)
    34483458            return;
    3449         rareData = &ensureBlockRareData(this);
     3459        rareData = &ensureBlockRareData(*this);
    34503460    }
    34513461    rareData->m_paginationStrut = strut;
     
    34543464void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
    34553465{
    3456     RenderBlockRareData* rareData = getBlockRareData(this);
     3466    RenderBlockRareData* rareData = getBlockRareData(*this);
    34573467    if (!rareData) {
    34583468        if (!logicalOffset)
    34593469            return;
    3460         rareData = &ensureBlockRareData(this);
     3470        rareData = &ensureBlockRareData(*this);
    34613471    }
    34623472    rareData->m_pageLogicalOffset = logicalOffset;
     
    40844094LayoutUnit RenderBlock::intrinsicBorderForFieldset() const
    40854095{
    4086     auto* rareData = getBlockRareData(this);
     4096    auto* rareData = getBlockRareData(*this);
    40874097    return rareData ? rareData->m_intrinsicBorderForFieldset : LayoutUnit();
    40884098}
     
    40904100void RenderBlock::setIntrinsicBorderForFieldset(LayoutUnit padding)
    40914101{
    4092     auto* rareData = getBlockRareData(this);
     4102    auto* rareData = getBlockRareData(*this);
    40934103    if (!rareData) {
    40944104        if (!padding)
    40954105            return;
    4096         rareData = &ensureBlockRareData(this);
     4106        rareData = &ensureBlockRareData(*this);
    40974107    }
    40984108    rareData->m_intrinsicBorderForFieldset = padding;
  • trunk/Source/WebCore/rendering/RenderBlock.h

    r213455 r214173  
    428428    void computeChildPreferredLogicalWidths(RenderObject&, LayoutUnit& minPreferredLogicalWidth, LayoutUnit& maxPreferredLogicalWidth) const;
    429429
     430    void blockWillBeDestroyed();
     431
    430432private:
    431433    static std::unique_ptr<RenderBlock> createAnonymousBlockWithStyleAndDisplay(Document&, const RenderStyle&, EDisplay);
  • trunk/Source/WebCore/rendering/RenderBlockFlow.cpp

    r214126 r214173  
    120120RenderBlockFlow::~RenderBlockFlow()
    121121{
     122    // Do not add any code here. Add it to willBeDestroyed() instead.
    122123}
    123124
     
    176177    m_lineBoxes.deleteLineBoxes();
    177178
    178     removeFromUpdateScrollInfoAfterLayoutTransaction();
     179    blockWillBeDestroyed();
    179180
    180181    // NOTE: This jumps down to RenderBox, bypassing RenderBlock since it would do duplicate work.
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r214126 r214173  
    146146RenderBox::~RenderBox()
    147147{
     148    // Do not add any code here. Add it to willBeDestroyed() instead.
     149}
     150
     151void RenderBox::willBeDestroyed()
     152{
    148153    if (frame().eventHandler().autoscrollRenderer() == this)
    149154        frame().eventHandler().stopAutoscrollTimer(true);
     
    159164    view().unscheduleLazyRepaint(*this);
    160165    removeControlStatesForRenderer(*this);
     166   
     167    RenderBoxModelObject::willBeDestroyed();
    161168}
    162169
  • trunk/Source/WebCore/rendering/RenderBox.h

    r214010 r214173  
    635635
    636636    void willBeRemovedFromTree() override;
     637    void willBeDestroyed() override;
    637638
    638639    bool createsNewFormattingContext() const;
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r214082 r214173  
    178178RenderBoxModelObject::~RenderBoxModelObject()
    179179{
     180    // Do not add any code here. Add it to willBeDestroyed() instead.
    180181}
    181182
  • trunk/Source/WebCore/rendering/RenderCounter.cpp

    r208744 r214173  
    352352RenderCounter::~RenderCounter()
    353353{
     354    // Do not add any code here. Add it to willBeDestroyed() instead.
     355}
     356
     357void RenderCounter::willBeDestroyed()
     358{
    354359    view().removeRenderCounter();
    355360
     
    358363        ASSERT(!m_counterNode);
    359364    }
     365   
     366    RenderText::willBeDestroyed();
    360367}
    361368
  • trunk/Source/WebCore/rendering/RenderCounter.h

    r209292 r214173  
    4343
    4444private:
     45    void willBeDestroyed() override;
     46   
    4547    const char* renderName() const override;
    4648    bool isCounter() const override;
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r214082 r214173  
    133133RenderElement::~RenderElement()
    134134{
    135     if (hasInitializedStyle()) {
    136         for (auto* bgLayer = &m_style.backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) {
    137             if (auto* backgroundImage = bgLayer->image())
    138                 backgroundImage->removeClient(this);
    139         }
    140         for (auto* maskLayer = &m_style.maskLayers(); maskLayer; maskLayer = maskLayer->next()) {
    141             if (auto* maskImage = maskLayer->image())
    142                 maskImage->removeClient(this);
    143         }
    144         if (auto* borderImage = m_style.borderImage().image())
    145             borderImage->removeClient(this);
    146         if (auto* maskBoxImage = m_style.maskBoxImage().image())
    147             maskBoxImage->removeClient(this);
    148         if (auto shapeValue = m_style.shapeOutside()) {
    149             if (auto shapeImage = shapeValue->image())
    150                 shapeImage->removeClient(this);
    151         }
    152     }
    153     if (m_hasPausedImageAnimations)
    154         view().removeRendererWithPausedImageAnimations(*this);
    155     if (isRegisteredForVisibleInViewportCallback())
    156         view().unregisterForVisibleInViewportCallback(*this);
     135    // Do not add any code here. Add it to willBeDestroyed() instead.
    157136}
    158137
     
    11461125
    11471126    clearLayoutRootIfNeeded();
     1127
     1128    if (hasInitializedStyle()) {
     1129        for (auto* bgLayer = &m_style.backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) {
     1130            if (auto* backgroundImage = bgLayer->image())
     1131                backgroundImage->removeClient(this);
     1132        }
     1133        for (auto* maskLayer = &m_style.maskLayers(); maskLayer; maskLayer = maskLayer->next()) {
     1134            if (auto* maskImage = maskLayer->image())
     1135                maskImage->removeClient(this);
     1136        }
     1137        if (auto* borderImage = m_style.borderImage().image())
     1138            borderImage->removeClient(this);
     1139        if (auto* maskBoxImage = m_style.maskBoxImage().image())
     1140            maskBoxImage->removeClient(this);
     1141        if (auto shapeValue = m_style.shapeOutside()) {
     1142            if (auto shapeImage = shapeValue->image())
     1143                shapeImage->removeClient(this);
     1144        }
     1145    }
     1146    if (m_hasPausedImageAnimations)
     1147        view().removeRendererWithPausedImageAnimations(*this);
     1148
     1149    if (isRegisteredForVisibleInViewportCallback())
     1150        view().unregisterForVisibleInViewportCallback(*this);
    11481151}
    11491152
  • trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp

    r213464 r214173  
    108108RenderEmbeddedObject::~RenderEmbeddedObject()
    109109{
     110    // Do not add any code here. Add it to willBeDestroyed() instead.
     111}
     112
     113void RenderEmbeddedObject::willBeDestroyed()
     114{
    110115    view().frameView().removeEmbeddedObjectToUpdate(*this);
     116    RenderWidget::willBeDestroyed();
    111117}
    112118
  • trunk/Source/WebCore/rendering/RenderEmbeddedObject.h

    r208668 r214173  
    6767protected:
    6868    void layout() override;
     69    void willBeDestroyed() override;
    6970
    7071private:
  • trunk/Source/WebCore/rendering/RenderImage.cpp

    r214082 r214173  
    144144RenderImage::~RenderImage()
    145145{
     146    // Do not add any code here. Add it to willBeDestroyed() instead.
     147}
     148
     149void RenderImage::willBeDestroyed()
     150{
    146151    imageResource().shutdown();
     152    RenderReplaced::willBeDestroyed();
    147153}
    148154
  • trunk/Source/WebCore/rendering/RenderImage.h

    r213466 r214173  
    7777
    7878protected:
     79    void willBeDestroyed() override;
     80
    7981    bool needsPreferredWidthsRecalculation() const final;
    8082    RenderBox* embeddedContentBox() const final;
  • trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp

    r210768 r214173  
    5151RenderLayerModelObject::~RenderLayerModelObject()
    5252{
     53    // Do not add any code here. Add it to willBeDestroyed() instead.
     54}
     55
     56void RenderLayerModelObject::willBeDestroyed()
     57{
    5358    if (isPositioned()) {
    5459        if (style().hasViewportConstrainedPosition())
    5560            view().frameView().removeViewportConstrainedObject(this);
    5661    }
     62
     63    RenderElement::willBeDestroyed();
    5764
    5865    // Our layer should have been destroyed and cleared by now
  • trunk/Source/WebCore/rendering/RenderLayerModelObject.h

    r208668 r214173  
    5858
    5959    void createLayer();
     60    void willBeDestroyed() override;
    6061
    6162private:
  • trunk/Source/WebCore/rendering/RenderListBox.cpp

    r213149 r214173  
    9797RenderListBox::~RenderListBox()
    9898{
     99    // Do not add any code here. Add it to willBeDestroyed() instead.
     100}
     101
     102void RenderListBox::willBeDestroyed()
     103{
    99104    setHasVerticalScrollbar(false);
    100105    view().frameView().removeScrollableArea(this);
     106    RenderBlockFlow::willBeDestroyed();
    101107}
    102108
  • trunk/Source/WebCore/rendering/RenderListBox.h

    r209903 r214173  
    6868
    6969private:
     70    void willBeDestroyed() override;
     71
    7072    void element() const = delete;
    7173
  • trunk/Source/WebCore/rendering/RenderListItem.cpp

    r210239 r214173  
    6161RenderListItem::~RenderListItem()
    6262{
    63     ASSERT(!m_marker || !m_marker->parent());
     63    // Do not add any code here. Add it to willBeDestroyed() instead.
     64}
     65
     66void RenderListItem::willBeDestroyed()
     67{
    6468    if (m_marker) {
    6569        m_marker->destroy();
    6670        ASSERT(!m_marker);
    6771    }
     72    RenderBlockFlow::willBeDestroyed();
    6873}
    6974
  • trunk/Source/WebCore/rendering/RenderListItem.h

    r210001 r214173  
    6161    bool inLayout() const { return m_inLayout; }
    6262#endif
     63
    6364private:
     65    void willBeDestroyed() override;
     66
    6467    const char* renderName() const override { return "RenderListItem"; }
    6568
  • trunk/Source/WebCore/rendering/RenderListMarker.cpp

    r210239 r214173  
    11291129RenderListMarker::~RenderListMarker()
    11301130{
     1131    // Do not add any code here. Add it to willBeDestroyed() instead.
     1132}
     1133
     1134void RenderListMarker::willBeDestroyed()
     1135{
    11311136    m_listItem.didDestroyListMarker();
    11321137    if (m_image)
    11331138        m_image->removeClient(this);
     1139
     1140    RenderBox::willBeDestroyed();
    11341141}
    11351142
  • trunk/Source/WebCore/rendering/RenderListMarker.h

    r210239 r214173  
    5252
    5353private:
     54    void willBeDestroyed() override;
     55
    5456    void element() const = delete;
    5557
  • trunk/Source/WebCore/rendering/RenderMenuList.cpp

    r211033 r214173  
    8585RenderMenuList::~RenderMenuList()
    8686{
     87    // Do not add any code here. Add it to willBeDestroyed() instead.
     88}
     89
     90void RenderMenuList::willBeDestroyed()
     91{
    8792#if !PLATFORM(IOS)
    8893    if (m_popup)
     
    9095    m_popup = nullptr;
    9196#endif
     97
     98    RenderFlexibleBox::willBeDestroyed();
    9299}
    93100
  • trunk/Source/WebCore/rendering/RenderMenuList.h

    r209986 r214173  
    6161
    6262private:
     63    void willBeDestroyed() override;
     64
    6365    void element() const = delete;
    6466
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp

    r208658 r214173  
    5757RenderNamedFlowThread::~RenderNamedFlowThread()
    5858{
     59    // Do not add any code here. Add it to willBeDestroyed() instead.
     60}
     61
     62void RenderNamedFlowThread::willBeDestroyed()
     63{
     64    WTFLogAlways("RenderNamedFlowThread %p willBeDestroyed", this);
     65
    5966    // The flow thread can be destroyed without unregistering the content nodes if the document is destroyed.
    6067    // This can lead to problems because the nodes are still marked as belonging to a flow thread.
     
    6370    // Also leave the NamedFlow object in a consistent state by calling mark for destruction.
    6471    setMarkForDestruction();
     72
     73    RenderFlowThread::willBeDestroyed();
    6574}
    6675
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.h

    r208668 r214173  
    9797
    9898private:
     99    void willBeDestroyed() override;
    99100    const char* renderName() const override;
    100101    bool isRenderNamedFlowThread() const override { return true; }
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r214119 r214173  
    14821482
    14831483    // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily
    1484     // be moved into RenderBoxModelObject::destroy.
     1484    // be moved into RenderLayerModelObject::willBeDestroyed().
     1485    // FIXME: Is this still true?
    14851486    if (hasLayer()) {
    14861487        setHasLayer(false);
  • trunk/Source/WebCore/rendering/RenderQuote.cpp

    r214082 r214173  
    4141RenderQuote::~RenderQuote()
    4242{
     43    // Do not add any code here. Add it to willBeDestroyed() instead.
     44}
     45
     46void RenderQuote::willBeDestroyed()
     47{
    4348    detachQuote();
    4449
     
    4651    ASSERT(!m_next);
    4752    ASSERT(!m_previous);
     53
     54    RenderInline::willBeDestroyed();
    4855}
    4956
  • trunk/Source/WebCore/rendering/RenderQuote.h

    r208668 r214173  
    3535
    3636private:
     37    void willBeDestroyed() override;
    3738    void detachQuote();
    3839
  • trunk/Source/WebCore/rendering/RenderSearchField.cpp

    r211033 r214173  
    5959RenderSearchField::~RenderSearchField()
    6060{
     61    // Do not add any code here. Add it to willBeDestroyed() instead.
     62}
     63
     64void RenderSearchField::willBeDestroyed()
     65{
    6166    if (m_searchPopup) {
    6267        m_searchPopup->popupMenu()->disconnectClient();
    6368        m_searchPopup = nullptr;
    6469    }
     70
     71    RenderTextControlSingleLine::willBeDestroyed();
    6572}
    6673
  • trunk/Source/WebCore/rendering/RenderSearchField.h

    r208668 r214173  
    4646
    4747private:
     48    void willBeDestroyed() override;
    4849    void centerContainerIfNeeded(RenderBox*) const override;
    4950    LayoutUnit computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const override;
  • trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp

    r210828 r214173  
    5858RenderSnapshottedPlugIn::~RenderSnapshottedPlugIn()
    5959{
     60    // Do not add any code here. Add it to willBeDestroyed() instead.
     61}
     62
     63void RenderSnapshottedPlugIn::willBeDestroyed()
     64{
    6065    ASSERT(m_snapshotResource);
    6166    m_snapshotResource->shutdown();
     67
     68    RenderEmbeddedObject::willBeDestroyed();
    6269}
    6370
  • trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.h

    r210319 r214173  
    4343
    4444private:
     45    void willBeDestroyed() override;
    4546    void frameOwnerElement() const = delete;
    4647    const char* renderName() const final { return "RenderSnapshottedPlugIn"; }
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r214082 r214173  
    209209RenderText::~RenderText()
    210210{
    211     if (m_originalTextDiffersFromRendered)
    212         originalTextMap().remove(this);
     211    // Do not add any code here. Add it to willBeDestroyed() instead.
     212    ASSERT(!originalTextMap().contains(this));
    213213}
    214214
     
    287287
    288288    removeAndDestroyTextBoxes();
     289
     290    if (m_originalTextDiffersFromRendered)
     291        originalTextMap().remove(this);
     292
    289293    RenderObject::willBeDestroyed();
    290294}
  • trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp

    r213455 r214173  
    4040RenderTextControlMultiLine::~RenderTextControlMultiLine()
    4141{
     42    // Do not add any code here. Add it to willBeDestroyed() instead.
     43}
     44
     45void RenderTextControlMultiLine::willBeDestroyed()
     46{
    4247    if (textAreaElement().isConnected())
    4348        textAreaElement().rendererWillBeDestroyed();
     49
     50    RenderTextControl::willBeDestroyed();
    4451}
    4552
  • trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h

    r213455 r214173  
    3535
    3636private:
     37    void willBeDestroyed() override;
    3738    void element() const = delete;
    3839
  • trunk/Source/WebCore/rendering/RenderVideo.cpp

    r214082 r214173  
    5757RenderVideo::~RenderVideo()
    5858{
     59    // Do not add any code here. Add it to willBeDestroyed() instead.
     60}
     61
     62void RenderVideo::willBeDestroyed()
     63{
    5964    if (MediaPlayer* player = videoElement().player())
    6065        player->setVisible(false);
     66
     67    RenderMedia::willBeDestroyed();
    6168}
    6269
  • trunk/Source/WebCore/rendering/RenderVideo.h

    r214010 r214173  
    5454
    5555private:
     56    void willBeDestroyed() override;
    5657    void mediaElement() const = delete;
    5758
  • trunk/Source/WebCore/rendering/RenderWidget.h

    r210758 r214173  
    8080    RenderWidget(HTMLFrameOwnerElement&, RenderStyle&&);
    8181
     82    void willBeDestroyed() override;
    8283    void styleDidChange(StyleDifference, const RenderStyle* oldStyle) final;
    8384    void layout() override;
     
    9596    RenderBox* embeddedContentBox() const final;
    9697
    97     void willBeDestroyed() final;
    9898    void setSelectionState(SelectionState) final;
    9999    void setOverlapTestResult(bool) final;
  • trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp

    r208985 r214173  
    5454RenderSVGImage::~RenderSVGImage()
    5555{
     56}
     57
     58void RenderSVGImage::willBeDestroyed()
     59{
    5660    imageResource().shutdown();
     61    RenderSVGModelObject::willBeDestroyed();
    5762}
    5863
  • trunk/Source/WebCore/rendering/svg/RenderSVGImage.h

    r208668 r214173  
    5252
    5353private:
     54    void willBeDestroyed() override;
     55
    5456    void element() const = delete;
    5557
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp

    r214082 r214173  
    4545RenderSVGResourceContainer::~RenderSVGResourceContainer()
    4646{
    47     if (m_registered)
    48         svgExtensionsFromElement(element()).removeResource(m_id);
    4947}
    5048
     
    6260{
    6361    SVGResourcesCache::resourceDestroyed(*this);
     62
     63    if (m_registered) {
     64        svgExtensionsFromElement(element()).removeResource(m_id);
     65        m_registered = false;
     66    }
     67
    6468    RenderSVGHiddenContainer::willBeDestroyed();
    6569}
Note: See TracChangeset for help on using the changeset viewer.