| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | |
| 4 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. | |
| 5 * | |
| 6 * This library is free software; you can redistribute it and/or | |
| 7 * modify it under the terms of the GNU Library General Public | |
| 8 * License as published by the Free Software Foundation; either | |
| 9 * version 2 of the License, or (at your option) any later version. | |
| 10 * | |
| 11 * This library is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 * Library General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU Library General Public License | |
| 17 * along with this library; see the file COPYING.LIB. If not, write to | |
| 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
| 19 * Boston, MA 02110-1301, USA. | |
| 20 * | |
| 21 */ | |
| 22 | |
| 23 #ifndef RenderBox_h | |
| 24 #define RenderBox_h | |
| 25 | |
| 26 #include "core/layout/LayoutBoxModelObject.h" | |
| 27 #include "core/layout/shapes/ShapeOutsideInfo.h" | |
| 28 #include "core/rendering/RenderOverflow.h" | |
| 29 #include "platform/scroll/ScrollTypes.h" | |
| 30 #include "platform/scroll/ScrollableArea.h" | |
| 31 | |
| 32 namespace blink { | |
| 33 | |
| 34 class LayoutMultiColumnSpannerPlaceholder; | |
| 35 | |
| 36 struct PaintInfo; | |
| 37 | |
| 38 enum SizeType { MainOrPreferredSize, MinSize, MaxSize }; | |
| 39 enum AvailableLogicalHeightType { ExcludeMarginBorderPadding, IncludeMarginBorde
rPadding }; | |
| 40 enum OverlayScrollbarSizeRelevancy { IgnoreOverlayScrollbarSize, IncludeOverlayS
crollbarSize }; | |
| 41 enum MarginDirection { BlockDirection, InlineDirection }; | |
| 42 | |
| 43 enum ShouldComputePreferred { ComputeActual, ComputePreferred }; | |
| 44 | |
| 45 enum ScrollOffsetClamping { | |
| 46 ScrollOffsetUnclamped, | |
| 47 ScrollOffsetClamped | |
| 48 }; | |
| 49 | |
| 50 struct RenderBoxRareData { | |
| 51 WTF_MAKE_NONCOPYABLE(RenderBoxRareData); WTF_MAKE_FAST_ALLOCATED; | |
| 52 public: | |
| 53 RenderBoxRareData() | |
| 54 : m_inlineBoxWrapper(0) | |
| 55 , m_spannerPlaceholder(0) | |
| 56 , m_overrideLogicalContentHeight(-1) | |
| 57 , m_overrideLogicalContentWidth(-1) | |
| 58 , m_previousBorderBoxSize(-1, -1) | |
| 59 { | |
| 60 } | |
| 61 | |
| 62 // For inline replaced elements, the inline box that owns us. | |
| 63 InlineBox* m_inlineBoxWrapper; | |
| 64 | |
| 65 // For spanners, the spanner placeholder that lays us out within the multico
l container. | |
| 66 LayoutMultiColumnSpannerPlaceholder* m_spannerPlaceholder; | |
| 67 | |
| 68 LayoutUnit m_overrideLogicalContentHeight; | |
| 69 LayoutUnit m_overrideLogicalContentWidth; | |
| 70 | |
| 71 // Set by RenderBox::updatePreviousBorderBoxSizeIfNeeded(). | |
| 72 LayoutSize m_previousBorderBoxSize; | |
| 73 }; | |
| 74 | |
| 75 class RenderBox : public LayoutBoxModelObject { | |
| 76 public: | |
| 77 explicit RenderBox(ContainerNode*); | |
| 78 | |
| 79 virtual LayerType layerTypeRequired() const override; | |
| 80 | |
| 81 virtual bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect)
const override; | |
| 82 | |
| 83 virtual bool backgroundShouldAlwaysBeClipped() const { return false; } | |
| 84 | |
| 85 // Use this with caution! No type checking is done! | |
| 86 RenderBox* firstChildBox() const; | |
| 87 RenderBox* lastChildBox() const; | |
| 88 | |
| 89 int pixelSnappedWidth() const { return m_frameRect.pixelSnappedWidth(); } | |
| 90 int pixelSnappedHeight() const { return m_frameRect.pixelSnappedHeight(); } | |
| 91 | |
| 92 void setX(LayoutUnit x) { m_frameRect.setX(x); } | |
| 93 void setY(LayoutUnit y) { m_frameRect.setY(y); } | |
| 94 void setWidth(LayoutUnit width) { m_frameRect.setWidth(width); } | |
| 95 void setHeight(LayoutUnit height) { m_frameRect.setHeight(height); } | |
| 96 | |
| 97 LayoutUnit logicalLeft() const { return style()->isHorizontalWritingMode() ?
m_frameRect.x() : m_frameRect.y(); } | |
| 98 LayoutUnit logicalRight() const { return logicalLeft() + logicalWidth(); } | |
| 99 LayoutUnit logicalTop() const { return style()->isHorizontalWritingMode() ?
m_frameRect.y() : m_frameRect.x(); } | |
| 100 LayoutUnit logicalBottom() const { return logicalTop() + logicalHeight(); } | |
| 101 LayoutUnit logicalWidth() const { return style()->isHorizontalWritingMode()
? m_frameRect.width() : m_frameRect.height(); } | |
| 102 LayoutUnit logicalHeight() const { return style()->isHorizontalWritingMode()
? m_frameRect.height() : m_frameRect.width(); } | |
| 103 | |
| 104 LayoutUnit constrainLogicalWidthByMinMax(LayoutUnit, LayoutUnit, RenderBlock
*) const; | |
| 105 LayoutUnit constrainLogicalHeightByMinMax(LayoutUnit logicalHeight, LayoutUn
it intrinsicContentHeight) const; | |
| 106 LayoutUnit constrainContentBoxLogicalHeightByMinMax(LayoutUnit logicalHeight
, LayoutUnit intrinsicContentHeight) const; | |
| 107 | |
| 108 int pixelSnappedLogicalHeight() const { return style()->isHorizontalWritingM
ode() ? pixelSnappedHeight() : pixelSnappedWidth(); } | |
| 109 int pixelSnappedLogicalWidth() const { return style()->isHorizontalWritingMo
de() ? pixelSnappedWidth() : pixelSnappedHeight(); } | |
| 110 | |
| 111 void setLogicalLeft(LayoutUnit left) | |
| 112 { | |
| 113 if (style()->isHorizontalWritingMode()) | |
| 114 setX(left); | |
| 115 else | |
| 116 setY(left); | |
| 117 } | |
| 118 void setLogicalTop(LayoutUnit top) | |
| 119 { | |
| 120 if (style()->isHorizontalWritingMode()) | |
| 121 setY(top); | |
| 122 else | |
| 123 setX(top); | |
| 124 } | |
| 125 void setLogicalLocation(const LayoutPoint& location) | |
| 126 { | |
| 127 if (style()->isHorizontalWritingMode()) | |
| 128 setLocation(location); | |
| 129 else | |
| 130 setLocation(location.transposedPoint()); | |
| 131 } | |
| 132 void setLogicalWidth(LayoutUnit size) | |
| 133 { | |
| 134 if (style()->isHorizontalWritingMode()) | |
| 135 setWidth(size); | |
| 136 else | |
| 137 setHeight(size); | |
| 138 } | |
| 139 void setLogicalHeight(LayoutUnit size) | |
| 140 { | |
| 141 if (style()->isHorizontalWritingMode()) | |
| 142 setHeight(size); | |
| 143 else | |
| 144 setWidth(size); | |
| 145 } | |
| 146 | |
| 147 LayoutPoint location() const { return m_frameRect.location(); } | |
| 148 LayoutSize locationOffset() const { return LayoutSize(m_frameRect.x(), m_fra
meRect.y()); } | |
| 149 LayoutSize size() const { return m_frameRect.size(); } | |
| 150 IntSize pixelSnappedSize() const { return m_frameRect.pixelSnappedSize(); } | |
| 151 | |
| 152 void setLocation(const LayoutPoint& location) { m_frameRect.setLocation(loca
tion); } | |
| 153 | |
| 154 void setSize(const LayoutSize& size) { m_frameRect.setSize(size); } | |
| 155 void move(LayoutUnit dx, LayoutUnit dy) { m_frameRect.move(dx, dy); } | |
| 156 | |
| 157 LayoutRect frameRect() const { return m_frameRect; } | |
| 158 void setFrameRect(const LayoutRect& rect) { m_frameRect = rect; } | |
| 159 | |
| 160 LayoutRect borderBoxRect() const { return LayoutRect(LayoutPoint(), size());
} | |
| 161 LayoutRect paddingBoxRect() const { return LayoutRect(borderLeft(), borderTo
p(), clientWidth(), clientHeight()); } | |
| 162 IntRect pixelSnappedBorderBoxRect() const { return IntRect(IntPoint(), m_fra
meRect.pixelSnappedSize()); } | |
| 163 virtual IntRect borderBoundingBox() const override final { return pixelSnapp
edBorderBoxRect(); } | |
| 164 | |
| 165 // The content area of the box (excludes padding - and intrinsic padding for
table cells, etc... - and border). | |
| 166 LayoutRect contentBoxRect() const { return LayoutRect(borderLeft() + padding
Left(), borderTop() + paddingTop(), contentWidth(), contentHeight()); } | |
| 167 LayoutSize contentBoxOffset() const { return LayoutSize(borderLeft() + paddi
ngLeft(), borderTop() + paddingTop()); } | |
| 168 // The content box in absolute coords. Ignores transforms. | |
| 169 IntRect absoluteContentBox() const; | |
| 170 // The offset of the content box in absolute coords, ignoring transforms. | |
| 171 IntSize absoluteContentBoxOffset() const; | |
| 172 // The content box converted to absolute coords (taking transforms into acco
unt). | |
| 173 FloatQuad absoluteContentQuad() const; | |
| 174 | |
| 175 // This returns the content area of the box (excluding padding and border).
The only difference with contentBoxRect is that computedCSSContentBoxRect | |
| 176 // does include the intrinsic padding in the content box as this is what som
e callers expect (like getComputedStyle). | |
| 177 LayoutRect computedCSSContentBoxRect() const { return LayoutRect(borderLeft(
) + computedCSSPaddingLeft(), borderTop() + computedCSSPaddingTop(), clientWidth
() - computedCSSPaddingLeft() - computedCSSPaddingRight(), clientHeight() - comp
utedCSSPaddingTop() - computedCSSPaddingBottom()); } | |
| 178 | |
| 179 virtual void addFocusRingRects(Vector<LayoutRect>&, const LayoutPoint& addit
ionalOffset) const override; | |
| 180 | |
| 181 // Use this with caution! No type checking is done! | |
| 182 RenderBox* previousSiblingBox() const; | |
| 183 RenderBox* previousInFlowSiblingBox() const; | |
| 184 RenderBox* nextSiblingBox() const; | |
| 185 RenderBox* nextInFlowSiblingBox() const; | |
| 186 RenderBox* parentBox() const; | |
| 187 | |
| 188 // Return the previous sibling column set or spanner placeholder. Only to be
used on multicol container children. | |
| 189 RenderBox* previousSiblingMultiColumnBox() const; | |
| 190 // Return the next sibling column set or spanner placeholder. Only to be use
d on multicol container children. | |
| 191 RenderBox* nextSiblingMultiColumnBox() const; | |
| 192 | |
| 193 bool canResize() const; | |
| 194 | |
| 195 // Visual and layout overflow are in the coordinate space of the box. This
means that they aren't purely physical directions. | |
| 196 // For horizontal-tb and vertical-lr they will match physical directions, bu
t for horizontal-bt and vertical-rl, the top/bottom and left/right | |
| 197 // respectively are flipped when compared to their physical counterparts. F
or example minX is on the left in vertical-lr, | |
| 198 // but it is on the right in vertical-rl. | |
| 199 LayoutRect noOverflowRect() const; | |
| 200 LayoutRect layoutOverflowRect() const { return m_overflow ? m_overflow->layo
utOverflowRect() : noOverflowRect(); } | |
| 201 IntRect pixelSnappedLayoutOverflowRect() const { return pixelSnappedIntRect(
layoutOverflowRect()); } | |
| 202 LayoutSize maxLayoutOverflow() const { return LayoutSize(layoutOverflowRect(
).maxX(), layoutOverflowRect().maxY()); } | |
| 203 LayoutUnit logicalLeftLayoutOverflow() const { return style()->isHorizontalW
ritingMode() ? layoutOverflowRect().x() : layoutOverflowRect().y(); } | |
| 204 LayoutUnit logicalRightLayoutOverflow() const { return style()->isHorizontal
WritingMode() ? layoutOverflowRect().maxX() : layoutOverflowRect().maxY(); } | |
| 205 | |
| 206 virtual LayoutRect visualOverflowRect() const { return m_overflow ? m_overfl
ow->visualOverflowRect() : borderBoxRect(); } | |
| 207 LayoutUnit logicalLeftVisualOverflow() const { return style()->isHorizontalW
ritingMode() ? visualOverflowRect().x() : visualOverflowRect().y(); } | |
| 208 LayoutUnit logicalRightVisualOverflow() const { return style()->isHorizontal
WritingMode() ? visualOverflowRect().maxX() : visualOverflowRect().maxY(); } | |
| 209 | |
| 210 LayoutRect contentsVisualOverflowRect() const { return m_overflow ? m_overfl
ow->contentsVisualOverflowRect() : LayoutRect(); } | |
| 211 | |
| 212 void addLayoutOverflow(const LayoutRect&); | |
| 213 void addVisualOverflow(const LayoutRect&); | |
| 214 | |
| 215 // Clipped by the contents clip, if one exists. | |
| 216 void addContentsVisualOverflow(const LayoutRect&); | |
| 217 | |
| 218 void addVisualEffectOverflow(); | |
| 219 LayoutRectOutsets computeVisualEffectOverflowOutsets() const; | |
| 220 void addOverflowFromChild(RenderBox* child) { addOverflowFromChild(child, ch
ild->locationOffset()); } | |
| 221 void addOverflowFromChild(RenderBox* child, const LayoutSize& delta); | |
| 222 void clearLayoutOverflow(); | |
| 223 void clearAllOverflows() { m_overflow.clear(); } | |
| 224 | |
| 225 void updateLayerTransformAfterLayout(); | |
| 226 | |
| 227 LayoutUnit contentWidth() const { return clientWidth() - paddingLeft() - pad
dingRight(); } | |
| 228 LayoutUnit contentHeight() const { return clientHeight() - paddingTop() - pa
ddingBottom(); } | |
| 229 LayoutSize contentSize() const { return LayoutSize(contentWidth(), contentHe
ight()); } | |
| 230 LayoutUnit contentLogicalWidth() const { return style()->isHorizontalWriting
Mode() ? contentWidth() : contentHeight(); } | |
| 231 LayoutUnit contentLogicalHeight() const { return style()->isHorizontalWritin
gMode() ? contentHeight() : contentWidth(); } | |
| 232 | |
| 233 // IE extensions. Used to calculate offsetWidth/Height. Overridden by inlin
es (RenderFlow) | |
| 234 // to return the remaining width on a given line (and the height of a single
line). | |
| 235 virtual LayoutUnit offsetWidth() const override { return m_frameRect.width()
; } | |
| 236 virtual LayoutUnit offsetHeight() const override { return m_frameRect.height
(); } | |
| 237 | |
| 238 virtual int pixelSnappedOffsetWidth() const override final; | |
| 239 virtual int pixelSnappedOffsetHeight() const override final; | |
| 240 | |
| 241 // More IE extensions. clientWidth and clientHeight represent the interior
of an object | |
| 242 // excluding border and scrollbar. clientLeft/Top are just the borderLeftWi
dth and borderTopWidth. | |
| 243 LayoutUnit clientLeft() const { return borderLeft() + (style()->shouldPlaceB
lockDirectionScrollbarOnLogicalLeft() ? verticalScrollbarWidth() : 0); } | |
| 244 LayoutUnit clientTop() const { return borderTop(); } | |
| 245 LayoutUnit clientWidth() const; | |
| 246 LayoutUnit clientHeight() const; | |
| 247 LayoutUnit clientLogicalWidth() const { return style()->isHorizontalWritingM
ode() ? clientWidth() : clientHeight(); } | |
| 248 LayoutUnit clientLogicalHeight() const { return style()->isHorizontalWriting
Mode() ? clientHeight() : clientWidth(); } | |
| 249 LayoutUnit clientLogicalBottom() const { return borderBefore() + clientLogic
alHeight(); } | |
| 250 LayoutRect clientBoxRect() const { return LayoutRect(clientLeft(), clientTop
(), clientWidth(), clientHeight()); } | |
| 251 | |
| 252 int pixelSnappedClientWidth() const; | |
| 253 int pixelSnappedClientHeight() const; | |
| 254 | |
| 255 // scrollWidth/scrollHeight will be the same as clientWidth/clientHeight unl
ess the | |
| 256 // object has overflow:hidden/scroll/auto specified and also has overflow. | |
| 257 // scrollLeft/Top return the current scroll position. These methods are vir
tual so that objects like | |
| 258 // textareas can scroll shadow content (but pretend that they are the object
s that are | |
| 259 // scrolling). | |
| 260 virtual LayoutUnit scrollLeft() const; | |
| 261 virtual LayoutUnit scrollTop() const; | |
| 262 virtual LayoutUnit scrollWidth() const; | |
| 263 virtual LayoutUnit scrollHeight() const; | |
| 264 int pixelSnappedScrollWidth() const; | |
| 265 int pixelSnappedScrollHeight() const; | |
| 266 virtual void setScrollLeft(LayoutUnit); | |
| 267 virtual void setScrollTop(LayoutUnit); | |
| 268 | |
| 269 void scrollToOffset(const DoubleSize&, ScrollBehavior = ScrollBehaviorInstan
t); | |
| 270 void scrollByRecursively(const DoubleSize& delta, ScrollOffsetClamping = Scr
ollOffsetUnclamped); | |
| 271 void scrollRectToVisible(const LayoutRect&, const ScrollAlignment& alignX, c
onst ScrollAlignment& alignY); | |
| 272 | |
| 273 virtual LayoutRectOutsets marginBoxOutsets() const override { return m_margi
nBoxOutsets; } | |
| 274 virtual LayoutUnit marginTop() const override { return m_marginBoxOutsets.to
p(); } | |
| 275 virtual LayoutUnit marginBottom() const override { return m_marginBoxOutsets
.bottom(); } | |
| 276 virtual LayoutUnit marginLeft() const override { return m_marginBoxOutsets.l
eft(); } | |
| 277 virtual LayoutUnit marginRight() const override { return m_marginBoxOutsets.
right(); } | |
| 278 void setMarginTop(LayoutUnit margin) { m_marginBoxOutsets.setTop(margin); } | |
| 279 void setMarginBottom(LayoutUnit margin) { m_marginBoxOutsets.setBottom(margi
n); } | |
| 280 void setMarginLeft(LayoutUnit margin) { m_marginBoxOutsets.setLeft(margin);
} | |
| 281 void setMarginRight(LayoutUnit margin) { m_marginBoxOutsets.setRight(margin)
; } | |
| 282 | |
| 283 LayoutUnit marginLogicalLeft() const { return m_marginBoxOutsets.logicalLeft
(style()->writingMode()); } | |
| 284 LayoutUnit marginLogicalRight() const { return m_marginBoxOutsets.logicalRig
ht(style()->writingMode()); } | |
| 285 | |
| 286 virtual LayoutUnit marginBefore(const LayoutStyle* overrideStyle = 0) const
override final { return m_marginBoxOutsets.before((overrideStyle ? overrideStyle
: style())->writingMode()); } | |
| 287 virtual LayoutUnit marginAfter(const LayoutStyle* overrideStyle = 0) const o
verride final { return m_marginBoxOutsets.after((overrideStyle ? overrideStyle :
style())->writingMode()); } | |
| 288 virtual LayoutUnit marginStart(const LayoutStyle* overrideStyle = 0) const o
verride final | |
| 289 { | |
| 290 const LayoutStyle* styleToUse = overrideStyle ? overrideStyle : style(); | |
| 291 return m_marginBoxOutsets.start(styleToUse->writingMode(), styleToUse->d
irection()); | |
| 292 } | |
| 293 virtual LayoutUnit marginEnd(const LayoutStyle* overrideStyle = 0) const ove
rride final | |
| 294 { | |
| 295 const LayoutStyle* styleToUse = overrideStyle ? overrideStyle : style(); | |
| 296 return m_marginBoxOutsets.end(styleToUse->writingMode(), styleToUse->dir
ection()); | |
| 297 } | |
| 298 void setMarginBefore(LayoutUnit value, const LayoutStyle* overrideStyle = 0)
{ m_marginBoxOutsets.setBefore((overrideStyle ? overrideStyle : style())->writi
ngMode(), value); } | |
| 299 void setMarginAfter(LayoutUnit value, const LayoutStyle* overrideStyle = 0)
{ m_marginBoxOutsets.setAfter((overrideStyle ? overrideStyle : style())->writing
Mode(), value); } | |
| 300 void setMarginStart(LayoutUnit value, const LayoutStyle* overrideStyle = 0) | |
| 301 { | |
| 302 const LayoutStyle* styleToUse = overrideStyle ? overrideStyle : style(); | |
| 303 m_marginBoxOutsets.setStart(styleToUse->writingMode(), styleToUse->direc
tion(), value); | |
| 304 } | |
| 305 void setMarginEnd(LayoutUnit value, const LayoutStyle* overrideStyle = 0) | |
| 306 { | |
| 307 const LayoutStyle* styleToUse = overrideStyle ? overrideStyle : style(); | |
| 308 m_marginBoxOutsets.setEnd(styleToUse->writingMode(), styleToUse->directi
on(), value); | |
| 309 } | |
| 310 | |
| 311 // The following functions are used to implement collapsing margins. | |
| 312 // All objects know their maximal positive and negative margins. The | |
| 313 // formula for computing a collapsed margin is |maxPosMargin| - |maxNegmargi
n|. | |
| 314 // For a non-collapsing box, such as a leaf element, this formula will simpl
y return | |
| 315 // the margin of the element. Blocks override the maxMarginBefore and maxMa
rginAfter | |
| 316 // methods. | |
| 317 virtual bool isSelfCollapsingBlock() const { return false; } | |
| 318 virtual LayoutUnit collapsedMarginBefore() const { return marginBefore(); } | |
| 319 virtual LayoutUnit collapsedMarginAfter() const { return marginAfter(); } | |
| 320 LayoutRectOutsets collapsedMarginBoxLogicalOutsets() const { return LayoutRe
ctOutsets(collapsedMarginBefore(), 0, collapsedMarginAfter(), 0); } | |
| 321 | |
| 322 virtual void absoluteRects(Vector<IntRect>&, const LayoutPoint& accumulatedO
ffset) const override; | |
| 323 virtual void absoluteQuads(Vector<FloatQuad>&, bool* wasFixed) const overrid
e; | |
| 324 | |
| 325 int reflectionOffset() const; | |
| 326 // Given a rect in the object's coordinate space, returns the corresponding
rect in the reflection. | |
| 327 LayoutRect reflectedRect(const LayoutRect&) const; | |
| 328 | |
| 329 virtual void layout() override; | |
| 330 virtual void paint(const PaintInfo&, const LayoutPoint&) override; | |
| 331 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTes
tLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAct
ion) override; | |
| 332 | |
| 333 virtual LayoutUnit minPreferredLogicalWidth() const override; | |
| 334 virtual LayoutUnit maxPreferredLogicalWidth() const override; | |
| 335 | |
| 336 // FIXME: We should rename these back to overrideLogicalHeight/Width and hav
e them store | |
| 337 // the border-box height/width like the regular height/width accessors on Re
nderBox. | |
| 338 // Right now, these are different than contentHeight/contentWidth because th
ey still | |
| 339 // include the scrollbar height/width. | |
| 340 LayoutUnit overrideLogicalContentWidth() const; | |
| 341 LayoutUnit overrideLogicalContentHeight() const; | |
| 342 bool hasOverrideHeight() const; | |
| 343 bool hasOverrideWidth() const; | |
| 344 void setOverrideLogicalContentHeight(LayoutUnit); | |
| 345 void setOverrideLogicalContentWidth(LayoutUnit); | |
| 346 void clearOverrideSize(); | |
| 347 void clearOverrideLogicalContentHeight(); | |
| 348 void clearOverrideLogicalContentWidth(); | |
| 349 | |
| 350 LayoutUnit overrideContainingBlockContentLogicalWidth() const; | |
| 351 LayoutUnit overrideContainingBlockContentLogicalHeight() const; | |
| 352 bool hasOverrideContainingBlockLogicalWidth() const; | |
| 353 bool hasOverrideContainingBlockLogicalHeight() const; | |
| 354 void setOverrideContainingBlockContentLogicalWidth(LayoutUnit); | |
| 355 void setOverrideContainingBlockContentLogicalHeight(LayoutUnit); | |
| 356 void clearContainingBlockOverrideSize(); | |
| 357 void clearOverrideContainingBlockContentLogicalHeight(); | |
| 358 | |
| 359 LayoutUnit extraInlineOffset() const; | |
| 360 LayoutUnit extraBlockOffset() const; | |
| 361 void setExtraInlineOffset(LayoutUnit inlineOffest); | |
| 362 void setExtraBlockOffset(LayoutUnit blockOffest); | |
| 363 void clearExtraInlineAndBlockOffests(); | |
| 364 | |
| 365 virtual LayoutSize offsetFromContainer(const LayoutObject*, const LayoutPoin
t&, bool* offsetDependsOnPoint = 0) const override; | |
| 366 | |
| 367 LayoutUnit adjustBorderBoxLogicalWidthForBoxSizing(LayoutUnit width) const; | |
| 368 LayoutUnit adjustBorderBoxLogicalHeightForBoxSizing(LayoutUnit height) const
; | |
| 369 LayoutUnit adjustContentBoxLogicalWidthForBoxSizing(LayoutUnit width) const; | |
| 370 LayoutUnit adjustContentBoxLogicalHeightForBoxSizing(LayoutUnit height) cons
t; | |
| 371 | |
| 372 struct ComputedMarginValues { | |
| 373 ComputedMarginValues() { } | |
| 374 | |
| 375 LayoutUnit m_before; | |
| 376 LayoutUnit m_after; | |
| 377 LayoutUnit m_start; | |
| 378 LayoutUnit m_end; | |
| 379 }; | |
| 380 struct LogicalExtentComputedValues { | |
| 381 LogicalExtentComputedValues() { } | |
| 382 | |
| 383 LayoutUnit m_extent; | |
| 384 LayoutUnit m_position; | |
| 385 ComputedMarginValues m_margins; | |
| 386 }; | |
| 387 // Resolve auto margins in the chosen direction of the containing block so t
hat objects can be pushed to the start, middle or end | |
| 388 // of the containing block. | |
| 389 void computeMarginsForDirection(MarginDirection forDirection, const RenderBl
ock* containingBlock, LayoutUnit containerWidth, LayoutUnit childWidth, LayoutUn
it& marginStart, LayoutUnit& marginEnd, Length marginStartLength, Length marginS
tartEnd) const; | |
| 390 | |
| 391 // Used to resolve margins in the containing block's block-flow direction. | |
| 392 void computeAndSetBlockDirectionMargins(const RenderBlock* containingBlock); | |
| 393 | |
| 394 virtual LayoutUnit offsetFromLogicalTopOfFirstPage() const; | |
| 395 | |
| 396 void positionLineBox(InlineBox*); | |
| 397 void moveWithEdgeOfInlineContainerIfNecessary(bool isHorizontal); | |
| 398 void markStaticPositionedBoxForLayout(bool isHorizontal, bool isInline); | |
| 399 | |
| 400 virtual InlineBox* createInlineBox(); | |
| 401 void dirtyLineBoxes(bool fullLayout); | |
| 402 | |
| 403 // For inline replaced elements, this function returns the inline box that o
wns us. Enables | |
| 404 // the replaced LayoutObject to quickly determine what line it is contained
on and to easily | |
| 405 // iterate over structures on the line. | |
| 406 InlineBox* inlineBoxWrapper() const { return m_rareData ? m_rareData->m_inli
neBoxWrapper : 0; } | |
| 407 void setInlineBoxWrapper(InlineBox*); | |
| 408 void deleteLineBoxWrapper(); | |
| 409 | |
| 410 void setSpannerPlaceholder(LayoutMultiColumnSpannerPlaceholder&); | |
| 411 void clearSpannerPlaceholder(); | |
| 412 virtual LayoutMultiColumnSpannerPlaceholder* spannerPlaceholder() const fina
l { return m_rareData ? m_rareData->m_spannerPlaceholder : 0; } | |
| 413 | |
| 414 virtual LayoutRect clippedOverflowRectForPaintInvalidation(const LayoutBoxMo
delObject* paintInvalidationContainer, const PaintInvalidationState* = 0) const
override; | |
| 415 virtual void mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* p
aintInvalidationContainer, LayoutRect&, const PaintInvalidationState*) const ove
rride; | |
| 416 virtual void invalidatePaintForOverhangingFloats(bool paintAllDescendants); | |
| 417 | |
| 418 virtual LayoutUnit containingBlockLogicalWidthForContent() const override; | |
| 419 LayoutUnit containingBlockLogicalHeightForContent(AvailableLogicalHeightType
) const; | |
| 420 | |
| 421 LayoutUnit containingBlockAvailableLineWidth() const; | |
| 422 LayoutUnit perpendicularContainingBlockLogicalHeight() const; | |
| 423 | |
| 424 virtual void updateLogicalWidth(); | |
| 425 void updateLogicalHeight(); | |
| 426 virtual void computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logic
alTop, LogicalExtentComputedValues&) const; | |
| 427 | |
| 428 void computeLogicalWidth(LogicalExtentComputedValues&) const; | |
| 429 | |
| 430 bool stretchesToViewport() const | |
| 431 { | |
| 432 return document().inQuirksMode() && style()->logicalHeight().isAuto() &&
!isFloatingOrOutOfFlowPositioned() && (isDocumentElement() || isBody()) && !isI
nline(); | |
| 433 } | |
| 434 | |
| 435 virtual LayoutSize intrinsicSize() const { return LayoutSize(); } | |
| 436 LayoutUnit intrinsicLogicalWidth() const { return style()->isHorizontalWriti
ngMode() ? intrinsicSize().width() : intrinsicSize().height(); } | |
| 437 LayoutUnit intrinsicLogicalHeight() const { return style()->isHorizontalWrit
ingMode() ? intrinsicSize().height() : intrinsicSize().width(); } | |
| 438 virtual LayoutUnit intrinsicContentLogicalHeight() const { return m_intrinsi
cContentLogicalHeight; } | |
| 439 | |
| 440 // Whether or not the element shrinks to its intrinsic width (rather than fi
lling the width | |
| 441 // of a containing block). HTML4 buttons, <select>s, <input>s, legends, and
floating/compact elements do this. | |
| 442 bool sizesLogicalWidthToFitContent(const Length& logicalWidth) const; | |
| 443 | |
| 444 LayoutUnit shrinkLogicalWidthToAvoidFloats(LayoutUnit childMarginStart, Layo
utUnit childMarginEnd, const RenderBlockFlow* cb) const; | |
| 445 | |
| 446 LayoutUnit computeLogicalWidthUsing(SizeType, const Length& logicalWidth, La
youtUnit availableLogicalWidth, const RenderBlock* containingBlock) const; | |
| 447 LayoutUnit computeLogicalHeightUsing(const Length& height, LayoutUnit intrin
sicContentHeight) const; | |
| 448 LayoutUnit computeContentLogicalHeight(const Length& height, LayoutUnit intr
insicContentHeight) const; | |
| 449 LayoutUnit computeContentAndScrollbarLogicalHeightUsing(const Length& height
, LayoutUnit intrinsicContentHeight) const; | |
| 450 LayoutUnit computeReplacedLogicalWidthUsing(const Length& width) const; | |
| 451 LayoutUnit computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit logic
alWidth, ShouldComputePreferred = ComputeActual) const; | |
| 452 LayoutUnit computeReplacedLogicalHeightUsing(const Length& height) const; | |
| 453 LayoutUnit computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutUnit log
icalHeight) const; | |
| 454 | |
| 455 virtual LayoutUnit computeReplacedLogicalWidth(ShouldComputePreferred = Com
puteActual) const; | |
| 456 virtual LayoutUnit computeReplacedLogicalHeight() const; | |
| 457 | |
| 458 static bool logicalWidthIsResolvableFromBlock(const RenderBlock* containingB
lock); | |
| 459 bool hasDefiniteLogicalWidth() const; | |
| 460 static bool percentageLogicalHeightIsResolvableFromBlock(const RenderBlock*
containingBlock, bool outOfFlowPositioned); | |
| 461 bool hasDefiniteLogicalHeight() const; | |
| 462 LayoutUnit computePercentageLogicalHeight(const Length& height) const; | |
| 463 | |
| 464 // Block flows subclass availableWidth/Height to handle multi column layout
(shrinking the width/height available to children when laying out.) | |
| 465 virtual LayoutUnit availableLogicalWidth() const { return contentLogicalWidt
h(); } | |
| 466 virtual LayoutUnit availableLogicalHeight(AvailableLogicalHeightType) const; | |
| 467 LayoutUnit availableLogicalHeightUsing(const Length&, AvailableLogicalHeight
Type) const; | |
| 468 | |
| 469 // There are a few cases where we need to refer specifically to the availabl
e physical width and available physical height. | |
| 470 // Relative positioning is one of those cases, since left/top offsets are ph
ysical. | |
| 471 LayoutUnit availableWidth() const { return style()->isHorizontalWritingMode(
) ? availableLogicalWidth() : availableLogicalHeight(IncludeMarginBorderPadding)
; } | |
| 472 LayoutUnit availableHeight() const { return style()->isHorizontalWritingMode
() ? availableLogicalHeight(IncludeMarginBorderPadding) : availableLogicalWidth(
); } | |
| 473 | |
| 474 virtual int verticalScrollbarWidth() const; | |
| 475 int horizontalScrollbarHeight() const; | |
| 476 int intrinsicScrollbarLogicalWidth() const; | |
| 477 int scrollbarLogicalWidth() const { return style()->isHorizontalWritingMode(
) ? verticalScrollbarWidth() : horizontalScrollbarHeight(); } | |
| 478 int scrollbarLogicalHeight() const { return style()->isHorizontalWritingMode
() ? horizontalScrollbarHeight() : verticalScrollbarWidth(); } | |
| 479 virtual bool scroll(ScrollDirection, ScrollGranularity, float delta = 1); | |
| 480 bool canBeScrolledAndHasScrollableArea() const; | |
| 481 virtual bool canBeProgramaticallyScrolled() const; | |
| 482 virtual void autoscroll(const IntPoint&); | |
| 483 bool canAutoscroll() const; | |
| 484 IntSize calculateAutoscrollDirection(const IntPoint& windowPoint) const; | |
| 485 static RenderBox* findAutoscrollable(LayoutObject*); | |
| 486 virtual void stopAutoscroll() { } | |
| 487 virtual void panScroll(const IntPoint&); | |
| 488 | |
| 489 bool hasAutoVerticalScrollbar() const { return hasOverflowClip() && (style()
->overflowY() == OAUTO || style()->overflowY() == OPAGEDY || style()->overflowY(
) == OOVERLAY); } | |
| 490 bool hasAutoHorizontalScrollbar() const { return hasOverflowClip() && (style
()->overflowX() == OAUTO || style()->overflowX() == OOVERLAY); } | |
| 491 bool scrollsOverflow() const { return scrollsOverflowX() || scrollsOverflowY
(); } | |
| 492 | |
| 493 bool hasScrollableOverflowX() const { return scrollsOverflowX() && pixelSnap
pedScrollWidth() != pixelSnappedClientWidth(); } | |
| 494 bool hasScrollableOverflowY() const { return scrollsOverflowY() && pixelSnap
pedScrollHeight() != pixelSnappedClientHeight(); } | |
| 495 virtual bool scrollsOverflowX() const { return hasOverflowClip() && (style()
->overflowX() == OSCROLL || hasAutoHorizontalScrollbar()); } | |
| 496 virtual bool scrollsOverflowY() const { return hasOverflowClip() && (style()
->overflowY() == OSCROLL || hasAutoVerticalScrollbar()); } | |
| 497 bool usesCompositedScrolling() const; | |
| 498 | |
| 499 // Elements such as the <input> field override this to specify that they are
scrollable | |
| 500 // outside the context of the CSS overflow style | |
| 501 virtual bool isIntristicallyScrollable(ScrollbarOrientation orientation) con
st { return false; } | |
| 502 | |
| 503 bool hasUnsplittableScrollingOverflow() const; | |
| 504 bool isUnsplittableForPagination() const; | |
| 505 | |
| 506 virtual LayoutRect localCaretRect(InlineBox*, int caretOffset, LayoutUnit* e
xtraWidthToEndOfLine = 0) override; | |
| 507 | |
| 508 virtual LayoutRect overflowClipRect(const LayoutPoint& location, OverlayScro
llbarSizeRelevancy = IgnoreOverlayScrollbarSize); | |
| 509 LayoutRect clipRect(const LayoutPoint& location); | |
| 510 virtual bool hasControlClip() const { return false; } | |
| 511 virtual LayoutRect controlClipRect(const LayoutPoint&) const { return Layout
Rect(); } | |
| 512 | |
| 513 virtual void paintObject(const PaintInfo&, const LayoutPoint&) { ASSERT_NOT_
REACHED(); } | |
| 514 virtual void paintBoxDecorationBackground(const PaintInfo&, const LayoutPoin
t&); | |
| 515 virtual void paintMask(const PaintInfo&, const LayoutPoint&); | |
| 516 virtual void paintClippingMask(const PaintInfo&, const LayoutPoint&); | |
| 517 virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) override; | |
| 518 | |
| 519 void logicalExtentAfterUpdatingLogicalWidth(const LayoutUnit& logicalTop, Lo
gicalExtentComputedValues&); | |
| 520 | |
| 521 virtual PositionWithAffinity positionForPoint(const LayoutPoint&) override; | |
| 522 | |
| 523 void removeFloatingOrPositionedChildFromBlockLists(); | |
| 524 | |
| 525 Layer* enclosingFloatPaintingLayer() const; | |
| 526 | |
| 527 virtual int firstLineBoxBaseline() const { return -1; } | |
| 528 virtual int inlineBlockBaseline(LineDirectionMode) const { return -1; } // R
eturns -1 if we should skip this box when computing the baseline of an inline-bl
ock. | |
| 529 | |
| 530 bool shrinkToAvoidFloats() const; | |
| 531 virtual bool avoidsFloats() const; | |
| 532 | |
| 533 virtual void markForPaginationRelayoutIfNeeded(SubtreeLayoutScope&); | |
| 534 | |
| 535 bool isWritingModeRoot() const { return !parent() || parent()->style()->writ
ingMode() != style()->writingMode(); } | |
| 536 | |
| 537 bool isDeprecatedFlexItem() const { return !isInline() && !isFloatingOrOutOf
FlowPositioned() && parent() && parent()->isDeprecatedFlexibleBox(); } | |
| 538 bool isFlexItemIncludingDeprecated() const { return !isInline() && !isFloati
ngOrOutOfFlowPositioned() && parent() && parent()->isFlexibleBoxIncludingDepreca
ted(); } | |
| 539 | |
| 540 bool isGridItem() const { return parent() && parent()->isRenderGrid(); } | |
| 541 | |
| 542 virtual LayoutUnit lineHeight(bool firstLine, LineDirectionMode, LinePositio
nMode = PositionOnContainingLine) const override; | |
| 543 virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode
, LinePositionMode = PositionOnContainingLine) const override; | |
| 544 | |
| 545 virtual LayoutUnit offsetLeft() const override; | |
| 546 virtual LayoutUnit offsetTop() const override; | |
| 547 | |
| 548 LayoutPoint flipForWritingModeForChild(const RenderBox* child, const LayoutP
oint&) const; | |
| 549 LayoutUnit flipForWritingMode(LayoutUnit position) const WARN_UNUSED_RETURN | |
| 550 { | |
| 551 // The offset is in the block direction (y for horizontal writing modes,
x for vertical writing modes). | |
| 552 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | |
| 553 return position; | |
| 554 return logicalHeight() - position; | |
| 555 } | |
| 556 LayoutPoint flipForWritingMode(const LayoutPoint& position) const WARN_UNUSE
D_RETURN | |
| 557 { | |
| 558 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | |
| 559 return position; | |
| 560 return isHorizontalWritingMode() ? LayoutPoint(position.x(), m_frameRect
.height() - position.y()) : LayoutPoint(m_frameRect.width() - position.x(), posi
tion.y()); | |
| 561 } | |
| 562 LayoutPoint flipForWritingModeIncludingColumns(const LayoutPoint&) const; | |
| 563 LayoutSize flipForWritingMode(const LayoutSize& offset) const WARN_UNUSED_RE
TURN | |
| 564 { | |
| 565 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | |
| 566 return offset; | |
| 567 return isHorizontalWritingMode() ? LayoutSize(offset.width(), m_frameRec
t.height() - offset.height()) : LayoutSize(m_frameRect.width() - offset.width(),
offset.height()); | |
| 568 } | |
| 569 void flipForWritingMode(LayoutRect& rect) const | |
| 570 { | |
| 571 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | |
| 572 return; | |
| 573 if (isHorizontalWritingMode()) | |
| 574 rect.setY(m_frameRect.height() - rect.maxY()); | |
| 575 else | |
| 576 rect.setX(m_frameRect.width() - rect.maxX()); | |
| 577 } | |
| 578 FloatPoint flipForWritingMode(const FloatPoint& position) const WARN_UNUSED_
RETURN | |
| 579 { | |
| 580 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | |
| 581 return position; | |
| 582 return isHorizontalWritingMode() ? FloatPoint(position.x(), m_frameRect.
height() - position.y()) : FloatPoint(m_frameRect.width() - position.x(), positi
on.y()); | |
| 583 } | |
| 584 void flipForWritingMode(FloatRect& rect) const | |
| 585 { | |
| 586 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | |
| 587 return; | |
| 588 if (isHorizontalWritingMode()) | |
| 589 rect.setY(m_frameRect.height() - rect.maxY()); | |
| 590 else | |
| 591 rect.setX(m_frameRect.width() - rect.maxX()); | |
| 592 } | |
| 593 // These represent your location relative to your container as a physical of
fset. | |
| 594 // In layout related methods you almost always want the logical location (e.
g. x() and y()). | |
| 595 LayoutPoint topLeftLocation() const; | |
| 596 LayoutSize topLeftLocationOffset() const { return toLayoutSize(topLeftLocati
on()); } | |
| 597 | |
| 598 LayoutRect logicalVisualOverflowRectForPropagation(const LayoutStyle&) const
; | |
| 599 LayoutRect visualOverflowRectForPropagation(const LayoutStyle&) const; | |
| 600 LayoutRect logicalLayoutOverflowRectForPropagation(const LayoutStyle&) const
; | |
| 601 LayoutRect layoutOverflowRectForPropagation(const LayoutStyle&) const; | |
| 602 | |
| 603 bool hasRenderOverflow() const { return m_overflow; } | |
| 604 bool hasVisualOverflow() const { return m_overflow && !borderBoxRect().conta
ins(m_overflow->visualOverflowRect()); } | |
| 605 | |
| 606 virtual bool needsPreferredWidthsRecalculation() const; | |
| 607 virtual void computeIntrinsicRatioInformation(FloatSize& /* intrinsicSize */
, double& /* intrinsicRatio */) const { } | |
| 608 | |
| 609 IntSize scrolledContentOffset() const; | |
| 610 void applyCachedClipAndScrollOffsetForPaintInvalidation(LayoutRect& paintRec
t) const; | |
| 611 | |
| 612 virtual bool hasRelativeLogicalHeight() const; | |
| 613 | |
| 614 bool hasHorizontalLayoutOverflow() const | |
| 615 { | |
| 616 if (!m_overflow) | |
| 617 return false; | |
| 618 | |
| 619 LayoutRect layoutOverflowRect = m_overflow->layoutOverflowRect(); | |
| 620 LayoutRect noOverflowRect = this->noOverflowRect(); | |
| 621 return layoutOverflowRect.x() < noOverflowRect.x() || layoutOverflowRect
.maxX() > noOverflowRect.maxX(); | |
| 622 } | |
| 623 | |
| 624 bool hasVerticalLayoutOverflow() const | |
| 625 { | |
| 626 if (!m_overflow) | |
| 627 return false; | |
| 628 | |
| 629 LayoutRect layoutOverflowRect = m_overflow->layoutOverflowRect(); | |
| 630 LayoutRect noOverflowRect = this->noOverflowRect(); | |
| 631 return layoutOverflowRect.y() < noOverflowRect.y() || layoutOverflowRect
.maxY() > noOverflowRect.maxY(); | |
| 632 } | |
| 633 | |
| 634 virtual RenderBox* createAnonymousBoxWithSameTypeAs(const LayoutObject*) con
st | |
| 635 { | |
| 636 ASSERT_NOT_REACHED(); | |
| 637 return 0; | |
| 638 } | |
| 639 | |
| 640 bool hasSameDirectionAs(const RenderBox* object) const { return style()->dir
ection() == object->style()->direction(); } | |
| 641 | |
| 642 ShapeOutsideInfo* shapeOutsideInfo() const | |
| 643 { | |
| 644 return ShapeOutsideInfo::isEnabledFor(*this) ? ShapeOutsideInfo::info(*t
his) : 0; | |
| 645 } | |
| 646 | |
| 647 void markShapeOutsideDependentsForLayout() | |
| 648 { | |
| 649 if (isFloating()) | |
| 650 removeFloatingOrPositionedChildFromBlockLists(); | |
| 651 } | |
| 652 | |
| 653 bool backgroundHasOpaqueTopLayer() const; | |
| 654 | |
| 655 void setIntrinsicContentLogicalHeight(LayoutUnit intrinsicContentLogicalHeig
ht) const { m_intrinsicContentLogicalHeight = intrinsicContentLogicalHeight; } | |
| 656 protected: | |
| 657 virtual void willBeDestroyed() override; | |
| 658 | |
| 659 virtual void styleWillChange(StyleDifference, const LayoutStyle& newStyle) o
verride; | |
| 660 virtual void styleDidChange(StyleDifference, const LayoutStyle* oldStyle) ov
erride; | |
| 661 virtual void updateFromStyle() override; | |
| 662 | |
| 663 // Returns false if it could not cheaply compute the extent (e.g. fixed back
ground), in which case the returned rect may be incorrect. | |
| 664 // FIXME: make this a const method once the RenderBox reference in BoxPainte
r is const. | |
| 665 bool getBackgroundPaintedExtent(LayoutRect&); | |
| 666 virtual bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect,
unsigned maxDepthToTest) const; | |
| 667 virtual bool computeBackgroundIsKnownToBeObscured() override; | |
| 668 | |
| 669 void computePositionedLogicalWidth(LogicalExtentComputedValues&) const; | |
| 670 | |
| 671 LayoutUnit computeIntrinsicLogicalWidthUsing(const Length& logicalWidthLengt
h, LayoutUnit availableLogicalWidth, LayoutUnit borderAndPadding) const; | |
| 672 LayoutUnit computeIntrinsicLogicalContentHeightUsing(const Length& logicalHe
ightLength, LayoutUnit intrinsicContentHeight, LayoutUnit borderAndPadding) cons
t; | |
| 673 | |
| 674 virtual bool shouldComputeSizeAsReplaced() const { return isReplaced() && !i
sInlineBlockOrInlineTable(); } | |
| 675 | |
| 676 virtual void mapLocalToContainer(const LayoutBoxModelObject* paintInvalidati
onContainer, TransformState&, MapCoordinatesFlags = ApplyContainerFlip, bool* wa
sFixed = 0, const PaintInvalidationState* = 0) const override; | |
| 677 virtual void mapAbsoluteToLocalPoint(MapCoordinatesFlags, TransformState&) c
onst override; | |
| 678 | |
| 679 LayoutObject* splitAnonymousBoxesAroundChild(LayoutObject* beforeChild); | |
| 680 | |
| 681 virtual void addLayerHitTestRects(LayerHitTestRects&, const Layer* currentCo
mpositedLayer, const LayoutPoint& layerOffset, const LayoutRect& containerRect)
const override; | |
| 682 virtual void computeSelfHitTestRects(Vector<LayoutRect>&, const LayoutPoint&
layerOffset) const override; | |
| 683 | |
| 684 virtual PaintInvalidationReason paintInvalidationReason(const LayoutBoxModel
Object& paintInvalidationContainer, | |
| 685 const LayoutRect& oldBounds, const LayoutPoint& oldPositionFromPaintInva
lidationContainer, | |
| 686 const LayoutRect& newBounds, const LayoutPoint& newPositionFromPaintInva
lidationContainer) const override; | |
| 687 virtual void incrementallyInvalidatePaint(const LayoutBoxModelObject& paintI
nvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds,
const LayoutPoint& positionFromPaintInvalidationContainer) override; | |
| 688 | |
| 689 virtual void clearPaintInvalidationState(const PaintInvalidationState&) over
ride; | |
| 690 #if ENABLE(ASSERT) | |
| 691 virtual bool paintInvalidationStateIsDirty() const override; | |
| 692 #endif | |
| 693 | |
| 694 virtual PaintInvalidationReason invalidatePaintIfNeeded(const PaintInvalidat
ionState&, const LayoutBoxModelObject& newPaintInvalidationContainer) override; | |
| 695 virtual void invalidateDisplayItemClients(DisplayItemList*) const override; | |
| 696 | |
| 697 virtual bool hasNonCompositedScrollbars() const override final; | |
| 698 | |
| 699 private: | |
| 700 void invalidatePaintRectClippedByOldAndNewBounds(const LayoutBoxModelObject&
paintInvalidationContainer, const LayoutRect&, const LayoutRect& oldBounds, con
st LayoutRect& newBounds); | |
| 701 | |
| 702 void updateShapeOutsideInfoAfterStyleChange(const LayoutStyle&, const Layout
Style* oldStyle); | |
| 703 void updateGridPositionAfterStyleChange(const LayoutStyle*); | |
| 704 | |
| 705 bool autoWidthShouldFitContent() const; | |
| 706 LayoutUnit shrinkToFitLogicalWidth(LayoutUnit availableLogicalWidth, LayoutU
nit bordersPlusPadding) const; | |
| 707 | |
| 708 // Returns true if we queued up a paint invalidation. | |
| 709 bool paintInvalidationLayerRectsForImage(WrappedImagePtr, const FillLayer&,
bool drawingBackground); | |
| 710 | |
| 711 bool skipContainingBlockForPercentHeightCalculation(const RenderBox* contain
ingBlock) const; | |
| 712 | |
| 713 LayoutUnit containingBlockLogicalWidthForPositioned(const LayoutBoxModelObje
ct* containingBlock, bool checkForPerpendicularWritingMode = true) const; | |
| 714 LayoutUnit containingBlockLogicalHeightForPositioned(const LayoutBoxModelObj
ect* containingBlock, bool checkForPerpendicularWritingMode = true) const; | |
| 715 | |
| 716 void computePositionedLogicalHeight(LogicalExtentComputedValues&) const; | |
| 717 void computePositionedLogicalWidthUsing(Length logicalWidth, const LayoutBox
ModelObject* containerBlock, TextDirection containerDirection, | |
| 718 LayoutUnit containerLogicalWidth, La
youtUnit bordersPlusPadding, | |
| 719 const Length& logicalLeft, const Len
gth& logicalRight, const Length& marginLogicalLeft, | |
| 720 const Length& marginLogicalRight, Lo
gicalExtentComputedValues&) const; | |
| 721 void computePositionedLogicalHeightUsing(Length logicalHeightLength, const L
ayoutBoxModelObject* containerBlock, | |
| 722 LayoutUnit containerLogicalHeight,
LayoutUnit bordersPlusPadding, LayoutUnit logicalHeight, | |
| 723 const Length& logicalTop, const Len
gth& logicalBottom, const Length& marginLogicalTop, | |
| 724 const Length& marginLogicalBottom,
LogicalExtentComputedValues&) const; | |
| 725 | |
| 726 void computePositionedLogicalHeightReplaced(LogicalExtentComputedValues&) co
nst; | |
| 727 void computePositionedLogicalWidthReplaced(LogicalExtentComputedValues&) con
st; | |
| 728 | |
| 729 LayoutUnit fillAvailableMeasure(LayoutUnit availableLogicalWidth) const; | |
| 730 LayoutUnit fillAvailableMeasure(LayoutUnit availableLogicalWidth, LayoutUnit
& marginStart, LayoutUnit& marginEnd) const; | |
| 731 | |
| 732 virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
utUnit& maxLogicalWidth) const; | |
| 733 | |
| 734 // This function calculates the minimum and maximum preferred widths for an
object. | |
| 735 // These values are used in shrink-to-fit layout systems. | |
| 736 // These include tables, positioned objects, floats and flexible boxes. | |
| 737 virtual void computePreferredLogicalWidths() { clearPreferredLogicalWidthsDi
rty(); } | |
| 738 | |
| 739 RenderBoxRareData& ensureRareData() | |
| 740 { | |
| 741 if (!m_rareData) | |
| 742 m_rareData = adoptPtr(new RenderBoxRareData()); | |
| 743 return *m_rareData.get(); | |
| 744 } | |
| 745 | |
| 746 void savePreviousBorderBoxSizeIfNeeded(); | |
| 747 LayoutSize computePreviousBorderBoxSize(const LayoutSize& previousBoundsSize
) const; | |
| 748 | |
| 749 bool logicalHeightComputesAsNone(SizeType) const; | |
| 750 | |
| 751 bool isBox() const = delete; // This will catch anyone doing an unnecessary
check. | |
| 752 | |
| 753 // The width/height of the contents + borders + padding. The x/y location i
s relative to our container (which is not always our parent). | |
| 754 LayoutRect m_frameRect; | |
| 755 | |
| 756 // Our intrinsic height, used for min-height: min-content etc. Maintained by | |
| 757 // updateLogicalHeight. This is logicalHeight() before it is clamped to | |
| 758 // min/max. | |
| 759 mutable LayoutUnit m_intrinsicContentLogicalHeight; | |
| 760 | |
| 761 void inflatePaintInvalidationRectForReflectionAndFilter(LayoutRect&) const; | |
| 762 | |
| 763 LayoutRectOutsets m_marginBoxOutsets; | |
| 764 | |
| 765 protected: | |
| 766 // The preferred logical width of the element if it were to break its lines
at every possible opportunity. | |
| 767 LayoutUnit m_minPreferredLogicalWidth; | |
| 768 | |
| 769 // The preferred logical width of the element if it never breaks any lines a
t all. | |
| 770 LayoutUnit m_maxPreferredLogicalWidth; | |
| 771 | |
| 772 // Our overflow information. | |
| 773 OwnPtr<RenderOverflow> m_overflow; | |
| 774 | |
| 775 private: | |
| 776 OwnPtr<RenderBoxRareData> m_rareData; | |
| 777 }; | |
| 778 | |
| 779 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(RenderBox, isBox()); | |
| 780 | |
| 781 inline RenderBox* RenderBox::previousSiblingBox() const | |
| 782 { | |
| 783 return toRenderBox(previousSibling()); | |
| 784 } | |
| 785 | |
| 786 inline RenderBox* RenderBox::previousInFlowSiblingBox() const | |
| 787 { | |
| 788 RenderBox* previous = previousSiblingBox(); | |
| 789 while (previous && previous->isOutOfFlowPositioned()) | |
| 790 previous = previous->previousSiblingBox(); | |
| 791 return previous; | |
| 792 } | |
| 793 | |
| 794 inline RenderBox* RenderBox::nextSiblingBox() const | |
| 795 { | |
| 796 return toRenderBox(nextSibling()); | |
| 797 } | |
| 798 | |
| 799 inline RenderBox* RenderBox::nextInFlowSiblingBox() const | |
| 800 { | |
| 801 RenderBox* next = nextSiblingBox(); | |
| 802 while (next && next->isOutOfFlowPositioned()) | |
| 803 next = next->nextSiblingBox(); | |
| 804 return next; | |
| 805 } | |
| 806 | |
| 807 inline RenderBox* RenderBox::parentBox() const | |
| 808 { | |
| 809 return toRenderBox(parent()); | |
| 810 } | |
| 811 | |
| 812 inline RenderBox* RenderBox::firstChildBox() const | |
| 813 { | |
| 814 return toRenderBox(slowFirstChild()); | |
| 815 } | |
| 816 | |
| 817 inline RenderBox* RenderBox::lastChildBox() const | |
| 818 { | |
| 819 return toRenderBox(slowLastChild()); | |
| 820 } | |
| 821 | |
| 822 inline RenderBox* RenderBox::previousSiblingMultiColumnBox() const | |
| 823 { | |
| 824 ASSERT(isLayoutMultiColumnSpannerPlaceholder() || isLayoutMultiColumnSet()); | |
| 825 RenderBox* previousBox = previousSiblingBox(); | |
| 826 if (previousBox->isLayoutFlowThread()) | |
| 827 return 0; | |
| 828 return previousBox; | |
| 829 } | |
| 830 | |
| 831 inline RenderBox* RenderBox::nextSiblingMultiColumnBox() const | |
| 832 { | |
| 833 ASSERT(isLayoutMultiColumnSpannerPlaceholder() || isLayoutMultiColumnSet()); | |
| 834 return nextSiblingBox(); | |
| 835 } | |
| 836 | |
| 837 inline void RenderBox::setInlineBoxWrapper(InlineBox* boxWrapper) | |
| 838 { | |
| 839 if (boxWrapper) { | |
| 840 ASSERT(!inlineBoxWrapper()); | |
| 841 // m_inlineBoxWrapper should already be 0. Deleting it is a safeguard ag
ainst security issues. | |
| 842 // Otherwise, there will two line box wrappers keeping the reference to
this renderer, and | |
| 843 // only one will be notified when the renderer is getting destroyed. The
second line box wrapper | |
| 844 // will keep a stale reference. | |
| 845 if (UNLIKELY(inlineBoxWrapper() != 0)) | |
| 846 deleteLineBoxWrapper(); | |
| 847 } | |
| 848 | |
| 849 ensureRareData().m_inlineBoxWrapper = boxWrapper; | |
| 850 } | |
| 851 | |
| 852 } // namespace blink | |
| 853 | |
| 854 #endif // RenderBox_h | |
| OLD | NEW |