blob: 472876b7be257c5e1d14022c44671cf7325dd2f0 (
plain)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_MULTI_COLUMN_SPANNER_PLACEHOLDER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_MULTI_COLUMN_SPANNER_PLACEHOLDER_H_
#include "base/notreached.h"
#include "third_party/blink/renderer/core/layout/layout_block_flow.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 {
NOT_DESTROYED();
return type == kLayoutObjectMultiColumnSpannerPlaceholder ||
LayoutBox::IsOfType(type);
}
static LayoutMultiColumnSpannerPlaceholder* CreateAnonymous(
const ComputedStyle& parent_style,
LayoutBox&);
void Trace(Visitor*) const override;
LayoutBlockFlow* MultiColumnBlockFlow() const {
NOT_DESTROYED();
return To<LayoutBlockFlow>(Parent());
}
LayoutMultiColumnFlowThread* FlowThread() const {
NOT_DESTROYED();
return To<LayoutBlockFlow>(Parent())->MultiColumnFlowThread();
}
LayoutBox* LayoutObjectInFlowThread() const {
NOT_DESTROYED();
return layout_object_in_flow_thread_;
}
void MarkForLayoutIfObjectInFlowThreadNeedsLayout() {
NOT_DESTROYED();
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);
}
bool AnonymousHasStylePropagationOverride() final {
NOT_DESTROYED();
return true;
}
void LayoutObjectInFlowThreadStyleDidChange(const ComputedStyle* old_style);
void UpdateProperties(const ComputedStyle& parent_style);
explicit LayoutMultiColumnSpannerPlaceholder(LayoutBox*);
const char* GetName() const override {
NOT_DESTROYED();
return "LayoutMultiColumnSpannerPlaceholder";
}
protected:
void InsertedIntoTree() override;
void WillBeRemovedFromTree() override;
bool NeedsPreferredWidthsRecalculation() const override;
void RecalcVisualOverflow() override;
MinMaxSizes PreferredLogicalWidths() const override;
void UpdateLayout() override;
void ComputeLogicalHeight(LayoutUnit logical_height,
LayoutUnit logical_top,
LogicalExtentComputedValues&) const override;
void Paint(const PaintInfo&) const override;
bool NodeAtPoint(HitTestResult&,
const HitTestLocation&,
const PhysicalOffset& accumulated_offset,
HitTestPhase) override;
private:
MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
NOT_DESTROYED();
NOTREACHED();
return MinMaxSizes();
}
// The actual column-span:all layoutObject inside the flow thread.
Member<LayoutBox> layout_object_in_flow_thread_;
};
template <>
struct DowncastTraits<LayoutMultiColumnSpannerPlaceholder> {
static bool AllowFrom(const LayoutObject& object) {
return object.IsLayoutMultiColumnSpannerPlaceholder();
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_MULTI_COLUMN_SPANNER_PLACEHOLDER_H_
|