[LFC] Implement height computation for non-replaced inflow elements.
[WebKit-https.git] / Source / WebCore / layout / layouttree / LayoutBox.h
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
29
30 #include "RenderStyle.h"
31 #include <wtf/IsoMalloc.h>
32 #include <wtf/WeakPtr.h>
33
34 namespace WebCore {
35
36 namespace Layout {
37
38 class Container;
39 class TreeBuilder;
40
41 class Box {
42     WTF_MAKE_ISO_ALLOCATED(Box);
43 public:
44     friend class TreeBuilder;
45
46     virtual ~Box();
47
48     bool establishesFormattingContext() const;
49     virtual bool establishesBlockFormattingContext() const;
50     virtual bool establishesInlineFormattingContext() const { return false; }
51
52     bool isInFlow() const { return !isFloatingOrOutOfFlowPositioned(); }
53     bool isPositioned() const { return isInFlowPositioned() || isOutOfFlowPositioned(); }
54     bool isInFlowPositioned() const { return isRelativelyPositioned() || isStickyPositioned(); }
55     bool isOutOfFlowPositioned() const { return isAbsolutelyPositioned() || isFixedPositioned(); }
56     bool isRelativelyPositioned() const;
57     bool isStickyPositioned() const;
58     bool isAbsolutelyPositioned() const;
59     bool isFixedPositioned() const;
60     bool isFloatingPositioned() const;
61
62     bool isFloatingOrOutOfFlowPositioned() const { return isFloatingPositioned() || isOutOfFlowPositioned(); }
63
64     const Container* containingBlock() const;
65     const Container& formattingContextRoot() const;
66     bool isDescendantOf(Container&) const;
67
68     bool isAnonymous() const { return m_isAnonymous; }
69
70     bool isBlockLevelBox() const;
71     bool isInlineLevelBox() const;
72     bool isInlineBlockBox() const;
73     bool isBlockContainerBox() const;
74     bool isInitialContainingBlock() const;
75     bool isReplaced() const;
76
77     const Container* parent() const { return m_parent; }
78     const Box* nextSibling() const { return m_nextSibling; }
79     const Box* nextInFlowSibling() const;
80     const Box* nextInFlowOrFloatingSibling() const;
81     const Box* previousSibling() const { return m_previousSibling; }
82     const Box* previousInFlowSibling() const;
83     const Box* previousInFlowOrFloatingSibling() const;
84
85     typedef unsigned BaseTypeFlags;
86     bool isContainer() const { return m_baseTypeFlags & ContainerFlag; }
87     bool isBlockContainer() const { return m_baseTypeFlags & BlockContainerFlag; }
88     bool isInlineBox() const { return m_baseTypeFlags & InlineBoxFlag; }
89     bool isInlineContainer() const { return m_baseTypeFlags & InlineContainerFlag; }
90
91     const RenderStyle& style() const { return m_style; }
92     auto& weakPtrFactory() const { return m_weakFactory; }
93
94 protected:
95     enum BaseTypeFlag {
96         ContainerFlag         = 1 << 0,
97         BlockContainerFlag    = 1 << 1,
98         InlineBoxFlag         = 1 << 2,
99         InlineContainerFlag   = 1 << 3
100     };
101     Box(RenderStyle&&, BaseTypeFlags);
102
103     bool isOverflowVisible() const;
104
105 private:
106     void setParent(Container& parent) { m_parent = &parent; }
107     void setNextSibling(Box& nextSibling) { m_nextSibling = &nextSibling; }
108     void setPreviousSibling(Box& previousSibling) { m_previousSibling = &previousSibling; }
109     void setIsAnonymous() { m_isAnonymous = true; }
110
111     WeakPtrFactory<Box> m_weakFactory;
112     RenderStyle m_style;
113
114     Container* m_parent { nullptr };
115     Box* m_previousSibling { nullptr };
116     Box* m_nextSibling { nullptr };
117
118     unsigned m_baseTypeFlags : 4;
119     unsigned m_isAnonymous : 1;
120
121 };
122
123 }
124 }
125
126 #define SPECIALIZE_TYPE_TRAITS_LAYOUT_BOX(ToValueTypeName, predicate) \
127 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::Layout::ToValueTypeName) \
128     static bool isType(const WebCore::Layout::Box& box) { return box.predicate; } \
129 SPECIALIZE_TYPE_TRAITS_END()
130
131 #endif