1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// 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 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*);
LayoutBox* m_layoutObjectInFlowThread; // The actual column-span:all layoutObject inside the flow thread.
};
DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutMultiColumnSpannerPlaceholder, isLayoutMultiColumnSpannerPlaceholder());
} // namespace blink
#endif
|