Clear Node renderer pointer when destroying RenderObject
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Nov 2017 16:55:26 +0000 (16:55 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Nov 2017 16:55:26 +0000 (16:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=179112

Reviewed by Zalan Bujtas.

Make sure we don't leave renderer pointers behind in Nodes.
This could be done with WeakPtr but that would add extra indirection between DOM and render tree.

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

    Null the node renderer pointer.
    With continuations we have a case where renderer points to a node that has a different renderer.
    This is is ok as we know no node points to a continuation (they should really be anonymous renderers).

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@224336 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderObject.cpp

index 0d827fa..cee3ce9 100644 (file)
@@ -1,5 +1,22 @@
 2017-11-02  Antti Koivisto  <antti@apple.com>
 
 2017-11-02  Antti Koivisto  <antti@apple.com>
 
+        Clear Node renderer pointer when destroying RenderObject
+        https://bugs.webkit.org/show_bug.cgi?id=179112
+
+        Reviewed by Zalan Bujtas.
+
+        Make sure we don't leave renderer pointers behind in Nodes.
+        This could be done with WeakPtr but that would add extra indirection between DOM and render tree.
+
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::willBeDestroyed):
+
+            Null the node renderer pointer.
+            With continuations we have a case where renderer points to a node that has a different renderer.
+            This is is ok as we know no node points to a continuation (they should really be anonymous renderers).
+
+2017-11-02  Antti Koivisto  <antti@apple.com>
+
         Remove empty continuations in RenderObject::removeFromParentAndDestroyCleaningUpAnonymousWrappers
         https://bugs.webkit.org/show_bug.cgi?id=179014
 
         Remove empty continuations in RenderObject::removeFromParentAndDestroyCleaningUpAnonymousWrappers
         https://bugs.webkit.org/show_bug.cgi?id=179014
 
index a7cc073..06b561c 100644 (file)
@@ -1434,6 +1434,13 @@ void RenderObject::willBeDestroyed()
     if (AXObjectCache* cache = document().existingAXObjectCache())
         cache->remove(this);
 
     if (AXObjectCache* cache = document().existingAXObjectCache())
         cache->remove(this);
 
+    if (auto* node = this->node()) {
+        // FIXME: Continuations should be anonymous.
+        ASSERT(!node->renderer() || node->renderer() == this || (is<RenderElement>(*this) && downcast<RenderElement>(*this).isContinuation()));
+        if (node->renderer() == this)
+            node->setRenderer(nullptr);
+    }
+
     removeRareData();
 }
 
     removeRareData();
 }
 
@@ -1518,6 +1525,7 @@ void RenderObject::destroy()
 #endif
 
     willBeDestroyed();
 #endif
 
     willBeDestroyed();
+
     if (is<RenderWidget>(*this)) {
         downcast<RenderWidget>(*this).deref();
         return;
     if (is<RenderWidget>(*this)) {
         downcast<RenderWidget>(*this).deref();
         return;