blob: 29d49de7f4e35b0520623739940e3edb64a0bf66 [file] [log] [blame]
// 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