Title: [224976] trunk/Source/WebCore
Revision
224976
Author
[email protected]
Date
2017-11-17 11:34:32 -0800 (Fri, 17 Nov 2017)

Log Message

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

Reviewed by Zalan Bujtas.

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

* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::willBeDestroyed):
* rendering/RenderElement.cpp:
(WebCore::RenderElement::willBeDestroyed):
* rendering/RenderElement.h:
(WebCore::RenderElement::setLastChild):
* rendering/RenderInline.cpp:
(WebCore::RenderInline::willBeDestroyed):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::~RenderLayer):

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

* rendering/RenderObject.cpp:
(WebCore::RenderObject::destroy):

    Call destroyLeftoverChildren.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (224975 => 224976)


--- trunk/Source/WebCore/ChangeLog	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/ChangeLog	2017-11-17 19:34:32 UTC (rev 224976)
@@ -1,3 +1,32 @@
+2017-11-17  Antti Koivisto  <[email protected]>
+
+        Move destroyLeftoverChildren call to RenderObject::destroy
+        https://bugs.webkit.org/show_bug.cgi?id=179819
+
+        Reviewed by Zalan Bujtas.
+
+        This is currently called inconsistenly from various willBeDestroyed implementations.
+        We should always call it before invoking willBeDestroyed.
+
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::willBeDestroyed):
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::willBeDestroyed):
+        * rendering/RenderElement.h:
+        (WebCore::RenderElement::setLastChild):
+        * rendering/RenderInline.cpp:
+        (WebCore::RenderInline::willBeDestroyed):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::~RenderLayer):
+
+            Add some release asserts verifying layer has been detached before destruction.
+            This would reveal cases where destroyLeftoverChildren was called too late.
+
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::destroy):
+
+            Call destroyLeftoverChildren.
+
 2017-11-17  Said Abou-Hallawa  <[email protected]>
 
         SVG scrolling anchor should be reset if the fragmentIdentifier does not exist or is not provided

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (224975 => 224976)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2017-11-17 19:34:32 UTC (rev 224976)
@@ -132,10 +132,6 @@
 
 void RenderBlockFlow::willBeDestroyed()
 {
-    // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
-    // properly dirty line boxes that they are removed from. Effects that do :before/:after only on hover could crash otherwise.
-    destroyLeftoverChildren();
-
     if (!renderTreeBeingDestroyed()) {
         if (firstRootBox()) {
             // We can't wait for RenderBox::destroy to clear the selection,

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (224975 => 224976)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2017-11-17 19:34:32 UTC (rev 224976)
@@ -1126,8 +1126,6 @@
     if (m_style.hasFixedBackgroundImage() && !settings().fixedBackgroundsPaintRelativeToDocument())
         view().frameView().removeSlowRepaintObject(this);
 
-    destroyLeftoverChildren();
-
     unregisterForVisibleInViewportCallback();
 
     if (hasCounterNodeMap())

Modified: trunk/Source/WebCore/rendering/RenderElement.h (224975 => 224976)


--- trunk/Source/WebCore/rendering/RenderElement.h	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/rendering/RenderElement.h	2017-11-17 19:34:32 UTC (rev 224976)
@@ -229,6 +229,8 @@
     bool isFirstLetter() const { return m_isFirstLetter; }
     void setIsFirstLetter() { m_isFirstLetter = true; }
 
+    void destroyLeftoverChildren();
+
 protected:
     enum BaseTypeFlag {
         RenderLayerModelObjectFlag  = 1 << 0,
@@ -254,7 +256,6 @@
 
     void setFirstChild(RenderObject* child) { m_firstChild = child; }
     void setLastChild(RenderObject* child) { m_lastChild = child; }
-    void destroyLeftoverChildren();
 
     virtual void styleWillChange(StyleDifference, const RenderStyle& newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);

Modified: trunk/Source/WebCore/rendering/RenderInline.cpp (224975 => 224976)


--- trunk/Source/WebCore/rendering/RenderInline.cpp	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/rendering/RenderInline.cpp	2017-11-17 19:34:32 UTC (rev 224976)
@@ -84,10 +84,6 @@
     }
 #endif
 
-    // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
-    // properly dirty line boxes that they are removed from.  Effects that do :before/:after only on hover could crash otherwise.
-    destroyLeftoverChildren();
-    
     if (!renderTreeBeingDestroyed()) {
         if (firstLineBox()) {
             // We can't wait for RenderBoxModelObject::destroy to clear the selection,

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (224975 => 224976)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2017-11-17 19:34:32 UTC (rev 224976)
@@ -435,6 +435,10 @@
     // we don't need to delete them ourselves.
 
     clearBacking(true);
+
+    // Layer and all its children should be removed from the tree before destruction.
+    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(renderer().renderTreeBeingDestroyed() || !m_parent);
+    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(renderer().renderTreeBeingDestroyed() || !m_first);
 }
 
 String RenderLayer::name() const

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (224975 => 224976)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2017-11-17 19:29:34 UTC (rev 224975)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2017-11-17 19:34:32 UTC (rev 224976)
@@ -1519,6 +1519,9 @@
     RELEASE_ASSERT(!m_previous);
     RELEASE_ASSERT(!m_bitfields.beingDestroyed());
 
+    if (is<RenderElement>(*this))
+        downcast<RenderElement>(*this).destroyLeftoverChildren();
+
     m_bitfields.setBeingDestroyed(true);
 
 #if PLATFORM(IOS)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to