| // 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/LayoutBlockFlow.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 insertedIntoTree() override; |
| 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 invalidatePaintOfSubtreesIfNeeded( |
| const PaintInvalidationState&) override; |
| void paint(const PaintInfo&, const LayoutPoint& paintOffset) const override; |
| bool nodeAtPoint(HitTestResult&, |
| const HitTestLocation& locationInContainer, |
| const LayoutPoint& accumulatedOffset, |
| HitTestAction) override; |
| |
| private: |
| LayoutMultiColumnSpannerPlaceholder(LayoutBox*); |
| |
| // The actual column-span:all layoutObject inside the flow thread. |
| LayoutBox* m_layoutObjectInFlowThread; |
| }; |
| |
| DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutMultiColumnSpannerPlaceholder, |
| isLayoutMultiColumnSpannerPlaceholder()); |
| |
| } // namespace blink |
| |
| #endif |