[LFC] Add assertions for stale Display::Box geometry
[WebKit-https.git] / Source / WebCore / layout / displaytree / DisplayBox.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 "LayoutPoint.h"
31 #include "LayoutRect.h"
32 #include "LayoutUnit.h"
33 #include <wtf/IsoMalloc.h>
34
35 namespace WebCore {
36
37 namespace Layout {
38 class LayoutContext;
39 class BlockFormattingContext;
40 }
41
42 namespace Display {
43
44 class Box {
45     WTF_MAKE_ISO_ALLOCATED(Box);
46 public:
47     friend class Layout::LayoutContext;
48     friend class Layout::BlockFormattingContext;
49
50     ~Box();
51
52     LayoutRect rect() const;
53
54     LayoutUnit top() const;
55     LayoutUnit left() const;
56     LayoutUnit bottom() const;
57     LayoutUnit right() const;
58
59     LayoutPoint topLeft() const;
60     LayoutPoint bottomRight() const;
61
62     LayoutSize size() const;
63     LayoutUnit width() const;
64     LayoutUnit height() const;
65
66     LayoutUnit marginTop() const;
67     LayoutUnit marginLeft() const;
68     LayoutUnit marginBottom() const;
69     LayoutUnit marginRight() const;
70
71     LayoutRect marginBox() const;
72     LayoutRect borderBox() const;
73     LayoutRect paddingBox() const;
74     LayoutRect contentBox() const;
75
76 private:
77     Box();
78
79     void setRect(const LayoutRect&);
80     void setTopLeft(const LayoutPoint&);
81     void setTop(LayoutUnit);
82     void setLeft(LayoutUnit);
83     void setSize(const LayoutSize&);
84     void setWidth(LayoutUnit);
85     void setHeight(LayoutUnit);
86
87     void setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom);
88     void setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom);
89     void setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom);
90
91 #if !ASSERT_DISABLED
92     void invalidateTop() { m_hasValidTop = false; }
93     void invalidateLeft() { m_hasValidLeft = false; }
94     void invalidateWidth() { m_hasValidWidth = false; }
95     void invalidateHeight() { m_hasValidHeight = false; }
96     void invalidatePosition();
97     void invalidateSize();
98     void invalidateMargin() { m_hasValidMargin = false; }
99     void invalidateBorder() { m_hasValidBorder = false; }
100     void invalidatePadding() { m_hasValidPadding = false; }
101
102     bool hasValidPosition() const { return m_hasValidTop && m_hasValidLeft; }
103     bool hasValidSize() const { return m_hasValidWidth && m_hasValidHeight; }
104     bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
105     
106     void setHasValidPosition();
107     void setHasValidSize();
108     void setHasValidGeometry();
109     
110     void setHasValidMargin();
111     void setHasValidBorder();
112     void setHasValidPadding();
113 #endif
114
115     LayoutRect m_rect;
116
117     LayoutUnit m_marginTop;
118     LayoutUnit m_marginLeft;
119     LayoutUnit m_marginBottom;
120     LayoutUnit m_marginRight;
121
122     LayoutUnit m_borderTop;
123     LayoutUnit m_borderLeft;
124     LayoutUnit m_borderBottom;
125     LayoutUnit m_borderRight;
126
127     LayoutUnit m_paddingTop;
128     LayoutUnit m_paddingLeft;
129     LayoutUnit m_paddingBottom;
130     LayoutUnit m_paddingRight;
131
132 #if !ASSERT_DISABLED
133     bool m_hasValidTop { false };
134     bool m_hasValidLeft { false };
135     bool m_hasValidWidth { false };
136     bool m_hasValidHeight { false };
137     bool m_hasValidMargin { false };
138     bool m_hasValidBorder { false };
139     bool m_hasValidPadding { false };
140 #endif
141 };
142
143 #if !ASSERT_DISABLED
144 inline void Box::invalidatePosition()
145 {
146     invalidateTop();
147     invalidateLeft();
148 }
149
150 inline void Box::invalidateSize()
151 {
152     invalidateWidth();
153     invalidateHeight();
154 }
155
156 inline void Box::setHasValidPosition()
157 {
158     m_hasValidTop = true;
159     m_hasValidLeft = true;
160 }
161
162 inline void Box::setHasValidSize()
163 {
164     m_hasValidWidth = true;
165     m_hasValidHeight = true;
166 }
167
168 inline void Box::setHasValidGeometry()
169 {
170     setHasValidPosition();
171     setHasValidSize();
172 }
173 #endif
174
175 inline LayoutRect Box::rect() const
176 {
177     ASSERT(hasValidGeometry());
178     return m_rect;
179 }
180
181 inline LayoutUnit Box::top() const
182 {
183     ASSERT(m_hasValidTop);
184     return m_rect.y();
185 }
186
187 inline LayoutUnit Box::left() const
188 {
189     ASSERT(m_hasValidLeft);
190     return m_rect.x();
191 }
192
193 inline LayoutUnit Box::bottom() const
194 {
195     ASSERT(m_hasValidTop && m_hasValidHeight);
196     return m_rect.maxY();
197 }
198
199 inline LayoutUnit Box::right() const
200 {
201     ASSERT(m_hasValidLeft && m_hasValidWidth);
202     return m_rect.maxX();
203 }
204
205 inline LayoutPoint Box::topLeft() const
206 {
207     ASSERT(hasValidPosition());
208     return m_rect.location();
209 }
210
211 inline LayoutPoint Box::bottomRight() const
212 {
213     ASSERT(hasValidGeometry());
214     return m_rect.maxXMaxYCorner();
215 }
216
217 inline LayoutSize Box::size() const
218 {
219     ASSERT(hasValidSize());
220     return m_rect.size();
221 }
222
223 inline LayoutUnit Box::width() const
224 {
225     ASSERT(m_hasValidWidth);
226     return m_rect.width();
227 }
228
229 inline LayoutUnit Box::height() const
230 {
231     ASSERT(m_hasValidHeight);
232     return m_rect.height();
233 }
234
235 inline void Box::setRect(const LayoutRect& rect)
236 {
237 #if !ASSERT_DISABLED
238     setHasValidGeometry();
239 #endif
240     m_rect = rect;
241 }
242
243 inline void Box::setTopLeft(const LayoutPoint& topLeft)
244 {
245 #if !ASSERT_DISABLED
246     setHasValidPosition();
247 #endif
248     m_rect.setLocation(topLeft);
249 }
250
251 inline void Box::setTop(LayoutUnit top)
252 {
253 #if !ASSERT_DISABLED
254     m_hasValidTop = true;
255 #endif
256     m_rect.setY(top);
257 }
258
259 inline void Box::setLeft(LayoutUnit left)
260 {
261 #if !ASSERT_DISABLED
262     m_hasValidLeft = true;
263 #endif
264     m_rect.setX(left);
265 }
266
267 inline void Box::setSize(const LayoutSize& size)
268 {
269 #if !ASSERT_DISABLED
270     setHasValidSize();
271 #endif
272     m_rect.setSize(size);
273 }
274
275 inline void Box::setWidth(LayoutUnit width)
276 {
277 #if !ASSERT_DISABLED
278     m_hasValidWidth = true;
279 #endif
280     m_rect.setWidth(width);
281 }
282
283 inline void Box::setHeight(LayoutUnit height)
284 {
285 #if !ASSERT_DISABLED
286     m_hasValidHeight = true;
287 #endif
288     m_rect.setHeight(height);
289 }
290
291 inline void Box::setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom)
292 {
293 #if !ASSERT_DISABLED
294     void setHasValidMargin();
295 #endif
296     m_marginTop = marginTop;
297     m_marginLeft = marginLeft;
298     m_marginBottom = marginBottom;
299     m_marginRight = marginRight;
300 }
301
302 inline void Box::setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom)
303 {
304 #if !ASSERT_DISABLED
305     void setHasValidBorder();
306 #endif
307     m_borderTop = borderTop;
308     m_borderLeft = borderLeft;
309     m_borderBottom = borderBottom;
310     m_borderRight = borderRight;
311 }
312
313 inline void Box::setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom)
314 {
315 #if !ASSERT_DISABLED
316     void setHasValidPadding();
317 #endif
318     m_paddingTop = paddingTop;
319     m_paddingLeft = paddingLeft;
320     m_paddingBottom = paddingBottom;
321     m_paddingRight = paddingRight;
322 }
323
324 inline LayoutUnit Box::marginTop() const
325 {
326     ASSERT(m_hasValidMargin);
327     return m_marginTop;
328 }
329
330 inline LayoutUnit Box::marginLeft() const
331 {
332     ASSERT(m_hasValidMargin);
333     return m_marginLeft;
334 }
335
336 inline LayoutUnit Box::marginBottom() const
337 {
338     ASSERT(m_hasValidMargin);
339     return m_marginBottom;
340 }
341
342 inline LayoutUnit Box::marginRight() const
343 {
344     ASSERT(m_hasValidMargin);
345     return m_marginRight;
346 }
347
348 }
349 }
350 #endif