- 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