Title: [222845] trunk/Source/WebCore
Revision
222845
Author
[email protected]
Date
2017-10-04 07:14:13 -0700 (Wed, 04 Oct 2017)

Log Message

RenderMultiColumnSpannerPlaceholder should not hold raw pointers.
https://bugs.webkit.org/show_bug.cgi?id=177840
<rdar://problem/34800109>

Reviewed by Sam Weinig.

Though we should always have a spanner as long as there's a RenderMultiColumnSpannerPlaceholder,
the spanner inject/removal logic is complicated enough to protect them with WeakPtr.

Covered by existing tests.

* rendering/RenderMultiColumnSpannerPlaceholder.cpp:
(WebCore::RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder):
* rendering/RenderMultiColumnSpannerPlaceholder.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (222844 => 222845)


--- trunk/Source/WebCore/ChangeLog	2017-10-04 14:07:19 UTC (rev 222844)
+++ trunk/Source/WebCore/ChangeLog	2017-10-04 14:14:13 UTC (rev 222845)
@@ -1,3 +1,20 @@
+2017-10-04  Zalan Bujtas  <[email protected]>
+
+        RenderMultiColumnSpannerPlaceholder should not hold raw pointers.
+        https://bugs.webkit.org/show_bug.cgi?id=177840
+        <rdar://problem/34800109>
+
+        Reviewed by Sam Weinig.
+
+        Though we should always have a spanner as long as there's a RenderMultiColumnSpannerPlaceholder,
+        the spanner inject/removal logic is complicated enough to protect them with WeakPtr.  
+
+        Covered by existing tests.
+
+        * rendering/RenderMultiColumnSpannerPlaceholder.cpp:
+        (WebCore::RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder):
+        * rendering/RenderMultiColumnSpannerPlaceholder.h:
+
 2017-10-04  Michael Catanzaro  <[email protected]>
 
         [GTK] GtkUtilities.h should not be included in libs not linked to GTK

Modified: trunk/Source/WebCore/rendering/RenderMultiColumnFlow.cpp (222844 => 222845)


--- trunk/Source/WebCore/rendering/RenderMultiColumnFlow.cpp	2017-10-04 14:07:19 UTC (rev 222844)
+++ trunk/Source/WebCore/rendering/RenderMultiColumnFlow.cpp	2017-10-04 14:14:13 UTC (rev 222845)
@@ -348,7 +348,7 @@
         // content before and after the spanner, so that it becomes separate line boxes. Secondly,
         // this placeholder serves as a break point for column sets, so that, when encountered, we
         // end flowing one column set and move to the next one.
-        auto newPlaceholder = RenderMultiColumnSpannerPlaceholder::createAnonymous(this, downcast<RenderBox>(descendant), &container->style());
+        auto newPlaceholder = RenderMultiColumnSpannerPlaceholder::createAnonymous(*this, downcast<RenderBox>(descendant), container->style());
         auto& placeholder = *newPlaceholder;
         container->addChild(WTFMove(newPlaceholder), descendant.nextSibling());
         auto takenDescendant = container->takeChild(descendant);

Modified: trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.cpp (222844 => 222845)


--- trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.cpp	2017-10-04 14:07:19 UTC (rev 222844)
+++ trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.cpp	2017-10-04 14:14:13 UTC (rev 222845)
@@ -34,9 +34,9 @@
 
 namespace WebCore {
 
-RenderPtr<RenderMultiColumnSpannerPlaceholder> RenderMultiColumnSpannerPlaceholder::createAnonymous(RenderMultiColumnFlow* fragmentedFlow, RenderBox& spanner, const RenderStyle* parentStyle)
+RenderPtr<RenderMultiColumnSpannerPlaceholder> RenderMultiColumnSpannerPlaceholder::createAnonymous(RenderMultiColumnFlow& fragmentedFlow, RenderBox& spanner, const RenderStyle& parentStyle)
 {
-    auto newStyle = RenderStyle::createAnonymousStyleWithDisplay(*parentStyle, BLOCK);
+    auto newStyle = RenderStyle::createAnonymousStyleWithDisplay(parentStyle, BLOCK);
     newStyle.setClear(CBOTH); // We don't want floats in the row preceding the spanner to continue on the other side.
     auto placeholder = createRenderer<RenderMultiColumnSpannerPlaceholder>(fragmentedFlow, spanner, WTFMove(newStyle));
     placeholder->initializeStyle();
@@ -43,10 +43,10 @@
     return placeholder;
 }
 
-RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlow* fragmentedFlow, RenderBox& spanner, RenderStyle&& style)
-    : RenderBox(fragmentedFlow->document(), WTFMove(style), RenderBoxModelObjectFlag)
-    , m_spanner(&spanner)
-    , m_fragmentedFlow(fragmentedFlow)
+RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlow& fragmentedFlow, RenderBox& spanner, RenderStyle&& style)
+    : RenderBox(fragmentedFlow.document(), WTFMove(style), RenderBoxModelObjectFlag)
+    , m_spanner(makeWeakPtr(spanner))
+    , m_fragmentedFlow(makeWeakPtr(fragmentedFlow))
 {
 }
 

Modified: trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.h (222844 => 222845)


--- trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.h	2017-10-04 14:07:19 UTC (rev 222844)
+++ trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.h	2017-10-04 14:14:13 UTC (rev 222845)
@@ -37,15 +37,15 @@
 
 class RenderMultiColumnSpannerPlaceholder final : public RenderBox {
 public:
-    static RenderPtr<RenderMultiColumnSpannerPlaceholder> createAnonymous(RenderMultiColumnFlow*, RenderBox& spanner, const RenderStyle* parentStyle);
+    static RenderPtr<RenderMultiColumnSpannerPlaceholder> createAnonymous(RenderMultiColumnFlow&, RenderBox& spanner, const RenderStyle& parentStyle);
 
-    RenderBox* spanner() const { return m_spanner; }
-    RenderMultiColumnFlow* fragmentedFlow() const { return m_fragmentedFlow; }
+    RenderBox* spanner() const { return m_spanner.get(); }
+    RenderMultiColumnFlow* fragmentedFlow() const { return m_fragmentedFlow.get(); }
 
 private:
     template<class T, class... Args> friend RenderPtr<T> createRenderer(Args&&...);
 
-    RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlow*, RenderBox& spanner, RenderStyle&&);
+    RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlow&, RenderBox& spanner, RenderStyle&&);
     bool isRenderMultiColumnSpannerPlaceholder() const override { return true; }
 
     bool canHaveChildren() const override { return false; }
@@ -52,8 +52,8 @@
     void paint(PaintInfo&, const LayoutPoint&) override { }
     const char* renderName() const override;
 
-    RenderBox* m_spanner;
-    RenderMultiColumnFlow* m_fragmentedFlow;
+    WeakPtr<RenderBox> m_spanner;
+    WeakPtr<RenderMultiColumnFlow> m_fragmentedFlow;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to