Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
index 9596387617665fb76b04d9f9b3ce6d919cae03f0..196a2f1d2316777b0f2d53fe467703e35735e793 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
@@ -3,7 +3,8 @@ |
* (C) 1999 Antti Koivisto (koivisto@kde.org) |
* (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
* (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
- * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. |
+ * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. |
+ * All rights reserved. |
* Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
* |
* This library is free software; you can redistribute it and/or |
@@ -102,8 +103,9 @@ LayoutBox::LayoutBox(ContainerNode* node) |
} |
PaintLayerType LayoutBox::layerTypeRequired() const { |
- // hasAutoZIndex only returns true if the element is positioned or a flex-item since |
- // position:static elements that are not flex-items get their z-index coerced to auto. |
+ // hasAutoZIndex only returns true if the element is positioned or a flex-item |
+ // since position:static elements that are not flex-items get their z-index |
+ // coerced to auto. |
if (isPositioned() || createsGroup() || hasClipPath() || |
hasTransformRelatedProperty() || style()->hasCompositorProxy() || |
hasHiddenBackface() || hasReflection() || style()->specifiesColumns() || |
@@ -185,8 +187,9 @@ void LayoutBox::styleWillChange(StyleDifference diff, |
if (flowThread && flowThread != this) |
flowThread->flowThreadDescendantStyleWillChange(this, diff, newStyle); |
- // The background of the root element or the body element could propagate up to |
- // the canvas. Just dirty the entire canvas when our style changes substantially. |
+ // The background of the root element or the body element could propagate up |
+ // to the canvas. Just dirty the entire canvas when our style changes |
+ // substantially. |
if ((diff.needsPaintInvalidation() || diff.needsLayout()) && node() && |
(isHTMLHtmlElement(*node()) || isHTMLBodyElement(*node()))) { |
view()->setShouldDoFullPaintInvalidation(); |
@@ -196,14 +199,16 @@ void LayoutBox::styleWillChange(StyleDifference diff, |
view()->compositor()->setNeedsUpdateFixedBackground(); |
} |
- // When a layout hint happens and an object's position style changes, we have to do a layout |
- // to dirty the layout tree using the old position value now. |
+ // When a layout hint happens and an object's position style changes, we |
+ // have to do a layout to dirty the layout tree using the old position |
+ // value now. |
if (diff.needsFullLayout() && parent() && |
oldStyle->position() != newStyle.position()) { |
if (!oldStyle->hasOutOfFlowPosition() && |
newStyle.hasOutOfFlowPosition()) { |
- // We're about to go out of flow. Before that takes place, we need to mark the |
- // current containing block chain for preferred widths recalculation. |
+ // We're about to go out of flow. Before that takes place, we need to |
+ // mark the current containing block chain for preferred widths |
+ // recalculation. |
setNeedsLayoutAndPrefWidthsRecalc( |
LayoutInvalidationReason::StyleChange); |
} else { |
@@ -217,8 +222,9 @@ void LayoutBox::styleWillChange(StyleDifference diff, |
newStyle.hasOutOfFlowPosition()) |
removeFloatingOrPositionedChildFromBlockLists(); |
} |
- // FIXME: This branch runs when !oldStyle, which means that layout was never called |
- // so what's the point in invalidating the whole view that we never painted? |
+ // FIXME: This branch runs when !oldStyle, which means that layout was never |
+ // called so what's the point in invalidating the whole view that we never |
+ // painted? |
} else if (isBody()) { |
view()->setShouldDoFullPaintInvalidation(); |
} |
@@ -228,9 +234,10 @@ void LayoutBox::styleWillChange(StyleDifference diff, |
void LayoutBox::styleDidChange(StyleDifference diff, |
const ComputedStyle* oldStyle) { |
- // Horizontal writing mode definition is updated in LayoutBoxModelObject::updateFromStyle, |
- // (as part of the LayoutBoxModelObject::styleDidChange call below). So, we can safely cache the horizontal |
- // writing mode value before style change here. |
+ // Horizontal writing mode definition is updated in LayoutBoxModelObject:: |
+ // updateFromStyle, (as part of the LayoutBoxModelObject::styleDidChange call |
+ // below). So, we can safely cache the horizontal writing mode value before |
+ // style change here. |
bool oldHorizontalWritingMode = isHorizontalWritingMode(); |
LayoutBoxModelObject::styleDidChange(diff, oldStyle); |
@@ -255,8 +262,8 @@ void LayoutBox::styleDidChange(StyleDifference diff, |
clearPercentHeightDescendants(); |
} |
- // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the |
- // new zoomed coordinate space. |
+ // If our zoom factor changes and we have a defined scrollLeft/Top, we need to |
+ // adjust that value into the new zoomed coordinate space. |
if (hasOverflowClip() && oldStyle && |
oldStyle->effectiveZoom() != newStyle.effectiveZoom()) { |
PaintLayerScrollableArea* scrollableArea = this->getScrollableArea(); |
@@ -314,27 +321,28 @@ void LayoutBox::styleDidChange(StyleDifference diff, |
updateScrollSnapMappingAfterStyleChange(&newStyle, oldStyle); |
} |
- ASSERT( |
- !isInline() || |
- isAtomicInlineLevel()); // Non-atomic inlines should be LayoutInline or LayoutText, not LayoutBox. |
+ // Non-atomic inlines should be LayoutInline or LayoutText, not LayoutBox. |
+ DCHECK(!isInline() || isAtomicInlineLevel()); |
} |
void LayoutBox::updateBackgroundAttachmentFixedStatusAfterStyleChange() { |
if (!frameView()) |
return; |
- // On low-powered/mobile devices, preventing blitting on a scroll can cause noticeable delays |
- // when scrolling a page with a fixed background image. As an optimization, assuming there are |
- // no fixed positoned elements on the page, we can acclerate scrolling (via blitting) if we |
- // ignore the CSS property "background-attachment: fixed". |
+ // On low-powered/mobile devices, preventing blitting on a scroll can cause |
+ // noticeable delays when scrolling a page with a fixed background image. As |
+ // an optimization, assuming there are no fixed positoned elements on the |
+ // page, we can acclerate scrolling (via blitting) if we ignore the CSS |
+ // property "background-attachment: fixed". |
bool ignoreFixedBackgroundAttachment = |
RuntimeEnabledFeatures::fastMobileScrollingEnabled(); |
if (ignoreFixedBackgroundAttachment) |
return; |
- // An object needs to be repainted on frame scroll when it has background-attachment:fixed. |
- // LayoutView is responsible for painting root background, thus the root element (and the |
- // body element if html element has no background) skips painting backgrounds. |
+ // An object needs to be repainted on frame scroll when it has background- |
+ // attachment:fixed. LayoutView is responsible for painting root background, |
+ // thus the root element (and the body element if html element has no |
+ // background) skips painting backgrounds. |
bool isBackgroundAttachmentFixedObject = !isDocumentElement() && |
!backgroundStolenForBeingBody() && |
styleRef().hasFixedBackgroundImage(); |
@@ -364,7 +372,8 @@ void LayoutBox::updateShapeOutsideInfoAfterStyleChange( |
oldStyle ? oldStyle->shapeImageThreshold() |
: ComputedStyle::initialShapeImageThreshold(); |
- // FIXME: A future optimization would do a deep comparison for equality. (bug 100811) |
+ // FIXME: A future optimization would do a deep comparison for equality. (bug |
+ // 100811) |
if (shapeOutside == oldShapeOutside && shapeMargin == oldShapeMargin && |
shapeImageThreshold == oldShapeImageThreshold) |
return; |
@@ -391,7 +400,8 @@ void LayoutBox::updateGridPositionAfterStyleChange( |
oldStyle->hasOutOfFlowPosition() == style()->hasOutOfFlowPosition()) |
return; |
- // It should be possible to not dirty the grid in some cases (like moving an explicitly placed grid item). |
+ // It should be possible to not dirty the grid in some cases (like moving an |
+ // explicitly placed grid item). |
// For now, it's more simple to just always recompute the grid. |
toLayoutGrid(parent())->dirtyGrid(); |
} |
@@ -461,8 +471,8 @@ void LayoutBox::layout() { |
clearNeedsLayout(); |
} |
-// More IE extensions. clientWidth and clientHeight represent the interior of an object |
-// excluding border and scrollbar. |
+// More IE extensions. clientWidth and clientHeight represent the interior of |
+// an object excluding border and scrollbar. |
DISABLE_CFI_PERF |
LayoutUnit LayoutBox::clientWidth() const { |
return m_frameRect.width() - borderLeft() - borderRight() - |
@@ -535,8 +545,8 @@ int LayoutBox::pixelSnappedScrollHeight() const { |
} |
void LayoutBox::setScrollLeft(LayoutUnit newLeft) { |
- // This doesn't hit in any tests, but since the equivalent code in setScrollTop |
- // does, presumably this code does as well. |
+ // This doesn't hit in any tests, but since the equivalent code in |
+ // setScrollTop does, presumably this code does as well. |
DisableCompositingQueryAsserts disabler; |
if (hasOverflowClip()) |
@@ -545,7 +555,8 @@ void LayoutBox::setScrollLeft(LayoutUnit newLeft) { |
} |
void LayoutBox::setScrollTop(LayoutUnit newTop) { |
- // Hits in compositing/overflow/do-not-assert-on-invisible-composited-layers.html |
+ // Hits in |
+ // compositing/overflow/do-not-assert-on-invisible-composited-layers.html |
DisableCompositingQueryAsserts disabler; |
if (hasOverflowClip()) |
@@ -555,8 +566,8 @@ void LayoutBox::setScrollTop(LayoutUnit newTop) { |
void LayoutBox::scrollToOffset(const DoubleSize& offset, |
ScrollBehavior scrollBehavior) { |
- // This doesn't hit in any tests, but since the equivalent code in setScrollTop |
- // does, presumably this code does as well. |
+ // This doesn't hit in any tests, but since the equivalent code in |
+ // setScrollTop does, presumably this code does as well. |
DisableCompositingQueryAsserts disabler; |
if (hasOverflowClip()) |
@@ -564,7 +575,8 @@ void LayoutBox::scrollToOffset(const DoubleSize& offset, |
scrollBehavior); |
} |
-// Returns true iff we are attempting an autoscroll inside an iframe with scrolling="no". |
+// Returns true iff we are attempting an autoscroll inside an iframe with |
+// scrolling="no". |
static bool isDisallowedAutoscroll(HTMLFrameOwnerElement* ownerElement, |
FrameView* frameView) { |
if (ownerElement && isHTMLFrameElementBase(*ownerElement)) { |
@@ -603,8 +615,11 @@ void LayoutBox::scrollRectToVisible(const LayoutRect& rect, |
} |
if (hasOverflowClip() && !restrictedByLineClamp) { |
- // Don't scroll to reveal an overflow layer that is restricted by the -webkit-line-clamp property. |
- // This will prevent us from revealing text hidden by the slider in Safari RSS. |
+ // Don't scroll to reveal an overflow layer that is restricted by the |
+ // -webkit-line-clamp property. This will prevent us from revealing text |
+ // hidden by the slider in Safari RSS. |
+ // TODO(eae): We probably don't need this any more as we don't share any |
+ // code with the Safari RSS reeder. |
newRect = getScrollableArea()->scrollIntoView(rectToScroll, alignX, alignY, |
scrollType); |
if (newRect.isEmpty()) |
@@ -670,7 +685,8 @@ FloatRect LayoutBox::localBoundingBoxRectForAccessibility() const { |
} |
void LayoutBox::updateLayerTransformAfterLayout() { |
- // Transform-origin depends on box size, so we need to update the layer transform after layout. |
+ // Transform-origin depends on box size, so we need to update the layer |
+ // transform after layout. |
if (hasLayer()) |
layer()->updateTransformationMatrix(); |
} |
@@ -707,7 +723,8 @@ LayoutUnit LayoutBox::constrainLogicalHeightByMinMax( |
LayoutUnit LayoutBox::constrainContentBoxLogicalHeightByMinMax( |
LayoutUnit logicalHeight, |
LayoutUnit intrinsicContentHeight) const { |
- // If the min/max height and logical height are both percentages we take advantage of already knowing the current resolved percentage height |
+ // If the min/max height and logical height are both percentages we take |
+ // advantage of already knowing the current resolved percentage height |
// to avoid recursing up through our containing blocks again to determine it. |
const ComputedStyle& styleToUse = styleRef(); |
if (!styleToUse.logicalMaxHeight().isMaxSizeNone()) { |
@@ -815,8 +832,8 @@ LayoutRect LayoutBox::backgroundRect(BackgroundRectType rectType) const { |
cur->attachment() == LocalBackgroundAttachment) |
currentClip = PaddingFillBox; |
- // If we're asking for the clip rect, a content-box clipped fill layer can be scrolled |
- // into the padding box of the overflow container. |
+ // If we're asking for the clip rect, a content-box clipped fill layer can |
+ // be scrolled into the padding box of the overflow container. |
if (rectType == BackgroundClipRect && currentClip == ContentFillBox && |
cur->attachment() == LocalBackgroundAttachment) { |
currentClip = PaddingFillBox; |
@@ -1057,7 +1074,8 @@ void LayoutBox::middleClickAutoscroll(const IntPoint& sourcePoint) { |
IntPoint lastKnownMousePosition = |
frame->eventHandler().lastKnownMousePosition(); |
- // We need to check if the last known mouse position is out of the window. When the mouse is out of the window, the position is incoherent |
+ // We need to check if the last known mouse position is out of the window. |
+ // When the mouse is out of the window, the position is incoherent |
static IntPoint previousMousePosition; |
if (lastKnownMousePosition.x() < 0 || lastKnownMousePosition.y() < 0) |
lastKnownMousePosition = previousMousePosition; |
@@ -1066,9 +1084,8 @@ void LayoutBox::middleClickAutoscroll(const IntPoint& sourcePoint) { |
IntSize delta = lastKnownMousePosition - sourcePoint; |
- if (abs(delta.width()) <= |
- AutoscrollController:: |
- noMiddleClickAutoscrollRadius) // at the center we let the space for the icon |
+ // at the center we let the space for the icon. |
+ if (abs(delta.width()) <= AutoscrollController::noMiddleClickAutoscrollRadius) |
delta.setWidth(0); |
if (abs(delta.height()) <= |
AutoscrollController::noMiddleClickAutoscrollRadius) |
@@ -1092,7 +1109,8 @@ void LayoutBox::scrollByRecursively(const DoubleSize& delta, |
DoubleSize newScrollOffset = scrollableArea->adjustedScrollOffset() + delta; |
scrollableArea->scrollToOffset(newScrollOffset, clamp); |
- // If this layer can't do the scroll we ask the next layer up that can scroll to try |
+ // If this layer can't do the scroll we ask the next layer up that can |
+ // scroll to try. |
DoubleSize remainingScrollOffset = |
newScrollOffset - scrollableArea->adjustedScrollOffset(); |
if (!remainingScrollOffset.isZero() && parent()) { |
@@ -1104,12 +1122,14 @@ void LayoutBox::scrollByRecursively(const DoubleSize& delta, |
frame->page()->autoscrollController().updateAutoscrollLayoutObject(); |
} |
} else if (view()->frameView()) { |
- // If we are here, we were called on a layoutObject that can be programmatically scrolled, but doesn't |
- // have an overflow clip. Which means that it is a document node that can be scrolled. |
+ // If we are here, we were called on a layoutObject that can be |
+ // programmatically scrolled, but doesn't have an overflow clip. Which means |
+ // that it is a document node that can be scrolled. |
// FIXME: Pass in DoubleSize. crbug.com/414283. |
view()->frameView()->scrollBy(flooredIntSize(delta), UserScroll); |
- // FIXME: If we didn't scroll the whole way, do we want to try looking at the frames ownerElement? |
+ // FIXME: If we didn't scroll the whole way, do we want to try looking at |
+ // the frames ownerElement? |
// https://bugs.webkit.org/show_bug.cgi?id=28237 |
} |
} |
@@ -1169,8 +1189,9 @@ bool LayoutBox::mapScrollingContentsRectToBoxSpace( |
rect.move(offset); |
} |
- // This won't work fully correctly for fixed-position elements, who should receive CSS clip but for whom the current object |
- // is not in the containing block chain. |
+ // This won't work fully correctly for fixed-position elements, who should |
+ // receive CSS clip but for whom the current object is not in the containing |
+ // block chain. |
LayoutRect clipRect = clippingRect(); |
bool doesIntersect; |
@@ -1261,31 +1282,36 @@ LayoutUnit LayoutBox::overrideLogicalContentHeight() const { |
return m_rareData->m_overrideLogicalContentHeight; |
} |
-// TODO (lajava) Now that we have implemented these functions based on physical direction, we'd rather remove the logical ones. |
+// TODO (lajava) Now that we have implemented these functions based on physical |
+// direction, we'd rather remove the logical ones. |
LayoutUnit LayoutBox::overrideContainingBlockContentLogicalWidth() const { |
DCHECK(hasOverrideContainingBlockLogicalWidth()); |
return m_rareData->m_overrideContainingBlockContentLogicalWidth; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
LayoutUnit LayoutBox::overrideContainingBlockContentLogicalHeight() const { |
DCHECK(hasOverrideContainingBlockLogicalHeight()); |
return m_rareData->m_overrideContainingBlockContentLogicalHeight; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
bool LayoutBox::hasOverrideContainingBlockLogicalWidth() const { |
return m_rareData && |
m_rareData->m_hasOverrideContainingBlockContentLogicalWidth; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
bool LayoutBox::hasOverrideContainingBlockLogicalHeight() const { |
return m_rareData && |
m_rareData->m_hasOverrideContainingBlockContentLogicalHeight; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
void LayoutBox::setOverrideContainingBlockContentLogicalWidth( |
LayoutUnit logicalWidth) { |
DCHECK_GE(logicalWidth, LayoutUnit(-1)); |
@@ -1293,7 +1319,8 @@ void LayoutBox::setOverrideContainingBlockContentLogicalWidth( |
ensureRareData().m_hasOverrideContainingBlockContentLogicalWidth = true; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
void LayoutBox::setOverrideContainingBlockContentLogicalHeight( |
LayoutUnit logicalHeight) { |
DCHECK_GE(logicalHeight, LayoutUnit(-1)); |
@@ -1302,7 +1329,8 @@ void LayoutBox::setOverrideContainingBlockContentLogicalHeight( |
ensureRareData().m_hasOverrideContainingBlockContentLogicalHeight = true; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
void LayoutBox::clearContainingBlockOverrideSize() { |
if (!m_rareData) |
return; |
@@ -1310,7 +1338,8 @@ void LayoutBox::clearContainingBlockOverrideSize() { |
ensureRareData().m_hasOverrideContainingBlockContentLogicalHeight = false; |
} |
-// TODO (lajava) Shouldn't we implement these functions based on physical direction ?. |
+// TODO (lajava) Shouldn't we implement these functions based on physical |
+// direction ?. |
void LayoutBox::clearOverrideContainingBlockContentLogicalHeight() { |
if (!m_rareData) |
return; |
@@ -1510,8 +1539,9 @@ bool LayoutBox::getBackgroundPaintedExtent(LayoutRect& paintedExtent) const { |
} |
BackgroundImageGeometry geometry; |
- // TODO(jchaffraix): This function should be rethought as it's called during and outside |
- // of the paint phase. Potentially returning different results at different phases. |
+ // TODO(jchaffraix): This function should be rethought as it's called during |
+ // and outside of the paint phase. Potentially returning different results at |
+ // different phases. |
geometry.calculate(*this, nullptr, GlobalPaintNormalPhase, |
style()->backgroundLayers(), backgroundRect); |
if (geometry.hasNonLocalGeometry()) |
@@ -1587,7 +1617,8 @@ bool LayoutBox::foregroundIsKnownToBeOpaqueInRect( |
LayoutRect childLocalRect = localRect; |
childLocalRect.moveBy(-childLocation); |
if (childLocalRect.y() < 0 || childLocalRect.x() < 0) { |
- // If there is unobscured area above/left of a static positioned box then the rect is probably not covered. |
+ // If there is unobscured area above/left of a static positioned box then |
+ // the rect is probably not covered. |
if (!childBox->isPositioned()) |
return false; |
continue; |
@@ -1630,7 +1661,8 @@ void LayoutBox::paintMask(const PaintInfo& paintInfo, |
} |
void LayoutBox::imageChanged(WrappedImagePtr image, const IntRect*) { |
- // TODO(chrishtr): support PaintInvalidationDelayedFull for animated border images. |
+ // TODO(chrishtr): support PaintInvalidationDelayedFull for animated border |
+ // images. |
if ((styleRef().borderImage().image() && |
styleRef().borderImage().image()->data() == image) || |
(styleRef().maskBoxImage().image() && |
@@ -1682,8 +1714,8 @@ ResourcePriority LayoutBox::computeResourcePriority() const { |
LayoutRect viewBounds = viewRect(); |
LayoutRect objectBounds = LayoutRect(absoluteContentBox()); |
- // The object bounds might be empty right now, so intersects will fail since it doesn't deal |
- // with empty rects. Use LayoutRect::contains in that case. |
+ // The object bounds might be empty right now, so intersects will fail since |
+ // it doesn't deal with empty rects. Use LayoutRect::contains in that case. |
bool isVisible; |
if (!objectBounds.isEmpty()) |
isVisible = viewBounds.intersects(objectBounds); |
@@ -1831,7 +1863,8 @@ LayoutUnit LayoutBox::shrinkLogicalWidthToAvoidFloats( |
LayoutUnit endOffsetForLine = |
cb->endOffsetForLine(logicalTopPosition, DoNotIndentText, logicalHeight); |
- // If there aren't any floats constraining us then allow the margins to shrink/expand the width as much as they want. |
+ // If there aren't any floats constraining us then allow the margins to |
+ // shrink/expand the width as much as they want. |
if (startOffsetForContent == startOffsetForLine && |
endOffsetForContent == endOffsetForLine) |
return cb->availableLogicalWidthForLine(logicalTopPosition, DoNotIndentText, |
@@ -1842,11 +1875,14 @@ LayoutUnit LayoutBox::shrinkLogicalWidthToAvoidFloats( |
logicalTopPosition, DoNotIndentText, logicalHeight) - |
std::max(LayoutUnit(), childMarginStart) - |
std::max(LayoutUnit(), childMarginEnd); |
- // We need to see if margins on either the start side or the end side can contain the floats in question. If they can, |
- // then just using the line width is inaccurate. In the case where a float completely fits, we don't need to use the line |
- // offset at all, but can instead push all the way to the content edge of the containing block. In the case where the float |
- // doesn't fit, we can use the line offset, but we need to grow it by the margin to reflect the fact that the margin was |
- // "consumed" by the float. Negative margins aren't consumed by the float, and so we ignore them. |
+ // We need to see if margins on either the start side or the end side can |
+ // contain the floats in question. If they can, then just using the line width |
+ // is inaccurate. In the case where a float completely fits, we don't need to |
+ // use the line offset at all, but can instead push all the way to the content |
+ // edge of the containing block. In the case where the float doesn't fit, we |
+ // can use the line offset, but we need to grow it by the margin to reflect |
+ // the fact that the margin was "consumed" by the float. Negative margins |
+ // aren't consumed by the float, and so we ignore them. |
width += portionOfMarginNotConsumedByFloat( |
childMarginStart, startOffsetForContent, startOffsetForLine); |
width += portionOfMarginNotConsumedByFloat( |
@@ -1907,7 +1943,8 @@ LayoutUnit LayoutBox::perpendicularContainingBlockLogicalHeight() const { |
const ComputedStyle& containingBlockStyle = cb->styleRef(); |
Length logicalHeightLength = containingBlockStyle.logicalHeight(); |
- // FIXME: For now just support fixed heights. Eventually should support percentage heights as well. |
+ // FIXME: For now just support fixed heights. Eventually should support |
+ // percentage heights as well. |
if (!logicalHeightLength.isFixed()) { |
LayoutUnit fillFallbackExtent = |
LayoutUnit(containingBlockStyle.isHorizontalWritingMode() |
@@ -1930,8 +1967,9 @@ void LayoutBox::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, |
MapCoordinatesFlags mode) const { |
bool isFixedPos = style()->position() == FixedPosition; |
- // If this box has a transform or contains paint, it acts as a fixed position container for fixed descendants, |
- // and may itself also be fixed position. So propagate 'fixed' up only if this box is fixed position. |
+ // If this box has a transform or contains paint, it acts as a fixed position |
+ // container for fixed descendants, and may itself also be fixed position. So |
+ // propagate 'fixed' up only if this box is fixed position. |
if (style()->canContainFixedPositionObjects() && !isFixedPos) |
mode &= ~IsFixed; |
else if (isFixedPos) |
@@ -1948,8 +1986,9 @@ void LayoutBox::mapAncestorToLocal(const LayoutBoxModelObject* ancestor, |
bool isFixedPos = style()->position() == FixedPosition; |
- // If this box has a transform or contains paint, it acts as a fixed position container for fixed descendants, |
- // and may itself also be fixed position. So propagate 'fixed' up only if this box is fixed position. |
+ // If this box has a transform or contains paint, it acts as a fixed position |
+ // container for fixed descendants, and may itself also be fixed position. So |
+ // propagate 'fixed' up only if this box is fixed position. |
if (style()->canContainFixedPositionObjects() && !isFixedPos) |
mode &= ~IsFixed; |
else if (isFixedPos) |
@@ -1998,16 +2037,16 @@ void LayoutBox::positionLineBox(InlineBox* box) { |
bool originallyInline = style()->isOriginalDisplayInlineType(); |
if (originallyInline) { |
// The value is cached in the xPos of the box. We only need this value if |
- // our object was inline originally, since otherwise it would have ended up underneath |
- // the inlines. |
+ // our object was inline originally, since otherwise it would have ended |
+ // up underneath the inlines. |
RootInlineBox& root = box->root(); |
root.block().setStaticInlinePositionForChild(LineLayoutBox(this), |
box->logicalLeft()); |
} else { |
- // Our object was a block originally, so we make our normal flow position be |
- // just below the line box (as though all the inlines that came before us got |
- // wrapped in an anonymous block, which is what would have happened had we been |
- // in flow). This value was cached in the y() of the box. |
+ // Our object was a block originally, so we make our normal flow position |
+ // be just below the line box (as though all the inlines that came before |
+ // us got wrapped in an anonymous block, which is what would have happened |
+ // had we been in flow). This value was cached in the y() of the box. |
layer()->setStaticBlockPosition(box->logicalTop()); |
} |
@@ -2018,8 +2057,9 @@ void LayoutBox::positionLineBox(InlineBox* box) { |
box->remove(DontMarkLineBoxes); |
box->destroy(); |
} else if (isAtomicInlineLevel()) { |
- // FIXME: the call to roundedLayoutPoint() below is temporary and should be removed once |
- // the transition to LayoutUnit-based types is complete (crbug.com/321237) |
+ // FIXME: the call to roundedLayoutPoint() below is temporary and should be |
+ // removed once the transition to LayoutUnit-based types is complete |
+ // (crbug.com/321237). |
setLocationAndUpdateOverflowControlsIfNeeded(box->topLeft()); |
setInlineBoxWrapper(box); |
} |
@@ -2028,9 +2068,11 @@ void LayoutBox::positionLineBox(InlineBox* box) { |
void LayoutBox::moveWithEdgeOfInlineContainerIfNecessary(bool isHorizontal) { |
ASSERT(isOutOfFlowPositioned() && container()->isLayoutInline() && |
container()->isInFlowPositioned()); |
- // If this object is inside a relative positioned inline and its inline position is an explicit offset from the edge of its container |
- // then it will need to move if its inline container has changed width. We do not track if the width has changed |
- // but if we are here then we are laying out lines inside it, so it probably has - mark our object for layout so that it can |
+ // If this object is inside a relative positioned inline and its inline |
+ // position is an explicit offset from the edge of its container then it will |
+ // need to move if its inline container has changed width. We do not track if |
+ // the width has changed but if we are here then we are laying out lines |
+ // inside it, so it probably has - mark our object for layout so that it can |
// move to the new offset created by the new width. |
if (!normalChildNeedsLayout() && |
!style()->hasStaticInlinePosition(isHorizontal)) |
@@ -2048,10 +2090,8 @@ void LayoutBox::deleteLineBoxWrapper() { |
void LayoutBox::setSpannerPlaceholder( |
LayoutMultiColumnSpannerPlaceholder& placeholder) { |
- RELEASE_ASSERT( |
- !m_rareData || |
- !m_rareData |
- ->m_spannerPlaceholder); // not expected to change directly from one spanner to another. |
+ // Not expected to change directly from one spanner to another. |
+ RELEASE_ASSERT(!m_rareData || !m_rareData->m_spannerPlaceholder); |
ensureRareData().m_spannerPlaceholder = &placeholder; |
} |
@@ -2070,8 +2110,9 @@ void LayoutBox::setPaginationStrut(LayoutUnit strut) { |
bool LayoutBox::isBreakBetweenControllable(EBreak breakValue) const { |
if (breakValue == BreakAuto) |
return true; |
- // We currently only support non-auto break-before and break-after values on in-flow block |
- // level elements, which is the minimum requirement according to the spec. |
+ // We currently only support non-auto break-before and break-after values on |
+ // in-flow block level elements, which is the minimum requirement according to |
+ // the spec. |
if (isInline() || isFloatingOrOutOfFlowPositioned()) |
return false; |
const LayoutBlock* curr = containingBlock(); |
@@ -2095,8 +2136,8 @@ bool LayoutBox::isBreakBetweenControllable(EBreak breakValue) const { |
return !isMulticolValue; |
if (isMulticolValue) |
return true; |
- // If this is a flow thread for a multicol container, and we have a break value for |
- // paged, we need to keep looking. |
+ // If this is a flow thread for a multicol container, and we have a break |
+ // value for paged, we need to keep looking. |
} |
if (curr->isFloatingOrOutOfFlowPositioned()) |
return false; |
@@ -2123,8 +2164,8 @@ bool LayoutBox::isBreakInsideControllable(EBreak breakValue) const { |
return true; // The view is paginated, probably because we're printing. |
if (!flowThread) |
return false; // We're not inside any pagination context |
- // We're inside a flow thread. We need to be contained by a flow thread for paged overflow in |
- // order for pagination values to be valid, though. |
+ // We're inside a flow thread. We need to be contained by a flow thread for |
+ // paged overflow in order for pagination values to be valid, though. |
for (const LayoutBlock* ancestor = flowThread; ancestor; |
ancestor = ancestor->containingBlock()) { |
if (ancestor->isLayoutFlowThread() && |
@@ -2155,8 +2196,9 @@ EBreak LayoutBox::breakInside() const { |
return BreakAuto; |
} |
-// At a class A break point [1], the break value with the highest precedence wins. If the two values |
-// have the same precedence (e.g. "left" and "right"), the value specified on a latter object wins. |
+// At a class A break point [1], the break value with the highest precedence |
+// wins. If the two values have the same precedence (e.g. "left" and "right"), |
+// the value specified on a latter object wins. |
// |
// [1] https://drafts.csswg.org/css-break/#possible-breaks |
static inline int fragmentainerBreakPrecedence(EBreak breakValue) { |
@@ -2166,7 +2208,8 @@ static inline int fragmentainerBreakPrecedence(EBreak breakValue) { |
// "avoid" wins over "avoid-page". |
// Forced break values win over "avoid". |
// Any forced page break value wins over "column" forced break. |
- // More specific break values (left, right, recto, verso) wins over generic "page" values. |
+ // More specific break values (left, right, recto, verso) wins over generic |
+ // "page" values. |
switch (breakValue) { |
default: |
@@ -2208,9 +2251,10 @@ EBreak LayoutBox::classABreakPointValue(EBreak previousBreakAfterValue) const { |
} |
bool LayoutBox::needsForcedBreakBefore(EBreak previousBreakAfterValue) const { |
- // Forced break values are only honored when specified on in-flow objects, but floats and |
- // out-of-flow positioned objects may be affected by a break-after value of the previous |
- // in-flow object, even though we're not at a class A break point. |
+ // Forced break values are only honored when specified on in-flow objects, but |
+ // floats and out-of-flow positioned objects may be affected by a break-after |
+ // value of the previous in-flow object, even though we're not at a class A |
+ // break point. |
EBreak breakValue = isFloatingOrOutOfFlowPositioned() |
? previousBreakAfterValue |
: classABreakPointValue(previousBreakAfterValue); |
@@ -2218,8 +2262,8 @@ bool LayoutBox::needsForcedBreakBefore(EBreak previousBreakAfterValue) const { |
} |
bool LayoutBox::paintedOutputOfObjectHasNoEffectRegardlessOfSize() const { |
- // In case scrollbars got repositioned (which will typically happen if the box got |
- // resized), we cannot skip invalidation. |
+ // In case scrollbars got repositioned (which will typically happen if the box |
+ // got resized), we cannot skip invalidation. |
if (hasNonCompositedScrollbars()) |
return false; |
@@ -2228,11 +2272,13 @@ bool LayoutBox::paintedOutputOfObjectHasNoEffectRegardlessOfSize() const { |
styleRef().hasBoxDecorations() || styleRef().hasVisualOverflowingEffect()) |
return false; |
- // If the box has clip, we need issue a paint invalidation to cover the changed part of |
- // children because of change of clip when the box got resized. In theory the children |
- // should invalidate themselves when ancestor clip changes, but for now this is missing |
- // and ensuring it may hurt performance. |
- // TODO(wangxianzhu): Paint invalidation for clip change will be different in spv2. |
+ // If the box has clip, we need issue a paint invalidation to cover the |
+ // changed part of children because of change of clip when the box got |
+ // resized. In theory the children should invalidate themselves when ancestor |
+ // clip changes, but for now this is missing and ensuring it may hurt |
+ // performance. |
+ // TODO(wangxianzhu): Paint invalidation for clip change will be different in |
+ // spv2. |
if (hasClipRelatedProperty() || hasControlClip()) |
return false; |
@@ -2250,14 +2296,16 @@ void LayoutBox::inflateVisualRectForFilterUnderContainer( |
LayoutRect& rect, |
const LayoutObject& container, |
const LayoutBoxModelObject* ancestorToStopAt) const { |
- // Apply visual overflow caused by reflections and filters defined on objects between this object |
- // and container (not included) or ancestorToStopAt (included). |
+ // Apply visual overflow caused by reflections and filters defined on objects |
+ // between this object and container (not included) or ancestorToStopAt |
+ // (included). |
LayoutSize offsetFromContainer = this->offsetFromContainer(&container); |
rect.move(offsetFromContainer); |
for (LayoutObject* parent = this->parent(); parent && parent != container; |
parent = parent->parent()) { |
if (parent->isBox()) { |
- // Convert rect into coordinate space of parent to apply parent's reflection and filter. |
+ // Convert rect into coordinate space of parent to apply parent's |
+ // reflection and filter. |
LayoutSize parentOffset = parent->offsetFromAncestorContainer(&container); |
rect.move(-parentOffset); |
toLayoutBox(parent)->inflateVisualRectForFilter(rect); |
@@ -2298,25 +2346,28 @@ bool LayoutBox::mapToVisualRectInAncestorSpace( |
if (filterSkipped) |
inflateVisualRectForFilterUnderContainer(rect, *container, ancestor); |
- // We are now in our parent container's coordinate space. Apply our transform to obtain a bounding box |
- // in the parent's coordinate space that encloses us. |
+ // We are now in our parent container's coordinate space. Apply our transform |
+ // to obtain a bounding box in the parent's coordinate space that encloses us. |
if (hasLayer() && layer()->transform()) { |
- // Use enclosingIntRect because we cannot properly compute pixel snapping for painted elements within |
- // the transform since we don't know the desired subpixel accumulation at this point, and the transform may |
- // include a scale. |
+ // Use enclosingIntRect because we cannot properly compute pixel snapping |
+ // for painted elements within the transform since we don't know the desired |
+ // subpixel accumulation at this point, and the transform may include a |
+ // scale. |
rect = LayoutRect(layer()->transform()->mapRect(enclosingIntRect(rect))); |
} |
LayoutPoint topLeft = rect.location(); |
if (container->isBox()) { |
topLeft.moveBy(topLeftLocation(toLayoutBox(container))); |
- // If the row is the ancestor, however, add its offset back in. In effect, this passes from the joint <td> / <tr> |
- // coordinate space to the parent space, then back to <tr> / <td>. |
+ // If the row is the ancestor, however, add its offset back in. In effect, |
+ // this passes from the joint <td> / <tr> coordinate space to the parent |
+ // space, then back to <tr> / <td>. |
if (tableRowContainer) |
topLeft.moveBy( |
-tableRowContainer->topLeftLocation(toLayoutBox(container))); |
} else if (container->isRuby()) { |
- // TODO(wkorman): Generalize Ruby specialization and/or document more clearly. |
- // See the accompanying specialization in LayoutInline::mapToVisualRectInAncestorSpace. |
+ // TODO(wkorman): Generalize Ruby specialization and/or document more |
+ // clearly. See the accompanying specialization in |
+ // LayoutInline::mapToVisualRectInAncestorSpace. |
topLeft.moveBy(topLeftLocation()); |
} else { |
topLeft.moveBy(location()); |
@@ -2329,15 +2380,17 @@ bool LayoutBox::mapToVisualRectInAncestorSpace( |
topLeft += |
toLayoutInline(container)->offsetForInFlowPositionedInline(*this); |
} else if (styleToUse.hasInFlowPosition() && layer()) { |
- // Apply the relative position offset when invalidating a rectangle. The layer |
- // is translated, but the layout box isn't, so we need to do this to get the |
- // right dirty rect. Since this is called from LayoutObject::setStyle, the relative position |
- // flag on the LayoutObject has been cleared, so use the one on the style(). |
+ // Apply the relative position offset when invalidating a rectangle. The |
+ // layer is translated, but the layout box isn't, so we need to do this to |
+ // get the right dirty rect. Since this is called from |
+ // LayoutObject::setStyle, the relative position flag on the LayoutObject |
+ // has been cleared, so use the one on the style(). |
topLeft += layer()->offsetForInFlowPosition(); |
} |
- // FIXME: We ignore the lightweight clipping rect that controls use, since if |o| is in mid-layout, |
- // its controlClipRect will be wrong. For overflow clip we use the values cached by the layer. |
+ // FIXME: We ignore the lightweight clipping rect that controls use, since if |
+ // |o| is in mid-layout, its controlClipRect will be wrong. For overflow clip |
+ // we use the values cached by the layer. |
rect.setLocation(topLeft); |
if (container->isBox() && |
@@ -2348,11 +2401,13 @@ bool LayoutBox::mapToVisualRectInAncestorSpace( |
return false; |
if (ancestorSkipped) { |
- // If the ancestor is below the container, then we need to map the rect into ancestor's coordinates. |
+ // If the ancestor is below the container, then we need to map the rect into |
+ // ancestor's coordinates. |
LayoutSize containerOffset = |
ancestor->offsetFromAncestorContainer(container); |
rect.move(-containerOffset); |
- // If the ancestor is fixed, then the rect is already in its coordinates so doesn't need viewport-adjusting. |
+ // If the ancestor is fixed, then the rect is already in its coordinates so |
+ // doesn't need viewport-adjusting. |
if (ancestor->style()->position() != FixedPosition && |
container->isLayoutView() && position == FixedPosition) |
toLayoutView(container)->adjustOffsetForFixedPosition(rect); |
@@ -2446,8 +2501,10 @@ void LayoutBox::computeLogicalWidth( |
bool inVerticalBox = parent()->isDeprecatedFlexibleBox() && |
(parent()->style()->boxOrient() == VERTICAL); |
bool stretching = (parent()->style()->boxAlign() == BSTRETCH); |
- // TODO (lajava): Stretching is the only reason why we don't want the box to be treated as a replaced element, so we could perhaps |
- // refactor all this logic, not only for flex and grid since alignment is intended to be applied to any block. |
+ // TODO (lajava): Stretching is the only reason why we don't want the box to |
+ // be treated as a replaced element, so we could perhaps refactor all this |
+ // logic, not only for flex and grid since alignment is intended to be applied |
+ // to any block. |
bool treatAsReplaced = shouldComputeSizeAsReplaced() && |
(!inVerticalBox || !stretching) && |
(!isGridItem() || !hasStretchedLogicalWidth()); |
@@ -2528,7 +2585,8 @@ void LayoutBox::computeLogicalWidth( |
Node* parentNode = generatingNode(); |
if (parentNode && |
(isHTMLOListElement(*parentNode) || isHTMLUListElement(*parentNode))) { |
- // Make sure the markers in a list are properly positioned (i.e. not chopped off) when autosized. |
+ // Make sure the markers in a list are properly positioned (i.e. not |
+ // chopped off) when autosized. |
const float adjustedMargin = |
(1 - 1.0 / styleToUse.textAutosizingMultiplier()) * |
getMaxWidthListMarker(this); |
@@ -2604,7 +2662,8 @@ LayoutUnit LayoutBox::computeLogicalWidthUsing(SizeType widthType, |
return adjustBorderBoxLogicalWidthForBoxSizing(0); |
if (!logicalWidth.isIntrinsicOrAuto()) { |
- // FIXME: If the containing block flow is perpendicular to our direction we need to use the available logical height instead. |
+ // FIXME: If the containing block flow is perpendicular to our direction we |
+ // need to use the available logical height instead. |
return adjustBorderBoxLogicalWidthForBoxSizing( |
valueForLength(logicalWidth, availableLogicalWidth)); |
} |
@@ -2632,8 +2691,8 @@ LayoutUnit LayoutBox::computeLogicalWidthUsing(SizeType widthType, |
} |
bool LayoutBox::columnFlexItemHasStretchAlignment() const { |
- // auto margins mean we don't stretch. Note that this function will only be used for |
- // widths, so we don't have to check marginBefore/marginAfter. |
+ // auto margins mean we don't stretch. Note that this function will only be |
+ // used for widths, so we don't have to check marginBefore/marginAfter. |
const auto& parentStyle = parent()->styleRef(); |
DCHECK(parentStyle.isColumnFlexDirection()); |
if (styleRef().marginStart().isAuto() || styleRef().marginEnd().isAuto()) |
@@ -2652,7 +2711,8 @@ bool LayoutBox::isStretchingColumnFlexItem() const { |
parent->style()->boxAlign() == BSTRETCH) |
return true; |
- // We don't stretch multiline flexboxes because they need to apply line spacing (align-content) first. |
+ // We don't stretch multiline flexboxes because they need to apply line |
+ // spacing (align-content) first. |
if (parent->isFlexibleBox() && parent->style()->flexWrap() == FlexNoWrap && |
parent->style()->isColumnFlexDirection() && |
columnFlexItemHasStretchAlignment()) |
@@ -2660,7 +2720,8 @@ bool LayoutBox::isStretchingColumnFlexItem() const { |
return false; |
} |
-// TODO (lajava) Can/Should we move this inside specific layout classes (flex. grid)? Can we refactor columnFlexItemHasStretchAlignment logic? |
+// TODO (lajava) Can/Should we move this inside specific layout classes (flex. |
+// grid)? Can we refactor columnFlexItemHasStretchAlignment logic? |
bool LayoutBox::hasStretchedLogicalWidth() const { |
const ComputedStyle& style = styleRef(); |
if (!style.logicalWidth().isAuto() || style.marginStart().isAuto() || |
@@ -2668,8 +2729,9 @@ bool LayoutBox::hasStretchedLogicalWidth() const { |
return false; |
LayoutBlock* cb = containingBlock(); |
if (!cb) { |
- // We are evaluating align-self/justify-self, which default to 'normal' for the root element. |
- // The 'normal' value behaves like 'start' except for Flexbox Items, which obviously should have a container. |
+ // We are evaluating align-self/justify-self, which default to 'normal' for |
+ // the root element. The 'normal' value behaves like 'start' except for |
+ // Flexbox Items, which obviously should have a container. |
return false; |
} |
const ComputedStyle* parentStyle = isAnonymous() ? cb->style() : nullptr; |
@@ -2692,11 +2754,13 @@ bool LayoutBox::sizesLogicalWidthToFitContent( |
if (isGridItem()) |
return !hasStretchedLogicalWidth(); |
- // Flexible box items should shrink wrap, so we lay them out at their intrinsic widths. |
- // In the case of columns that have a stretch alignment, we go ahead and layout at the |
- // stretched size to avoid an extra layout when applying alignment. |
+ // Flexible box items should shrink wrap, so we lay them out at their |
+ // intrinsic widths. In the case of columns that have a stretch alignment, we |
+ // go ahead and layout at the stretched size to avoid an extra layout when |
+ // applying alignment. |
if (parent()->isFlexibleBox()) { |
- // For multiline columns, we need to apply align-content first, so we can't stretch now. |
+ // For multiline columns, we need to apply align-content first, so we can't |
+ // stretch now. |
if (!parent()->style()->isColumnFlexDirection() || |
parent()->style()->flexWrap() != FlexNoWrap) |
return true; |
@@ -2704,8 +2768,9 @@ bool LayoutBox::sizesLogicalWidthToFitContent( |
return true; |
} |
- // Flexible horizontal boxes lay out children at their intrinsic widths. Also vertical boxes |
- // that don't stretch their kids lay out their children at their intrinsic widths. |
+ // Flexible horizontal boxes lay out children at their intrinsic widths. Also |
+ // vertical boxes that don't stretch their kids lay out their children at |
+ // their intrinsic widths. |
// FIXME: Think about writing-mode here. |
// https://bugs.webkit.org/show_bug.cgi?id=46473 |
if (parent()->isDeprecatedFlexibleBox() && |
@@ -2713,8 +2778,8 @@ bool LayoutBox::sizesLogicalWidthToFitContent( |
parent()->style()->boxAlign() != BSTRETCH)) |
return true; |
- // Button, input, select, textarea, and legend treat width value of 'auto' as 'intrinsic' unless it's in a |
- // stretching column flexbox. |
+ // Button, input, select, textarea, and legend treat width value of 'auto' as |
+ // 'intrinsic' unless it's in a stretching column flexbox. |
// FIXME: Think about writing-mode here. |
// https://bugs.webkit.org/show_bug.cgi?id=46473 |
if (logicalWidth.isAuto() && !isStretchingColumnFlexItem() && |
@@ -2742,7 +2807,8 @@ void LayoutBox::computeMarginsForDirection(MarginDirection flowDirection, |
LayoutUnit& marginEnd, |
Length marginStartLength, |
Length marginEndLength) const { |
- // First assert that we're not calling this method on box types that don't support margins. |
+ // First assert that we're not calling this method on box types that don't |
+ // support margins. |
ASSERT(!isTableCell()); |
ASSERT(!isTableRow()); |
ASSERT(!isTableSection()); |
@@ -2758,8 +2824,8 @@ void LayoutBox::computeMarginsForDirection(MarginDirection flowDirection, |
if (containingBlock->isFlexibleBox()) { |
// We need to let flexbox handle the margin adjustment - otherwise, flexbox |
- // will think we're wider than we actually are and calculate line sizes wrong. |
- // See also http://dev.w3.org/csswg/css-flexbox/#auto-margins |
+ // will think we're wider than we actually are and calculate line sizes |
+ // wrong. See also http://dev.w3.org/csswg/css-flexbox/#auto-margins |
if (marginStartLength.isAuto()) |
marginStartLength.setValue(0); |
if (marginEndLength.isAuto()) |
@@ -2781,22 +2847,26 @@ void LayoutBox::computeMarginsForDirection(MarginDirection flowDirection, |
} |
} |
- // CSS 2.1 (10.3.3): "If 'width' is not 'auto' and 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' |
- // (plus any of 'margin-left' or 'margin-right' that are not 'auto') is larger than the width of the containing block, then any 'auto' |
- // values for 'margin-left' or 'margin-right' are, for the following rules, treated as zero. |
+ // CSS 2.1 (10.3.3): "If 'width' is not 'auto' and 'border-left-width' + |
+ // 'padding-left' + 'width' + 'padding-right' + 'border-right-width' (plus any |
+ // of 'margin-left' or 'margin-right' that are not 'auto') is larger than the |
+ // width of the containing block, then any 'auto' values for 'margin-left' or |
+ // 'margin-right' are, for the following rules, treated as zero. |
LayoutUnit marginBoxWidth = |
childWidth + (!style()->width().isAuto() |
? marginStartWidth + marginEndWidth |
: LayoutUnit()); |
if (marginBoxWidth < availableWidth) { |
- // CSS 2.1: "If both 'margin-left' and 'margin-right' are 'auto', their used values are equal. This horizontally centers the element |
- // with respect to the edges of the containing block." |
+ // CSS 2.1: "If both 'margin-left' and 'margin-right' are 'auto', their used |
+ // values are equal. This horizontally centers the element with respect to |
+ // the edges of the containing block." |
const ComputedStyle& containingBlockStyle = containingBlock->styleRef(); |
if ((marginStartLength.isAuto() && marginEndLength.isAuto()) || |
(!marginStartLength.isAuto() && !marginEndLength.isAuto() && |
containingBlockStyle.textAlign() == WEBKIT_CENTER)) { |
- // Other browsers center the margin box for align=center elements so we match them here. |
+ // Other browsers center the margin box for align=center elements so we |
+ // match them here. |
LayoutUnit centeredMarginBoxStart = std::max( |
LayoutUnit(), |
(availableWidth - childWidth - marginStartWidth - marginEndWidth) / |
@@ -2821,7 +2891,8 @@ void LayoutBox::computeMarginsForDirection(MarginDirection flowDirection, |
} |
} |
- // CSS 2.1: "If there is exactly one value specified as 'auto', its used value follows from the equality." |
+ // CSS 2.1: "If there is exactly one value specified as 'auto', its used |
+ // value follows from the equality." |
if (marginEndLength.isAuto()) { |
marginStart = marginStartWidth; |
marginEnd = availableWidth - childWidth - marginStart; |
@@ -2835,7 +2906,8 @@ void LayoutBox::computeMarginsForDirection(MarginDirection flowDirection, |
} |
} |
- // Either no auto margins, or our margin box width is >= the container width, auto margins will just turn into 0. |
+ // Either no auto margins, or our margin box width is >= the container width, |
+ // auto margins will just turn into 0. |
marginStart = marginStartWidth; |
marginEnd = marginEndWidth; |
} |
@@ -2872,11 +2944,15 @@ void LayoutBox::computeLogicalHeight( |
} else { |
LayoutBlock* cb = containingBlock(); |
- // If we are perpendicular to our containing block then we need to resolve our block-start and block-end margins so that if they |
- // are 'auto' we are centred or aligned within the inline flow containing block: this is done by computing the margins as though they are inline. |
- // Note that as this is the 'sizing phase' we are using our own writing mode rather than the containing block's. We use the containing block's |
- // writing mode when figuring out the block-direction margins for positioning in |computeAndSetBlockDirectionMargins| (i.e. margin collapsing etc.). |
- // See http://www.w3.org/TR/2014/CR-css-writing-modes-3-20140320/#orthogonal-flows |
+ // If we are perpendicular to our containing block then we need to resolve |
+ // our block-start and block-end margins so that if they are 'auto' we are |
+ // centred or aligned within the inline flow containing block: this is done |
+ // by computing the margins as though they are inline. |
+ // Note that as this is the 'sizing phase' we are using our own writing mode |
+ // rather than the containing block's. We use the containing block's writing |
+ // mode when figuring out the block-direction margins for positioning in |
+ // |computeAndSetBlockDirectionMargins| (i.e. margin collapsing etc.). |
+ // http://www.w3.org/TR/2014/CR-css-writing-modes-3-20140320/#orthogonal-flows |
MarginDirection flowDirection = |
isHorizontalWritingMode() != cb->isHorizontalWritingMode() |
? InlineDirection |
@@ -2901,8 +2977,8 @@ void LayoutBox::computeLogicalHeight( |
shouldComputeSizeAsReplaced() && (!inHorizontalBox || !stretching); |
bool checkMinMaxHeight = false; |
- // The parent box is flexing us, so it has increased or decreased our height. We have to |
- // grab our cached flexible height. |
+ // The parent box is flexing us, so it has increased or decreased our |
+ // height. We have to grab our cached flexible height. |
// FIXME: Account for writing-mode in flexible boxes. |
// https://bugs.webkit.org/show_bug.cgi?id=46418 |
if (hasOverrideLogicalContentHeight()) { |
@@ -2949,9 +3025,9 @@ void LayoutBox::computeLogicalHeight( |
heightResult, |
computedValues.m_extent - borderAndPaddingLogicalHeight()); |
} else { |
- // The only times we don't check min/max height are when a fixed length has |
- // been given as an override. Just use that. The value has already been adjusted |
- // for box-sizing. |
+ // The only times we don't check min/max height are when a fixed length |
+ // has been given as an override. Just use that. The value has already |
+ // been adjusted for box-sizing. |
ASSERT(h.isFixed()); |
heightResult = LayoutUnit(h.value()) + borderAndPaddingLogicalHeight(); |
} |
@@ -2964,11 +3040,13 @@ void LayoutBox::computeLogicalHeight( |
style()->marginAfter()); |
} |
- // WinIE quirk: The <html> block always fills the entire canvas in quirks mode. The <body> always fills the |
- // <html> block in quirks mode. Only apply this quirk if the block is normal flow and no height |
- // is specified. When we're printing, we also need this quirk if the body or root has a percentage |
- // height since we don't set a height in LayoutView when we're printing. So without this quirk, the |
- // height has nothing to be a percentage of, and it ends up being 0. That is bad. |
+ // WinIE quirk: The <html> block always fills the entire canvas in quirks |
+ // mode. The <body> always fills the <html> block in quirks mode. Only apply |
+ // this quirk if the block is normal flow and no height is specified. When |
+ // we're printing, we also need this quirk if the body or root has a |
+ // percentage height since we don't set a height in LayoutView when we're |
+ // printing. So without this quirk, the height has nothing to be a percentage |
+ // of, and it ends up being 0. That is bad. |
bool paginatedContentNeedsBaseHeight = |
document().printing() && h.isPercentOrCalc() && |
(isDocumentElement() || (isBody() && |
@@ -2996,8 +3074,9 @@ void LayoutBox::computeLogicalHeight( |
} |
LayoutUnit LayoutBox::computeLogicalHeightWithoutLayout() const { |
- // TODO(cbiesinger): We should probably return something other than just border + padding, but for now |
- // we have no good way to do anything else without layout, so we just use that. |
+ // TODO(cbiesinger): We should probably return something other than just |
+ // border + padding, but for now we have no good way to do anything else |
+ // without layout, so we just use that. |
LogicalExtentComputedValues computedValues; |
computeLogicalHeight(borderAndPaddingLogicalHeight(), LayoutUnit(), |
computedValues); |
@@ -3041,7 +3120,8 @@ LayoutUnit LayoutBox::computeIntrinsicLogicalContentHeightUsing( |
const Length& logicalHeightLength, |
LayoutUnit intrinsicContentHeight, |
LayoutUnit borderAndPadding) const { |
- // FIXME(cbiesinger): The css-sizing spec is considering changing what min-content/max-content should resolve to. |
+ // FIXME(cbiesinger): The css-sizing spec is considering changing what |
+ // min-content/max-content should resolve to. |
// If that happens, this code will have to change. |
if (logicalHeightLength.isMinContent() || |
logicalHeightLength.isMaxContent() || |
@@ -3064,7 +3144,8 @@ LayoutUnit LayoutBox::computeContentAndScrollbarLogicalHeightUsing( |
LayoutUnit intrinsicContentHeight) const { |
if (height.isAuto()) |
return heightType == MinSize ? LayoutUnit() : LayoutUnit(-1); |
- // FIXME(cbiesinger): The css-sizing spec is considering changing what min-content/max-content should resolve to. |
+ // FIXME(cbiesinger): The css-sizing spec is considering changing what |
+ // min-content/max-content should resolve to. |
// If that happens, this code will have to change. |
if (height.isIntrinsic()) { |
if (intrinsicContentHeight == -1) |
@@ -3091,22 +3172,26 @@ bool LayoutBox::stretchesToViewportInQuirksMode() const { |
bool LayoutBox::skipContainingBlockForPercentHeightCalculation( |
const LayoutBox* containingBlock) const { |
- // If the writing mode of the containing block is orthogonal to ours, it means that we shouldn't |
- // skip anything, since we're going to resolve the percentage height against a containing block *width*. |
+ // If the writing mode of the containing block is orthogonal to ours, it means |
+ // that we shouldn't skip anything, since we're going to resolve the |
+ // percentage height against a containing block *width*. |
if (isHorizontalWritingMode() != containingBlock->isHorizontalWritingMode()) |
return false; |
- // Anonymous blocks should not impede percentage resolution on a child. Examples of such |
- // anonymous blocks are blocks wrapped around inlines that have block siblings (from the CSS |
- // spec) and multicol flow threads (an implementation detail). Another implementation detail, |
- // ruby runs, create anonymous inline-blocks, so skip those too. All other types of anonymous |
- // objects, such as table-cells, will be treated just as if they were non-anonymous. |
+ // Anonymous blocks should not impede percentage resolution on a child. |
+ // Examples of such anonymous blocks are blocks wrapped around inlines that |
+ // have block siblings (from the CSS spec) and multicol flow threads (an |
+ // implementation detail). Another implementation detail, ruby runs, create |
+ // anonymous inline-blocks, so skip those too. All other types of anonymous |
+ // objects, such as table-cells, will be treated just as if they were |
+ // non-anonymous. |
if (containingBlock->isAnonymous()) { |
EDisplay display = containingBlock->styleRef().display(); |
return display == EDisplay::Block || display == EDisplay::InlineBlock; |
} |
- // For quirks mode, we skip most auto-height containing blocks when computing percentages. |
+ // For quirks mode, we skip most auto-height containing blocks when computing |
+ // percentages. |
return document().inQuirksMode() && !containingBlock->isTableCell() && |
!containingBlock->isOutOfFlowPositioned() && |
!containingBlock->isLayoutGrid() && |
@@ -3138,17 +3223,21 @@ LayoutUnit LayoutBox::computePercentageLogicalHeight( |
availableHeight = overrideContainingBlockContentLogicalHeight(); |
} else if (cb->isTableCell()) { |
if (!skippedAutoHeightContainingBlock) { |
- // Table cells violate what the CSS spec says to do with heights. Basically we |
- // don't care if the cell specified a height or not. We just always make ourselves |
- // be a percentage of the cell's current content height. |
+ // Table cells violate what the CSS spec says to do with heights. |
+ // Basically we don't care if the cell specified a height or not. We just |
+ // always make ourselves be a percentage of the cell's current content |
+ // height. |
if (!cb->hasOverrideLogicalContentHeight()) { |
- // Normally we would let the cell size intrinsically, but scrolling overflow has to be |
- // treated differently, since WinIE lets scrolled overflow regions shrink as needed. |
- // While we can't get all cases right, we can at least detect when the cell has a specified |
- // height or when the table has a specified height. In these cases we want to initially have |
- // no size and allow the flexing of the table or the cell to its specified height to cause us |
- // to grow to fill the space. This could end up being wrong in some cases, but it is |
- // preferable to the alternative (sizing intrinsically and making the row end up too big). |
+ // Normally we would let the cell size intrinsically, but scrolling |
+ // overflow has to be treated differently, since WinIE lets scrolled |
+ // overflow regions shrink as needed. |
+ // While we can't get all cases right, we can at least detect when the |
+ // cell has a specified height or when the table has a specified height. |
+ // In these cases we want to initially have no size and allow the |
+ // flexing of the table or the cell to its specified height to cause us |
+ // to grow to fill the space. This could end up being wrong in some |
+ // cases, but it is preferable to the alternative (sizing intrinsically |
+ // and making the row end up too big). |
LayoutTableCell* cell = toLayoutTableCell(cb); |
if (scrollsOverflowY() && |
(!cell->style()->logicalHeight().isAuto() || |
@@ -3176,7 +3265,8 @@ LayoutUnit LayoutBox::computePercentageLogicalHeight( |
cb->hasOverrideLogicalContentHeight()); |
if (includeBorderPadding) { |
- // FIXME: Table cells should default to box-sizing: border-box so we can avoid this hack. |
+ // FIXME: Table cells should default to box-sizing: border-box so we can |
+ // avoid this hack. |
// It is necessary to use the border-box to match WinIE's broken |
// box model. This is essential for sizing inside |
// table cells using percentage heights. |
@@ -3236,16 +3326,16 @@ LayoutUnit LayoutBox::computeReplacedLogicalWidthUsing( |
case FillAvailable: |
case Percent: |
case Calculated: { |
- // FIXME: containingBlockLogicalWidthForContent() is wrong if the replaced element's writing-mode is perpendicular to the |
- // containing block's writing-mode. |
- // https://bugs.webkit.org/show_bug.cgi?id=46496 |
+ // FIXME: containingBlockLogicalWidthForContent() is wrong if the replaced |
+ // element's writing-mode is perpendicular to the containing block's |
+ // writing-mode. https://bugs.webkit.org/show_bug.cgi?id=46496 |
const LayoutUnit cw = isOutOfFlowPositioned() |
? containingBlockLogicalWidthForPositioned( |
toLayoutBoxModelObject(container())) |
: containingBlockLogicalWidthForContent(); |
Length containerLogicalWidth = containingBlock()->style()->logicalWidth(); |
- // FIXME: Handle cases when containing block width is calculated or viewport percent. |
- // https://bugs.webkit.org/show_bug.cgi?id=91071 |
+ // FIXME: Handle cases when containing block width is calculated or |
+ // viewport percent. https://bugs.webkit.org/show_bug.cgi?id=91071 |
if (logicalWidth.isIntrinsic()) |
return computeIntrinsicLogicalWidthUsing( |
logicalWidth, cw, borderAndPaddingLogicalWidth()) - |
@@ -3293,8 +3383,10 @@ bool LayoutBox::logicalHeightComputesAsNone(SizeType sizeType) const { |
LayoutUnit LayoutBox::computeReplacedLogicalHeightRespectingMinMaxHeight( |
LayoutUnit logicalHeight) const { |
- // If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, |
- // the percentage value is treated as '0' (for 'min-height') or 'none' (for 'max-height'). |
+ // If the height of the containing block is not specified explicitly (i.e., it |
+ // depends on content height), and this element is not absolutely positioned, |
+ // the percentage value is treated as '0' (for 'min-height') or 'none' (for |
+ // 'max-height'). |
LayoutUnit minLogicalHeight; |
if (!logicalHeightComputesAsNone(MinSize)) |
minLogicalHeight = |
@@ -3319,8 +3411,10 @@ LayoutUnit LayoutBox::computeReplacedLogicalHeightUsing( |
return adjustContentBoxLogicalHeightForBoxSizing(logicalHeight.value()); |
case Percent: |
case Calculated: { |
- // TODO(rego): Check if we can somehow reuse LayoutBox::computePercentageLogicalHeight() and/or |
- // LayoutBlock::availableLogicalHeightForPercentageComputation() (see http://crbug.com/635655). |
+ // TODO(rego): Check if we can somehow reuse |
+ // LayoutBox::computePercentageLogicalHeight() and/or |
+ // LayoutBlock::availableLogicalHeightForPercentageComputation() (see |
+ // http://crbug.com/635655). |
LayoutObject* cb = |
isOutOfFlowPositioned() ? container() : containingBlock(); |
while (cb->isAnonymous()) |
@@ -3354,8 +3448,8 @@ LayoutUnit LayoutBox::computeReplacedLogicalHeightUsing( |
valueForLength(logicalHeight, newHeight)); |
} |
- // FIXME: availableLogicalHeight() is wrong if the replaced element's writing-mode is perpendicular to the |
- // containing block's writing-mode. |
+ // FIXME: availableLogicalHeight() is wrong if the replaced element's |
+ // writing-mode is perpendicular to the containing block's writing-mode. |
// https://bugs.webkit.org/show_bug.cgi?id=46496 |
LayoutUnit availableHeight; |
if (isOutOfFlowPositioned()) { |
@@ -3371,7 +3465,8 @@ LayoutUnit LayoutBox::computeReplacedLogicalHeightUsing( |
// It is necessary to use the border-box to match WinIE's broken |
// box model. This is essential for sizing inside |
// table cells using percentage heights. |
- // FIXME: This needs to be made writing-mode-aware. If the cell and image are perpendicular writing-modes, this isn't right. |
+ // FIXME: This needs to be made writing-mode-aware. If the cell and |
+ // image are perpendicular writing-modes, this isn't right. |
// https://bugs.webkit.org/show_bug.cgi?id=46997 |
while (cb && !cb->isLayoutView() && |
(cb->style()->logicalHeight().isAuto() || |
@@ -3408,7 +3503,8 @@ LayoutUnit LayoutBox::computeReplacedLogicalHeightUsing( |
LayoutUnit LayoutBox::availableLogicalHeight( |
AvailableLogicalHeightType heightType) const { |
- // http://www.w3.org/TR/CSS2/visudet.html#propdef-height - We are interested in the content height. |
+ // http://www.w3.org/TR/CSS2/visudet.html#propdef-height - We are interested |
+ // in the content height. |
// FIXME: Should we pass intrinsicContentLogicalHeight() instead of -1 here? |
return constrainContentBoxLogicalHeightByMinMax( |
availableLogicalHeightUsing(style()->logicalHeight(), heightType), |
@@ -3425,9 +3521,10 @@ LayoutUnit LayoutBox::availableLogicalHeightUsing( |
: toLayoutView(this)->frameView()->visibleContentSize().width()); |
} |
- // We need to stop here, since we don't want to increase the height of the table |
- // artificially. We're going to rely on this cell getting expanded to some new |
- // height, and then when we lay out again we'll use the calculation below. |
+ // We need to stop here, since we don't want to increase the height of the |
+ // table artificially. We're going to rely on this cell getting expanded to |
+ // some new height, and then when we lay out again we'll use the calculation |
+ // below. |
if (isTableCell() && (h.isAuto() || h.isPercentOrCalc())) { |
if (hasOverrideLogicalContentHeight()) |
return overrideLogicalContentHeight(); |
@@ -3443,7 +3540,8 @@ LayoutUnit LayoutBox::availableLogicalHeightUsing( |
} |
if (h.isPercentOrCalc() && isOutOfFlowPositioned()) { |
- // FIXME: This is wrong if the containingBlock has a perpendicular writing mode. |
+ // FIXME: This is wrong if the containingBlock has a perpendicular writing |
+ // mode. |
LayoutUnit availableHeight = |
containingBlockLogicalHeightForPositioned(containingBlock()); |
return adjustContentBoxLogicalHeightForBoxSizing( |
@@ -3459,7 +3557,8 @@ LayoutUnit LayoutBox::availableLogicalHeightUsing( |
heightIncludingScrollbar) - |
scrollbarLogicalHeight()); |
- // FIXME: Check logicalTop/logicalBottom here to correctly handle vertical writing-mode. |
+ // FIXME: Check logicalTop/logicalBottom here to correctly handle vertical |
+ // writing-mode. |
// https://bugs.webkit.org/show_bug.cgi?id=46500 |
if (isLayoutBlock() && isOutOfFlowPositioned() && |
style()->height().isAuto() && |
@@ -3474,11 +3573,13 @@ LayoutUnit LayoutBox::availableLogicalHeightUsing( |
return adjustContentBoxLogicalHeightForBoxSizing(newContentHeight); |
} |
- // FIXME: This is wrong if the containingBlock has a perpendicular writing mode. |
+ // FIXME: This is wrong if the containingBlock has a perpendicular writing |
+ // mode. |
LayoutUnit availableHeight = |
containingBlockLogicalHeightForContent(heightType); |
if (heightType == ExcludeMarginBorderPadding) { |
- // FIXME: Margin collapsing hasn't happened yet, so this incorrectly removes collapsed margins. |
+ // FIXME: Margin collapsing hasn't happened yet, so this incorrectly removes |
+ // collapsed margins. |
availableHeight -= |
marginBefore() + marginAfter() + borderAndPaddingLogicalHeight(); |
} |
@@ -3494,8 +3595,10 @@ void LayoutBox::computeAndSetBlockDirectionMargins( |
logicalHeight(), marginBefore, marginAfter, |
style()->marginBeforeUsing(containingBlock->style()), |
style()->marginAfterUsing(containingBlock->style())); |
- // Note that in this 'positioning phase' of the layout we are using the containing block's writing mode rather than our own when calculating margins. |
- // See http://www.w3.org/TR/2014/CR-css-writing-modes-3-20140320/#orthogonal-flows |
+ // Note that in this 'positioning phase' of the layout we are using the |
+ // containing block's writing mode rather than our own when calculating |
+ // margins. |
+ // http://www.w3.org/TR/2014/CR-css-writing-modes-3-20140320/#orthogonal-flows |
containingBlock->setMarginBeforeForChild(*this, marginBefore); |
containingBlock->setMarginAfterForChild(*this, marginAfter); |
} |
@@ -3512,7 +3615,8 @@ LayoutUnit LayoutBox::containingBlockLogicalWidthForPositioned( |
!document().printing()) { |
const LayoutView* view = toLayoutView(containingBlock); |
if (FrameView* frameView = view->frameView()) { |
- // Don't use visibleContentRect since the PaintLayer's size has not been set yet. |
+ // Don't use visibleContentRect since the PaintLayer's size has not been |
+ // set yet. |
LayoutSize viewportSize( |
frameView->layoutViewportScrollableArea()->excludeScrollbars( |
frameView->frameRect().size())); |
@@ -3525,8 +3629,9 @@ LayoutUnit LayoutBox::containingBlockLogicalWidthForPositioned( |
if (hasOverrideContainingBlockLogicalWidth()) |
return overrideContainingBlockContentLogicalWidth(); |
- // Ensure we compute our width based on the width of our rel-pos inline container rather than any anonymous block |
- // created to manage a block-flow ancestor of ours in the rel-pos inline's inline flow. |
+ // Ensure we compute our width based on the width of our rel-pos inline |
+ // container rather than any anonymous block created to manage a block-flow |
+ // ancestor of ours in the rel-pos inline's inline flow. |
if (containingBlock->isAnonymousBlock() && containingBlock->isRelPositioned()) |
containingBlock = toLayoutBox(containingBlock)->continuation(); |
else if (containingBlock->isBox()) |
@@ -3571,7 +3676,8 @@ LayoutUnit LayoutBox::containingBlockLogicalHeightForPositioned( |
!document().printing()) { |
const LayoutView* view = toLayoutView(containingBlock); |
if (FrameView* frameView = view->frameView()) { |
- // Don't use visibleContentRect since the PaintLayer's size has not been set yet. |
+ // Don't use visibleContentRect since the PaintLayer's size has not been |
+ // set yet. |
LayoutSize viewportSize( |
frameView->layoutViewportScrollableArea()->excludeScrollbars( |
frameView->frameRect().size())); |
@@ -3622,9 +3728,9 @@ static LayoutUnit accumulateStaticOffsetForFlowThread( |
if (!layoutBox.isLayoutFlowThread()) |
return LayoutUnit(); |
LayoutUnit previousInlinePosition = inlinePosition; |
- // We're walking out of a flowthread here. This flow thread is not in the containing block |
- // chain, so we need to convert the position from the coordinate space of this flowthread to |
- // the containing coordinate space. |
+ // We're walking out of a flowthread here. This flow thread is not in the |
+ // containing block chain, so we need to convert the position from the |
+ // coordinate space of this flowthread to the containing coordinate space. |
toLayoutFlowThread(layoutBox).flowThreadToContainingCoordinateSpace( |
blockPosition, inlinePosition); |
return inlinePosition - previousInlinePosition; |
@@ -3639,11 +3745,12 @@ void LayoutBox::computeInlineStaticDistance( |
if (!logicalLeft.isAuto() || !logicalRight.isAuto()) |
return; |
- // For multicol we also need to keep track of the block position, since that determines which |
- // column we're in and thus affects the inline position. |
+ // For multicol we also need to keep track of the block position, since that |
+ // determines which column we're in and thus affects the inline position. |
LayoutUnit staticBlockPosition = child->layer()->staticBlockPosition(); |
- // FIXME: The static distance computation has not been patched for mixed writing modes yet. |
+ // FIXME: The static distance computation has not been patched for mixed |
+ // writing modes yet. |
if (child->parent()->style()->direction() == LTR) { |
LayoutUnit staticPosition = child->layer()->staticInlinePosition() - |
containerBlock->borderLogicalLeft(); |
@@ -3711,19 +3818,20 @@ void LayoutBox::computeInlineStaticDistance( |
void LayoutBox::computePositionedLogicalWidth( |
LogicalExtentComputedValues& computedValues) const { |
// QUESTIONS |
- // FIXME 1: Should we still deal with these the cases of 'left' or 'right' having |
- // the type 'static' in determining whether to calculate the static distance? |
+ // FIXME 1: Should we still deal with these the cases of 'left' or 'right' |
+ // having the type 'static' in determining whether to calculate the static |
+ // distance? |
// NOTE: 'static' is not a legal value for 'left' or 'right' as of CSS 2.1. |
- // FIXME 2: Can perhaps optimize out cases when max-width/min-width are greater |
- // than or less than the computed width(). Be careful of box-sizing and |
- // percentage issues. |
+ // FIXME 2: Can perhaps optimize out cases when max-width/min-width are |
+ // greater than or less than the computed width(). Be careful of box-sizing |
+ // and percentage issues. |
// The following is based off of the W3C Working Draft from April 11, 2006 of |
// CSS 2.1: Section 10.3.7 "Absolutely positioned, non-replaced elements" |
// <http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width> |
- // (block-style-comments in this function and in computePositionedLogicalWidthUsing() |
- // correspond to text from the spec) |
+ // (block-style-comments in this function and in |
+ // computePositionedLogicalWidthUsing() correspond to text from the spec) |
// We don't use containingBlock(), since we may be positioned by an enclosing |
// relative positioned inline. |
@@ -3733,9 +3841,9 @@ void LayoutBox::computePositionedLogicalWidth( |
const LayoutUnit containerLogicalWidth = |
containingBlockLogicalWidthForPositioned(containerBlock); |
- // Use the container block's direction except when calculating the static distance |
- // This conforms with the reference results for abspos-replaced-width-margin-000.htm |
- // of the CSS 2.1 test suite |
+ // Use the container block's direction except when calculating the static |
+ // distance. This conforms with the reference results for |
+ // abspos-replaced-width-margin-000.htm of the CSS 2.1 test suite. |
TextDirection containerDirection = containerBlock->style()->direction(); |
bool isHorizontal = isHorizontalWritingMode(); |
@@ -3747,31 +3855,29 @@ void LayoutBox::computePositionedLogicalWidth( |
Length logicalLeftLength = style()->logicalLeft(); |
Length logicalRightLength = style()->logicalRight(); |
- |
- /*---------------------------------------------------------------------------*\ |
- * For the purposes of this section and the next, the term "static position" |
- * (of an element) refers, roughly, to the position an element would have had |
- * in the normal flow. More precisely: |
- * |
- * * The static position for 'left' is the distance from the left edge of the |
- * containing block to the left margin edge of a hypothetical box that would |
- * have been the first box of the element if its 'position' property had |
- * been 'static' and 'float' had been 'none'. The value is negative if the |
- * hypothetical box is to the left of the containing block. |
- * * The static position for 'right' is the distance from the right edge of the |
- * containing block to the right margin edge of the same hypothetical box as |
- * above. The value is positive if the hypothetical box is to the left of the |
- * containing block's edge. |
- * |
- * But rather than actually calculating the dimensions of that hypothetical box, |
- * user agents are free to make a guess at its probable position. |
- * |
- * For the purposes of calculating the static position, the containing block of |
- * fixed positioned elements is the initial containing block instead of the |
- * viewport, and all scrollable boxes should be assumed to be scrolled to their |
- * origin. |
- \*---------------------------------------------------------------------------*/ |
- |
+ // --------------------------------------------------------------------------- |
+ // For the purposes of this section and the next, the term "static position" |
+ // (of an element) refers, roughly, to the position an element would have had |
+ // in the normal flow. More precisely: |
+ // |
+ // * The static position for 'left' is the distance from the left edge of the |
+ // containing block to the left margin edge of a hypothetical box that |
+ // would have been the first box of the element if its 'position' property |
+ // had been 'static' and 'float' had been 'none'. The value is negative if |
+ // the hypothetical box is to the left of the containing block. |
+ // * The static position for 'right' is the distance from the right edge of |
+ // the containing block to the right margin edge of the same hypothetical |
+ // box as above. The value is positive if the hypothetical box is to the |
+ // left of the containing block's edge. |
+ // |
+ // But rather than actually calculating the dimensions of that hypothetical |
+ // box, user agents are free to make a guess at its probable position. |
+ // |
+ // For the purposes of calculating the static position, the containing block |
+ // of fixed positioned elements is the initial containing block instead of |
+ // the viewport, and all scrollable boxes should be assumed to be scrolled to |
+ // their origin. |
+ // --------------------------------------------------------------------------- |
// see FIXME 1 |
// Calculate the static distance if needed. |
computeInlineStaticDistance(logicalLeftLength, logicalRightLength, this, |
@@ -3831,8 +3937,10 @@ void LayoutBox::computeLogicalLeftPositionedOffset( |
LayoutUnit logicalWidthValue, |
const LayoutBoxModelObject* containerBlock, |
LayoutUnit containerLogicalWidth) { |
- // Deal with differing writing modes here. Our offset needs to be in the containing block's coordinate space. If the containing block is flipped |
- // along this axis, then we need to flip the coordinate. This can only happen if the containing block is both a flipped mode and perpendicular to us. |
+ // Deal with differing writing modes here. Our offset needs to be in the |
+ // containing block's coordinate space. If the containing block is flipped |
+ // along this axis, then we need to flip the coordinate. This can only happen |
+ // if the containing block is both a flipped mode and perpendicular to us. |
if (containerBlock->isHorizontalWritingMode() != |
child->isHorizontalWritingMode() && |
containerBlock->style()->isFlippedBlocksWritingMode()) { |
@@ -3889,7 +3997,8 @@ void LayoutBox::computePositionedLogicalWidthUsing( |
// converted to the static position already |
ASSERT(!(logicalLeft.isAuto() && logicalRight.isAuto())); |
- // minimumValueForLength will convert 'auto' to 0 so that it doesn't impact the available space computation below. |
+ // minimumValueForLength will convert 'auto' to 0 so that it doesn't impact |
+ // the available space computation below. |
LayoutUnit logicalLeftValue = |
minimumValueForLength(logicalLeft, containerLogicalWidth); |
LayoutUnit logicalRightValue = |
@@ -3908,18 +4017,18 @@ void LayoutBox::computePositionedLogicalWidthUsing( |
? computedValues.m_margins.m_end |
: computedValues.m_margins.m_start; |
if (!logicalLeftIsAuto && !logicalWidthIsAuto && !logicalRightIsAuto) { |
- /*-----------------------------------------------------------------------*\ |
- * If none of the three is 'auto': If both 'margin-left' and 'margin- |
- * right' are 'auto', solve the equation under the extra constraint that |
- * the two margins get equal values, unless this would make them negative, |
- * in which case when direction of the containing block is 'ltr' ('rtl'), |
- * set 'margin-left' ('margin-right') to zero and solve for 'margin-right' |
- * ('margin-left'). If one of 'margin-left' or 'margin-right' is 'auto', |
- * solve the equation for that value. If the values are over-constrained, |
- * ignore the value for 'left' (in case the 'direction' property of the |
- * containing block is 'rtl') or 'right' (in case 'direction' is 'ltr') |
- * and solve for that value. |
- \*-----------------------------------------------------------------------*/ |
+ // ------------------------------------------------------------------------- |
+ // If none of the three is 'auto': If both 'margin-left' and 'margin- |
+ // right' are 'auto', solve the equation under the extra constraint that |
+ // the two margins get equal values, unless this would make them negative, |
+ // in which case when direction of the containing block is 'ltr' ('rtl'), |
+ // set 'margin-left' ('margin-right') to zero and solve for 'margin-right' |
+ // ('margin-left'). If one of 'margin-left' or 'margin-right' is 'auto', |
+ // solve the equation for that value. If the values are over-constrained, |
+ // ignore the value for 'left' (in case the 'direction' property of the |
+ // containing block is 'rtl') or 'right' (in case 'direction' is 'ltr') |
+ // and solve for that value. |
+ // ------------------------------------------------------------------------- |
// NOTE: It is not necessary to solve for 'right' in the over constrained |
// case because the value is not used for any further calculations. |
@@ -3972,44 +4081,43 @@ void LayoutBox::computePositionedLogicalWidthUsing( |
marginLogicalLeftValue - marginLogicalRightValue; |
} |
} else { |
- /*--------------------------------------------------------------------*\ |
- * Otherwise, set 'auto' values for 'margin-left' and 'margin-right' |
- * to 0, and pick the one of the following six rules that applies. |
- * |
- * 1. 'left' and 'width' are 'auto' and 'right' is not 'auto', then the |
- * width is shrink-to-fit. Then solve for 'left' |
- * |
- * OMIT RULE 2 AS IT SHOULD NEVER BE HIT |
- * ------------------------------------------------------------------ |
- * 2. 'left' and 'right' are 'auto' and 'width' is not 'auto', then if |
- * the 'direction' property of the containing block is 'ltr' set |
- * 'left' to the static position, otherwise set 'right' to the |
- * static position. Then solve for 'left' (if 'direction is 'rtl') |
- * or 'right' (if 'direction' is 'ltr'). |
- * ------------------------------------------------------------------ |
- * |
- * 3. 'width' and 'right' are 'auto' and 'left' is not 'auto', then the |
- * width is shrink-to-fit . Then solve for 'right' |
- * 4. 'left' is 'auto', 'width' and 'right' are not 'auto', then solve |
- * for 'left' |
- * 5. 'width' is 'auto', 'left' and 'right' are not 'auto', then solve |
- * for 'width' |
- * 6. 'right' is 'auto', 'left' and 'width' are not 'auto', then solve |
- * for 'right' |
- * |
- * Calculation of the shrink-to-fit width is similar to calculating the |
- * width of a table cell using the automatic table layout algorithm. |
- * Roughly: calculate the preferred width by formatting the content |
- * without breaking lines other than where explicit line breaks occur, |
- * and also calculate the preferred minimum width, e.g., by trying all |
- * possible line breaks. CSS 2.1 does not define the exact algorithm. |
- * Thirdly, calculate the available width: this is found by solving |
- * for 'width' after setting 'left' (in case 1) or 'right' (in case 3) |
- * to 0. |
- * |
- * Then the shrink-to-fit width is: |
- * min(max(preferred minimum width, available width), preferred width). |
- \*--------------------------------------------------------------------*/ |
+ // ------------------------------------------------------------------------- |
+ // Otherwise, set 'auto' values for 'margin-left' and 'margin-right' |
+ // to 0, and pick the one of the following six rules that applies. |
+ // |
+ // 1. 'left' and 'width' are 'auto' and 'right' is not 'auto', then the |
+ // width is shrink-to-fit. Then solve for 'left' |
+ // |
+ // OMIT RULE 2 AS IT SHOULD NEVER BE HIT |
+ // ------------------------------------------------------------------ |
+ // 2. 'left' and 'right' are 'auto' and 'width' is not 'auto', then if |
+ // the 'direction' property of the containing block is 'ltr' set |
+ // 'left' to the static position, otherwise set 'right' to the |
+ // static position. Then solve for 'left' (if 'direction is 'rtl') |
+ // or 'right' (if 'direction' is 'ltr'). |
+ // ------------------------------------------------------------------ |
+ // |
+ // 3. 'width' and 'right' are 'auto' and 'left' is not 'auto', then the |
+ // width is shrink-to-fit . Then solve for 'right' |
+ // 4. 'left' is 'auto', 'width' and 'right' are not 'auto', then solve |
+ // for 'left' |
+ // 5. 'width' is 'auto', 'left' and 'right' are not 'auto', then solve |
+ // for 'width' |
+ // 6. 'right' is 'auto', 'left' and 'width' are not 'auto', then solve |
+ // for 'right' |
+ // |
+ // Calculation of the shrink-to-fit width is similar to calculating the |
+ // width of a table cell using the automatic table layout algorithm. |
+ // Roughly: calculate the preferred width by formatting the content without |
+ // breaking lines other than where explicit line breaks occur, and also |
+ // calculate the preferred minimum width, e.g., by trying all possible line |
+ // breaks. CSS 2.1 does not define the exact algorithm. |
+ // Thirdly, calculate the available width: this is found by solving for |
+ // 'width' after setting 'left' (in case 1) or 'right' (in case 3) to 0. |
+ // |
+ // Then the shrink-to-fit width is: |
+ // min(max(preferred minimum width, available width), preferred width). |
+ // ------------------------------------------------------------------------- |
// NOTE: For rules 3 and 6 it is not necessary to solve for 'right' |
// because the value is not used for any further calculations. |
@@ -4057,10 +4165,10 @@ void LayoutBox::computePositionedLogicalWidthUsing( |
// Use computed values to calculate the horizontal position. |
- // FIXME: This hack is needed to calculate the logical left position for a 'rtl' relatively |
- // positioned, inline because right now, it is using the logical left position |
- // of the first line box when really it should use the last line box. When |
- // this is fixed elsewhere, this block should be removed. |
+ // FIXME: This hack is needed to calculate the logical left position for a |
+ // 'rtl' relatively positioned, inline because right now, it is using the |
+ // logical left position of the first line box when really it should use the |
+ // last line box. When this is fixed elsewhere, this block should be removed. |
if (containerBlock->isLayoutInline() && |
!containerBlock->style()->isLeftToRightDirection()) { |
const LayoutInline* flow = toLayoutInline(containerBlock); |
@@ -4097,7 +4205,8 @@ void LayoutBox::computeBlockStaticDistance( |
if (!logicalTop.isAuto() || !logicalBottom.isAuto()) |
return; |
- // FIXME: The static distance computation has not been patched for mixed writing modes. |
+ // FIXME: The static distance computation has not been patched for mixed |
+ // writing modes. |
LayoutUnit staticLogicalTop = child->layer()->staticBlockPosition(); |
for (LayoutObject* curr = child->parent(); curr && curr != containerBlock; |
curr = curr->container()) { |
@@ -4107,10 +4216,11 @@ void LayoutBox::computeBlockStaticDistance( |
staticLogicalTop += box.logicalTop(); |
if (!box.isLayoutFlowThread()) |
continue; |
- // We're walking out of a flowthread here. This flow thread is not in the containing block |
- // chain, so we need to convert the position from the coordinate space of this flowthread |
- // to the containing coordinate space. The inline position cannot affect the block |
- // position, so we don't bother calculating it. |
+ // We're walking out of a flowthread here. This flow thread is not in the |
+ // containing block chain, so we need to convert the position from the |
+ // coordinate space of this flowthread to the containing coordinate space. |
+ // The inline position cannot affect the block position, so we don't bother |
+ // calculating it. |
LayoutUnit dummyInlinePosition; |
toLayoutFlowThread(box).flowThreadToContainingCoordinateSpace( |
staticLogicalTop, dummyInlinePosition); |
@@ -4123,10 +4233,12 @@ void LayoutBox::computePositionedLogicalHeight( |
// The following is based off of the W3C Working Draft from April 11, 2006 of |
// CSS 2.1: Section 10.6.4 "Absolutely positioned, non-replaced elements" |
// <http://www.w3.org/TR/2005/WD-CSS21-20050613/visudet.html#abs-non-replaced-height> |
- // (block-style-comments in this function and in computePositionedLogicalHeightUsing() |
+ // (block-style-comments in this function and in |
+ // computePositionedLogicalHeightUsing() |
// correspond to text from the spec) |
- // We don't use containingBlock(), since we may be positioned by an enclosing relpositioned inline. |
+ // We don't use containingBlock(), since we may be positioned by an enclosing |
+ // relpositioned inline. |
const LayoutBoxModelObject* containerBlock = |
toLayoutBoxModelObject(container()); |
@@ -4140,23 +4252,22 @@ void LayoutBox::computePositionedLogicalHeight( |
Length logicalTopLength = styleToUse.logicalTop(); |
Length logicalBottomLength = styleToUse.logicalBottom(); |
- /*---------------------------------------------------------------------------*\ |
- * For the purposes of this section and the next, the term "static position" |
- * (of an element) refers, roughly, to the position an element would have had |
- * in the normal flow. More precisely, the static position for 'top' is the |
- * distance from the top edge of the containing block to the top margin edge |
- * of a hypothetical box that would have been the first box of the element if |
- * its 'position' property had been 'static' and 'float' had been 'none'. The |
- * value is negative if the hypothetical box is above the containing block. |
- * |
- * But rather than actually calculating the dimensions of that hypothetical |
- * box, user agents are free to make a guess at its probable position. |
- * |
- * For the purposes of calculating the static position, the containing block |
- * of fixed positioned elements is the initial containing block instead of |
- * the viewport. |
- \*---------------------------------------------------------------------------*/ |
- |
+ // --------------------------------------------------------------------------- |
+ // For the purposes of this section and the next, the term "static position" |
+ // (of an element) refers, roughly, to the position an element would have had |
+ // in the normal flow. More precisely, the static position for 'top' is the |
+ // distance from the top edge of the containing block to the top margin edge |
+ // of a hypothetical box that would have been the first box of the element if |
+ // its 'position' property had been 'static' and 'float' had been 'none'. The |
+ // value is negative if the hypothetical box is above the containing block. |
+ // |
+ // But rather than actually calculating the dimensions of that hypothetical |
+ // box, user agents are free to make a guess at its probable position. |
+ // |
+ // For the purposes of calculating the static position, the containing block |
+ // of fixed positioned elements is the initial containing block instead of |
+ // the viewport. |
+ // --------------------------------------------------------------------------- |
// see FIXME 1 |
// Calculate the static distance if needed. |
computeBlockStaticDistance(logicalTopLength, logicalBottomLength, this, |
@@ -4170,7 +4281,8 @@ void LayoutBox::computePositionedLogicalHeight( |
logicalTopLength, logicalBottomLength, marginBefore, marginAfter, |
computedValues); |
- // Avoid doing any work in the common case (where the values of min-height and max-height are their defaults). |
+ // Avoid doing any work in the common case (where the values of min-height and |
+ // max-height are their defaults). |
// see FIXME 2 |
// Calculate constraint equation values for 'max-height' case. |
@@ -4223,8 +4335,10 @@ void LayoutBox::computeLogicalTopPositionedOffset( |
LayoutUnit logicalHeightValue, |
const LayoutBoxModelObject* containerBlock, |
LayoutUnit containerLogicalHeight) { |
- // Deal with differing writing modes here. Our offset needs to be in the containing block's coordinate space. If the containing block is flipped |
- // along this axis, then we need to flip the coordinate. This can only happen if the containing block is both a flipped mode and perpendicular to us. |
+ // Deal with differing writing modes here. Our offset needs to be in the |
+ // containing block's coordinate space. If the containing block is flipped |
+ // along this axis, then we need to flip the coordinate. This can only happen |
+ // if the containing block is both a flipped mode and perpendicular to us. |
if ((child->style()->isFlippedBlocksWritingMode() && |
child->isHorizontalWritingMode() != |
containerBlock->isHorizontalWritingMode()) || |
@@ -4234,7 +4348,8 @@ void LayoutBox::computeLogicalTopPositionedOffset( |
containerBlock->isHorizontalWritingMode())) |
logicalTopPos = containerLogicalHeight - logicalHeightValue - logicalTopPos; |
- // Our offset is from the logical bottom edge in a flipped environment, e.g., right for vertical-rl. |
+ // Our offset is from the logical bottom edge in a flipped environment, e.g., |
+ // right for vertical-rl. |
if (containerBlock->style()->isFlippedBlocksWritingMode() && |
child->isHorizontalWritingMode() == |
containerBlock->isHorizontalWritingMode()) { |
@@ -4298,14 +4413,13 @@ void LayoutBox::computePositionedLogicalHeightUsing( |
} |
if (!logicalTopIsAuto && !logicalHeightIsAuto && !logicalBottomIsAuto) { |
- /*-----------------------------------------------------------------------*\ |
- * If none of the three are 'auto': If both 'margin-top' and 'margin- |
- * bottom' are 'auto', solve the equation under the extra constraint that |
- * the two margins get equal values. If one of 'margin-top' or 'margin- |
- * bottom' is 'auto', solve the equation for that value. If the values |
- * are over-constrained, ignore the value for 'bottom' and solve for that |
- * value. |
- \*-----------------------------------------------------------------------*/ |
+ // ------------------------------------------------------------------------- |
+ // If none of the three are 'auto': If both 'margin-top' and 'margin-bottom' |
+ // are 'auto', solve the equation under the extra constraint that the two |
+ // margins get equal values. If one of 'margin-top' or 'margin- bottom' is |
+ // 'auto', solve the equation for that value. If the values are over- |
+ // constrained, ignore the value for 'bottom' and solve for that value. |
+ // ------------------------------------------------------------------------- |
// NOTE: It is not necessary to solve for 'bottom' in the over constrained |
// case because the value is not used for any further calculations. |
@@ -4348,28 +4462,28 @@ void LayoutBox::computePositionedLogicalHeightUsing( |
valueForLength(marginAfter, containerRelativeLogicalWidth); |
} |
} else { |
- /*--------------------------------------------------------------------*\ |
- * Otherwise, set 'auto' values for 'margin-top' and 'margin-bottom' |
- * to 0, and pick the one of the following six rules that applies. |
- * |
- * 1. 'top' and 'height' are 'auto' and 'bottom' is not 'auto', then |
- * the height is based on the content, and solve for 'top'. |
- * |
- * OMIT RULE 2 AS IT SHOULD NEVER BE HIT |
- * ------------------------------------------------------------------ |
- * 2. 'top' and 'bottom' are 'auto' and 'height' is not 'auto', then |
- * set 'top' to the static position, and solve for 'bottom'. |
- * ------------------------------------------------------------------ |
- * |
- * 3. 'height' and 'bottom' are 'auto' and 'top' is not 'auto', then |
- * the height is based on the content, and solve for 'bottom'. |
- * 4. 'top' is 'auto', 'height' and 'bottom' are not 'auto', and |
- * solve for 'top'. |
- * 5. 'height' is 'auto', 'top' and 'bottom' are not 'auto', and |
- * solve for 'height'. |
- * 6. 'bottom' is 'auto', 'top' and 'height' are not 'auto', and |
- * solve for 'bottom'. |
- \*--------------------------------------------------------------------*/ |
+ // ------------------------------------------------------------------------- |
+ // Otherwise, set 'auto' values for 'margin-top' and 'margin-bottom' |
+ // to 0, and pick the one of the following six rules that applies. |
+ // |
+ // 1. 'top' and 'height' are 'auto' and 'bottom' is not 'auto', then |
+ // the height is based on the content, and solve for 'top'. |
+ // |
+ // OMIT RULE 2 AS IT SHOULD NEVER BE HIT |
+ // ------------------------------------------------------------------ |
+ // 2. 'top' and 'bottom' are 'auto' and 'height' is not 'auto', then |
+ // set 'top' to the static position, and solve for 'bottom'. |
+ // ------------------------------------------------------------------ |
+ // |
+ // 3. 'height' and 'bottom' are 'auto' and 'top' is not 'auto', then |
+ // the height is based on the content, and solve for 'bottom'. |
+ // 4. 'top' is 'auto', 'height' and 'bottom' are not 'auto', and |
+ // solve for 'top'. |
+ // 5. 'height' is 'auto', 'top' and 'bottom' are not 'auto', and |
+ // solve for 'height'. |
+ // 6. 'bottom' is 'auto', 'top' and 'height' are not 'auto', and |
+ // solve for 'bottom'. |
+ // ------------------------------------------------------------------------- |
// NOTE: For rules 3 and 6 it is not necessary to solve for 'bottom' |
// because the value is not used for any further calculations. |
@@ -4432,10 +4546,12 @@ void LayoutBox::computePositionedLogicalHeightUsing( |
LayoutRect LayoutBox::localCaretRect(InlineBox* box, |
int caretOffset, |
LayoutUnit* extraWidthToEndOfLine) { |
- // VisiblePositions at offsets inside containers either a) refer to the positions before/after |
- // those containers (tables and select elements) or b) refer to the position inside an empty block. |
+ // VisiblePositions at offsets inside containers either a) refer to the |
+ // positions before/after those containers (tables and select elements) or |
+ // b) refer to the position inside an empty block. |
// They never refer to children. |
- // FIXME: Paint the carets inside empty blocks differently than the carets before/after elements. |
+ // FIXME: Paint the carets inside empty blocks differently than the carets |
+ // before/after elements. |
LayoutRect rect(location(), LayoutSize(caretWidth(), size().height())); |
bool ltr = |
@@ -4454,9 +4570,10 @@ LayoutRect LayoutBox::localCaretRect(InlineBox* box, |
// If height of box is smaller than font height, use the latter one, |
// otherwise the caret might become invisible. |
// |
- // Also, if the box is not an atomic inline-level element, always use the font height. |
- // This prevents the "big caret" bug described in: |
- // <rdar://problem/3777804> Deleting all content in a document can result in giant tall-as-window insertion point |
+ // Also, if the box is not an atomic inline-level element, always use the font |
+ // height. This prevents the "big caret" bug described in: |
+ // <rdar://problem/3777804> Deleting all content in a document can result in |
+ // giant tall-as-window insertion point |
// |
// FIXME: ignoring :first-line, missing good reason to take care of |
LayoutUnit fontHeight = LayoutUnit(style()->getFontMetrics().height()); |
@@ -4485,7 +4602,8 @@ LayoutRect LayoutBox::localCaretRect(InlineBox* box, |
} |
PositionWithAffinity LayoutBox::positionForPoint(const LayoutPoint& point) { |
- // no children...return this layout object's element, if there is one, and offset 0 |
+ // no children...return this layout object's element, if there is one, and |
+ // offset 0 |
LayoutObject* firstChild = slowFirstChild(); |
if (!firstChild) |
return createPositionWithAffinity( |
@@ -4540,8 +4658,9 @@ PositionWithAffinity LayoutBox::positionForPoint(const LayoutPoint& point) { |
return layoutBox->positionForPoint(point - layoutBox->locationOffset()); |
} |
- // Find the distance from (x, y) to the box. Split the space around the box into 8 pieces |
- // and use a different compare depending on which piece (x, y) is in. |
+ // Find the distance from (x, y) to the box. Split the space around the box |
+ // into 8 pieces and use a different compare depending on which piece (x, y) |
+ // is in. |
LayoutPoint cmp; |
if (point.x() > right) { |
if (point.y() < top) |
@@ -4583,7 +4702,8 @@ PositionWithAffinity LayoutBox::positionForPoint(const LayoutPoint& point) { |
DISABLE_CFI_PERF |
bool LayoutBox::shrinkToAvoidFloats() const { |
- // Floating objects don't shrink. Objects that don't avoid floats don't shrink. |
+ // Floating objects don't shrink. Objects that don't avoid floats don't |
+ // shrink. |
if (isInline() || !avoidsFloats() || isFloating()) |
return false; |
@@ -4592,7 +4712,8 @@ bool LayoutBox::shrinkToAvoidFloats() const { |
} |
static bool shouldBeConsideredAsReplaced(Node* node) { |
- // Checkboxes and radioboxes are not isAtomicInlineLevel() nor do they have their own layoutObject in which to override avoidFloats(). |
+ // Checkboxes and radioboxes are not isAtomicInlineLevel() nor do they have |
+ // their own layoutObject in which to override avoidFloats(). |
return node && node->isElementNode() && |
(toElement(node)->isFormControlElement() || |
isHTMLImageElement(toElement(node))); |
@@ -4678,7 +4799,8 @@ LayoutRectOutsets LayoutBox::computeVisualEffectOverflowOutsets() const { |
left = std::max(left, borderOutsets.left()); |
} |
- // Box-shadow and border-image-outsets are in physical direction. Flip into block direction. |
+ // Box-shadow and border-image-outsets are in physical direction. Flip into |
+ // block direction. |
if (UNLIKELY(hasFlippedBlocksWritingMode())) |
std::swap(left, right); |
@@ -4705,17 +4827,19 @@ void LayoutBox::addOverflowFromChild(LayoutBox* child, |
if (child->isLayoutFlowThread()) |
return; |
- // Only propagate layout overflow from the child if the child isn't clipping its overflow. If it is, then |
- // its overflow is internal to it, and we don't care about it. layoutOverflowRectForPropagation takes care of this |
- // and just propagates the border box rect instead. |
+ // Only propagate layout overflow from the child if the child isn't clipping |
+ // its overflow. If it is, then its overflow is internal to it, and we don't |
+ // care about it. layoutOverflowRectForPropagation takes care of this and just |
+ // propagates the border box rect instead. |
LayoutRect childLayoutOverflowRect = |
child->layoutOverflowRectForPropagation(styleRef()); |
childLayoutOverflowRect.move(delta); |
addLayoutOverflow(childLayoutOverflowRect); |
- // Add in visual overflow from the child. Even if the child clips its overflow, it may still |
- // have visual overflow of its own set from box shadows or reflections. It is unnecessary to propagate this |
- // overflow if we are clipping our own overflow. |
+ // Add in visual overflow from the child. Even if the child clips its |
+ // overflow, it may still have visual overflow of its own set from box shadows |
+ // or reflections. It is unnecessary to propagate this overflow if we are |
+ // clipping our own overflow. |
if (child->hasSelfPaintingLayer()) |
return; |
LayoutRect childVisualOverflowRect = |
@@ -4741,11 +4865,14 @@ void LayoutBox::addLayoutOverflow(const LayoutRect& rect) { |
if (clientBox.contains(rect)) |
return; |
- // For overflow clip objects, we don't want to propagate overflow into unreachable areas. |
+ // For overflow clip objects, we don't want to propagate overflow into |
+ // unreachable areas. |
LayoutRect overflowRect(rect); |
if (hasOverflowClip() || isLayoutView()) { |
- // Overflow is in the block's coordinate space and thus is flipped for vertical-rl writing |
- // mode. At this stage that is actually a simplification, since we can treat vertical-lr/rl |
+ // Overflow is in the block's coordinate space and thus is flipped for |
+ // vertical-rl writing |
+ // mode. At this stage that is actually a simplification, since we can |
+ // treat vertical-lr/rl |
// as the same. |
if (hasTopOverflow()) |
overflowRect.shiftMaxYEdgeTo( |
@@ -4758,7 +4885,8 @@ void LayoutBox::addLayoutOverflow(const LayoutRect& rect) { |
else |
overflowRect.shiftXEdgeTo(std::max(overflowRect.x(), clientBox.x())); |
- // Now re-test with the adjusted rectangle and see if it has become unreachable or fully |
+ // Now re-test with the adjusted rectangle and see if it has become |
+ // unreachable or fully |
// contained. |
if (clientBox.contains(overflowRect) || overflowRect.isEmpty()) |
return; |
@@ -4788,9 +4916,11 @@ void LayoutBox::addContentsVisualOverflow(const LayoutRect& rect) { |
if (rect.isEmpty()) |
return; |
- // If hasOverflowClip() we always save contents visual overflow because we need it |
+ // If hasOverflowClip() we always save contents visual overflow because we |
+ // need it |
// e.g. to determine whether to apply rounded corner clip on contents. |
- // Otherwise we save contents visual overflow only if it overflows the border box. |
+ // Otherwise we save contents visual overflow only if it overflows the border |
+ // box. |
LayoutRect borderBox = borderBoxRect(); |
if (!hasOverflowClip() && borderBox.contains(rect)) |
return; |
@@ -4819,23 +4949,26 @@ bool LayoutBox::percentageLogicalHeightIsResolvable() const { |
DISABLE_CFI_PERF |
bool LayoutBox::hasUnsplittableScrollingOverflow() const { |
- // We will paginate as long as we don't scroll overflow in the pagination direction. |
+ // We will paginate as long as we don't scroll overflow in the pagination |
+ // direction. |
bool isHorizontal = isHorizontalWritingMode(); |
if ((isHorizontal && !scrollsOverflowY()) || |
(!isHorizontal && !scrollsOverflowX())) |
return false; |
- // Fragmenting scrollbars is only problematic in interactive media, e.g. multicol on a |
- // screen. If we're printing, which is non-interactive media, we should allow objects with |
- // non-visible overflow to be paginated as normally. |
+ // Fragmenting scrollbars is only problematic in interactive media, e.g. |
+ // multicol on a screen. If we're printing, which is non-interactive media, we |
+ // should allow objects with non-visible overflow to be paginated as normally. |
if (document().printing()) |
return false; |
- // We do have overflow. We'll still be willing to paginate as long as the block |
- // has auto logical height, auto or undefined max-logical-height and a zero or auto min-logical-height. |
- // Note this is just a heuristic, and it's still possible to have overflow under these |
- // conditions, but it should work out to be good enough for common cases. Paginating overflow |
- // with scrollbars present is not the end of the world and is what we used to do in the old model anyway. |
+ // We do have overflow. We'll still be willing to paginate as long as the |
+ // block has auto logical height, auto or undefined max-logical-height and a |
+ // zero or auto min-logical-height. |
+ // Note this is just a heuristic, and it's still possible to have overflow |
+ // under these conditions, but it should work out to be good enough for common |
+ // cases. Paginating overflow with scrollbars present is not the end of the |
+ // world and is what we used to do in the old model anyway. |
return !style()->logicalHeight().isIntrinsicOrAuto() || |
(!style()->logicalMaxHeight().isIntrinsicOrAuto() && |
!style()->logicalMaxHeight().isMaxSizeNone() && |
@@ -4917,8 +5050,9 @@ LayoutRect LayoutBox::visualOverflowRectForPropagation( |
if (parentStyle.getWritingMode() == style()->getWritingMode()) |
return rect; |
- // We are putting ourselves into our parent's coordinate space. If there is a flipped block mismatch |
- // in a particular axis, then we have to flip the rect along that axis. |
+ // We are putting ourselves into our parent's coordinate space. If there is a |
+ // flipped block mismatch in a particular axis, then we have to flip the rect |
+ // along that axis. |
if (style()->getWritingMode() == RightToLeftWritingMode || |
parentStyle.getWritingMode() == RightToLeftWritingMode) |
rect.setX(size().width() - rect.maxX()); |
@@ -4940,8 +5074,8 @@ LayoutRect LayoutBox::layoutOverflowRectForPropagation( |
const ComputedStyle& parentStyle) const { |
// Only propagate interior layout overflow if we don't clip it. |
LayoutRect rect = borderBoxRect(); |
- // We want to include the margin, but only when it adds height. Quirky margins don't contribute height |
- // nor do the margins of self-collapsing blocks. |
+ // We want to include the margin, but only when it adds height. Quirky margins |
+ // don't contribute height nor do the margins of self-collapsing blocks. |
if (!styleRef().hasMarginAfterQuirk() && !isSelfCollapsingBlock()) |
rect.expand(isHorizontalWritingMode() |
? LayoutSize(LayoutUnit(), marginAfter()) |
@@ -4952,9 +5086,9 @@ LayoutRect LayoutBox::layoutOverflowRectForPropagation( |
bool hasTransform = hasLayer() && layer()->transform(); |
if (isInFlowPositioned() || hasTransform) { |
- // If we are relatively positioned or if we have a transform, then we have to convert |
- // this rectangle into physical coordinates, apply relative positioning and transforms |
- // to it, and then convert it back. |
+ // If we are relatively positioned or if we have a transform, then we have |
+ // to convert this rectangle into physical coordinates, apply relative |
+ // positioning and transforms to it, and then convert it back. |
flipForWritingMode(rect); |
if (hasTransform) |
@@ -4972,8 +5106,9 @@ LayoutRect LayoutBox::layoutOverflowRectForPropagation( |
if (parentStyle.getWritingMode() == style()->getWritingMode()) |
return rect; |
- // We are putting ourselves into our parent's coordinate space. If there is a flipped block mismatch |
- // in a particular axis, then we have to flip the rect along that axis. |
+ // We are putting ourselves into our parent's coordinate space. If there is a |
+ // flipped block mismatch in a particular axis, then we have to flip the rect |
+ // along that axis. |
if (style()->getWritingMode() == RightToLeftWritingMode || |
parentStyle.getWritingMode() == RightToLeftWritingMode) |
rect.setX(size().width() - rect.maxX()); |
@@ -4983,11 +5118,12 @@ LayoutRect LayoutBox::layoutOverflowRectForPropagation( |
DISABLE_CFI_PERF |
LayoutRect LayoutBox::noOverflowRect() const { |
- // Because of the special coordinate system used for overflow rectangles and many other |
- // rectangles (not quite logical, not quite physical), we need to flip the block progression |
- // coordinate in vertical-rl writing mode. In other words, the rectangle returned is physical, |
- // except for the block direction progression coordinate (x in vertical writing mode), which is |
- // always "logical top". Apart from the flipping, this method does the same thing as |
+ // Because of the special coordinate system used for overflow rectangles and |
+ // many other rectangles (not quite logical, not quite physical), we need to |
+ // flip the block progression coordinate in vertical-rl writing mode. In other |
+ // words, the rectangle returned is physical, except for the block direction |
+ // progression coordinate (x in vertical writing mode), which is always |
+ // "logical top". Apart from the flipping, this method does the same thing as |
// clientBoxRect(). |
const int scrollBarWidth = verticalScrollbarWidth(); |
@@ -5001,15 +5137,16 @@ LayoutRect LayoutBox::noOverflowRect() const { |
LayoutRect rect(left, top, size().width() - left - right, |
size().height() - top - bottom); |
flipForWritingMode(rect); |
- // Subtract space occupied by scrollbars. Order is important here: first flip, then subtract |
- // scrollbars. This may seem backwards and weird, since one would think that a vertical |
- // scrollbar at the physical right in vertical-rl ought to be at the logical left (physical |
- // right), between the logical left (physical right) border and the logical left (physical |
- // right) padding. But this is how the rest of the code expects us to behave. This is highly |
+ // Subtract space occupied by scrollbars. Order is important here: first flip, |
+ // then subtract scrollbars. This may seem backwards and weird, since one |
+ // would think that a vertical scrollbar at the physical right in vertical-rl |
+ // ought to be at the logical left (physical right), between the logical left |
+ // (physical right) border and the logical left (physical right) padding. But |
+ // this is how the rest of the code expects us to behave. This is highly |
// related to https://bugs.webkit.org/show_bug.cgi?id=76129 |
- // FIXME: when the above mentioned bug is fixed, it should hopefully be possible to call |
- // clientBoxRect() or paddingBoxRect() in this method, rather than fiddling with the edges on |
- // our own. |
+ // FIXME: when the above mentioned bug is fixed, it should hopefully be |
+ // possible to call clientBoxRect() or paddingBoxRect() in this method, rather |
+ // than fiddling with the edges on our own. |
if (shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
rect.contract(0, scrollBarHeight); |
else |
@@ -5085,8 +5222,9 @@ static void markBoxForRelayoutAfterSplit(LayoutBox* box) { |
// FIXME: The table code should handle that automatically. If not, |
// we should fix it and remove the table part checks. |
if (box->isTable()) { |
- // Because we may have added some sections with already computed column structures, we need to |
- // sync the table structure with them now. This avoids crashes when adding new cells to the table. |
+ // Because we may have added some sections with already computed column |
+ // structures, we need to sync the table structure with them now. This |
+ // avoids crashes when adding new cells to the table. |
toLayoutTable(box)->forceSectionsRecalc(); |
} else if (box->isTableSection()) { |
toLayoutTableSection(box)->setNeedsCellRecalc(); |
@@ -5120,7 +5258,8 @@ LayoutObject* LayoutBox::splitAnonymousBoxesAroundChild( |
postBox->setChildrenInline(boxToSplit->childrenInline()); |
LayoutBox* parentBox = toLayoutBox(boxToSplit->parent()); |
// We need to invalidate the |parentBox| before inserting the new node |
- // so that the table paint invalidation logic knows the structure is dirty. |
+ // so that the table paint invalidation logic knows the structure is |
+ // dirty. |
// See for example LayoutTableCell:localOverflowRectForPaintInvalidation. |
markBoxForRelayoutAfterSplit(parentBox); |
parentBox->virtualChildren()->insertChildNode(parentBox, postBox, |
@@ -5146,8 +5285,9 @@ LayoutObject* LayoutBox::splitAnonymousBoxesAroundChild( |
} |
} |
- // Splitting the box means the left side of the container chain will lose any percent height descendants |
- // below |boxAtTopOfNewBranch| on the right hand side. |
+ // Splitting the box means the left side of the container chain will lose any |
+ // percent height descendants below |boxAtTopOfNewBranch| on the right hand |
+ // side. |
if (boxAtTopOfNewBranch) { |
boxAtTopOfNewBranch->clearPercentHeightDescendants(); |
markBoxForRelayoutAfterSplit(this); |
@@ -5169,11 +5309,12 @@ LayoutUnit LayoutBox::offsetFromLogicalTopOfFirstPage() const { |
: offsetDelta.width(); |
} |
- // A LayoutBlock always establishes a layout state, and this method is only meant to be called |
- // on the object currently being laid out. |
+ // A LayoutBlock always establishes a layout state, and this method is only |
+ // meant to be called on the object currently being laid out. |
ASSERT(!isLayoutBlock()); |
- // In case this box doesn't establish a layout state, try the containing block. |
+ // In case this box doesn't establish a layout state, try the containing |
+ // block. |
LayoutBlock* containerBlock = containingBlock(); |
ASSERT(layoutState->layoutObject() == containerBlock); |
return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); |
@@ -5360,7 +5501,8 @@ void LayoutBox::removeFromPercentHeightContainer() { |
ASSERT(percentHeightContainer()->hasPercentHeightDescendant(this)); |
percentHeightContainer()->removePercentHeightDescendant(this); |
- // The above call should call this object's setPercentHeightContainer(nullptr). |
+ // The above call should call this object's |
+ // setPercentHeightContainer(nullptr). |
ASSERT(!percentHeightContainer()); |
} |
@@ -5393,9 +5535,9 @@ LayoutUnit LayoutBox::pageRemainingLogicalHeightForOffset( |
LayoutUnit remainingHeight = |
pageLogicalHeight - intMod(offset, pageLogicalHeight); |
if (pageBoundaryRule == AssociateWithFormerPage) { |
- // An offset exactly at a page boundary will act as being part of the former page in |
- // question (i.e. no remaining space), rather than being part of the latter (i.e. one |
- // whole page length of remaining space). |
+ // An offset exactly at a page boundary will act as being part of the |
+ // former page in question (i.e. no remaining space), rather than being |
+ // part of the latter (i.e. one whole page length of remaining space). |
remainingHeight = intMod(remainingHeight, pageLogicalHeight); |
} |
return remainingHeight; |
@@ -5413,18 +5555,21 @@ LayoutUnit LayoutBox::calculatePaginationStrutToFitContent( |
pageRemainingLogicalHeightForOffset(offset, AssociateWithLatterPage)); |
LayoutUnit nextPageLogicalTop = offset + strutToNextPage; |
if (pageLogicalHeightForOffset(nextPageLogicalTop) >= contentLogicalHeight) |
- return strutToNextPage; // Content fits just fine in the next page or column. |
+ return strutToNextPage; // Content fits just fine in the next page or |
+ // column. |
- // Moving to the top of the next page or column doesn't result in enough space for the content |
- // that we're trying to fit. If we're in a nested fragmentation context, we may find enough |
- // space if we move to a column further ahead, by effectively breaking to the next outer |
- // fragmentainer. |
+ // Moving to the top of the next page or column doesn't result in enough space |
+ // for the content that we're trying to fit. If we're in a nested |
+ // fragmentation context, we may find enough space if we move to a column |
+ // further ahead, by effectively breaking to the next outer fragmentainer. |
LayoutFlowThread* flowThread = flowThreadContainingBlock(); |
if (!flowThread) { |
- // If there's no flow thread, we're not nested. All pages have the same height. Give up. |
+ // If there's no flow thread, we're not nested. All pages have the same |
+ // height. Give up. |
return strutToNextPage; |
} |
- // Start searching for a suitable offset at the top of the next page or column. |
+ // Start searching for a suitable offset at the top of the next page or |
+ // column. |
LayoutUnit flowThreadOffset = |
offsetFromLogicalTopOfFirstPage() + nextPageLogicalTop; |
return strutToNextPage + |