Unreviewed, rolling out r224273 and r224278.
[WebKit-https.git] / Source / WebCore / rendering / RenderBoxModelObject.cpp
index c6c6bfd..cc65754 100644 (file)
@@ -77,54 +77,10 @@ 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.
-
-struct RenderBoxModelObject::ContinuationChainNode {
-    WeakPtr<RenderBoxModelObject> renderer;
-    ContinuationChainNode* previous { nullptr };
-    ContinuationChainNode* next { nullptr };
-
-    ContinuationChainNode(RenderBoxModelObject&);
-    ~ContinuationChainNode();
-
-    void insertAfter(ContinuationChainNode&);
-
-    WTF_MAKE_FAST_ALLOCATED;
-};
-
-RenderBoxModelObject::ContinuationChainNode::ContinuationChainNode(RenderBoxModelObject& renderer)
-    : renderer(makeWeakPtr(renderer))
-{
-}
-
-RenderBoxModelObject::ContinuationChainNode::~ContinuationChainNode()
+typedef HashMap<const RenderBoxModelObject*, WeakPtr<RenderBoxModelObject>> ContinuationMap;
+static ContinuationMap& continuationMap()
 {
-    if (next) {
-        ASSERT(previous);
-        ASSERT(next->previous == this);
-        next->previous = previous;
-    }
-    if (previous) {
-        ASSERT(previous->next == this);
-        previous->next = next;
-    }
-}
-
-void RenderBoxModelObject::ContinuationChainNode::insertAfter(ContinuationChainNode& after)
-{
-    ASSERT(!previous);
-    ASSERT(!next);
-    if ((next = after.next)) {
-        ASSERT(next->previous == &after);
-        next->previous = this;
-    }
-    previous = &after;
-    after.next = this;
-}
-
-typedef HashMap<const RenderBoxModelObject*, std::unique_ptr<RenderBoxModelObject::ContinuationChainNode>> ContinuationChainNodeMap;
-static ContinuationChainNodeMap& continuationChainNodeMap()
-{
-    static NeverDestroyed<ContinuationChainNodeMap> map;
+    static NeverDestroyed<ContinuationMap> map;
     return map;
 }
 
@@ -231,12 +187,10 @@ RenderBoxModelObject::~RenderBoxModelObject()
 
 void RenderBoxModelObject::willBeDestroyed()
 {
-    if (continuation() && !isContinuation()) {
-        removeAndDestroyAllContinuations();
-        ASSERT(!continuation());
+    if (hasContinuation()) {
+        continuation()->removeFromParentAndDestroy();
+        setContinuation(nullptr);
     }
-    if (hasContinuationChainNode())
-        removeFromContinuationChain();
 
     // If this is a first-letter object with a remaining text fragment then the
     // entry needs to be cleared from the map.
@@ -2493,49 +2447,19 @@ LayoutUnit RenderBoxModelObject::containingBlockLogicalWidthForContent() const
 
 RenderBoxModelObject* RenderBoxModelObject::continuation() const
 {
-    if (!hasContinuationChainNode())
-        return nullptr;
-
-    auto& continuationChainNode = *continuationChainNodeMap().get(this);
-    if (!continuationChainNode.next)
+    if (!hasContinuation())
         return nullptr;
-    return continuationChainNode.next->renderer.get();
-}
-
-void RenderBoxModelObject::insertIntoContinuationChainAfter(RenderBoxModelObject& afterRenderer)
-{
-    ASSERT(isContinuation());
-    ASSERT(!continuationChainNodeMap().contains(this));
-
-    auto& after = afterRenderer.ensureContinuationChainNode();
-    ensureContinuationChainNode().insertAfter(after);
-}
-
-void RenderBoxModelObject::removeFromContinuationChain()
-{
-    ASSERT(hasContinuationChainNode());
-    ASSERT(continuationChainNodeMap().contains(this));
-    setHasContinuationChainNode(false);
-    continuationChainNodeMap().remove(this);
-}
-
-auto RenderBoxModelObject::ensureContinuationChainNode() -> ContinuationChainNode&
-{
-    setHasContinuationChainNode(true);
-    return *continuationChainNodeMap().ensure(this, [&] {
-        return std::make_unique<ContinuationChainNode>(*this);
-    }).iterator->value;
+    return continuationMap().get(this).get();
 }
 
-void RenderBoxModelObject::removeAndDestroyAllContinuations()
+void RenderBoxModelObject::setContinuation(RenderBoxModelObject* continuation)
 {
-    ASSERT(!isContinuation());
-    ASSERT(hasContinuationChainNode());
-    ASSERT(continuationChainNodeMap().contains(this));
-    auto& continuationChainNode = *continuationChainNodeMap().get(this);
-    while (continuationChainNode.next)
-        continuationChainNode.next->renderer->removeFromParentAndDestroy();
-    removeFromContinuationChain();
+    ASSERT(!continuation || continuation->isContinuation());
+    if (continuation)
+        continuationMap().set(this, makeWeakPtr(continuation));
+    else if (hasContinuation())
+        continuationMap().remove(this);
+    setHasContinuation(!!continuation);
 }
 
 RenderTextFragment* RenderBoxModelObject::firstLetterRemainingText() const