Title: [214770] releases/WebKitGTK/webkit-2.16/Source/WebCore
Revision
214770
Author
carlo...@webkit.org
Date
2017-04-03 04:25:05 -0700 (Mon, 03 Apr 2017)

Log Message

Merge r214173 - 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):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog	2017-04-03 11:25:05 UTC (rev 214770)
@@ -1,3 +1,116 @@
+2017-03-20  Simon Fraser  <simon.fra...@apple.com>
+
+        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):
+
 2017-03-20  Emanuele Aina  <emanuele.a...@collabora.com>
 
         [Cairo] Ensure depth and stencil renderbuffers are created on GLESv2

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlock.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlock.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlock.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -258,7 +258,7 @@
 };
 
 typedef HashMap<const RenderBlock*, std::unique_ptr<RenderBlockRareData>> RenderBlockRareDataMap;
-static RenderBlockRareDataMap* gRareDataMap = 0;
+static RenderBlockRareDataMap* gRareDataMap;
 
 // This class helps dispatching the 'overflow' event on layout change. overflow can be set on RenderBoxes, yet the existing code
 // only works on RenderBlocks. If this change, this class should be shared with other RenderBoxes.
@@ -335,14 +335,14 @@
 
 RenderBlock::~RenderBlock()
 {
-    removeFromUpdateScrollInfoAfterLayoutTransaction();
-
+    // Blocks can be added to gRareDataMap during willBeDestroyed(), so this code can't move there.
     if (gRareDataMap)
         gRareDataMap->remove(this);
-    removeBlockFromPercentageDescendantAndContainerMaps(this);
-    positionedDescendantsMap().removeContainingBlock(*this);
+
+    // Do not add any more code here. Add it to willBeDestroyed() instead.
 }
 
+// Note that this is not called for RenderBlockFlows.
 void RenderBlock::willBeDestroyed()
 {
     if (!renderTreeBeingDestroyed()) {
@@ -350,9 +350,19 @@
             parent()->dirtyLinesFromChangedChild(*this);
     }
 
+    blockWillBeDestroyed();
+
     RenderBox::willBeDestroyed();
 }
 
+void RenderBlock::blockWillBeDestroyed()
+{
+    removeFromUpdateScrollInfoAfterLayoutTransaction();
+
+    removeBlockFromPercentageDescendantAndContainerMaps(this);
+    positionedDescendantsMap().removeContainingBlock(*this);
+}
+
 bool RenderBlock::hasRareData() const
 {
     return gRareDataMap ? gRareDataMap->contains(this) : false;
@@ -1069,17 +1079,17 @@
     invalidateBackgroundObscurationStatus();
 }
 
-static RenderBlockRareData* getBlockRareData(const RenderBlock* block)
+static RenderBlockRareData* getBlockRareData(const RenderBlock& block)
 {
-    return gRareDataMap ? gRareDataMap->get(block) : nullptr;
+    return gRareDataMap ? gRareDataMap->get(&block) : nullptr;
 }
 
