| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LayoutMultiColumnSpannerPlaceholder_h |
| #define LayoutMultiColumnSpannerPlaceholder_h |
| |
| #include "core/layout/LayoutMultiColumnFlowThread.h" |
| |
| namespace blink { |
| |
| // Placeholder layoutObject for column-span:all elements. The column-span:all layoutObject itself is a |
| // descendant of the flow thread, but due to its out-of-flow nature, we need something on the |
| // outside to take care of its positioning and sizing. LayoutMultiColumnSpannerPlaceholder objects |
| // are siblings of LayoutMultiColumnSet objects, i.e. direct children of the multicol container. |
| class LayoutMultiColumnSpannerPlaceholder final : public LayoutBox { |
| public: |
| bool isOfType(LayoutObjectType type) const override { return type == LayoutObjectLayoutMultiColumnSpannerPlaceholder || LayoutBox::isOfType(type); } |
| |
| static LayoutMultiColumnSpannerPlaceholder* createAnonymous(const ComputedStyle& parentStyle, LayoutBox&); |
| |
| LayoutMultiColumnFlowThread* flowThread() const { return toLayoutBlockFlow(parent())->multiColumnFlowThread(); } |
| |
| LayoutBox* layoutObjectInFlowThread() const { return m_layoutObjectInFlowThread; } |
| void markForLayoutIfObjectInFlowThreadNeedsLayout() |
| { |
| if (!m_layoutObjectInFlowThread->needsLayout()) |
| return; |
| // The containing block of a spanner is the multicol container (our parent here), but the |
| // spanner is laid out via its spanner set (us), so we need to make sure that we enter it. |
| setChildNeedsLayout(MarkOnlyThis); |
| } |
| |
| void layoutObjectInFlowThreadStyleDidChange(const ComputedStyle* oldStyle); |
| void updateMarginProperties(); |
| |
| const char* name() const override { return "LayoutMultiColumnSpannerPlaceholder"; } |
| |
| protected: |
| void willBeRemovedFromTree() override; |
| bool needsPreferredWidthsRecalculation() const override; |
| LayoutUnit minPreferredLogicalWidth() const override; |
| LayoutUnit maxPreferredLogicalWidth() const override; |
| void layout() override; |
| void computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues&) const override; |
| void invalidateTreeIfNeeded(PaintInvalidationState&) override; |
| void paint(const PaintInfo&, const LayoutPoint& paintOffset) override; |
| bool nodeAtPoint(HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override; |
| |
| private: |
| LayoutMultiColumnSpannerPlaceholder(LayoutBox*); |
| |
| LayoutBox* m_layoutObjectInFlowThread; // The actual column-span:all layoutObject inside the flow thread. |
| }; |
| |
| DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutMultiColumnSpannerPlaceholder, isLayoutMultiColumnSpannerPlaceholder()); |
| |
| } // namespace blink |
| |
| #endif |