Continuation map should not hold a raw pointer
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Oct 2017 22:13:14 +0000 (22:13 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Oct 2017 22:13:14 +0000 (22:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=178021
<rdar://problem/34861590>

Reviewed by Simon Fraser.

This patch ensures proper lifetime management for renderers stored in the Continuation map
(currently they rely on the correctness of addChild/takeChild methods).

Covered by existing tests.

* rendering/RenderBoxModelObject.cpp:
(WebCore::RenderBoxModelObject::continuation const):
(WebCore::RenderBoxModelObject::setContinuation):

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

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderBoxModelObject.cpp

index 89c02d9..fd034ce 100644 (file)
@@ -1,3 +1,20 @@
+2017-10-06  Zalan Bujtas  <zalan@apple.com>
+
+        Continuation map should not hold a raw pointer
+        https://bugs.webkit.org/show_bug.cgi?id=178021
+        <rdar://problem/34861590>
+
+        Reviewed by Simon Fraser.
+
+        This patch ensures proper lifetime management for renderers stored in the Continuation map
+        (currently they rely on the correctness of addChild/takeChild methods).
+
+        Covered by existing tests.
+
+        * rendering/RenderBoxModelObject.cpp:
+        (WebCore::RenderBoxModelObject::continuation const):
+        (WebCore::RenderBoxModelObject::setContinuation):
+
 2017-10-06  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r222791 and r222873.
index 1e583ad..eb2dd3d 100644 (file)
@@ -77,7 +77,7 @@ using namespace HTMLNames;
 // an anonymous block (that houses other blocks) or it will be an inline flow.
 // <b><i><p>Hello</p></i></b>. In this example the <i> will have a block as
 // its continuation but the <b> will just have an inline as its continuation.
-typedef HashMap<const RenderBoxModelObject*, RenderBoxModelObject*> ContinuationMap;
+typedef HashMap<const RenderBoxModelObject*, WeakPtr<RenderBoxModelObject>> ContinuationMap;
 static ContinuationMap& continuationMap()
 {
     static NeverDestroyed<ContinuationMap> map;
@@ -2449,13 +2449,13 @@ RenderBoxModelObject* RenderBoxModelObject::continuation() const
 {
     if (!hasContinuation())
         return nullptr;
-    return continuationMap().get(this);
+    return continuationMap().get(this).get();
 }
 
 void RenderBoxModelObject::setContinuation(RenderBoxModelObject* continuation)
 {
     if (continuation)
-        continuationMap().set(this, continuation);
+        continuationMap().set(this, makeWeakPtr(continuation));
     else if (hasContinuation())
         continuationMap().remove(this);
     setHasContinuation(!!continuation);