blob: e164460adc7bc49dc998439774c631614108c106 [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/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