-static RenderBlockRareData& ensureBlockRareData(const RenderBlock* block)
+static RenderBlockRareData& ensureBlockRareData(const RenderBlock& block)
 {
     if (!gRareDataMap)
         gRareDataMap = new RenderBlockRareDataMap;
     
-    auto& rareData = gRareDataMap->add(block, nullptr).iterator->value;
+    auto& rareData = gRareDataMap->add(&block, nullptr).iterator->value;
     if (!rareData)
         rareData = std::make_unique<RenderBlockRareData>();
     return *rareData.get();
@@ -3296,7 +3306,7 @@
 
 RenderFlowThread* RenderBlock::cachedFlowThreadContainingBlock() const
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
 
     if (!rareData || !rareData->m_flowThreadContainingBlock)
         return nullptr;
@@ -3306,7 +3316,7 @@
 
 bool RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate() const
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
 
     if (!rareData || !rareData->m_flowThreadContainingBlock)
         return true;
@@ -3316,13 +3326,13 @@
 
 void RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate()
 {
-    RenderBlockRareData& rareData = ensureBlockRareData(this);
+    RenderBlockRareData& rareData = ensureBlockRareData(*this);
     rareData.m_flowThreadContainingBlock = std::nullopt;
 }
 
 RenderFlowThread* RenderBlock::updateCachedFlowThreadContainingBlock(RenderFlowThread* flowThread) const
 {
-    RenderBlockRareData& rareData = ensureBlockRareData(this);
+    RenderBlockRareData& rareData = ensureBlockRareData(*this);
     rareData.m_flowThreadContainingBlock = flowThread;
 
     return flowThread;
@@ -3330,7 +3340,7 @@
 
 RenderFlowThread* RenderBlock::locateFlowThreadContainingBlock() const
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
     if (!rareData || !rareData->m_flowThreadContainingBlock)
         return updateCachedFlowThreadContainingBlock(RenderBox::locateFlowThreadContainingBlock());
 
@@ -3362,23 +3372,23 @@
 
 LayoutUnit RenderBlock::paginationStrut() const
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
     return rareData ? rareData->m_paginationStrut : LayoutUnit();
 }
 
 LayoutUnit RenderBlock::pageLogicalOffset() const
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
     return rareData ? rareData->m_pageLogicalOffset : LayoutUnit();
 }
 
 void RenderBlock::setPaginationStrut(LayoutUnit strut)
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
     if (!rareData) {
         if (!strut)
             return;
-        rareData = &ensureBlockRareData(this);
+        rareData = &ensureBlockRareData(*this);
     }
     rareData->m_paginationStrut = strut;
 }
@@ -3385,11 +3395,11 @@
 
 void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
 {
-    RenderBlockRareData* rareData = getBlockRareData(this);
+    RenderBlockRareData* rareData = getBlockRareData(*this);
     if (!rareData) {
         if (!logicalOffset)
             return;
-        rareData = &ensureBlockRareData(this);
+        rareData = &ensureBlockRareData(*this);
     }
     rareData->m_pageLogicalOffset = logicalOffset;
 }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlock.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlock.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlock.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -395,6 +395,8 @@
 
     void preparePaginationBeforeBlockLayout(bool&);
 
+    void blockWillBeDestroyed();
+
 private:
     static std::unique_ptr<RenderBlock> createAnonymousBlockWithStyleAndDisplay(Document&, const RenderStyle&, EDisplay);
 

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlockFlow.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlockFlow.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBlockFlow.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -119,6 +119,7 @@
 
 RenderBlockFlow::~RenderBlockFlow()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
 }
 
 void RenderBlockFlow::createMultiColumnFlowThread()
@@ -175,7 +176,7 @@
 
     m_lineBoxes.deleteLineBoxes();
 
-    removeFromUpdateScrollInfoAfterLayoutTransaction();
+    blockWillBeDestroyed();
 
     // NOTE: This jumps down to RenderBox, bypassing RenderBlock since it would do duplicate work.
     RenderBox::willBeDestroyed();

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBox.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBox.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBox.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -144,6 +144,11 @@
 
 RenderBox::~RenderBox()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderBox::willBeDestroyed()
+{
     if (frame().eventHandler().autoscrollRenderer() == this)
         frame().eventHandler().stopAutoscrollTimer(true);
 
@@ -157,6 +162,8 @@
 
     view().unscheduleLazyRepaint(*this);
     removeControlStatesForRenderer(*this);
+    
+    RenderBoxModelObject::willBeDestroyed();
 }
 
 RenderRegion* RenderBox::clampToStartAndEndRegions(RenderRegion* region) const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBox.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBox.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBox.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -615,6 +615,7 @@
     void updateFromStyle() override;
 
     void willBeRemovedFromTree() override;
+    void willBeDestroyed() override;
 
     bool createsNewFormattingContext() const;
 

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBoxModelObject.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBoxModelObject.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderBoxModelObject.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -176,6 +176,7 @@
 
 RenderBoxModelObject::~RenderBoxModelObject()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
 }
 
 void RenderBoxModelObject::willBeDestroyed()

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderCounter.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderCounter.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderCounter.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -351,6 +351,11 @@
 
 RenderCounter::~RenderCounter()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderCounter::willBeDestroyed()
