OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | |
3 * (C) 2000 Antti Koivisto (koivisto@kde.org) | |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | |
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) | |
6 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012 Apple Inc. All r
ights reserved. | |
7 * Copyright (C) 2009 Google Inc. All rights reserved. | |
8 * | |
9 * This library is free software; you can redistribute it and/or | |
10 * modify it under the terms of the GNU Library General Public | |
11 * License as published by the Free Software Foundation; either | |
12 * version 2 of the License, or (at your option) any later version. | |
13 * | |
14 * This library is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Library General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Library General Public License | |
20 * along with this library; see the file COPYING.LIB. If not, write to | |
21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
22 * Boston, MA 02110-1301, USA. | |
23 * | |
24 */ | |
25 | |
26 #ifndef RenderObject_h | |
27 #define RenderObject_h | |
28 | |
29 #include "core/dom/Document.h" | |
30 #include "core/dom/DocumentLifecycle.h" | |
31 #include "core/dom/Element.h" | |
32 #include "core/editing/TextAffinity.h" | |
33 #include "core/fetch/ImageResourceClient.h" | |
34 #include "core/html/HTMLElement.h" | |
35 #include "core/inspector/InspectorTraceEvents.h" | |
36 #include "core/layout/HitTestRequest.h" | |
37 #include "core/layout/compositing/CompositingState.h" | |
38 #include "core/layout/compositing/CompositingTriggers.h" | |
39 #include "core/rendering/PaintInvalidationState.h" | |
40 #include "core/rendering/PaintPhase.h" | |
41 #include "core/rendering/RenderObjectChildList.h" | |
42 #include "core/rendering/ScrollAlignment.h" | |
43 #include "core/rendering/SubtreeLayoutScope.h" | |
44 #include "core/rendering/style/RenderStyle.h" | |
45 #include "core/rendering/style/StyleInheritedData.h" | |
46 #include "platform/geometry/FloatQuad.h" | |
47 #include "platform/geometry/LayoutRect.h" | |
48 #include "platform/graphics/CompositingReasons.h" | |
49 #include "platform/graphics/PaintInvalidationReason.h" | |
50 #include "platform/graphics/paint/DisplayItemClient.h" | |
51 #include "platform/transforms/TransformationMatrix.h" | |
52 | |
53 namespace blink { | |
54 | |
55 class AffineTransform; | |
56 class Cursor; | |
57 class DisplayItemList; | |
58 class Document; | |
59 class HitTestLocation; | |
60 class HitTestResult; | |
61 class InlineBox; | |
62 class Position; | |
63 class PositionWithAffinity; | |
64 class PseudoStyleRequest; | |
65 class RenderBoxModelObject; | |
66 class RenderBlock; | |
67 class RenderFlowThread; | |
68 class RenderGeometryMap; | |
69 class Layer; | |
70 class LayoutLayerModelObject; | |
71 class RenderMultiColumnSpannerPlaceholder; | |
72 class RenderView; | |
73 class TransformState; | |
74 | |
75 struct PaintInfo; | |
76 | |
77 enum CursorDirective { | |
78 SetCursorBasedOnStyle, | |
79 SetCursor, | |
80 DoNotSetCursor | |
81 }; | |
82 | |
83 enum HitTestFilter { | |
84 HitTestAll, | |
85 HitTestSelf, | |
86 HitTestDescendants | |
87 }; | |
88 | |
89 enum HitTestAction { | |
90 HitTestBlockBackground, | |
91 HitTestChildBlockBackground, | |
92 HitTestChildBlockBackgrounds, | |
93 HitTestFloat, | |
94 HitTestForeground | |
95 }; | |
96 | |
97 enum MarkingBehavior { | |
98 MarkOnlyThis, | |
99 MarkContainingBlockChain, | |
100 }; | |
101 | |
102 enum MapCoordinatesMode { | |
103 IsFixed = 1 << 0, | |
104 UseTransforms = 1 << 1, | |
105 ApplyContainerFlip = 1 << 2, | |
106 TraverseDocumentBoundaries = 1 << 3, | |
107 }; | |
108 typedef unsigned MapCoordinatesFlags; | |
109 | |
110 const int caretWidth = 1; | |
111 | |
112 struct AnnotatedRegionValue { | |
113 bool operator==(const AnnotatedRegionValue& o) const | |
114 { | |
115 return draggable == o.draggable && bounds == o.bounds; | |
116 } | |
117 | |
118 LayoutRect bounds; | |
119 bool draggable; | |
120 }; | |
121 | |
122 typedef WTF::HashMap<const Layer*, Vector<LayoutRect>> LayerHitTestRects; | |
123 | |
124 #ifndef NDEBUG | |
125 const int showTreeCharacterOffset = 39; | |
126 #endif | |
127 | |
128 // Base class for all rendering tree objects. | |
129 class RenderObject : public ImageResourceClient { | |
130 friend class RenderBlock; | |
131 friend class RenderBlockFlow; | |
132 friend class LayerReflectionInfo; // For setParent | |
133 friend class LayerScrollableArea; // For setParent. | |
134 friend class RenderObjectChildList; | |
135 WTF_MAKE_NONCOPYABLE(RenderObject); | |
136 public: | |
137 // Anonymous objects should pass the document as their node, and they will t
hen automatically be | |
138 // marked as anonymous in the constructor. | |
139 explicit RenderObject(Node*); | |
140 virtual ~RenderObject(); | |
141 | |
142 virtual const char* renderName() const = 0; | |
143 | |
144 String debugName() const; | |
145 | |
146 RenderObject* parent() const { return m_parent; } | |
147 bool isDescendantOf(const RenderObject*) const; | |
148 | |
149 RenderObject* previousSibling() const { return m_previous; } | |
150 RenderObject* nextSibling() const { return m_next; } | |
151 | |
152 RenderObject* slowFirstChild() const | |
153 { | |
154 if (const RenderObjectChildList* children = virtualChildren()) | |
155 return children->firstChild(); | |
156 return 0; | |
157 } | |
158 RenderObject* slowLastChild() const | |
159 { | |
160 if (const RenderObjectChildList* children = virtualChildren()) | |
161 return children->lastChild(); | |
162 return 0; | |
163 } | |
164 | |
165 virtual RenderObjectChildList* virtualChildren() { return 0; } | |
166 virtual const RenderObjectChildList* virtualChildren() const { return 0; } | |
167 | |
168 RenderObject* nextInPreOrder() const; | |
169 RenderObject* nextInPreOrder(const RenderObject* stayWithin) const; | |
170 RenderObject* nextInPreOrderAfterChildren() const; | |
171 RenderObject* nextInPreOrderAfterChildren(const RenderObject* stayWithin) co
nst; | |
172 RenderObject* previousInPreOrder() const; | |
173 RenderObject* previousInPreOrder(const RenderObject* stayWithin) const; | |
174 RenderObject* childAt(unsigned) const; | |
175 | |
176 RenderObject* lastLeafChild() const; | |
177 | |
178 // The following six functions are used when the render tree hierarchy chang
es to make sure layers get | |
179 // properly added and removed. Since containership can be implemented by an
y subclass, and since a hierarchy | |
180 // can contain a mixture of boxes and other object types, these functions ne
ed to be in the base class. | |
181 Layer* enclosingLayer() const; | |
182 void addLayers(Layer* parentLayer); | |
183 void removeLayers(Layer* parentLayer); | |
184 void moveLayers(Layer* oldParent, Layer* newParent); | |
185 Layer* findNextLayer(Layer* parentLayer, RenderObject* startPoint, bool chec
kParent = true); | |
186 | |
187 // Scrolling is a RenderBox concept, however some code just cares about recu
rsively scrolling our enclosing ScrollableArea(s). | |
188 bool scrollRectToVisible(const LayoutRect&, const ScrollAlignment& alignX =
ScrollAlignment::alignCenterIfNeeded, const ScrollAlignment& alignY = ScrollAlig
nment::alignCenterIfNeeded); | |
189 | |
190 // Convenience function for getting to the nearest enclosing box of a Render
Object. | |
191 RenderBox* enclosingBox() const; | |
192 RenderBoxModelObject* enclosingBoxModelObject() const; | |
193 | |
194 RenderBox* enclosingScrollableBox() const; | |
195 | |
196 // Function to return our enclosing flow thread if we are contained inside o
ne. This | |
197 // function follows the containing block chain. | |
198 RenderFlowThread* flowThreadContainingBlock() const | |
199 { | |
200 if (flowThreadState() == NotInsideFlowThread) | |
201 return 0; | |
202 return locateFlowThreadContainingBlock(); | |
203 } | |
204 | |
205 #if ENABLE(ASSERT) | |
206 void setHasAXObject(bool flag) { m_hasAXObject = flag; } | |
207 bool hasAXObject() const { return m_hasAXObject; } | |
208 | |
209 // Helper class forbidding calls to setNeedsLayout() during its lifetime. | |
210 class SetLayoutNeededForbiddenScope { | |
211 public: | |
212 explicit SetLayoutNeededForbiddenScope(RenderObject&); | |
213 ~SetLayoutNeededForbiddenScope(); | |
214 private: | |
215 RenderObject& m_renderObject; | |
216 bool m_preexistingForbidden; | |
217 }; | |
218 | |
219 void assertRendererLaidOut() const | |
220 { | |
221 #ifndef NDEBUG | |
222 if (needsLayout()) | |
223 showRenderTreeForThis(); | |
224 #endif | |
225 ASSERT_WITH_SECURITY_IMPLICATION(!needsLayout()); | |
226 } | |
227 | |
228 void assertSubtreeIsLaidOut() const | |
229 { | |
230 for (const RenderObject* renderer = this; renderer; renderer = renderer-
>nextInPreOrder()) | |
231 renderer->assertRendererLaidOut(); | |
232 } | |
233 | |
234 void assertRendererClearedPaintInvalidationState() const | |
235 { | |
236 #ifndef NDEBUG | |
237 if (paintInvalidationStateIsDirty()) { | |
238 showRenderTreeForThis(); | |
239 ASSERT_NOT_REACHED(); | |
240 } | |
241 #endif | |
242 } | |
243 | |
244 void assertSubtreeClearedPaintInvalidationState() const | |
245 { | |
246 for (const RenderObject* renderer = this; renderer; renderer = renderer-
>nextInPreOrder()) | |
247 renderer->assertRendererClearedPaintInvalidationState(); | |
248 } | |
249 | |
250 #endif | |
251 | |
252 // FIXME: This could be used when changing the size of a renderer without ch
ildren to skip some invalidations. | |
253 bool rendererHasNoBoxEffect() const | |
254 { | |
255 return !style()->hasVisualOverflowingEffect() && !style()->hasBorder() &
& !style()->hasBackground(); | |
256 } | |
257 | |
258 // Obtains the nearest enclosing block (including this block) that contribut
es a first-line style to our inline | |
259 // children. | |
260 virtual RenderBlock* firstLineBlock() const; | |
261 | |
262 // Called when an object that was floating or positioned becomes a normal fl
ow object | |
263 // again. We have to make sure the render tree updates as needed to accommo
date the new | |
264 // normal flow object. | |
265 void handleDynamicFloatPositionChange(); | |
266 | |
267 // RenderObject tree manipulation | |
268 ////////////////////////////////////////// | |
269 virtual bool canHaveChildren() const { return virtualChildren(); } | |
270 virtual bool canHaveGeneratedChildren() const; | |
271 virtual bool isChildAllowed(RenderObject*, const RenderStyle&) const { retur
n true; } | |
272 virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0)
; | |
273 virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObje
ct* beforeChild = 0) { return addChild(newChild, beforeChild); } | |
274 virtual void removeChild(RenderObject*); | |
275 virtual bool createsAnonymousWrapper() const { return false; } | |
276 ////////////////////////////////////////// | |
277 | |
278 protected: | |
279 ////////////////////////////////////////// | |
280 // Helper functions. Dangerous to use! | |
281 void setPreviousSibling(RenderObject* previous) { m_previous = previous; } | |
282 void setNextSibling(RenderObject* next) { m_next = next; } | |
283 void setParent(RenderObject* parent) | |
284 { | |
285 m_parent = parent; | |
286 | |
287 // Only update if our flow thread state is different from our new parent
and if we're not a RenderFlowThread. | |
288 // A RenderFlowThread is always considered to be inside itself, so it ne
ver has to change its state | |
289 // in response to parent changes. | |
290 FlowThreadState newState = parent ? parent->flowThreadState() : NotInsid
eFlowThread; | |
291 if (newState != flowThreadState() && !isRenderFlowThread()) | |
292 setFlowThreadStateIncludingDescendants(newState); | |
293 } | |
294 | |
295 ////////////////////////////////////////// | |
296 private: | |
297 #if ENABLE(ASSERT) | |
298 bool isSetNeedsLayoutForbidden() const { return m_setNeedsLayoutForbidden; } | |
299 void setNeedsLayoutIsForbidden(bool flag) { m_setNeedsLayoutForbidden = flag
; } | |
300 #endif | |
301 | |
302 void addAbsoluteRectForLayer(LayoutRect& result); | |
303 bool requiresAnonymousTableWrappers(const RenderObject*) const; | |
304 | |
305 // Gets pseudoStyle from Shadow host(in case of input elements) | |
306 // or from Parent element. | |
307 PassRefPtr<RenderStyle> getUncachedPseudoStyleFromParentOrShadowHost() const
; | |
308 | |
309 bool skipInvalidationWhenLaidOutChildren() const; | |
310 | |
311 public: | |
312 #ifndef NDEBUG | |
313 void showTreeForThis() const; | |
314 void showRenderTreeForThis() const; | |
315 void showLineTreeForThis() const; | |
316 | |
317 void showRenderObject() const; | |
318 // We don't make printedCharacters an optional parameter so that | |
319 // showRenderObject can be called from gdb easily. | |
320 void showRenderObject(int printedCharacters) const; | |
321 void showRenderTreeAndMark(const RenderObject* markedObject1 = 0, const char
* markedLabel1 = 0, const RenderObject* markedObject2 = 0, const char* markedLab
el2 = 0, int depth = 0) const; | |
322 #endif | |
323 | |
324 static RenderObject* createObject(Element*, const RenderStyle&); | |
325 static unsigned instanceCount() { return s_instanceCount; } | |
326 | |
327 // RenderObjects are allocated out of the rendering partition. | |
328 void* operator new(size_t); | |
329 void operator delete(void*); | |
330 | |
331 public: | |
332 bool isPseudoElement() const { return node() && node()->isPseudoElement(); } | |
333 | |
334 virtual bool isBoxModelObject() const { return false; } | |
335 bool isBR() const { return isOfType(RenderObjectBr); } | |
336 bool isCanvas() const { return isOfType(RenderObjectCanvas); } | |
337 bool isCounter() const { return isOfType(RenderObjectCounter); } | |
338 bool isDetailsMarker() const { return isOfType(RenderObjectDetailsMarker); } | |
339 bool isEmbeddedObject() const { return isOfType(RenderObjectEmbeddedObject);
} | |
340 bool isFieldset() const { return isOfType(RenderObjectFieldset); } | |
341 bool isFileUploadControl() const { return isOfType(RenderObjectFileUploadCon
trol); } | |
342 bool isFrame() const { return isOfType(RenderObjectFrame); } | |
343 bool isFrameSet() const { return isOfType(RenderObjectFrameSet); } | |
344 bool isLayoutTableCol() const { return isOfType(RenderObjectLayoutTableCol);
} | |
345 bool isListBox() const { return isOfType(RenderObjectListBox); } | |
346 bool isListItem() const { return isOfType(RenderObjectListItem); } | |
347 bool isListMarker() const { return isOfType(RenderObjectListMarker); } | |
348 bool isMedia() const { return isOfType(RenderObjectMedia); } | |
349 bool isMenuList() const { return isOfType(RenderObjectMenuList); } | |
350 bool isMeter() const { return isOfType(RenderObjectMeter); } | |
351 bool isProgress() const { return isOfType(RenderObjectProgress); } | |
352 bool isQuote() const { return isOfType(RenderObjectQuote); } | |
353 bool isRenderButton() const { return isOfType(RenderObjectRenderButton); } | |
354 bool isRenderFullScreen() const { return isOfType(RenderObjectRenderFullScre
en); } | |
355 bool isRenderFullScreenPlaceholder() const { return isOfType(RenderObjectRen
derFullScreenPlaceholder); } | |
356 bool isRenderGrid() const { return isOfType(RenderObjectRenderGrid); } | |
357 bool isRenderIFrame() const { return isOfType(RenderObjectRenderIFrame); } | |
358 bool isRenderImage() const { return isOfType(RenderObjectRenderImage); } | |
359 bool isRenderMultiColumnSet() const { return isOfType(RenderObjectRenderMult
iColumnSet); } | |
360 bool isRenderMultiColumnSpannerPlaceholder() const { return isOfType(RenderO
bjectRenderMultiColumnSpannerPlaceholder); } | |
361 bool isRenderRegion() const { return isOfType(RenderObjectRenderRegion); } | |
362 bool isRenderScrollbarPart() const { return isOfType(RenderObjectRenderScrol
lbarPart); } | |
363 bool isRenderView() const { return isOfType(RenderObjectRenderView); } | |
364 bool isReplica() const { return isOfType(RenderObjectReplica); } | |
365 bool isRuby() const { return isOfType(RenderObjectRuby); } | |
366 bool isRubyBase() const { return isOfType(RenderObjectRubyBase); } | |
367 bool isRubyRun() const { return isOfType(RenderObjectRubyRun); } | |
368 bool isRubyText() const { return isOfType(RenderObjectRubyText); } | |
369 bool isSlider() const { return isOfType(RenderObjectSlider); } | |
370 bool isSliderThumb() const { return isOfType(RenderObjectSliderThumb); } | |
371 bool isTable() const { return isOfType(RenderObjectTable); } | |
372 bool isTableCaption() const { return isOfType(RenderObjectTableCaption); } | |
373 bool isTableCell() const { return isOfType(RenderObjectTableCell); } | |
374 bool isTableRow() const { return isOfType(RenderObjectTableRow); } | |
375 bool isTableSection() const { return isOfType(RenderObjectTableSection); } | |
376 bool isTextArea() const { return isOfType(RenderObjectTextArea); } | |
377 bool isTextControl() const { return isOfType(RenderObjectTextControl); } | |
378 bool isTextField() const { return isOfType(RenderObjectTextField); } | |
379 bool isVideo() const { return isOfType(RenderObjectVideo); } | |
380 bool isWidget() const { return isOfType(RenderObjectWidget); } | |
381 | |
382 virtual bool isImage() const { return false; } | |
383 | |
384 virtual bool isInlineBlockOrInlineTable() const { return false; } | |
385 virtual bool isLayoutLayerModelObject() const { return false; } | |
386 virtual bool isRenderBlock() const { return false; } | |
387 virtual bool isRenderBlockFlow() const { return false; } | |
388 virtual bool isRenderFlowThread() const { return false; } | |
389 virtual bool isRenderInline() const { return false; } | |
390 virtual bool isRenderPart() const { return false; } | |
391 | |
392 bool isDocumentElement() const { return document().documentElement() == m_no
de; } | |
393 // isBody is called from RenderBox::styleWillChange and is thus quite hot. | |
394 bool isBody() const { return node() && node()->hasTagName(HTMLNames::bodyTag
); } | |
395 bool isHR() const; | |
396 bool isLegend() const; | |
397 | |
398 bool isTablePart() const { return isTableCell() || isLayoutTableCol() || isT
ableCaption() || isTableRow() || isTableSection(); } | |
399 | |
400 inline bool isBeforeContent() const; | |
401 inline bool isAfterContent() const; | |
402 inline bool isBeforeOrAfterContent() const; | |
403 static inline bool isAfterContent(const RenderObject* obj) { return obj && o
bj->isAfterContent(); } | |
404 | |
405 bool hasCounterNodeMap() const { return m_bitfields.hasCounterNodeMap(); } | |
406 void setHasCounterNodeMap(bool hasCounterNodeMap) { m_bitfields.setHasCounte
rNodeMap(hasCounterNodeMap); } | |
407 bool everHadLayout() const { return m_bitfields.everHadLayout(); } | |
408 | |
409 bool childrenInline() const { return m_bitfields.childrenInline(); } | |
410 void setChildrenInline(bool b) { m_bitfields.setChildrenInline(b); } | |
411 bool hasColumns() const { return m_bitfields.hasColumns(); } | |
412 void setHasColumns(bool b = true) { m_bitfields.setHasColumns(b); } | |
413 | |
414 bool alwaysCreateLineBoxesForRenderInline() const | |
415 { | |
416 ASSERT(isRenderInline()); | |
417 return m_bitfields.alwaysCreateLineBoxesForRenderInline(); | |
418 } | |
419 void setAlwaysCreateLineBoxesForRenderInline(bool alwaysCreateLineBoxes) | |
420 { | |
421 ASSERT(isRenderInline()); | |
422 m_bitfields.setAlwaysCreateLineBoxesForRenderInline(alwaysCreateLineBoxe
s); | |
423 } | |
424 | |
425 bool ancestorLineBoxDirty() const { return m_bitfields.ancestorLineBoxDirty(
); } | |
426 void setAncestorLineBoxDirty(bool value = true) | |
427 { | |
428 m_bitfields.setAncestorLineBoxDirty(value); | |
429 if (value) | |
430 setNeedsLayoutAndFullPaintInvalidation(); | |
431 } | |
432 | |
433 enum FlowThreadState { | |
434 NotInsideFlowThread = 0, | |
435 InsideOutOfFlowThread = 1, | |
436 InsideInFlowThread = 2, | |
437 }; | |
438 | |
439 void setFlowThreadStateIncludingDescendants(FlowThreadState); | |
440 | |
441 FlowThreadState flowThreadState() const { return m_bitfields.flowThreadState
(); } | |
442 void setFlowThreadState(FlowThreadState state) { m_bitfields.setFlowThreadSt
ate(state); } | |
443 | |
444 // FIXME: Until all SVG renders can be subclasses of RenderSVGModelObject we
have | |
445 // to add SVG renderer methods to RenderObject with an ASSERT_NOT_REACHED()
default implementation. | |
446 bool isSVG() const { return isOfType(RenderObjectSVG); } | |
447 bool isSVGRoot() const { return isOfType(RenderObjectSVGRoot); } | |
448 bool isSVGContainer() const { return isOfType(RenderObjectSVGContainer); } | |
449 bool isSVGTransformableContainer() const { return isOfType(RenderObjectSVGTr
ansformableContainer); } | |
450 bool isSVGViewportContainer() const { return isOfType(RenderObjectSVGViewpor
tContainer); } | |
451 bool isSVGGradientStop() const { return isOfType(RenderObjectSVGGradientStop
); } | |
452 bool isSVGHiddenContainer() const { return isOfType(RenderObjectSVGHiddenCon
tainer); } | |
453 bool isSVGShape() const { return isOfType(RenderObjectSVGShape); } | |
454 bool isSVGText() const { return isOfType(RenderObjectSVGText); } | |
455 bool isSVGTextPath() const { return isOfType(RenderObjectSVGTextPath); } | |
456 bool isSVGInline() const { return isOfType(RenderObjectSVGInline); } | |
457 bool isSVGInlineText() const { return isOfType(RenderObjectSVGInlineText); } | |
458 bool isSVGImage() const { return isOfType(RenderObjectSVGImage); } | |
459 bool isSVGForeignObject() const { return isOfType(RenderObjectSVGForeignObje
ct); } | |
460 bool isSVGResourceContainer() const { return isOfType(RenderObjectSVGResourc
eContainer); } | |
461 bool isSVGResourceFilter() const { return isOfType(RenderObjectSVGResourceFi
lter); } | |
462 bool isSVGResourceFilterPrimitive() const { return isOfType(RenderObjectSVGR
esourceFilterPrimitive); } | |
463 | |
464 // FIXME: Those belong into a SVG specific base-class for all renderers (see
above) | |
465 // Unfortunately we don't have such a class yet, because it's not possible f
or all renderers | |
466 // to inherit from RenderSVGObject -> RenderObject (some need RenderBlock in
heritance for instance) | |
467 virtual void setNeedsTransformUpdate() { } | |
468 virtual void setNeedsBoundariesUpdate(); | |
469 | |
470 bool isBlendingAllowed() const { return !isSVG() || (isSVGContainer() && !is
SVGHiddenContainer()) || isSVGShape() || isSVGImage() || isSVGText(); } | |
471 virtual bool hasNonIsolatedBlendingDescendants() const { return false; } | |
472 enum DescendantIsolationState { | |
473 DescendantIsolationRequired, | |
474 DescendantIsolationNeedsUpdate, | |
475 }; | |
476 virtual void descendantIsolationRequirementsChanged(DescendantIsolationState
) { } | |
477 | |
478 // Per SVG 1.1 objectBoundingBox ignores clipping, masking, filter effects,
opacity and stroke-width. | |
479 // This is used for all computation of objectBoundingBox relative units and
by SVGLocatable::getBBox(). | |
480 // NOTE: Markers are not specifically ignored here by SVG 1.1 spec, but we i
gnore them | |
481 // since stroke-width is ignored (and marker size can depend on stroke-width
). | |
482 // objectBoundingBox is returned local coordinates. | |
483 // The name objectBoundingBox is taken from the SVG 1.1 spec. | |
484 virtual FloatRect objectBoundingBox() const; | |
485 virtual FloatRect strokeBoundingBox() const; | |
486 | |
487 // Returns the smallest rectangle enclosing all of the painted content | |
488 // respecting clipping, masking, filters, opacity, stroke-width and markers | |
489 virtual FloatRect paintInvalidationRectInLocalCoordinates() const; | |
490 | |
491 // This only returns the transform="" value from the element | |
492 // most callsites want localToParentTransform() instead. | |
493 virtual AffineTransform localTransform() const; | |
494 | |
495 // Returns the full transform mapping from local coordinates to local coords
for the parent SVG renderer | |
496 // This includes any viewport transforms and x/y offsets as well as the tran
sform="" value off the element. | |
497 virtual const AffineTransform& localToParentTransform() const; | |
498 | |
499 // SVG uses FloatPoint precise hit testing, and passes the point in parent | |
500 // coordinates instead of in paint invalidaiton container coordinates. Event
ually the | |
501 // rest of the rendering tree will move to a similar model. | |
502 virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const F
loatPoint& pointInParent, HitTestAction); | |
503 | |
504 bool isAnonymous() const { return m_bitfields.isAnonymous(); } | |
505 bool isAnonymousBlock() const | |
506 { | |
507 // This function is kept in sync with anonymous block creation condition
s in | |
508 // RenderBlock::createAnonymousBlock(). This includes creating an anonym
ous | |
509 // RenderBlock having a BLOCK or BOX display. Other classes such as Rend
erTextFragment | |
510 // are not RenderBlocks and will return false. See https://bugs.webkit.o
rg/show_bug.cgi?id=56709. | |
511 return isAnonymous() && (style()->display() == BLOCK || style()->display
() == BOX) && style()->styleType() == NOPSEUDO && isRenderBlock() && !isListMark
er() && !isRenderFlowThread() && !isRenderMultiColumnSet() | |
512 && !isRenderFullScreen() | |
513 && !isRenderFullScreenPlaceholder(); | |
514 } | |
515 bool isAnonymousColumnsBlock() const { return style()->specifiesColumns() &&
isAnonymousBlock(); } | |
516 bool isAnonymousColumnSpanBlock() const { return style()->columnSpan() && is
AnonymousBlock(); } | |
517 bool isElementContinuation() const { return node() && node()->renderer() !=
this; } | |
518 bool isInlineElementContinuation() const { return isElementContinuation() &&
isInline(); } | |
519 virtual RenderBoxModelObject* virtualContinuation() const { return 0; } | |
520 | |
521 bool isFloating() const { return m_bitfields.floating(); } | |
522 | |
523 bool isOutOfFlowPositioned() const { return m_bitfields.isOutOfFlowPositione
d(); } // absolute or fixed positioning | |
524 bool isRelPositioned() const { return m_bitfields.isRelPositioned(); } // re
lative positioning | |
525 bool isPositioned() const { return m_bitfields.isPositioned(); } | |
526 | |
527 bool isText() const { return m_bitfields.isText(); } | |
528 bool isBox() const { return m_bitfields.isBox(); } | |
529 bool isInline() const { return m_bitfields.isInline(); } // inline object | |
530 bool isDragging() const { return m_bitfields.isDragging(); } | |
531 bool isReplaced() const { return m_bitfields.isReplaced(); } // a "replaced"
element (see CSS) | |
532 bool isHorizontalWritingMode() const { return m_bitfields.horizontalWritingM
ode(); } | |
533 bool hasFlippedBlocksWritingMode() const | |
534 { | |
535 return style()->isFlippedBlocksWritingMode(); | |
536 } | |
537 | |
538 bool hasLayer() const { return m_bitfields.hasLayer(); } | |
539 | |
540 // "Box decoration background" includes all box decorations and backgrounds | |
541 // that are painted as the background of the object. It includes borders, | |
542 // box-shadows, background-color and background-image, etc. | |
543 enum BoxDecorationBackgroundState { | |
544 NoBoxDecorationBackground, | |
545 HasBoxDecorationBackgroundObscurationStatusInvalid, | |
546 HasBoxDecorationBackgroundKnownToBeObscured, | |
547 HasBoxDecorationBackgroundMayBeVisible, | |
548 }; | |
549 bool hasBoxDecorationBackground() const { return m_bitfields.boxDecorationBa
ckgroundState() != NoBoxDecorationBackground; } | |
550 bool boxDecorationBackgroundIsKnownToBeObscured(); | |
551 bool canRenderBorderImage() const; | |
552 bool mustInvalidateBackgroundOrBorderPaintOnWidthChange() const; | |
553 bool mustInvalidateBackgroundOrBorderPaintOnHeightChange() const; | |
554 bool mustInvalidateFillLayersPaintOnWidthChange(const FillLayer&) const; | |
555 bool mustInvalidateFillLayersPaintOnHeightChange(const FillLayer&) const; | |
556 bool hasBackground() const { return style()->hasBackground(); } | |
557 bool hasEntirelyFixedBackground() const; | |
558 | |
559 bool needsLayoutBecauseOfChildren() const { return needsLayout() && !selfNee
dsLayout() && !needsPositionedMovementLayout() && !needsSimplifiedNormalFlowLayo
ut(); } | |
560 | |
561 bool needsLayout() const | |
562 { | |
563 return m_bitfields.selfNeedsLayout() || m_bitfields.normalChildNeedsLayo
ut() || m_bitfields.posChildNeedsLayout() | |
564 || m_bitfields.needsSimplifiedNormalFlowLayout() || m_bitfields.need
sPositionedMovementLayout(); | |
565 } | |
566 | |
567 bool selfNeedsLayout() const { return m_bitfields.selfNeedsLayout(); } | |
568 bool needsPositionedMovementLayout() const { return m_bitfields.needsPositio
nedMovementLayout(); } | |
569 bool needsPositionedMovementLayoutOnly() const | |
570 { | |
571 return m_bitfields.needsPositionedMovementLayout() && !m_bitfields.selfN
eedsLayout() && !m_bitfields.normalChildNeedsLayout() | |
572 && !m_bitfields.posChildNeedsLayout() && !m_bitfields.needsSimplifie
dNormalFlowLayout(); | |
573 } | |
574 | |
575 bool posChildNeedsLayout() const { return m_bitfields.posChildNeedsLayout();
} | |
576 bool needsSimplifiedNormalFlowLayout() const { return m_bitfields.needsSimpl
ifiedNormalFlowLayout(); } | |
577 bool normalChildNeedsLayout() const { return m_bitfields.normalChildNeedsLay
out(); } | |
578 | |
579 bool preferredLogicalWidthsDirty() const { return m_bitfields.preferredLogic
alWidthsDirty(); } | |
580 | |
581 bool needsOverflowRecalcAfterStyleChange() const { return m_bitfields.selfNe
edsOverflowRecalcAfterStyleChange() || m_bitfields.childNeedsOverflowRecalcAfter
StyleChange(); } | |
582 bool selfNeedsOverflowRecalcAfterStyleChange() const { return m_bitfields.se
lfNeedsOverflowRecalcAfterStyleChange(); } | |
583 bool childNeedsOverflowRecalcAfterStyleChange() const { return m_bitfields.c
hildNeedsOverflowRecalcAfterStyleChange(); } | |
584 | |
585 bool isSelectionBorder() const; | |
586 | |
587 bool hasClip() const { return isOutOfFlowPositioned() && !style()->hasAutoCl
ip(); } | |
588 bool hasOverflowClip() const { return m_bitfields.hasOverflowClip(); } | |
589 bool hasClipOrOverflowClip() const { return hasClip() || hasOverflowClip();
} | |
590 | |
591 bool hasTransformRelatedProperty() const { return m_bitfields.hasTransformRe
latedProperty(); } | |
592 bool hasMask() const { return style() && style()->hasMask(); } | |
593 bool hasClipPath() const { return style() && style()->clipPath(); } | |
594 bool hasHiddenBackface() const { return style() && style()->backfaceVisibili
ty() == BackfaceVisibilityHidden; } | |
595 | |
596 bool hasFilter() const { return style() && style()->hasFilter(); } | |
597 | |
598 bool hasShapeOutside() const { return style() && style()->shapeOutside(); } | |
599 | |
600 inline bool preservesNewline() const; | |
601 | |
602 // The pseudo element style can be cached or uncached. Use the cached metho
d if the pseudo element doesn't respect | |
603 // any pseudo classes (and therefore has no concept of changing state). | |
604 RenderStyle* getCachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0) co
nst; | |
605 PassRefPtr<RenderStyle> getUncachedPseudoStyle(const PseudoStyleRequest&, Re
nderStyle* parentStyle = 0, RenderStyle* ownStyle = 0) const; | |
606 | |
607 virtual void updateDragState(bool dragOn); | |
608 | |
609 RenderView* view() const { return document().renderView(); }; | |
610 FrameView* frameView() const { return document().view(); }; | |
611 | |
612 bool isRooted() const; | |
613 | |
614 Node* node() const | |
615 { | |
616 return isAnonymous() ? 0 : m_node; | |
617 } | |
618 | |
619 Node* nonPseudoNode() const | |
620 { | |
621 return isPseudoElement() ? 0 : node(); | |
622 } | |
623 | |
624 // FIXME: Why does RenderPart need this? crbug.com/422457 | |
625 void clearNode() { m_node = nullptr; } | |
626 | |
627 // Returns the styled node that caused the generation of this renderer. | |
628 // This is the same as node() except for renderers of :before, :after and | |
629 // :first-letter pseudo elements for which their parent node is returned. | |
630 Node* generatingNode() const { return isPseudoElement() ? node()->parentOrSh
adowHostNode() : node(); } | |
631 | |
632 Document& document() const { return m_node->document(); } | |
633 LocalFrame* frame() const { return document().frame(); } | |
634 | |
635 virtual RenderMultiColumnSpannerPlaceholder* spannerPlaceholder() const { re
turn 0; } | |
636 bool isColumnSpanAll() const { return style()->columnSpan() == ColumnSpanAll
&& spannerPlaceholder(); } | |
637 | |
638 // Returns the object containing this one. Can be different from parent for
positioned elements. | |
639 // If paintInvalidationContainer and paintInvalidationContainerSkipped are n
ot null, on return *paintInvalidationContainerSkipped | |
640 // is true if the renderer returned is an ancestor of paintInvalidationConta
iner. | |
641 RenderObject* container(const LayoutLayerModelObject* paintInvalidationConta
iner = 0, bool* paintInvalidationContainerSkipped = 0) const; | |
642 RenderBlock* containerForFixedPosition(const LayoutLayerModelObject* paintIn
validationContainer = 0, bool* paintInvalidationContainerSkipped = 0) const; | |
643 | |
644 virtual RenderObject* hoverAncestor() const { return parent(); } | |
645 | |
646 Element* offsetParent() const; | |
647 | |
648 void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderObjec
t* newRoot = 0, SubtreeLayoutScope* = 0); | |
649 void setNeedsLayout(MarkingBehavior = MarkContainingBlockChain, SubtreeLayou
tScope* = 0); | |
650 void setNeedsLayoutAndFullPaintInvalidation(MarkingBehavior = MarkContaining
BlockChain, SubtreeLayoutScope* = 0); | |
651 void clearNeedsLayout(); | |
652 void setChildNeedsLayout(MarkingBehavior = MarkContainingBlockChain, Subtree
LayoutScope* = 0); | |
653 void setNeedsPositionedMovementLayout(); | |
654 void setPreferredLogicalWidthsDirty(MarkingBehavior = MarkContainingBlockCha
in); | |
655 void clearPreferredLogicalWidthsDirty(); | |
656 void invalidateContainerPreferredLogicalWidths(); | |
657 | |
658 void setNeedsLayoutAndPrefWidthsRecalc() | |
659 { | |
660 setNeedsLayout(); | |
661 setPreferredLogicalWidthsDirty(); | |
662 } | |
663 void setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation() | |
664 { | |
665 setNeedsLayoutAndFullPaintInvalidation(); | |
666 setPreferredLogicalWidthsDirty(); | |
667 } | |
668 | |
669 void setPositionState(EPosition position) | |
670 { | |
671 ASSERT((position != AbsolutePosition && position != FixedPosition) || is
Box()); | |
672 m_bitfields.setPositionedState(position); | |
673 } | |
674 void clearPositionedState() { m_bitfields.clearPositionedState(); } | |
675 | |
676 void setFloating(bool isFloating) { m_bitfields.setFloating(isFloating); } | |
677 void setInline(bool isInline) { m_bitfields.setIsInline(isInline); } | |
678 | |
679 void setHasBoxDecorationBackground(bool); | |
680 void invalidateBackgroundObscurationStatus(); | |
681 virtual bool computeBackgroundIsKnownToBeObscured() { return false; } | |
682 | |
683 void setIsText() { m_bitfields.setIsText(true); } | |
684 void setIsBox() { m_bitfields.setIsBox(true); } | |
685 void setReplaced(bool isReplaced) { m_bitfields.setIsReplaced(isReplaced); } | |
686 void setHorizontalWritingMode(bool hasHorizontalWritingMode) { m_bitfields.s
etHorizontalWritingMode(hasHorizontalWritingMode); } | |
687 void setHasOverflowClip(bool hasOverflowClip) { m_bitfields.setHasOverflowCl
ip(hasOverflowClip); } | |
688 void setHasLayer(bool hasLayer) { m_bitfields.setHasLayer(hasLayer); } | |
689 void setHasTransformRelatedProperty(bool hasTransform) { m_bitfields.setHasT
ransformRelatedProperty(hasTransform); } | |
690 void setHasReflection(bool hasReflection) { m_bitfields.setHasReflection(has
Reflection); } | |
691 | |
692 void scheduleRelayout(); | |
693 | |
694 void updateFillImages(const FillLayer* oldLayers, const FillLayer& newLayers
); | |
695 void updateImage(StyleImage*, StyleImage*); | |
696 void updateShapeImage(const ShapeValue*, const ShapeValue*); | |
697 | |
698 // paintOffset is the offset from the origin of the GraphicsContext at which
to paint the current object. | |
699 virtual void paint(const PaintInfo&, const LayoutPoint& paintOffset); | |
700 | |
701 // Subclasses must reimplement this method to compute the size and position | |
702 // of this object and all its descendants. | |
703 virtual void layout() = 0; | |
704 virtual bool updateImageLoadingPriorities() { return false; } | |
705 void setHasPendingResourceUpdate(bool hasPendingResourceUpdate) { m_bitfield
s.setHasPendingResourceUpdate(hasPendingResourceUpdate); } | |
706 bool hasPendingResourceUpdate() const { return m_bitfields.hasPendingResourc
eUpdate(); } | |
707 | |
708 /* This function performs a layout only if one is needed. */ | |
709 void layoutIfNeeded() { if (needsLayout()) layout(); } | |
710 | |
711 void forceLayout(); | |
712 void forceChildLayout(); | |
713 | |
714 // Used for element state updates that cannot be fixed with a | |
715 // paint invalidation and do not need a relayout. | |
716 virtual void updateFromElement() { } | |
717 | |
718 virtual void addAnnotatedRegions(Vector<AnnotatedRegionValue>&); | |
719 void collectAnnotatedRegions(Vector<AnnotatedRegionValue>&); | |
720 | |
721 CompositingState compositingState() const; | |
722 virtual CompositingReasons additionalCompositingReasons() const; | |
723 | |
724 bool hitTest(const HitTestRequest&, HitTestResult&, const HitTestLocation& l
ocationInContainer, const LayoutPoint& accumulatedOffset, HitTestFilter = HitTes
tAll); | |
725 virtual void updateHitTestResult(HitTestResult&, const LayoutPoint&); | |
726 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTes
tLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAct
ion); | |
727 | |
728 virtual PositionWithAffinity positionForPoint(const LayoutPoint&); | |
729 PositionWithAffinity createPositionWithAffinity(int offset, EAffinity); | |
730 PositionWithAffinity createPositionWithAffinity(const Position&); | |
731 | |
732 virtual void dirtyLinesFromChangedChild(RenderObject*); | |
733 | |
734 // Set the style of the object and update the state of the object accordingl
y. | |
735 void setStyle(PassRefPtr<RenderStyle>); | |
736 | |
737 // Set the style of the object if it's generated content. | |
738 void setPseudoStyle(PassRefPtr<RenderStyle>); | |
739 | |
740 // Updates only the local style ptr of the object. Does not update the stat
e of the object, | |
741 // and so only should be called when the style is known not to have changed
(or from setStyle). | |
742 void setStyleInternal(PassRefPtr<RenderStyle> style) { m_style = style; } | |
743 | |
744 // returns the containing block level element for this element. | |
745 RenderBlock* containingBlock() const; | |
746 | |
747 bool canContainFixedPositionObjects() const | |
748 { | |
749 return isRenderView() || (hasTransformRelatedProperty() && isRenderBlock
()) || isSVGForeignObject(); | |
750 } | |
751 | |
752 // Convert the given local point to absolute coordinates | |
753 // FIXME: Temporary. If UseTransforms is true, take transforms into account.
Eventually localToAbsolute() will always be transform-aware. | |
754 FloatPoint localToAbsolute(const FloatPoint& localPoint = FloatPoint(), MapC
oordinatesFlags = 0) const; | |
755 FloatPoint absoluteToLocal(const FloatPoint&, MapCoordinatesFlags = 0) const
; | |
756 | |
757 // Convert a local quad to absolute coordinates, taking transforms into acco
unt. | |
758 FloatQuad localToAbsoluteQuad(const FloatQuad& quad, MapCoordinatesFlags mod
e = 0, bool* wasFixed = 0) const | |
759 { | |
760 return localToContainerQuad(quad, 0, mode, wasFixed); | |
761 } | |
762 // Convert an absolute quad to local coordinates. | |
763 FloatQuad absoluteToLocalQuad(const FloatQuad&, MapCoordinatesFlags mode = 0
) const; | |
764 | |
765 // Convert a local quad into the coordinate system of container, taking tran
sforms into account. | |
766 FloatQuad localToContainerQuad(const FloatQuad&, const LayoutLayerModelObjec
t* paintInvalidatinoContainer, MapCoordinatesFlags = 0, bool* wasFixed = 0) cons
t; | |
767 FloatPoint localToContainerPoint(const FloatPoint&, const LayoutLayerModelOb
ject* paintInvalidationContainer, MapCoordinatesFlags = 0, bool* wasFixed = 0, c
onst PaintInvalidationState* = 0) const; | |
768 | |
769 // Convert a local point into the coordinate system of backing coordinates.
Also returns the backing layer if needed. | |
770 FloatPoint localToInvalidationBackingPoint(const LayoutPoint&, Layer** backi
ngLayer = nullptr); | |
771 | |
772 // Return the offset from the container() renderer (excluding transforms). I
n multi-column layout, | |
773 // different offsets apply at different points, so return the offset that ap
plies to the given point. | |
774 virtual LayoutSize offsetFromContainer(const RenderObject*, const LayoutPoin
t&, bool* offsetDependsOnPoint = 0) const; | |
775 // Return the offset from an object up the container() chain. Asserts that n
one of the intermediate objects have transforms. | |
776 LayoutSize offsetFromAncestorContainer(const RenderObject*) const; | |
777 | |
778 virtual void absoluteRects(Vector<IntRect>&, const LayoutPoint&) const { } | |
779 | |
780 IntRect absoluteBoundingBoxRect() const; | |
781 // FIXME: This function should go away eventually | |
782 IntRect absoluteBoundingBoxRectIgnoringTransforms() const; | |
783 | |
784 // Build an array of quads in absolute coords for line boxes | |
785 virtual void absoluteQuads(Vector<FloatQuad>&, bool* /*wasFixed*/ = 0) const
{ } | |
786 | |
787 virtual IntRect absoluteFocusRingBoundingBoxRect() const; | |
788 | |
789 static FloatRect absoluteBoundingBoxRectForRange(const Range*); | |
790 | |
791 // the rect that will be painted if this object is passed as the paintingRoo
t | |
792 LayoutRect paintingRootRect(LayoutRect& topLevelRect); | |
793 | |
794 virtual LayoutUnit minPreferredLogicalWidth() const { return 0; } | |
795 virtual LayoutUnit maxPreferredLogicalWidth() const { return 0; } | |
796 | |
797 RenderStyle* style() const { return m_style.get(); } | |
798 | |
799 // m_style can only be nullptr before the first style is set, thus most | |
800 // callers will never see a nullptr style and should use styleRef(). | |
801 // FIXME: It would be better if style() returned a const reference. | |
802 const RenderStyle& styleRef() const { return mutableStyleRef(); } | |
803 RenderStyle& mutableStyleRef() const { ASSERT(m_style); return *m_style; } | |
804 | |
805 /* The following methods are inlined in RenderObjectInlines.h */ | |
806 RenderStyle* firstLineStyle() const; | |
807 RenderStyle* style(bool firstLine) const; | |
808 const RenderStyle& styleRef(bool firstLine) const; | |
809 | |
810 static inline Color resolveColor(const RenderStyle& styleToUse, int colorPro
perty) | |
811 { | |
812 return styleToUse.visitedDependentColor(colorProperty); | |
813 } | |
814 | |
815 inline Color resolveColor(int colorProperty) const | |
816 { | |
817 return style()->visitedDependentColor(colorProperty); | |
818 } | |
819 | |
820 // Used only by Element::pseudoStyleCacheIsInvalid to get a first line style
based off of a | |
821 // given new style, without accessing the cache. | |
822 PassRefPtr<RenderStyle> uncachedFirstLineStyle(RenderStyle*) const; | |
823 | |
824 virtual CursorDirective getCursor(const LayoutPoint&, Cursor&) const; | |
825 | |
826 struct AppliedTextDecoration { | |
827 Color color; | |
828 TextDecorationStyle style; | |
829 AppliedTextDecoration() : color(Color::transparent), style(TextDecoratio
nStyleSolid) { } | |
830 }; | |
831 | |
832 void getTextDecorations(unsigned decorations, AppliedTextDecoration& underli
ne, AppliedTextDecoration& overline, AppliedTextDecoration& linethrough, bool qu
irksMode = false, bool firstlineStyle = false); | |
833 | |
834 // Return the LayoutLayerModelObject in the container chain which is respons
ible for painting this object, or 0 | |
835 // if painting is root-relative. This is the container that should be passed
to the 'forPaintInvalidation' | |
836 // methods. | |
837 const LayoutLayerModelObject* containerForPaintInvalidation() const; | |
838 const LayoutLayerModelObject* adjustCompositedContainerForSpecialAncestors(c
onst LayoutLayerModelObject* paintInvalidationContainer) const; | |
839 bool isPaintInvalidationContainer() const; | |
840 | |
841 LayoutRect computePaintInvalidationRect() | |
842 { | |
843 return computePaintInvalidationRect(containerForPaintInvalidation()); | |
844 } | |
845 | |
846 // Returns the paint invalidation rect for this RenderObject in the coordina
te space of the paint backing (typically a GraphicsLayer) for |paintInvalidation
Container|. | |
847 LayoutRect computePaintInvalidationRect(const LayoutLayerModelObject* paintI
nvalidationContainer, const PaintInvalidationState* = 0) const; | |
848 | |
849 // Returns the rect bounds needed to invalidate the paint of this object, in
the coordinate space of the rendering backing of |paintInvalidationContainer| | |
850 LayoutRect boundsRectForPaintInvalidation(const LayoutLayerModelObject* pain
tInvalidationContainer, const PaintInvalidationState* = 0) const; | |
851 | |
852 // Actually do the paint invalidate of rect r for this object which has been
computed in the coordinate space | |
853 // of the GraphicsLayer backing of |paintInvalidationContainer|. Note that t
his coordinaten space is not the same | |
854 // as the local coordinate space of |paintInvalidationContainer| in the pres
ence of layer squashing. | |
855 // If |paintInvalidationContainer| is 0, invalidate paints via the view. | |
856 // FIXME: |paintInvalidationContainer| should never be 0. See crbug.com/3636
99. | |
857 void invalidatePaintUsingContainer(const LayoutLayerModelObject* paintInvali
dationContainer, const LayoutRect&, PaintInvalidationReason) const; | |
858 | |
859 // Invalidate the paint of a specific subrectangle within a given object. Th
e rect |r| is in the object's coordinate space. | |
860 void invalidatePaintRectangle(const LayoutRect&) const; | |
861 | |
862 void invalidateSelectionIfNeeded(const LayoutLayerModelObject&, PaintInvalid
ationReason); | |
863 | |
864 // Walk the tree after layout issuing paint invalidations for renderers that
have changed or moved, updating bounds that have changed, and clearing paint in
validation state. | |
865 virtual void invalidateTreeIfNeeded(const PaintInvalidationState&); | |
866 | |
867 virtual void invalidatePaintForOverflow(); | |
868 void invalidatePaintForOverflowIfNeeded(); | |
869 | |
870 void invalidatePaintIncludingNonCompositingDescendants(); | |
871 | |
872 // Returns the rect that should have paint invalidated whenever this object
changes. The rect is in the view's | |
873 // coordinate space. This method deals with outlines and overflow. | |
874 virtual LayoutRect absoluteClippedOverflowRect() const; | |
875 virtual LayoutRect clippedOverflowRectForPaintInvalidation(const LayoutLayer
ModelObject* paintInvalidationContainer, const PaintInvalidationState* = 0) cons
t; | |
876 virtual LayoutRect rectWithOutlineForPaintInvalidation(const LayoutLayerMode
lObject* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInvalid
ationState* = 0) const; | |
877 | |
878 // Given a rect in the object's coordinate space, compute a rect suitable fo
r invalidating paints of | |
879 // that rect in the coordinate space of paintInvalidationContainer. | |
880 virtual void mapRectToPaintInvalidationBacking(const LayoutLayerModelObject*
paintInvalidationContainer, LayoutRect&, const PaintInvalidationState*) const; | |
881 | |
882 // Return the offset to the column in which the specified point (in flow-thr
ead coordinates) | |
883 // lives. This is used to convert a flow-thread point to a visual point. | |
884 virtual LayoutSize columnOffset(const LayoutPoint&) const { return LayoutSiz
e(); } | |
885 | |
886 virtual unsigned length() const { return 1; } | |
887 | |
888 bool isFloatingOrOutOfFlowPositioned() const { return (isFloating() || isOut
OfFlowPositioned()); } | |
889 | |
890 bool isTransparent() const { return style()->hasOpacity(); } | |
891 float opacity() const { return style()->opacity(); } | |
892 | |
893 bool hasReflection() const { return m_bitfields.hasReflection(); } | |
894 | |
895 enum SelectionState { | |
896 SelectionNone, // The object is not selected. | |
897 SelectionStart, // The object either contains the start of a selection r
un or is the start of a run | |
898 SelectionInside, // The object is fully encompassed by a selection run | |
899 SelectionEnd, // The object either contains the end of a selection run o
r is the end of a run | |
900 SelectionBoth // The object contains an entire run or is the sole select
ed object in that run | |
901 }; | |
902 | |
903 // The current selection state for an object. For blocks, the state refers
to the state of the leaf | |
904 // descendants (as described above in the SelectionState enum declaration). | |
905 SelectionState selectionState() const { return m_bitfields.selectionState();
} | |
906 virtual void setSelectionState(SelectionState state) { m_bitfields.setSelect
ionState(state); } | |
907 inline void setSelectionStateIfNeeded(SelectionState); | |
908 bool canUpdateSelectionOnRootLineBoxes() const; | |
909 | |
910 // A single rectangle that encompasses all of the selected objects within th
is object. Used to determine the tightest | |
911 // possible bounding box for the selection. The rect returned is in the coor
dinate space of the paint invalidation container's backing. | |
912 virtual LayoutRect selectionRectForPaintInvalidation(const LayoutLayerModelO
bject* /*paintInvalidationContainer*/) const { return LayoutRect(); } | |
913 | |
914 virtual bool canBeSelectionLeaf() const { return false; } | |
915 bool hasSelectedChildren() const { return selectionState() != SelectionNone;
} | |
916 | |
917 bool isSelectable() const; | |
918 // Obtains the selection colors that should be used when painting a selectio
n. | |
919 Color selectionBackgroundColor() const; | |
920 Color selectionForegroundColor() const; | |
921 Color selectionEmphasisMarkColor() const; | |
922 | |
923 // Whether or not a given block needs to paint selection gaps. | |
924 virtual bool shouldPaintSelectionGaps() const { return false; } | |
925 | |
926 /** | |
927 * Returns the local coordinates of the caret within this render object. | |
928 * @param caretOffset zero-based offset determining position within the rend
er object. | |
929 * @param extraWidthToEndOfLine optional out arg to give extra width to end
of line - | |
930 * useful for character range rect computations | |
931 */ | |
932 virtual LayoutRect localCaretRect(InlineBox*, int caretOffset, LayoutUnit* e
xtraWidthToEndOfLine = 0); | |
933 | |
934 // When performing a global document tear-down, the renderer of the document
is cleared. We use this | |
935 // as a hook to detect the case of document destruction and don't waste time
doing unnecessary work. | |
936 bool documentBeingDestroyed() const; | |
937 | |
938 void destroyAndCleanupAnonymousWrappers(); | |
939 virtual void destroy(); | |
940 | |
941 // Virtual function helpers for the deprecated Flexible Box Layout (display:
-webkit-box). | |
942 virtual bool isDeprecatedFlexibleBox() const { return false; } | |
943 | |
944 // Virtual function helper for the new FlexibleBox Layout (display: -webkit-
flex). | |
945 virtual bool isFlexibleBox() const { return false; } | |
946 | |
947 bool isFlexibleBoxIncludingDeprecated() const | |
948 { | |
949 return isFlexibleBox() || isDeprecatedFlexibleBox(); | |
950 } | |
951 | |
952 virtual bool isCombineText() const { return false; } | |
953 | |
954 virtual int caretMinOffset() const; | |
955 virtual int caretMaxOffset() const; | |
956 | |
957 virtual int previousOffset(int current) const; | |
958 virtual int previousOffsetForBackwardDeletion(int current) const; | |
959 virtual int nextOffset(int current) const; | |
960 | |
961 virtual void imageChanged(ImageResource*, const IntRect* = 0) override final
; | |
962 virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) { } | |
963 virtual bool willRenderImage(ImageResource*) override final; | |
964 virtual bool getImageAnimationPolicy(ImageResource*, ImageAnimationPolicy&)
override final; | |
965 | |
966 void selectionStartEnd(int& spos, int& epos) const; | |
967 | |
968 void remove() { if (parent()) parent()->removeChild(this); } | |
969 | |
970 bool isInert() const; | |
971 | |
972 bool supportsTouchAction() const; | |
973 | |
974 bool visibleToHitTestRequest(const HitTestRequest& request) const { return s
tyle()->visibility() == VISIBLE && (request.ignorePointerEventsNone() || style()
->pointerEvents() != PE_NONE) && !isInert(); } | |
975 | |
976 bool visibleToHitTesting() const { return style()->visibility() == VISIBLE &
& style()->pointerEvents() != PE_NONE && !isInert(); } | |
977 | |
978 // Map points and quads through elements, potentially via 3d transforms. You
should never need to call these directly; use | |
979 // localToAbsolute/absoluteToLocal methods instead. | |
980 virtual void mapLocalToContainer(const LayoutLayerModelObject* paintInvalida
tionContainer, TransformState&, MapCoordinatesFlags = ApplyContainerFlip, bool*
wasFixed = 0, const PaintInvalidationState* = 0) const; | |
981 virtual void mapAbsoluteToLocalPoint(MapCoordinatesFlags, TransformState&) c
onst; | |
982 | |
983 // Pushes state onto RenderGeometryMap about how to map coordinates from thi
s renderer to its container, or ancestorToStopAt (whichever is encountered first
). | |
984 // Returns the renderer which was mapped to (container or ancestorToStopAt). | |
985 virtual const RenderObject* pushMappingToContainer(const LayoutLayerModelObj
ect* ancestorToStopAt, RenderGeometryMap&) const; | |
986 | |
987 bool shouldUseTransformFromContainer(const RenderObject* container) const; | |
988 void getTransformFromContainer(const RenderObject* container, const LayoutSi
ze& offsetInContainer, TransformationMatrix&) const; | |
989 | |
990 bool createsGroup() const { return isTransparent() || hasMask() || hasFilter
() || style()->hasBlendMode(); } | |
991 | |
992 virtual void addFocusRingRects(Vector<LayoutRect>&, const LayoutPoint& addit
ionalOffset) const { } | |
993 | |
994 // Compute a list of hit-test rectangles per layer rooted at this renderer. | |
995 virtual void computeLayerHitTestRects(LayerHitTestRects&) const; | |
996 | |
997 // Return the renderer whose background style is used to paint the root back
ground. Should only be called on the renderer for which isDocumentElement() is t
rue. | |
998 RenderObject* rendererForRootBackground(); | |
999 | |
1000 RespectImageOrientationEnum shouldRespectImageOrientation() const; | |
1001 | |
1002 bool isRelayoutBoundaryForInspector() const; | |
1003 | |
1004 // The previous paint invalidation rect in the object's previous paint backi
ng. | |
1005 const LayoutRect& previousPaintInvalidationRect() const { return m_previousP
aintInvalidationRect; } | |
1006 void setPreviousPaintInvalidationRect(const LayoutRect& rect) { m_previousPa
intInvalidationRect = rect; } | |
1007 | |
1008 // The previous position of the top-left corner of the object in its previou
s paint backing. | |
1009 const LayoutPoint& previousPositionFromPaintInvalidationBacking() const { re
turn m_previousPositionFromPaintInvalidationBacking; } | |
1010 void setPreviousPositionFromPaintInvalidationBacking(const LayoutPoint& posi
tionFromPaintInvalidationBacking) { m_previousPositionFromPaintInvalidationBacki
ng = positionFromPaintInvalidationBacking; } | |
1011 | |
1012 bool shouldDoFullPaintInvalidation() const { return m_bitfields.fullPaintInv
alidationReason() != PaintInvalidationNone; } | |
1013 void setShouldDoFullPaintInvalidation(PaintInvalidationReason = PaintInvalid
ationFull); | |
1014 void clearShouldDoFullPaintInvalidation() { m_bitfields.setFullPaintInvalida
tionReason(PaintInvalidationNone); } | |
1015 | |
1016 bool shouldInvalidateOverflowForPaint() const { return m_bitfields.shouldInv
alidateOverflowForPaint(); } | |
1017 | |
1018 virtual void clearPaintInvalidationState(const PaintInvalidationState&); | |
1019 | |
1020 // Indicates whether this render object was re-laid-out since the last frame
. | |
1021 // The flag will be cleared during invalidateTreeIfNeeded. | |
1022 bool layoutDidGetCalledSinceLastFrame() const { return m_bitfields.layoutDid
GetCalledSinceLastFrame(); } | |
1023 | |
1024 bool mayNeedPaintInvalidation() const { return m_bitfields.mayNeedPaintInval
idation(); } | |
1025 void setMayNeedPaintInvalidation(); | |
1026 void clearMayNeedPaintInvalidation(); | |
1027 | |
1028 bool shouldInvalidateSelection() const { return m_bitfields.shouldInvalidate
Selection(); } | |
1029 void setShouldInvalidateSelection() | |
1030 { | |
1031 if (!canUpdateSelectionOnRootLineBoxes()) | |
1032 return; | |
1033 | |
1034 m_bitfields.setShouldInvalidateSelection(true); | |
1035 markContainingBlockChainForPaintInvalidation(); | |
1036 } | |
1037 void clearShouldInvalidateSelection() { m_bitfields.setShouldInvalidateSelec
tion(false); } | |
1038 | |
1039 bool neededLayoutBecauseOfChildren() const { return m_bitfields.neededLayout
BecauseOfChildren(); } | |
1040 void setNeededLayoutBecauseOfChildren(bool b) { m_bitfields.setNeededLayoutB
ecauseOfChildren(b); } | |
1041 | |
1042 bool shouldCheckForPaintInvalidation(const PaintInvalidationState& paintInva
lidationState) const | |
1043 { | |
1044 return paintInvalidationState.forceCheckForPaintInvalidation() || should
CheckForPaintInvalidationRegardlessOfPaintInvalidationState(); | |
1045 } | |
1046 | |
1047 bool shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() con
st | |
1048 { | |
1049 return layoutDidGetCalledSinceLastFrame() || mayNeedPaintInvalidation()
|| shouldDoFullPaintInvalidation() || shouldInvalidateSelection(); | |
1050 } | |
1051 | |
1052 virtual bool supportsPaintInvalidationStateCachedOffsets() const { return !h
asColumns() && !hasTransformRelatedProperty() && !hasReflection() && !style()->i
sFlippedBlocksWritingMode(); } | |
1053 | |
1054 void setNeedsOverflowRecalcAfterStyleChange(); | |
1055 void markContainingBlocksForOverflowRecalc(); | |
1056 | |
1057 virtual LayoutRect viewRect() const; | |
1058 | |
1059 DisplayItemClient displayItemClient() const { return toDisplayItemClient(thi
s); } | |
1060 | |
1061 protected: | |
1062 enum RenderObjectType { | |
1063 RenderObjectBr, | |
1064 RenderObjectCanvas, | |
1065 RenderObjectFieldset, | |
1066 RenderObjectCounter, | |
1067 RenderObjectDetailsMarker, | |
1068 RenderObjectEmbeddedObject, | |
1069 RenderObjectFileUploadControl, | |
1070 RenderObjectFrame, | |
1071 RenderObjectFrameSet, | |
1072 RenderObjectLayoutTableCol, | |
1073 RenderObjectListBox, | |
1074 RenderObjectListItem, | |
1075 RenderObjectListMarker, | |
1076 RenderObjectMedia, | |
1077 RenderObjectMenuList, | |
1078 RenderObjectMeter, | |
1079 RenderObjectProgress, | |
1080 RenderObjectQuote, | |
1081 RenderObjectRenderButton, | |
1082 RenderObjectRenderFlowThread, | |
1083 RenderObjectRenderFullScreen, | |
1084 RenderObjectRenderFullScreenPlaceholder, | |
1085 RenderObjectRenderGrid, | |
1086 RenderObjectRenderIFrame, | |
1087 RenderObjectRenderImage, | |
1088 RenderObjectRenderInline, | |
1089 RenderObjectRenderMultiColumnSet, | |
1090 RenderObjectRenderMultiColumnSpannerPlaceholder, | |
1091 RenderObjectRenderPart, | |
1092 RenderObjectRenderRegion, | |
1093 RenderObjectRenderScrollbarPart, | |
1094 RenderObjectRenderView, | |
1095 RenderObjectReplica, | |
1096 RenderObjectRuby, | |
1097 RenderObjectRubyBase, | |
1098 RenderObjectRubyRun, | |
1099 RenderObjectRubyText, | |
1100 RenderObjectSlider, | |
1101 RenderObjectSliderThumb, | |
1102 RenderObjectTable, | |
1103 RenderObjectTableCaption, | |
1104 RenderObjectTableCell, | |
1105 RenderObjectTableRow, | |
1106 RenderObjectTableSection, | |
1107 RenderObjectTextArea, | |
1108 RenderObjectTextControl, | |
1109 RenderObjectTextField, | |
1110 RenderObjectVideo, | |
1111 RenderObjectWidget, | |
1112 | |
1113 RenderObjectSVG, /* Keep by itself? */ | |
1114 RenderObjectSVGRoot, | |
1115 RenderObjectSVGContainer, | |
1116 RenderObjectSVGTransformableContainer, | |
1117 RenderObjectSVGViewportContainer, | |
1118 RenderObjectSVGHiddenContainer, | |
1119 RenderObjectSVGGradientStop, | |
1120 RenderObjectSVGShape, | |
1121 RenderObjectSVGText, | |
1122 RenderObjectSVGTextPath, | |
1123 RenderObjectSVGInline, | |
1124 RenderObjectSVGInlineText, | |
1125 RenderObjectSVGImage, | |
1126 RenderObjectSVGForeignObject, | |
1127 RenderObjectSVGResourceContainer, | |
1128 RenderObjectSVGResourceFilter, | |
1129 RenderObjectSVGResourceFilterPrimitive, | |
1130 }; | |
1131 virtual bool isOfType(RenderObjectType type) const { return false; } | |
1132 | |
1133 inline bool layerCreationAllowedForSubtree() const; | |
1134 | |
1135 // Overrides should call the superclass at the end. m_style will be 0 the fi
rst time | |
1136 // this function will be called. | |
1137 virtual void styleWillChange(StyleDifference, const RenderStyle& newStyle); | |
1138 // Overrides should call the superclass at the start. |oldStyle| will be 0 t
he first | |
1139 // time this function is called. | |
1140 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); | |
1141 void propagateStyleToAnonymousChildren(bool blockChildrenOnly = false); | |
1142 virtual void updateAnonymousChildStyle(const RenderObject* child, RenderStyl
e* style) const { } | |
1143 | |
1144 protected: | |
1145 void setSelfMayNeedPaintInvalidation(); | |
1146 | |
1147 void clearLayoutRootIfNeeded() const; | |
1148 virtual void willBeDestroyed(); | |
1149 void postDestroy(); | |
1150 | |
1151 virtual void insertedIntoTree(); | |
1152 virtual void willBeRemovedFromTree(); | |
1153 | |
1154 void setDocumentForAnonymous(Document* document) { ASSERT(isAnonymous()); m_
node = document; } | |
1155 | |
1156 // Add hit-test rects for the render tree rooted at this node to the provide
d collection on a | |
1157 // per-Layer basis. | |
1158 // currentLayer must be the enclosing layer, and layerOffset is the current
offset within | |
1159 // this layer. Subclass implementations will add any offset for this rendere
r within it's | |
1160 // container, so callers should provide only the offset of the container wit
hin it's layer. | |
1161 // containerRect is a rect that has already been added for the currentLayer
which is likely to | |
1162 // be a container for child elements. Any rect wholly contained by container
Rect can be | |
1163 // skipped. | |
1164 virtual void addLayerHitTestRects(LayerHitTestRects&, const Layer* currentLa
yer, const LayoutPoint& layerOffset, const LayoutRect& containerRect) const; | |
1165 | |
1166 // Add hit-test rects for this renderer only to the provided list. layerOffs
et is the offset | |
1167 // of this renderer within the current layer that should be used for each re
sult. | |
1168 virtual void computeSelfHitTestRects(Vector<LayoutRect>&, const LayoutPoint&
layerOffset) const { }; | |
1169 | |
1170 virtual PaintInvalidationReason paintInvalidationReason(const LayoutLayerMod
elObject& paintInvalidationContainer, | |
1171 const LayoutRect& oldPaintInvalidationRect, const LayoutPoint& oldPositi
onFromPaintInvalidationBacking, | |
1172 const LayoutRect& newPaintInvalidationRect, const LayoutPoint& newPositi
onFromPaintInvalidationBacking) const; | |
1173 virtual void incrementallyInvalidatePaint(const LayoutLayerModelObject& pain
tInvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds
, const LayoutPoint& positionFromPaintInvalidationBacking); | |
1174 void fullyInvalidatePaint(const LayoutLayerModelObject& paintInvalidationCon
tainer, PaintInvalidationReason, const LayoutRect& oldBounds, const LayoutRect&
newBounds); | |
1175 | |
1176 #if ENABLE(ASSERT) | |
1177 virtual bool paintInvalidationStateIsDirty() const | |
1178 { | |
1179 return neededLayoutBecauseOfChildren() || shouldCheckForPaintInvalidatio
nRegardlessOfPaintInvalidationState(); | |
1180 } | |
1181 #endif | |
1182 | |
1183 virtual void invalidatePaintOfSubtreesIfNeeded(const PaintInvalidationState&
childPaintInvalidationState); | |
1184 virtual PaintInvalidationReason invalidatePaintIfNeeded(const PaintInvalidat
ionState&, const LayoutLayerModelObject& paintInvalidationContainer); | |
1185 | |
1186 // When this object is invalidated for paint, this method is called to inval
idate any DisplayItemClients | |
1187 // owned by this object, including the object itself, RenderText/RenderInlin
e line boxes, scrollbars, etc., | |
1188 // not including children which will be invalidated normally during invalida
teTreeIfNeeded(). | |
1189 virtual void invalidateDisplayItemClients(DisplayItemList*) const; | |
1190 | |
1191 private: | |
1192 void setLayoutDidGetCalledSinceLastFrame() | |
1193 { | |
1194 m_bitfields.setLayoutDidGetCalledSinceLastFrame(true); | |
1195 | |
1196 // Make sure our parent is marked as needing invalidation. | |
1197 // This would be unneeded if we allowed sub-tree invalidation (akin to s
ub-tree layouts). | |
1198 markContainingBlockChainForPaintInvalidation(); | |
1199 } | |
1200 void clearLayoutDidGetCalledSinceLastFrame() { m_bitfields.setLayoutDidGetCa
lledSinceLastFrame(false); } | |
1201 | |
1202 void invalidatePaintIncludingNonCompositingDescendantsInternal(const LayoutL
ayerModelObject* repaintContainer); | |
1203 | |
1204 LayoutRect previousSelectionRectForPaintInvalidation() const; | |
1205 void setPreviousSelectionRectForPaintInvalidation(const LayoutRect&); | |
1206 | |
1207 const LayoutLayerModelObject* enclosingCompositedContainer() const; | |
1208 | |
1209 RenderFlowThread* locateFlowThreadContainingBlock() const; | |
1210 void removeFromRenderFlowThread(); | |
1211 void removeFromRenderFlowThreadRecursive(RenderFlowThread*); | |
1212 | |
1213 RenderStyle* cachedFirstLineStyle() const; | |
1214 StyleDifference adjustStyleDifference(StyleDifference) const; | |
1215 | |
1216 Color selectionColor(int colorProperty) const; | |
1217 | |
1218 void removeShapeImageClient(ShapeValue*); | |
1219 | |
1220 #if ENABLE(ASSERT) | |
1221 void checkBlockPositionedObjectsNeedLayout(); | |
1222 #endif | |
1223 | |
1224 void markContainingBlockChainForPaintInvalidation(); | |
1225 | |
1226 static bool isAllowedToModifyRenderTreeStructure(Document&); | |
1227 | |
1228 RefPtr<RenderStyle> m_style; | |
1229 | |
1230 // Oilpan: raw pointer back to the owning Node is considered safe. | |
1231 Node* m_node; | |
1232 | |
1233 RenderObject* m_parent; | |
1234 RenderObject* m_previous; | |
1235 RenderObject* m_next; | |
1236 | |
1237 #if ENABLE(ASSERT) | |
1238 unsigned m_hasAXObject : 1; | |
1239 unsigned m_setNeedsLayoutForbidden : 1; | |
1240 #endif | |
1241 | |
1242 #define ADD_BOOLEAN_BITFIELD(name, Name) \ | |
1243 private:\ | |
1244 unsigned m_##name : 1;\ | |
1245 public:\ | |
1246 bool name() const { return m_##name; }\ | |
1247 void set##Name(bool name) { m_##name = name; }\ | |
1248 | |
1249 class RenderObjectBitfields { | |
1250 enum PositionedState { | |
1251 IsStaticallyPositioned = 0, | |
1252 IsRelativelyPositioned = 1, | |
1253 IsOutOfFlowPositioned = 2, | |
1254 }; | |
1255 | |
1256 public: | |
1257 RenderObjectBitfields(Node* node) | |
1258 : m_selfNeedsLayout(false) | |
1259 , m_shouldInvalidateOverflowForPaint(false) | |
1260 // FIXME: We should remove mayNeedPaintInvalidation once we are able
to | |
1261 // use the other layout flags to detect the same cases. crbug.com/37
0118 | |
1262 , m_mayNeedPaintInvalidation(false) | |
1263 , m_shouldInvalidateSelection(false) | |
1264 , m_neededLayoutBecauseOfChildren(false) | |
1265 , m_needsPositionedMovementLayout(false) | |
1266 , m_normalChildNeedsLayout(false) | |
1267 , m_posChildNeedsLayout(false) | |
1268 , m_needsSimplifiedNormalFlowLayout(false) | |
1269 , m_preferredLogicalWidthsDirty(false) | |
1270 , m_floating(false) | |
1271 , m_selfNeedsOverflowRecalcAfterStyleChange(false) | |
1272 , m_childNeedsOverflowRecalcAfterStyleChange(false) | |
1273 , m_isAnonymous(!node) | |
1274 , m_isText(false) | |
1275 , m_isBox(false) | |
1276 , m_isInline(true) | |
1277 , m_isReplaced(false) | |
1278 , m_horizontalWritingMode(true) | |
1279 , m_isDragging(false) | |
1280 , m_hasLayer(false) | |
1281 , m_hasOverflowClip(false) | |
1282 , m_hasTransformRelatedProperty(false) | |
1283 , m_hasReflection(false) | |
1284 , m_hasCounterNodeMap(false) | |
1285 , m_everHadLayout(false) | |
1286 , m_ancestorLineBoxDirty(false) | |
1287 , m_layoutDidGetCalledSinceLastFrame(false) | |
1288 , m_hasPendingResourceUpdate(false) | |
1289 , m_childrenInline(false) | |
1290 , m_hasColumns(false) | |
1291 , m_alwaysCreateLineBoxesForRenderInline(false) | |
1292 , m_positionedState(IsStaticallyPositioned) | |
1293 , m_selectionState(SelectionNone) | |
1294 , m_flowThreadState(NotInsideFlowThread) | |
1295 , m_boxDecorationBackgroundState(NoBoxDecorationBackground) | |
1296 , m_fullPaintInvalidationReason(PaintInvalidationNone) | |
1297 { | |
1298 } | |
1299 | |
1300 // 32 bits have been used in the first word, and 14 in the second. | |
1301 ADD_BOOLEAN_BITFIELD(selfNeedsLayout, SelfNeedsLayout); | |
1302 ADD_BOOLEAN_BITFIELD(shouldInvalidateOverflowForPaint, ShouldInvalidateO
verflowForPaint); | |
1303 ADD_BOOLEAN_BITFIELD(mayNeedPaintInvalidation, MayNeedPaintInvalidation)
; | |
1304 ADD_BOOLEAN_BITFIELD(shouldInvalidateSelection, ShouldInvalidateSelectio
n); | |
1305 ADD_BOOLEAN_BITFIELD(neededLayoutBecauseOfChildren, NeededLayoutBecauseO
fChildren); | |
1306 ADD_BOOLEAN_BITFIELD(needsPositionedMovementLayout, NeedsPositionedMovem
entLayout); | |
1307 ADD_BOOLEAN_BITFIELD(normalChildNeedsLayout, NormalChildNeedsLayout); | |
1308 ADD_BOOLEAN_BITFIELD(posChildNeedsLayout, PosChildNeedsLayout); | |
1309 ADD_BOOLEAN_BITFIELD(needsSimplifiedNormalFlowLayout, NeedsSimplifiedNor
malFlowLayout); | |
1310 ADD_BOOLEAN_BITFIELD(preferredLogicalWidthsDirty, PreferredLogicalWidths
Dirty); | |
1311 ADD_BOOLEAN_BITFIELD(floating, Floating); | |
1312 ADD_BOOLEAN_BITFIELD(selfNeedsOverflowRecalcAfterStyleChange, SelfNeedsO
verflowRecalcAfterStyleChange); | |
1313 ADD_BOOLEAN_BITFIELD(childNeedsOverflowRecalcAfterStyleChange, ChildNeed
sOverflowRecalcAfterStyleChange); | |
1314 | |
1315 ADD_BOOLEAN_BITFIELD(isAnonymous, IsAnonymous); | |
1316 ADD_BOOLEAN_BITFIELD(isText, IsText); | |
1317 ADD_BOOLEAN_BITFIELD(isBox, IsBox); | |
1318 ADD_BOOLEAN_BITFIELD(isInline, IsInline); | |
1319 ADD_BOOLEAN_BITFIELD(isReplaced, IsReplaced); | |
1320 ADD_BOOLEAN_BITFIELD(horizontalWritingMode, HorizontalWritingMode); | |
1321 ADD_BOOLEAN_BITFIELD(isDragging, IsDragging); | |
1322 | |
1323 ADD_BOOLEAN_BITFIELD(hasLayer, HasLayer); | |
1324 ADD_BOOLEAN_BITFIELD(hasOverflowClip, HasOverflowClip); // Set in the ca
se of overflow:auto/scroll/hidden | |
1325 ADD_BOOLEAN_BITFIELD(hasTransformRelatedProperty, HasTransformRelatedPro
perty); | |
1326 ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection); | |
1327 | |
1328 ADD_BOOLEAN_BITFIELD(hasCounterNodeMap, HasCounterNodeMap); | |
1329 ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout); | |
1330 ADD_BOOLEAN_BITFIELD(ancestorLineBoxDirty, AncestorLineBoxDirty); | |
1331 | |
1332 ADD_BOOLEAN_BITFIELD(layoutDidGetCalledSinceLastFrame, LayoutDidGetCalle
dSinceLastFrame); | |
1333 | |
1334 ADD_BOOLEAN_BITFIELD(hasPendingResourceUpdate, HasPendingResourceUpdate)
; | |
1335 | |
1336 // from RenderBlock | |
1337 ADD_BOOLEAN_BITFIELD(childrenInline, ChildrenInline); | |
1338 ADD_BOOLEAN_BITFIELD(hasColumns, HasColumns); | |
1339 | |
1340 // from RenderInline | |
1341 ADD_BOOLEAN_BITFIELD(alwaysCreateLineBoxesForRenderInline, AlwaysCreateL
ineBoxesForRenderInline); | |
1342 | |
1343 private: | |
1344 unsigned m_positionedState : 2; // PositionedState | |
1345 unsigned m_selectionState : 3; // SelectionState | |
1346 unsigned m_flowThreadState : 2; // FlowThreadState | |
1347 unsigned m_boxDecorationBackgroundState : 2; // BoxDecorationBackgroundS
tate | |
1348 unsigned m_fullPaintInvalidationReason : 5; // PaintInvalidationReason | |
1349 | |
1350 public: | |
1351 bool isOutOfFlowPositioned() const { return m_positionedState == IsOutOf
FlowPositioned; } | |
1352 bool isRelPositioned() const { return m_positionedState == IsRelativelyP
ositioned; } | |
1353 bool isPositioned() const { return m_positionedState != IsStaticallyPosi
tioned; } | |
1354 | |
1355 void setPositionedState(int positionState) | |
1356 { | |
1357 // This mask maps FixedPosition and AbsolutePosition to IsOutOfFlowP
ositioned, saving one bit. | |
1358 m_positionedState = static_cast<PositionedState>(positionState & 0x3
); | |
1359 } | |
1360 void clearPositionedState() { m_positionedState = StaticPosition; } | |
1361 | |
1362 ALWAYS_INLINE SelectionState selectionState() const { return static_cast
<SelectionState>(m_selectionState); } | |
1363 ALWAYS_INLINE void setSelectionState(SelectionState selectionState) { m_
selectionState = selectionState; } | |
1364 | |
1365 ALWAYS_INLINE FlowThreadState flowThreadState() const { return static_ca
st<FlowThreadState>(m_flowThreadState); } | |
1366 ALWAYS_INLINE void setFlowThreadState(FlowThreadState flowThreadState) {
m_flowThreadState = flowThreadState; } | |
1367 | |
1368 ALWAYS_INLINE BoxDecorationBackgroundState boxDecorationBackgroundState(
) const { return static_cast<BoxDecorationBackgroundState>(m_boxDecorationBackgr
oundState); } | |
1369 ALWAYS_INLINE void setBoxDecorationBackgroundState(BoxDecorationBackgrou
ndState s) { m_boxDecorationBackgroundState = s; } | |
1370 | |
1371 PaintInvalidationReason fullPaintInvalidationReason() const { return sta
tic_cast<PaintInvalidationReason>(m_fullPaintInvalidationReason); } | |
1372 void setFullPaintInvalidationReason(PaintInvalidationReason reason) { m_
fullPaintInvalidationReason = reason; } | |
1373 }; | |
1374 | |
1375 #undef ADD_BOOLEAN_BITFIELD | |
1376 | |
1377 RenderObjectBitfields m_bitfields; | |
1378 | |
1379 void setSelfNeedsLayout(bool b) { m_bitfields.setSelfNeedsLayout(b); } | |
1380 void setNeedsPositionedMovementLayout(bool b) { m_bitfields.setNeedsPosition
edMovementLayout(b); } | |
1381 void setNormalChildNeedsLayout(bool b) { m_bitfields.setNormalChildNeedsLayo
ut(b); } | |
1382 void setPosChildNeedsLayout(bool b) { m_bitfields.setPosChildNeedsLayout(b);
} | |
1383 void setNeedsSimplifiedNormalFlowLayout(bool b) { m_bitfields.setNeedsSimpli
fiedNormalFlowLayout(b); } | |
1384 void setIsDragging(bool b) { m_bitfields.setIsDragging(b); } | |
1385 void setEverHadLayout(bool b) { m_bitfields.setEverHadLayout(b); } | |
1386 void setShouldInvalidateOverflowForPaint(bool b) { m_bitfields.setShouldInva
lidateOverflowForPaint(b); } | |
1387 void setSelfNeedsOverflowRecalcAfterStyleChange(bool b) { m_bitfields.setSel
fNeedsOverflowRecalcAfterStyleChange(b); } | |
1388 void setChildNeedsOverflowRecalcAfterStyleChange(bool b) { m_bitfields.setCh
ildNeedsOverflowRecalcAfterStyleChange(b); } | |
1389 | |
1390 private: | |
1391 // Store state between styleWillChange and styleDidChange | |
1392 static bool s_affectsParentBlock; | |
1393 | |
1394 // This stores the paint invalidation rect from the previous frame. | |
1395 LayoutRect m_previousPaintInvalidationRect; | |
1396 | |
1397 // This stores the position in the paint invalidation backing's coordinate. | |
1398 // It is used to detect renderer shifts that forces a full invalidation. | |
1399 LayoutPoint m_previousPositionFromPaintInvalidationBacking; | |
1400 | |
1401 static unsigned s_instanceCount; | |
1402 }; | |
1403 | |
1404 // FIXME: remove this once the render object lifecycle ASSERTS are no longer hit
. | |
1405 class DeprecatedDisableModifyRenderTreeStructureAsserts { | |
1406 WTF_MAKE_NONCOPYABLE(DeprecatedDisableModifyRenderTreeStructureAsserts); | |
1407 public: | |
1408 DeprecatedDisableModifyRenderTreeStructureAsserts(); | |
1409 | |
1410 static bool canModifyRenderTreeStateInAnyState(); | |
1411 | |
1412 private: | |
1413 TemporaryChange<bool> m_disabler; | |
1414 }; | |
1415 | |
1416 // Allow equality comparisons of RenderObjects by reference or pointer, intercha
ngeably. | |
1417 DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES(RenderObject) | |
1418 | |
1419 inline bool RenderObject::documentBeingDestroyed() const | |
1420 { | |
1421 return document().lifecycle().state() >= DocumentLifecycle::Stopping; | |
1422 } | |
1423 | |
1424 inline bool RenderObject::isBeforeContent() const | |
1425 { | |
1426 if (style()->styleType() != BEFORE) | |
1427 return false; | |
1428 // Text nodes don't have their own styles, so ignore the style on a text nod
e. | |
1429 if (isText() && !isBR()) | |
1430 return false; | |
1431 return true; | |
1432 } | |
1433 | |
1434 inline bool RenderObject::isAfterContent() const | |
1435 { | |
1436 if (style()->styleType() != AFTER) | |
1437 return false; | |
1438 // Text nodes don't have their own styles, so ignore the style on a text nod
e. | |
1439 if (isText() && !isBR()) | |
1440 return false; | |
1441 return true; | |
1442 } | |
1443 | |
1444 inline bool RenderObject::isBeforeOrAfterContent() const | |
1445 { | |
1446 return isBeforeContent() || isAfterContent(); | |
1447 } | |
1448 | |
1449 // setNeedsLayout() won't cause full paint invalidations as | |
1450 // setNeedsLayoutAndFullPaintInvalidation() does. Otherwise the two methods are
identical. | |
1451 inline void RenderObject::setNeedsLayout(MarkingBehavior markParents, SubtreeLay
outScope* layouter) | |
1452 { | |
1453 TRACE_EVENT_INSTANT1( | |
1454 TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking"), | |
1455 "LayoutInvalidationTracking", | |
1456 "data", | |
1457 InspectorLayoutInvalidationTrackingEvent::data(this)); | |
1458 ASSERT(!isSetNeedsLayoutForbidden()); | |
1459 bool alreadyNeededLayout = m_bitfields.selfNeedsLayout(); | |
1460 setSelfNeedsLayout(true); | |
1461 if (!alreadyNeededLayout) { | |
1462 if (markParents == MarkContainingBlockChain && (!layouter || layouter->r
oot() != this)) | |
1463 markContainingBlocksForLayout(true, 0, layouter); | |
1464 } | |
1465 } | |
1466 | |
1467 inline void RenderObject::setNeedsLayoutAndFullPaintInvalidation(MarkingBehavior
markParents, SubtreeLayoutScope* layouter) | |
1468 { | |
1469 setNeedsLayout(markParents, layouter); | |
1470 setShouldDoFullPaintInvalidation(); | |
1471 } | |
1472 | |
1473 inline void RenderObject::clearNeedsLayout() | |
1474 { | |
1475 setNeededLayoutBecauseOfChildren(needsLayoutBecauseOfChildren()); | |
1476 setLayoutDidGetCalledSinceLastFrame(); | |
1477 setSelfNeedsLayout(false); | |
1478 setEverHadLayout(true); | |
1479 setPosChildNeedsLayout(false); | |
1480 setNeedsSimplifiedNormalFlowLayout(false); | |
1481 setNormalChildNeedsLayout(false); | |
1482 setNeedsPositionedMovementLayout(false); | |
1483 setAncestorLineBoxDirty(false); | |
1484 #if ENABLE(ASSERT) | |
1485 checkBlockPositionedObjectsNeedLayout(); | |
1486 #endif | |
1487 } | |
1488 | |
1489 inline void RenderObject::setChildNeedsLayout(MarkingBehavior markParents, Subtr
eeLayoutScope* layouter) | |
1490 { | |
1491 ASSERT(!isSetNeedsLayoutForbidden()); | |
1492 bool alreadyNeededLayout = normalChildNeedsLayout(); | |
1493 setNormalChildNeedsLayout(true); | |
1494 // FIXME: Replace MarkOnlyThis with the SubtreeLayoutScope code path and rem
ove the MarkingBehavior argument entirely. | |
1495 if (!alreadyNeededLayout && markParents == MarkContainingBlockChain && (!lay
outer || layouter->root() != this)) | |
1496 markContainingBlocksForLayout(true, 0, layouter); | |
1497 } | |
1498 | |
1499 inline void RenderObject::setNeedsPositionedMovementLayout() | |
1500 { | |
1501 bool alreadyNeededLayout = needsPositionedMovementLayout(); | |
1502 setNeedsPositionedMovementLayout(true); | |
1503 ASSERT(!isSetNeedsLayoutForbidden()); | |
1504 if (!alreadyNeededLayout) | |
1505 markContainingBlocksForLayout(); | |
1506 } | |
1507 | |
1508 inline bool RenderObject::preservesNewline() const | |
1509 { | |
1510 if (isSVGInlineText()) | |
1511 return false; | |
1512 | |
1513 return style()->preserveNewline(); | |
1514 } | |
1515 | |
1516 inline bool RenderObject::layerCreationAllowedForSubtree() const | |
1517 { | |
1518 RenderObject* parentRenderer = parent(); | |
1519 while (parentRenderer) { | |
1520 if (parentRenderer->isSVGHiddenContainer()) | |
1521 return false; | |
1522 parentRenderer = parentRenderer->parent(); | |
1523 } | |
1524 | |
1525 return true; | |
1526 } | |
1527 | |
1528 inline void RenderObject::setSelectionStateIfNeeded(SelectionState state) | |
1529 { | |
1530 if (selectionState() == state) | |
1531 return; | |
1532 | |
1533 setSelectionState(state); | |
1534 } | |
1535 | |
1536 inline void RenderObject::setHasBoxDecorationBackground(bool b) | |
1537 { | |
1538 if (!b) { | |
1539 m_bitfields.setBoxDecorationBackgroundState(NoBoxDecorationBackground); | |
1540 return; | |
1541 } | |
1542 if (hasBoxDecorationBackground()) | |
1543 return; | |
1544 m_bitfields.setBoxDecorationBackgroundState(HasBoxDecorationBackgroundObscur
ationStatusInvalid); | |
1545 } | |
1546 | |
1547 inline void RenderObject::invalidateBackgroundObscurationStatus() | |
1548 { | |
1549 if (!hasBoxDecorationBackground()) | |
1550 return; | |
1551 m_bitfields.setBoxDecorationBackgroundState(HasBoxDecorationBackgroundObscur
ationStatusInvalid); | |
1552 } | |
1553 | |
1554 inline bool RenderObject::boxDecorationBackgroundIsKnownToBeObscured() | |
1555 { | |
1556 if (m_bitfields.boxDecorationBackgroundState() == HasBoxDecorationBackground
ObscurationStatusInvalid) { | |
1557 BoxDecorationBackgroundState state = computeBackgroundIsKnownToBeObscure
d() ? HasBoxDecorationBackgroundKnownToBeObscured : HasBoxDecorationBackgroundMa
yBeVisible; | |
1558 m_bitfields.setBoxDecorationBackgroundState(state); | |
1559 } | |
1560 return m_bitfields.boxDecorationBackgroundState() == HasBoxDecorationBackgro
undKnownToBeObscured; | |
1561 } | |
1562 | |
1563 inline void makeMatrixRenderable(TransformationMatrix& matrix, bool has3DRenderi
ng) | |
1564 { | |
1565 if (!has3DRendering) | |
1566 matrix.makeAffine(); | |
1567 } | |
1568 | |
1569 inline int adjustForAbsoluteZoom(int value, RenderObject* renderer) | |
1570 { | |
1571 return adjustForAbsoluteZoom(value, renderer->style()); | |
1572 } | |
1573 | |
1574 inline double adjustDoubleForAbsoluteZoom(double value, RenderObject& renderer) | |
1575 { | |
1576 ASSERT(renderer.style()); | |
1577 return adjustDoubleForAbsoluteZoom(value, *renderer.style()); | |
1578 } | |
1579 | |
1580 inline LayoutUnit adjustLayoutUnitForAbsoluteZoom(LayoutUnit value, RenderObject
& renderer) | |
1581 { | |
1582 ASSERT(renderer.style()); | |
1583 return adjustLayoutUnitForAbsoluteZoom(value, *renderer.style()); | |
1584 } | |
1585 | |
1586 inline void adjustFloatQuadForAbsoluteZoom(FloatQuad& quad, RenderObject& render
er) | |
1587 { | |
1588 float zoom = renderer.style()->effectiveZoom(); | |
1589 if (zoom != 1) | |
1590 quad.scale(1 / zoom, 1 / zoom); | |
1591 } | |
1592 | |
1593 inline void adjustFloatRectForAbsoluteZoom(FloatRect& rect, RenderObject& render
er) | |
1594 { | |
1595 float zoom = renderer.style()->effectiveZoom(); | |
1596 if (zoom != 1) | |
1597 rect.scale(1 / zoom, 1 / zoom); | |
1598 } | |
1599 | |
1600 inline double adjustScrollForAbsoluteZoom(double value, RenderObject& renderer) | |
1601 { | |
1602 ASSERT(renderer.style()); | |
1603 return adjustScrollForAbsoluteZoom(value, *renderer.style()); | |
1604 } | |
1605 | |
1606 #define DEFINE_RENDER_OBJECT_TYPE_CASTS(thisType, predicate) \ | |
1607 DEFINE_TYPE_CASTS(thisType, RenderObject, object, object->predicate, object.
predicate) | |
1608 | |
1609 } // namespace blink | |
1610 | |
1611 #ifndef NDEBUG | |
1612 // Outside the WebCore namespace for ease of invocation from gdb. | |
1613 void showTree(const blink::RenderObject*); | |
1614 void showLineTree(const blink::RenderObject*); | |
1615 void showRenderTree(const blink::RenderObject* object1); | |
1616 // We don't make object2 an optional parameter so that showRenderTree | |
1617 // can be called from gdb easily. | |
1618 void showRenderTree(const blink::RenderObject* object1, const blink::RenderObjec
t* object2); | |
1619 | |
1620 #endif | |
1621 | |
1622 #endif // RenderObject_h | |
OLD | NEW |