| // 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 == kLayoutObjectLayoutMultiColumnSpannerPlaceholder || |
| LayoutBox::IsOfType(type); |
| } |
| |
| static LayoutMultiColumnSpannerPlaceholder* CreateAnonymous( |
| const ComputedStyle& parent_style, |
| LayoutBox&); |
| |
| LayoutMultiColumnFlowThread* FlowThread() const { |
| return ToLayoutBlockFlow(Parent())->MultiColumnFlowThread(); |
| } |
| |
| LayoutBox* LayoutObjectInFlowThread() const { |
| return layout_object_in_flow_thread_; |
| } |
| void MarkForLayoutIfObjectInFlowThreadNeedsLayout() { |
| if (!layout_object_in_flow_thread_->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(kMarkOnlyThis); |
| } |
| |
| void LayoutObjectInFlowThreadStyleDidChange(const ComputedStyle* old_style); |
| void UpdateMarginProperties(); |
| |
| const char* GetName() const override { |
| return "LayoutMultiColumnSpannerPlaceholder"; |
| } |
| |
| protected: |
| void InsertedIntoTree() override; |
| void WillBeRemovedFromTree() override; |
| bool NeedsPreferredWidthsRecalculation() const override; |
| LayoutUnit MinPreferredLogicalWidth() const override; |
| LayoutUnit MaxPreferredLogicalWidth() const override; |
| void UpdateLayout() override; |
| void ComputeLogicalHeight(LayoutUnit logical_height, |
| LayoutUnit logical_top, |
| LogicalExtentComputedValues&) const override; |
| void Paint(const PaintInfo&, const LayoutPoint& paint_offset) const override; |
| bool NodeAtPoint(HitTestResult&, |
| const HitTestLocation& location_in_container, |
| const LayoutPoint& accumulated_offset, |
| HitTestAction) override; |
| |
| private: |
| LayoutMultiColumnSpannerPlaceholder(LayoutBox*); |
| |
| // The actual column-span:all layoutObject inside the flow thread. |
| LayoutBox* layout_object_in_flow_thread_; |
| }; |
| |
| DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutMultiColumnSpannerPlaceholder, |
| IsLayoutMultiColumnSpannerPlaceholder()); |
| |
| } // namespace blink |
| |
| #endif |