+{
     view().removeRenderCounter();
 
     if (m_counterNode) {
@@ -357,6 +362,8 @@
         m_counterNode->removeRenderer(*this);
         ASSERT(!m_counterNode);
     }
+    
+    RenderText::willBeDestroyed();
 }
 
 const char* RenderCounter::renderName() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderCounter.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderCounter.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderCounter.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -42,6 +42,8 @@
     void updateCounter();
 
 private:
+    void willBeDestroyed() override;
+    
     const char* renderName() const override;
     bool isCounter() const override;
     String originalText() const override;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderElement.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderElement.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderElement.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -132,28 +132,7 @@
 
 RenderElement::~RenderElement()
 {
-    if (hasInitializedStyle()) {
-        for (auto* bgLayer = &m_style.backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) {
-            if (auto* backgroundImage = bgLayer->image())
-                backgroundImage->removeClient(this);
-        }
-        for (auto* maskLayer = &m_style.maskLayers(); maskLayer; maskLayer = maskLayer->next()) {
-            if (auto* maskImage = maskLayer->image())
-                maskImage->removeClient(this);
-        }
-        if (auto* borderImage = m_style.borderImage().image())
-            borderImage->removeClient(this);
-        if (auto* maskBoxImage = m_style.maskBoxImage().image())
-            maskBoxImage->removeClient(this);
-        if (auto shapeValue = m_style.shapeOutside()) {
-            if (auto shapeImage = shapeValue->image())
-                shapeImage->removeClient(this);
-        }
-    }
-    if (m_hasPausedImageAnimations)
-        view().removeRendererWithPausedImageAnimations(*this);
-    if (isRegisteredForVisibleInViewportCallback())
-        view().unregisterForVisibleInViewportCallback(*this);
+    // Do not add any code here. Add it to willBeDestroyed() instead.
 }
 
 RenderPtr<RenderElement> RenderElement::createFor(Element& element, RenderStyle&& style)
@@ -1129,6 +1108,30 @@
 #endif
 
     clearLayoutRootIfNeeded();
+
+    if (hasInitializedStyle()) {
+        for (auto* bgLayer = &m_style.backgroundLayers(); bgLayer; bgLayer = bgLayer->next()) {
+            if (auto* backgroundImage = bgLayer->image())
+                backgroundImage->removeClient(this);
+        }
+        for (auto* maskLayer = &m_style.maskLayers(); maskLayer; maskLayer = maskLayer->next()) {
+            if (auto* maskImage = maskLayer->image())
+                maskImage->removeClient(this);
+        }
+        if (auto* borderImage = m_style.borderImage().image())
+            borderImage->removeClient(this);
+        if (auto* maskBoxImage = m_style.maskBoxImage().image())
+            maskBoxImage->removeClient(this);
+        if (auto shapeValue = m_style.shapeOutside()) {
+            if (auto shapeImage = shapeValue->image())
+                shapeImage->removeClient(this);
+        }
+    }
+    if (m_hasPausedImageAnimations)
+        view().removeRendererWithPausedImageAnimations(*this);
+
+    if (isRegisteredForVisibleInViewportCallback())
+        view().unregisterForVisibleInViewportCallback(*this);
 }
 
 void RenderElement::setNeedsPositionedMovementLayout(const RenderStyle* oldStyle)

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderEmbeddedObject.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderEmbeddedObject.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderEmbeddedObject.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -107,7 +107,13 @@
 
 RenderEmbeddedObject::~RenderEmbeddedObject()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderEmbeddedObject::willBeDestroyed()
+{
     view().frameView().removeEmbeddedObjectToUpdate(*this);
+    RenderWidget::willBeDestroyed();
 }
 
 RenderPtr<RenderEmbeddedObject> RenderEmbeddedObject::createForApplet(HTMLAppletElement& applet, RenderStyle&& style)

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderEmbeddedObject.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderEmbeddedObject.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderEmbeddedObject.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -66,6 +66,7 @@
 
 protected:
     void layout() override;
