<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[214173] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/214173">214173</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2017-03-20 10:28:55 -0700 (Mon, 20 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>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):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockcpp">trunk/Source/WebCore/rendering/RenderBlock.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockh">trunk/Source/WebCore/rendering/RenderBlock.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockFlowcpp">trunk/Source/WebCore/rendering/RenderBlockFlow.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxcpp">trunk/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxh">trunk/Source/WebCore/rendering/RenderBox.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxModelObjectcpp">trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderCountercpp">trunk/Source/WebCore/rendering/RenderCounter.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderCounterh">trunk/Source/WebCore/rendering/RenderCounter.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderElementcpp">trunk/Source/WebCore/rendering/RenderElement.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderEmbeddedObjectcpp">trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderEmbeddedObjecth">trunk/Source/WebCore/rendering/RenderEmbeddedObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderImagecpp">trunk/Source/WebCore/rendering/RenderImage.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderImageh">trunk/Source/WebCore/rendering/RenderImage.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerModelObjectcpp">trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerModelObjecth">trunk/Source/WebCore/rendering/RenderLayerModelObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListBoxcpp">trunk/Source/WebCore/rendering/RenderListBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListBoxh">trunk/Source/WebCore/rendering/RenderListBox.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListItemcpp">trunk/Source/WebCore/rendering/RenderListItem.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListItemh">trunk/Source/WebCore/rendering/RenderListItem.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListMarkercpp">trunk/Source/WebCore/rendering/RenderListMarker.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListMarkerh">trunk/Source/WebCore/rendering/RenderListMarker.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderMenuListcpp">trunk/Source/WebCore/rendering/RenderMenuList.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderMenuListh">trunk/Source/WebCore/rendering/RenderMenuList.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadcpp">trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadh">trunk/Source/WebCore/rendering/RenderNamedFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjectcpp">trunk/Source/WebCore/rendering/RenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderQuotecpp">trunk/Source/WebCore/rendering/RenderQuote.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderQuoteh">trunk/Source/WebCore/rendering/RenderQuote.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderSearchFieldcpp">trunk/Source/WebCore/rendering/RenderSearchField.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderSearchFieldh">trunk/Source/WebCore/rendering/RenderSearchField.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderSnapshottedPlugIncpp">trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderSnapshottedPlugInh">trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTextcpp">trunk/Source/WebCore/rendering/RenderText.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTextControlMultiLinecpp">trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTextControlMultiLineh">trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderVideocpp">trunk/Source/WebCore/rendering/RenderVideo.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderVideoh">trunk/Source/WebCore/rendering/RenderVideo.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderWidgeth">trunk/Source/WebCore/rendering/RenderWidget.h</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGImagecpp">trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGImageh">trunk/Source/WebCore/rendering/svg/RenderSVGImage.h</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceContainercpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/ChangeLog        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -1,3 +1,116 @@
</span><ins>+2017-03-20  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        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):
+
</ins><span class="cx"> 2017-03-20  Jon Lee  &lt;jonlee@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Mark differences in media stream implementation
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -256,7 +256,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> typedef HashMap&lt;const RenderBlock*, std::unique_ptr&lt;RenderBlockRareData&gt;&gt; RenderBlockRareDataMap;
</span><del>-static RenderBlockRareDataMap* gRareDataMap = 0;
</del><ins>+static RenderBlockRareDataMap* gRareDataMap;
</ins><span class="cx"> 
</span><span class="cx"> // This class helps dispatching the 'overflow' event on layout change. overflow can be set on RenderBoxes, yet the existing code
</span><span class="cx"> // only works on RenderBlocks. If this change, this class should be shared with other RenderBoxes.
</span><span class="lines">@@ -333,14 +333,14 @@
</span><span class="cx"> 
</span><span class="cx"> RenderBlock::~RenderBlock()
</span><span class="cx"> {
</span><del>-    removeFromUpdateScrollInfoAfterLayoutTransaction();
-
</del><ins>+    // Blocks can be added to gRareDataMap during willBeDestroyed(), so this code can't move there.
</ins><span class="cx">     if (gRareDataMap)
</span><span class="cx">         gRareDataMap-&gt;remove(this);
</span><del>-    removeBlockFromPercentageDescendantAndContainerMaps(this);
-    positionedDescendantsMap().removeContainingBlock(*this);
</del><ins>+
+    // Do not add any more code here. Add it to willBeDestroyed() instead.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Note that this is not called for RenderBlockFlows.
</ins><span class="cx"> void RenderBlock::willBeDestroyed()
</span><span class="cx"> {
</span><span class="cx">     if (!renderTreeBeingDestroyed()) {
</span><span class="lines">@@ -348,9 +348,19 @@
</span><span class="cx">             parent()-&gt;dirtyLinesFromChangedChild(*this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    blockWillBeDestroyed();
+
</ins><span class="cx">     RenderBox::willBeDestroyed();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderBlock::blockWillBeDestroyed()
+{
+    removeFromUpdateScrollInfoAfterLayoutTransaction();
+
+    removeBlockFromPercentageDescendantAndContainerMaps(this);
+    positionedDescendantsMap().removeContainingBlock(*this);
+}
+
</ins><span class="cx"> bool RenderBlock::hasRareData() const
</span><span class="cx"> {
</span><span class="cx">     return gRareDataMap ? gRareDataMap-&gt;contains(this) : false;
</span><span class="lines">@@ -1067,17 +1077,17 @@
</span><span class="cx">     invalidateBackgroundObscurationStatus();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static RenderBlockRareData* getBlockRareData(const RenderBlock* block)
</del><ins>+static RenderBlockRareData* getBlockRareData(const RenderBlock&amp; block)
</ins><span class="cx"> {
</span><del>-    return gRareDataMap ? gRareDataMap-&gt;get(block) : nullptr;
</del><ins>+    return gRareDataMap ? gRareDataMap-&gt;get(&amp;block) : nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static RenderBlockRareData&amp; ensureBlockRareData(const RenderBlock* block)
</del><ins>+static RenderBlockRareData&amp; ensureBlockRareData(const RenderBlock&amp; block)
</ins><span class="cx"> {
</span><span class="cx">     if (!gRareDataMap)
</span><span class="cx">         gRareDataMap = new RenderBlockRareDataMap;
</span><span class="cx">     
</span><del>-    auto&amp; rareData = gRareDataMap-&gt;add(block, nullptr).iterator-&gt;value;
</del><ins>+    auto&amp; rareData = gRareDataMap-&gt;add(&amp;block, nullptr).iterator-&gt;value;
</ins><span class="cx">     if (!rareData)
</span><span class="cx">         rareData = std::make_unique&lt;RenderBlockRareData&gt;();
</span><span class="cx">     return *rareData.get();
</span><span class="lines">@@ -3364,7 +3374,7 @@
</span><span class="cx"> 
</span><span class="cx"> RenderFlowThread* RenderBlock::cachedFlowThreadContainingBlock() const
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx"> 
</span><span class="cx">     if (!rareData || !rareData-&gt;m_flowThreadContainingBlock)
</span><span class="cx">         return nullptr;
</span><span class="lines">@@ -3374,7 +3384,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate() const
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx"> 
</span><span class="cx">     if (!rareData || !rareData-&gt;m_flowThreadContainingBlock)
</span><span class="cx">         return true;
</span><span class="lines">@@ -3384,13 +3394,13 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate()
</span><span class="cx"> {
</span><del>-    RenderBlockRareData&amp; rareData = ensureBlockRareData(this);
</del><ins>+    RenderBlockRareData&amp; rareData = ensureBlockRareData(*this);
</ins><span class="cx">     rareData.m_flowThreadContainingBlock = std::nullopt;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderFlowThread* RenderBlock::updateCachedFlowThreadContainingBlock(RenderFlowThread* flowThread) const
</span><span class="cx"> {
</span><del>-    RenderBlockRareData&amp; rareData = ensureBlockRareData(this);
</del><ins>+    RenderBlockRareData&amp; rareData = ensureBlockRareData(*this);
</ins><span class="cx">     rareData.m_flowThreadContainingBlock = flowThread;
</span><span class="cx"> 
</span><span class="cx">     return flowThread;
</span><span class="lines">@@ -3398,7 +3408,7 @@
</span><span class="cx"> 
</span><span class="cx"> RenderFlowThread* RenderBlock::locateFlowThreadContainingBlock() const
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx">     if (!rareData || !rareData-&gt;m_flowThreadContainingBlock)
</span><span class="cx">         return updateCachedFlowThreadContainingBlock(RenderBox::locateFlowThreadContainingBlock());
</span><span class="cx"> 
</span><span class="lines">@@ -3430,23 +3440,23 @@
</span><span class="cx"> 
</span><span class="cx"> LayoutUnit RenderBlock::paginationStrut() const
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx">     return rareData ? rareData-&gt;m_paginationStrut : LayoutUnit();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LayoutUnit RenderBlock::pageLogicalOffset() const
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx">     return rareData ? rareData-&gt;m_pageLogicalOffset : LayoutUnit();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBlock::setPaginationStrut(LayoutUnit strut)
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx">     if (!rareData) {
</span><span class="cx">         if (!strut)
</span><span class="cx">             return;
</span><del>-        rareData = &amp;ensureBlockRareData(this);
</del><ins>+        rareData = &amp;ensureBlockRareData(*this);
</ins><span class="cx">     }
</span><span class="cx">     rareData-&gt;m_paginationStrut = strut;
</span><span class="cx"> }
</span><span class="lines">@@ -3453,11 +3463,11 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
</span><span class="cx"> {
</span><del>-    RenderBlockRareData* rareData = getBlockRareData(this);
</del><ins>+    RenderBlockRareData* rareData = getBlockRareData(*this);
</ins><span class="cx">     if (!rareData) {
</span><span class="cx">         if (!logicalOffset)
</span><span class="cx">             return;
</span><del>-        rareData = &amp;ensureBlockRareData(this);
</del><ins>+        rareData = &amp;ensureBlockRareData(*this);
</ins><span class="cx">     }
</span><span class="cx">     rareData-&gt;m_pageLogicalOffset = logicalOffset;
</span><span class="cx"> }
</span><span class="lines">@@ -4083,17 +4093,17 @@
</span><span class="cx"> 
</span><span class="cx"> LayoutUnit RenderBlock::intrinsicBorderForFieldset() const
</span><span class="cx"> {
</span><del>-    auto* rareData = getBlockRareData(this);
</del><ins>+    auto* rareData = getBlockRareData(*this);
</ins><span class="cx">     return rareData ? rareData-&gt;m_intrinsicBorderForFieldset : LayoutUnit();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBlock::setIntrinsicBorderForFieldset(LayoutUnit padding)
</span><span class="cx"> {
</span><del>-    auto* rareData = getBlockRareData(this);
</del><ins>+    auto* rareData = getBlockRareData(*this);
</ins><span class="cx">     if (!rareData) {
</span><span class="cx">         if (!padding)
</span><span class="cx">             return;
</span><del>-        rareData = &amp;ensureBlockRareData(this);
</del><ins>+        rareData = &amp;ensureBlockRareData(*this);
</ins><span class="cx">     }
</span><span class="cx">     rareData-&gt;m_intrinsicBorderForFieldset = padding;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderBlock.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -427,6 +427,8 @@
</span><span class="cx"> 
</span><span class="cx">     void computeChildPreferredLogicalWidths(RenderObject&amp;, LayoutUnit&amp; minPreferredLogicalWidth, LayoutUnit&amp; maxPreferredLogicalWidth) const;
</span><span class="cx"> 
</span><ins>+    void blockWillBeDestroyed();
+
</ins><span class="cx"> private:
</span><span class="cx">     static std::unique_ptr&lt;RenderBlock&gt; createAnonymousBlockWithStyleAndDisplay(Document&amp;, const RenderStyle&amp;, EDisplay);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockFlowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -119,6 +119,7 @@
</span><span class="cx"> 
</span><span class="cx"> RenderBlockFlow::~RenderBlockFlow()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBlockFlow::createMultiColumnFlowThread()
</span><span class="lines">@@ -175,7 +176,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_lineBoxes.deleteLineBoxes();
</span><span class="cx"> 
</span><del>-    removeFromUpdateScrollInfoAfterLayoutTransaction();
</del><ins>+    blockWillBeDestroyed();
</ins><span class="cx"> 
</span><span class="cx">     // NOTE: This jumps down to RenderBox, bypassing RenderBlock since it would do duplicate work.
</span><span class="cx">     RenderBox::willBeDestroyed();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -145,6 +145,11 @@
</span><span class="cx"> 
</span><span class="cx"> RenderBox::~RenderBox()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderBox::willBeDestroyed()
+{
</ins><span class="cx">     if (frame().eventHandler().autoscrollRenderer() == this)
</span><span class="cx">         frame().eventHandler().stopAutoscrollTimer(true);
</span><span class="cx"> 
</span><span class="lines">@@ -158,6 +163,8 @@
</span><span class="cx"> 
</span><span class="cx">     view().unscheduleLazyRepaint(*this);
</span><span class="cx">     removeControlStatesForRenderer(*this);
</span><ins>+    
+    RenderBoxModelObject::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderRegion* RenderBox::clampToStartAndEndRegions(RenderRegion* region) const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderBox.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -634,6 +634,7 @@
</span><span class="cx">     void updateFromStyle() override;
</span><span class="cx"> 
</span><span class="cx">     void willBeRemovedFromTree() override;
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx"> 
</span><span class="cx">     bool createsNewFormattingContext() const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxModelObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -177,6 +177,7 @@
</span><span class="cx"> 
</span><span class="cx"> RenderBoxModelObject::~RenderBoxModelObject()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBoxModelObject::willBeDestroyed()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderCountercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderCounter.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderCounter.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderCounter.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -351,6 +351,11 @@
</span><span class="cx"> 
</span><span class="cx"> RenderCounter::~RenderCounter()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderCounter::willBeDestroyed()
+{
</ins><span class="cx">     view().removeRenderCounter();
</span><span class="cx"> 
</span><span class="cx">     if (m_counterNode) {
</span><span class="lines">@@ -357,6 +362,8 @@
</span><span class="cx">         m_counterNode-&gt;removeRenderer(*this);
</span><span class="cx">         ASSERT(!m_counterNode);
</span><span class="cx">     }
</span><ins>+    
+    RenderText::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* RenderCounter::renderName() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderCounterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderCounter.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderCounter.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderCounter.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -42,6 +42,8 @@
</span><span class="cx">     void updateCounter();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
+    
</ins><span class="cx">     const char* renderName() const override;
</span><span class="cx">     bool isCounter() const override;
</span><span class="cx">     String originalText() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderElement.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -132,28 +132,7 @@
</span><span class="cx"> 
</span><span class="cx"> RenderElement::~RenderElement()
</span><span class="cx"> {
</span><del>-    if (hasInitializedStyle()) {
-        for (auto* bgLayer = &amp;m_style.backgroundLayers(); bgLayer; bgLayer = bgLayer-&gt;next()) {
-            if (auto* backgroundImage = bgLayer-&gt;image())
-                backgroundImage-&gt;removeClient(this);
-        }
-        for (auto* maskLayer = &amp;m_style.maskLayers(); maskLayer; maskLayer = maskLayer-&gt;next()) {
-            if (auto* maskImage = maskLayer-&gt;image())
-                maskImage-&gt;removeClient(this);
-        }
-        if (auto* borderImage = m_style.borderImage().image())
-            borderImage-&gt;removeClient(this);
-        if (auto* maskBoxImage = m_style.maskBoxImage().image())
-            maskBoxImage-&gt;removeClient(this);
-        if (auto shapeValue = m_style.shapeOutside()) {
-            if (auto shapeImage = shapeValue-&gt;image())
-                shapeImage-&gt;removeClient(this);
-        }
-    }
-    if (m_hasPausedImageAnimations)
-        view().removeRendererWithPausedImageAnimations(*this);
-    if (isRegisteredForVisibleInViewportCallback())
-        view().unregisterForVisibleInViewportCallback(*this);
</del><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderPtr&lt;RenderElement&gt; RenderElement::createFor(Element&amp; element, RenderStyle&amp;&amp; style, RendererCreationType creationType)
</span><span class="lines">@@ -1145,6 +1124,30 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     clearLayoutRootIfNeeded();
</span><ins>+
+    if (hasInitializedStyle()) {
+        for (auto* bgLayer = &amp;m_style.backgroundLayers(); bgLayer; bgLayer = bgLayer-&gt;next()) {
+            if (auto* backgroundImage = bgLayer-&gt;image())
+                backgroundImage-&gt;removeClient(this);
+        }
+        for (auto* maskLayer = &amp;m_style.maskLayers(); maskLayer; maskLayer = maskLayer-&gt;next()) {
+            if (auto* maskImage = maskLayer-&gt;image())
+                maskImage-&gt;removeClient(this);
+        }
+        if (auto* borderImage = m_style.borderImage().image())
+            borderImage-&gt;removeClient(this);
+        if (auto* maskBoxImage = m_style.maskBoxImage().image())
+            maskBoxImage-&gt;removeClient(this);
+        if (auto shapeValue = m_style.shapeOutside()) {
+            if (auto shapeImage = shapeValue-&gt;image())
+                shapeImage-&gt;removeClient(this);
+        }
+    }
+    if (m_hasPausedImageAnimations)
+        view().removeRendererWithPausedImageAnimations(*this);
+
+    if (isRegisteredForVisibleInViewportCallback())
+        view().unregisterForVisibleInViewportCallback(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderElement::setNeedsPositionedMovementLayout(const RenderStyle* oldStyle)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderEmbeddedObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -107,7 +107,13 @@
</span><span class="cx"> 
</span><span class="cx"> RenderEmbeddedObject::~RenderEmbeddedObject()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderEmbeddedObject::willBeDestroyed()
+{
</ins><span class="cx">     view().frameView().removeEmbeddedObjectToUpdate(*this);
</span><ins>+    RenderWidget::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderPtr&lt;RenderEmbeddedObject&gt; RenderEmbeddedObject::createForApplet(HTMLAppletElement&amp; applet, RenderStyle&amp;&amp; style)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderEmbeddedObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderEmbeddedObject.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderEmbeddedObject.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderEmbeddedObject.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void layout() override;
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     const char* renderName() const override { return &quot;RenderEmbeddedObject&quot;; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderImage.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderImage.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderImage.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -143,7 +143,13 @@
</span><span class="cx"> 
</span><span class="cx"> RenderImage::~RenderImage()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderImage::willBeDestroyed()
+{
</ins><span class="cx">     imageResource().shutdown();
</span><ins>+    RenderReplaced::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // If we'll be displaying either alt text or an image, add some padding.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderImage.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderImage.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderImage.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -76,6 +76,8 @@
</span><span class="cx">     bool hasNonBitmapImage() const;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><ins>+    void willBeDestroyed() override;
+
</ins><span class="cx">     bool needsPreferredWidthsRecalculation() const final;
</span><span class="cx">     RenderBox* embeddedContentBox() const final;
</span><span class="cx">     void computeIntrinsicRatioInformation(FloatSize&amp; intrinsicSize, double&amp; intrinsicRatio) const final;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerModelObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -50,11 +50,18 @@
</span><span class="cx"> 
</span><span class="cx"> RenderLayerModelObject::~RenderLayerModelObject()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderLayerModelObject::willBeDestroyed()
+{
</ins><span class="cx">     if (isPositioned()) {
</span><span class="cx">         if (style().hasViewportConstrainedPosition())
</span><span class="cx">             view().frameView().removeViewportConstrainedObject(this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    RenderElement::willBeDestroyed();
+
</ins><span class="cx">     // Our layer should have been destroyed and cleared by now
</span><span class="cx">     ASSERT(!hasLayer());
</span><span class="cx">     ASSERT(!m_layer);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerModelObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerModelObject.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx">     RenderLayerModelObject(Document&amp;, RenderStyle&amp;&amp;, BaseTypeFlags);
</span><span class="cx"> 
</span><span class="cx">     void createLayer();
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     std::unique_ptr&lt;RenderLayer&gt; m_layer;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListBox.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -96,8 +96,14 @@
</span><span class="cx"> 
</span><span class="cx"> RenderListBox::~RenderListBox()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderListBox::willBeDestroyed()
+{
</ins><span class="cx">     setHasVerticalScrollbar(false);
</span><span class="cx">     view().frameView().removeScrollableArea(this);
</span><ins>+    RenderBlockFlow::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> HTMLSelectElement&amp; RenderListBox::selectElement() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListBoxh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListBox.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListBox.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderListBox.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -67,6 +67,8 @@
</span><span class="cx">     bool scrolledToRight() const override;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
+
</ins><span class="cx">     void element() const = delete;
</span><span class="cx"> 
</span><span class="cx">     const char* renderName() const override { return &quot;RenderListBox&quot;; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListItemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListItem.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListItem.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderListItem.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -60,11 +60,16 @@
</span><span class="cx"> 
</span><span class="cx"> RenderListItem::~RenderListItem()
</span><span class="cx"> {
</span><del>-    ASSERT(!m_marker || !m_marker-&gt;parent());
</del><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderListItem::willBeDestroyed()
+{
</ins><span class="cx">     if (m_marker) {
</span><span class="cx">         m_marker-&gt;destroy();
</span><span class="cx">         ASSERT(!m_marker);
</span><span class="cx">     }
</span><ins>+    RenderBlockFlow::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderListItem::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListItemh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListItem.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListItem.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderListItem.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -60,7 +60,10 @@
</span><span class="cx"> #if !ASSERT_DISABLED
</span><span class="cx">     bool inLayout() const { return m_inLayout; }
</span><span class="cx"> #endif
</span><ins>+
</ins><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
+
</ins><span class="cx">     const char* renderName() const override { return &quot;RenderListItem&quot;; }
</span><span class="cx"> 
</span><span class="cx">     bool isListItem() const override { return true; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListMarkercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListMarker.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListMarker.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderListMarker.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -1128,9 +1128,16 @@
</span><span class="cx"> 
</span><span class="cx"> RenderListMarker::~RenderListMarker()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderListMarker::willBeDestroyed()
+{
</ins><span class="cx">     m_listItem.didDestroyListMarker();
</span><span class="cx">     if (m_image)
</span><span class="cx">         m_image-&gt;removeClient(this);
</span><ins>+
+    RenderBox::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderListMarker::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListMarkerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListMarker.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListMarker.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderListMarker.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -51,6 +51,8 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
+
</ins><span class="cx">     void element() const = delete;
</span><span class="cx"> 
</span><span class="cx">     const char* renderName() const override { return &quot;RenderListMarker&quot;; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderMenuListcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderMenuList.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderMenuList.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderMenuList.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -84,11 +84,18 @@
</span><span class="cx"> 
</span><span class="cx"> RenderMenuList::~RenderMenuList()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderMenuList::willBeDestroyed()
+{
</ins><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx">     if (m_popup)
</span><span class="cx">         m_popup-&gt;disconnectClient();
</span><span class="cx">     m_popup = nullptr;
</span><span class="cx"> #endif
</span><ins>+
+    RenderFlexibleBox::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderMenuList::createInnerBlock()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderMenuListh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderMenuList.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderMenuList.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderMenuList.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -60,6 +60,8 @@
</span><span class="cx">     String text() const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
+
</ins><span class="cx">     void element() const = delete;
</span><span class="cx"> 
</span><span class="cx">     bool isMenuList() const override { return true; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -56,6 +56,13 @@
</span><span class="cx"> 
</span><span class="cx"> RenderNamedFlowThread::~RenderNamedFlowThread()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderNamedFlowThread::willBeDestroyed()
+{
+    WTFLogAlways(&quot;RenderNamedFlowThread %p willBeDestroyed&quot;, this);
+
</ins><span class="cx">     // The flow thread can be destroyed without unregistering the content nodes if the document is destroyed.
</span><span class="cx">     // This can lead to problems because the nodes are still marked as belonging to a flow thread.
</span><span class="cx">     clearContentElements();
</span><span class="lines">@@ -62,6 +69,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Also leave the NamedFlow object in a consistent state by calling mark for destruction.
</span><span class="cx">     setMarkForDestruction();
</span><ins>+
+    RenderFlowThread::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* RenderNamedFlowThread::renderName() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -96,6 +96,7 @@
</span><span class="cx">     void resetMarkForDestruction();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     const char* renderName() const override;
</span><span class="cx">     bool isRenderNamedFlowThread() const override { return true; }
</span><span class="cx">     bool isChildAllowed(const RenderObject&amp;, const RenderStyle&amp;) const override;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -1481,7 +1481,8 @@
</span><span class="cx">         cache-&gt;remove(this);
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily
</span><del>-    // be moved into RenderBoxModelObject::destroy.
</del><ins>+    // be moved into RenderLayerModelObject::willBeDestroyed().
+    // FIXME: Is this still true?
</ins><span class="cx">     if (hasLayer()) {
</span><span class="cx">         setHasLayer(false);
</span><span class="cx">         downcast&lt;RenderLayerModelObject&gt;(*this).destroyLayer();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderQuotecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderQuote.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderQuote.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderQuote.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -40,11 +40,18 @@
</span><span class="cx"> 
</span><span class="cx"> RenderQuote::~RenderQuote()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderQuote::willBeDestroyed()
+{
</ins><span class="cx">     detachQuote();
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!m_isAttached);
</span><span class="cx">     ASSERT(!m_next);
</span><span class="cx">     ASSERT(!m_previous);
</span><ins>+
+    RenderInline::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderQuote::insertedIntoTree()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderQuoteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderQuote.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderQuote.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderQuote.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx">     void attachQuote();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     void detachQuote();
</span><span class="cx"> 
</span><span class="cx">     const char* renderName() const override { return &quot;RenderQuote&quot;; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderSearchFieldcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderSearchField.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderSearchField.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderSearchField.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -58,10 +58,17 @@
</span><span class="cx"> 
</span><span class="cx"> RenderSearchField::~RenderSearchField()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderSearchField::willBeDestroyed()
+{
</ins><span class="cx">     if (m_searchPopup) {
</span><span class="cx">         m_searchPopup-&gt;popupMenu()-&gt;disconnectClient();
</span><span class="cx">         m_searchPopup = nullptr;
</span><span class="cx">     }
</span><ins>+
+    RenderTextControlSingleLine::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline HTMLElement* RenderSearchField::resultsButtonElement() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderSearchFieldh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderSearchField.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderSearchField.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderSearchField.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx">     void hidePopup();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     void centerContainerIfNeeded(RenderBox*) const override;
</span><span class="cx">     LayoutUnit computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const override;
</span><span class="cx">     LayoutUnit computeLogicalHeightLimit() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderSnapshottedPlugIncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -57,8 +57,15 @@
</span><span class="cx"> 
</span><span class="cx"> RenderSnapshottedPlugIn::~RenderSnapshottedPlugIn()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderSnapshottedPlugIn::willBeDestroyed()
+{
</ins><span class="cx">     ASSERT(m_snapshotResource);
</span><span class="cx">     m_snapshotResource-&gt;shutdown();
</span><ins>+
+    RenderEmbeddedObject::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> HTMLPlugInImageElement&amp; RenderSnapshottedPlugIn::plugInImageElement() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderSnapshottedPlugInh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx">     void handleEvent(Event&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     void frameOwnerElement() const = delete;
</span><span class="cx">     const char* renderName() const final { return &quot;RenderSnapshottedPlugIn&quot;; }
</span><span class="cx">     CursorDirective getCursor(const LayoutPoint&amp;, Cursor&amp;) const final;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderText.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderText.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderText.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -208,8 +208,8 @@
</span><span class="cx"> 
</span><span class="cx"> RenderText::~RenderText()
</span><span class="cx"> {
</span><del>-    if (m_originalTextDiffersFromRendered)
-        originalTextMap().remove(this);
</del><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+    ASSERT(!originalTextMap().contains(this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* RenderText::renderName() const
</span><span class="lines">@@ -286,6 +286,10 @@
</span><span class="cx">     secureTextTimers().remove(this);
</span><span class="cx"> 
</span><span class="cx">     removeAndDestroyTextBoxes();
</span><ins>+
+    if (m_originalTextDiffersFromRendered)
+        originalTextMap().remove(this);
+
</ins><span class="cx">     RenderObject::willBeDestroyed();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTextControlMultiLinecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -39,8 +39,15 @@
</span><span class="cx"> 
</span><span class="cx"> RenderTextControlMultiLine::~RenderTextControlMultiLine()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderTextControlMultiLine::willBeDestroyed()
+{
</ins><span class="cx">     if (textAreaElement().isConnected())
</span><span class="cx">         textAreaElement().rendererWillBeDestroyed();
</span><ins>+
+    RenderTextControl::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> HTMLTextAreaElement&amp; RenderTextControlMultiLine::textAreaElement() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTextControlMultiLineh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx">     HTMLTextAreaElement&amp; textAreaElement() const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     void element() const = delete;
</span><span class="cx"> 
</span><span class="cx">     bool isTextArea() const override { return true; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderVideocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderVideo.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderVideo.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderVideo.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -56,8 +56,15 @@
</span><span class="cx"> 
</span><span class="cx"> RenderVideo::~RenderVideo()
</span><span class="cx"> {
</span><ins>+    // Do not add any code here. Add it to willBeDestroyed() instead.
+}
+
+void RenderVideo::willBeDestroyed()
+{
</ins><span class="cx">     if (MediaPlayer* player = videoElement().player())
</span><span class="cx">         player-&gt;setVisible(false);
</span><ins>+
+    RenderMedia::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntSize RenderVideo::defaultSize()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderVideoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderVideo.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderVideo.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderVideo.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx">     void updateFromElement() final;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     void mediaElement() const = delete;
</span><span class="cx"> 
</span><span class="cx">     void intrinsicSizeChanged() final;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderWidgeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderWidget.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderWidget.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/RenderWidget.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -79,6 +79,7 @@
</span><span class="cx"> protected:
</span><span class="cx">     RenderWidget(HTMLFrameOwnerElement&amp;, RenderStyle&amp;&amp;);
</span><span class="cx"> 
</span><ins>+    void willBeDestroyed() override;
</ins><span class="cx">     void styleDidChange(StyleDifference, const RenderStyle* oldStyle) final;
</span><span class="cx">     void layout() override;
</span><span class="cx">     void paint(PaintInfo&amp;, const LayoutPoint&amp;) override;
</span><span class="lines">@@ -94,7 +95,6 @@
</span><span class="cx">     bool needsPreferredWidthsRecalculation() const final;
</span><span class="cx">     RenderBox* embeddedContentBox() const final;
</span><span class="cx"> 
</span><del>-    void willBeDestroyed() final;
</del><span class="cx">     void setSelectionState(SelectionState) final;
</span><span class="cx">     void setOverlapTestResult(bool) final;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -53,7 +53,12 @@
</span><span class="cx"> 
</span><span class="cx"> RenderSVGImage::~RenderSVGImage()
</span><span class="cx"> {
</span><ins>+}
+
+void RenderSVGImage::willBeDestroyed()
+{
</ins><span class="cx">     imageResource().shutdown();
</span><ins>+    RenderSVGModelObject::willBeDestroyed();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SVGImageElement&amp; RenderSVGImage::imageElement() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGImage.h (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGImage.h        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGImage.h        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -51,6 +51,8 @@
</span><span class="cx">     void paintForeground(PaintInfo&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void willBeDestroyed() override;
+
</ins><span class="cx">     void element() const = delete;
</span><span class="cx"> 
</span><span class="cx">     const char* renderName() const override { return &quot;RenderSVGImage&quot;; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceContainercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp (214172 => 214173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp        2017-03-20 17:11:02 UTC (rev 214172)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp        2017-03-20 17:28:55 UTC (rev 214173)
</span><span class="lines">@@ -44,8 +44,6 @@
</span><span class="cx"> 
</span><span class="cx"> RenderSVGResourceContainer::~RenderSVGResourceContainer()
</span><span class="cx"> {
</span><del>-    if (m_registered)
-        svgExtensionsFromElement(element()).removeResource(m_id);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderSVGResourceContainer::layout()
</span><span class="lines">@@ -61,6 +59,12 @@
</span><span class="cx"> void RenderSVGResourceContainer::willBeDestroyed()
</span><span class="cx"> {
</span><span class="cx">     SVGResourcesCache::resourceDestroyed(*this);
</span><ins>+
+    if (m_registered) {
+        svgExtensionsFromElement(element()).removeResource(m_id);
+        m_registered = false;
+    }
+
</ins><span class="cx">     RenderSVGHiddenContainer::willBeDestroyed();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>