summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/Source/core/layout/LayoutMultiColumnSpannerPlaceholder.h
blob: 2749700e2ddcb5f5d94b196aa9711cdf2adb97ee (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
// 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