+    void willBeDestroyed() override;
 
 private:
     const char* renderName() const override { return "RenderEmbeddedObject"; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderImage.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderImage.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderImage.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -143,7 +143,13 @@
 
 RenderImage::~RenderImage()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderImage::willBeDestroyed()
+{
     imageResource().shutdown();
+    RenderReplaced::willBeDestroyed();
 }
 
 // If we'll be displaying either alt text or an image, add some padding.

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderImage.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderImage.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderImage.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -71,6 +71,8 @@
     void setHasShadowControls(bool hasShadowControls) { m_hasShadowControls = hasShadowControls; }
 
 protected:
+    void willBeDestroyed() override;
+
     bool needsPreferredWidthsRecalculation() const final;
     RenderBox* embeddedContentBox() const final;
     void computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const final;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderLayerModelObject.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderLayerModelObject.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderLayerModelObject.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -50,11 +50,18 @@
 
 RenderLayerModelObject::~RenderLayerModelObject()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderLayerModelObject::willBeDestroyed()
+{
     if (isPositioned()) {
         if (style().hasViewportConstrainedPosition())
             view().frameView().removeViewportConstrainedObject(this);
     }
 
+    RenderElement::willBeDestroyed();
+
     // Our layer should have been destroyed and cleared by now
     ASSERT(!hasLayer());
     ASSERT(!m_layer);

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderLayerModelObject.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderLayerModelObject.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderLayerModelObject.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -57,6 +57,7 @@
     RenderLayerModelObject(Document&, RenderStyle&&, BaseTypeFlags);
 
     void createLayer();
+    void willBeDestroyed() override;
 
 private:
     std::unique_ptr<RenderLayer> m_layer;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListBox.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListBox.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListBox.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -96,8 +96,14 @@
 
 RenderListBox::~RenderListBox()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderListBox::willBeDestroyed()
+{
     setHasVerticalScrollbar(false);
     view().frameView().removeScrollableArea(this);
+    RenderBlockFlow::willBeDestroyed();
 }
 
 HTMLSelectElement& RenderListBox::selectElement() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListBox.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListBox.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListBox.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -67,6 +67,8 @@
     bool scrolledToRight() const override;
 
 private:
+    void willBeDestroyed() override;
+
     void element() const = delete;
 
     const char* renderName() const override { return "RenderListBox"; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListItem.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListItem.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListItem.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -60,11 +60,16 @@
 
 RenderListItem::~RenderListItem()
 {
-    ASSERT(!m_marker || !m_marker->parent());
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderListItem::willBeDestroyed()
+{
     if (m_marker) {
         m_marker->destroy();
         ASSERT(!m_marker);
     }
+    RenderBlockFlow::willBeDestroyed();
 }
 
 void RenderListItem::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListItem.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListItem.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListItem.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -60,7 +60,10 @@
 #if !ASSERT_DISABLED
     bool inLayout() const { return m_inLayout; }
 #endif
+
 private:
+    void willBeDestroyed() override;
+
     const char* renderName() const override { return "RenderListItem"; }
 
     bool isListItem() const override { return true; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListMarker.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListMarker.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListMarker.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -1128,9 +1128,16 @@
 
 RenderListMarker::~RenderListMarker()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderListMarker::willBeDestroyed()
+{
     m_listItem.didDestroyListMarker();
     if (m_image)
         m_image->removeClient(this);
+
+    RenderBox::willBeDestroyed();
 }
 
 void RenderListMarker::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListMarker.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListMarker.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderListMarker.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -51,6 +51,8 @@
 #endif
 
 private:
+    void willBeDestroyed() override;
+
     void element() const = delete;
 
     const char* renderName() const override { return "RenderListMarker"; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderMenuList.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderMenuList.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderMenuList.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -84,11 +84,18 @@
 
 RenderMenuList::~RenderMenuList()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderMenuList::willBeDestroyed()
+{
 #if !PLATFORM(IOS)
     if (m_popup)
         m_popup->disconnectClient();
     m_popup = nullptr;
 #endif
+
+    RenderFlexibleBox::willBeDestroyed();
 }
 
 void RenderMenuList::createInnerBlock()

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderMenuList.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderMenuList.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderMenuList.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -60,6 +60,8 @@
     String text() const;
 
 private:
+    void willBeDestroyed() override;
+
     void element() const = delete;
 
     bool isMenuList() const override { return true; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderNamedFlowThread.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderNamedFlowThread.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderNamedFlowThread.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -56,6 +56,13 @@
 
 RenderNamedFlowThread::~RenderNamedFlowThread()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderNamedFlowThread::willBeDestroyed()
+{
+    WTFLogAlways("RenderNamedFlowThread %p willBeDestroyed", this);
+
     // The flow thread can be destroyed without unregistering the content nodes if the document is destroyed.
     // This can lead to problems because the nodes are still marked as belonging to a flow thread.
     clearContentElements();
@@ -62,6 +69,8 @@
 
     // Also leave the NamedFlow object in a consistent state by calling mark for destruction.
     setMarkForDestruction();
+
+    RenderFlowThread::willBeDestroyed();
 }
 
 const char* RenderNamedFlowThread::renderName() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderNamedFlowThread.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderNamedFlowThread.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderNamedFlowThread.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -96,6 +96,7 @@
     void resetMarkForDestruction();
 
 private:
+    void willBeDestroyed() override;
     const char* renderName() const override;
     bool isRenderNamedFlowThread() const override { return true; }
     bool isChildAllowed(const RenderObject&, const RenderStyle&) const override;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderObject.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderObject.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderObject.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -1475,7 +1475,8 @@
         cache->remove(this);
 
     // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily
-    // be moved into RenderBoxModelObject::destroy.
+    // be moved into RenderLayerModelObject::willBeDestroyed().
+    // FIXME: Is this still true?
     if (hasLayer()) {
         setHasLayer(false);
         downcast<RenderLayerModelObject>(*this).destroyLayer();

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderQuote.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderQuote.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderQuote.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -40,11 +40,18 @@
 
 RenderQuote::~RenderQuote()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderQuote::willBeDestroyed()
+{
     detachQuote();
 
     ASSERT(!m_isAttached);
     ASSERT(!m_next);
     ASSERT(!m_previous);
+
+    RenderInline::willBeDestroyed();
 }
 
 void RenderQuote::insertedIntoTree()

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderQuote.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderQuote.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderQuote.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -34,6 +34,7 @@
     void attachQuote();
 
 private:
+    void willBeDestroyed() override;
     void detachQuote();
 
     const char* renderName() const override { return "RenderQuote"; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSearchField.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSearchField.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSearchField.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -58,10 +58,17 @@
 
 RenderSearchField::~RenderSearchField()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderSearchField::willBeDestroyed()
+{
     if (m_searchPopup) {
         m_searchPopup->popupMenu()->disconnectClient();
         m_searchPopup = nullptr;
     }
+
+    RenderTextControlSingleLine::willBeDestroyed();
 }
 
 inline HTMLElement* RenderSearchField::resultsButtonElement() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSearchField.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSearchField.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSearchField.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -45,6 +45,7 @@
     void hidePopup();
 
 private:
+    void willBeDestroyed() override;
     void centerContainerIfNeeded(RenderBox*) const override;
     LayoutUnit computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const override;
     LayoutUnit computeLogicalHeightLimit() const override;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -57,8 +57,15 @@
 
 RenderSnapshottedPlugIn::~RenderSnapshottedPlugIn()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderSnapshottedPlugIn::willBeDestroyed()
+{
     ASSERT(m_snapshotResource);
     m_snapshotResource->shutdown();
+
+    RenderEmbeddedObject::willBeDestroyed();
 }
 
 HTMLPlugInImageElement& RenderSnapshottedPlugIn::plugInImageElement() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSnapshottedPlugIn.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSnapshottedPlugIn.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderSnapshottedPlugIn.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -42,6 +42,7 @@
     void handleEvent(Event&);
 
 private:
+    void willBeDestroyed() override;
     void frameOwnerElement() const = delete;
     const char* renderName() const final { return "RenderSnapshottedPlugIn"; }
     CursorDirective getCursor(const LayoutPoint&, Cursor&) const final;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderText.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderText.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderText.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -208,8 +208,8 @@
 
 RenderText::~RenderText()
 {
-    if (m_originalTextDiffersFromRendered)
-        originalTextMap().remove(this);
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+    ASSERT(!originalTextMap().contains(this));
 }
 
 const char* RenderText::renderName() const
@@ -286,6 +286,10 @@
     secureTextTimers().remove(this);
 
     removeAndDestroyTextBoxes();
+
+    if (m_originalTextDiffersFromRendered)
+        originalTextMap().remove(this);
+
     RenderObject::willBeDestroyed();
 }
 

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderTextControlMultiLine.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderTextControlMultiLine.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderTextControlMultiLine.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -39,8 +39,15 @@
 
 RenderTextControlMultiLine::~RenderTextControlMultiLine()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderTextControlMultiLine::willBeDestroyed()
+{
     if (textAreaElement().isConnected())
         textAreaElement().rendererWillBeDestroyed();
+
+    RenderTextControl::willBeDestroyed();
 }
 
 HTMLTextAreaElement& RenderTextControlMultiLine::textAreaElement() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderTextControlMultiLine.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderTextControlMultiLine.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderTextControlMultiLine.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -34,6 +34,7 @@
     HTMLTextAreaElement& textAreaElement() const;
 
 private:
+    void willBeDestroyed() override;
     void element() const = delete;
 
     bool isTextArea() const override { return true; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderVideo.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderVideo.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderVideo.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -56,8 +56,15 @@
 
 RenderVideo::~RenderVideo()
 {
+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderVideo::willBeDestroyed()
+{
     if (MediaPlayer* player = videoElement().player())
         player->setVisible(false);
+
+    RenderMedia::willBeDestroyed();
 }
 
 IntSize RenderVideo::defaultSize()

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderVideo.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderVideo.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderVideo.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -53,6 +53,7 @@
     void updateFromElement() final;
 
 private:
+    void willBeDestroyed() override;
     void mediaElement() const = delete;
 
     void intrinsicSizeChanged() final;

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderWidget.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderWidget.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderWidget.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -79,6 +79,7 @@
 protected:
     RenderWidget(HTMLFrameOwnerElement&, RenderStyle&&);
 
+    void willBeDestroyed() override;
     void styleDidChange(StyleDifference, const RenderStyle* oldStyle) final;
     void layout() override;
     void paint(PaintInfo&, const LayoutPoint&) override;
@@ -94,7 +95,6 @@
     bool needsPreferredWidthsRecalculation() const final;
     RenderBox* embeddedContentBox() const final;
 
-    void willBeDestroyed() final;
     void setSelectionState(SelectionState) final;
     void setOverlapTestResult(bool) final;
 

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGImage.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGImage.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGImage.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -53,7 +53,12 @@
 
 RenderSVGImage::~RenderSVGImage()
 {
+}
+
+void RenderSVGImage::willBeDestroyed()
+{
     imageResource().shutdown();
+    RenderSVGModelObject::willBeDestroyed();
 }
 
 SVGImageElement& RenderSVGImage::imageElement() const

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGImage.h (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGImage.h	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGImage.h	2017-04-03 11:25:05 UTC (rev 214770)
@@ -51,6 +51,8 @@
     void paintForeground(PaintInfo&);
 
 private:
+    void willBeDestroyed() override;
+
     void element() const = delete;
 
     const char* renderName() const override { return "RenderSVGImage"; }

Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp (214769 => 214770)


--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp	2017-04-03 11:11:28 UTC (rev 214769)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp	2017-04-03 11:25:05 UTC (rev 214770)
@@ -44,8 +44,6 @@
 
 RenderSVGResourceContainer::~RenderSVGResourceContainer()
 {
-    if (m_registered)
-        svgExtensionsFromElement(element()).removeResource(m_id);
 }
 
 void RenderSVGResourceContainer::layout()
@@ -61,6 +59,12 @@
 void RenderSVGResourceContainer::willBeDestroyed()
 {
     SVGResourcesCache::resourceDestroyed(*this);
+
+    if (m_registered) {
+        svgExtensionsFromElement(element()).removeResource(m_id);
+        m_registered = false;
+    }
+
     RenderSVGHiddenContainer::willBeDestroyed();
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to