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();
}