WebKit Bugzilla
Attachment 343708 Details for
Bug 187096
: [LFC] Compute static position for out-of-flow elements only when required.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-187096-20180627073137.patch (text/plain), 10.24 KB, created by
zalan
on 2018-06-27 07:31:39 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2018-06-27 07:31:39 PDT
Size:
10.24 KB
patch
obsolete
>Subversion Revision: 233202 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 976923bbc04115d6bb3b0f1230a050ab6aae15e6..15bf9b0e685eefc98850dfc2bf2e748ee73d03c8 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,23 @@ >+2018-06-27 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC] Compute static position for out-of-flow elements only when required. >+ https://bugs.webkit.org/show_bug.cgi?id=187096 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Computing static position for out-of-flow elements could be somewhat expensive, so let's not do it unless we actually need it. >+ >+ * layout/FormattingContextGeometry.cpp: >+ (WebCore::Layout::staticVerticalPositionForOutOfFlowPositioned): >+ (WebCore::Layout::staticHorizontalPositionForOutOfFlowPositioned): >+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeometry): >+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry): >+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry): >+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry): >+ * layout/blockformatting/BlockFormattingContextGeometry.cpp: >+ (WebCore::Layout::BlockFormattingContext::Geometry::staticPosition): >+ (WebCore::Layout::BlockFormattingContext::Geometry::staticPositionForOutOfFlowPositioned): Deleted. >+ > 2018-06-26 Thibault Saunier <tsaunier@igalia.com> > > [GStreamer] Do not forget to set stream on track switching >diff --git a/Source/WebCore/layout/FormattingContextGeometry.cpp b/Source/WebCore/layout/FormattingContextGeometry.cpp >index f5fa05c791433f083f00db18ce62d0171ca04b6d..2466f2dec9f54e265e548e84a4e9f27656057ee9 100644 >--- a/Source/WebCore/layout/FormattingContextGeometry.cpp >+++ b/Source/WebCore/layout/FormattingContextGeometry.cpp >@@ -75,6 +75,45 @@ std::optional<LayoutUnit> FormattingContext::Geometry::computedValueIfNotAuto(co > return valueForLength(geometryProperty, containingBlockWidth); > } > >+static LayoutUnit staticVerticalPositionForOutOfFlowPositioned(const LayoutContext& layoutContext, const Box& layoutBox) >+{ >+ ASSERT(layoutBox.isOutOfFlowPositioned()); >+ >+ LayoutUnit top; >+ // Resolve top all the way up to the containing block. >+ auto* containingBlock = layoutBox.containingBlock(); >+ for (auto* parent = layoutBox.parent(); parent; parent = parent->parent()) { >+ auto& displayBox = *layoutContext.displayBoxForLayoutBox(*parent); >+ top += (displayBox.top() + displayBox.contentBoxTop()); >+ if (parent == containingBlock) >+ break; >+ } >+ // Add sibling offset >+ if (auto* previousInFlowSibling = layoutBox.previousInFlowSibling()) { >+ auto& previousInFlowDisplayBox = *layoutContext.displayBoxForLayoutBox(*previousInFlowSibling); >+ top += previousInFlowDisplayBox.bottom() + previousInFlowDisplayBox.marginBottom(); >+ } >+ // FIXME: floatings need to be taken into account. >+ return top; >+} >+ >+static LayoutUnit staticHorizontalPositionForOutOfFlowPositioned(const LayoutContext& layoutContext, const Box& layoutBox) >+{ >+ ASSERT(layoutBox.isOutOfFlowPositioned()); >+ >+ LayoutUnit left; >+ // Resolve left all the way up to the containing block. >+ auto* containingBlock = layoutBox.containingBlock(); >+ for (auto* parent = layoutBox.parent(); parent; parent = parent->parent()) { >+ auto& displayBox = *layoutContext.displayBoxForLayoutBox(*parent); >+ left += (displayBox.left() + displayBox.contentBoxLeft()); >+ if (parent == containingBlock) >+ break; >+ } >+ // FIXME: floatings need to be taken into account. >+ return left; >+} >+ > FormattingContext::Geometry::VerticalGeometry FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeometry(LayoutContext& layoutContext, const Box& layoutBox) > { > ASSERT(layoutBox.isOutOfFlowPositioned() && !layoutBox.replaced()); >@@ -120,7 +159,7 @@ FormattingContext::Geometry::VerticalGeometry FormattingContext::Geometry::outOf > auto borderBottom = displayBox.borderBottom(); > > if (!top && !height && !bottom) >- top = displayBox.top(); >+ top = staticVerticalPositionForOutOfFlowPositioned(layoutContext, layoutBox); > > if (top && height && bottom) { > if (!marginTop && !marginBottom) { >@@ -146,7 +185,7 @@ FormattingContext::Geometry::VerticalGeometry FormattingContext::Geometry::outOf > > if (!top && !bottom && height) { > // #2 >- top = displayBox.top(); >+ top = staticVerticalPositionForOutOfFlowPositioned(layoutContext, layoutBox); > marginTop = marginTop.value_or(0); > marginBottom = marginBottom.value_or(0); > bottom = containingBlockHeight - (*top + *marginTop + borderTop + paddingTop + *height + paddingBottom + borderBottom + *marginBottom); >@@ -244,10 +283,11 @@ FormattingContext::Geometry::HorizontalGeometry FormattingContext::Geometry::out > marginLeft = marginLeft.value_or(0); > marginRight = marginRight.value_or(0); > >+ auto staticHorizontalPosition = staticHorizontalPositionForOutOfFlowPositioned(layoutContext, layoutBox); > if (isLeftToRightDirection) >- left = displayBox.left(); >+ left = staticHorizontalPosition; > else >- right = displayBox.right(); >+ right = staticHorizontalPosition; > } else if (left && width && right) { > // 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 >@@ -301,11 +341,12 @@ FormattingContext::Geometry::HorizontalGeometry FormattingContext::Geometry::out > left = containingBlockWidth - (*marginLeft + borderLeft + paddingLeft + *width + paddingRight + borderRight + *marginRight + *right); > } else if (!left && !right && width) { > // #2 >+ auto staticHorizontalPosition = staticHorizontalPositionForOutOfFlowPositioned(layoutContext, layoutBox); > if (isLeftToRightDirection) { >- left = displayBox.left(); >+ left = staticHorizontalPosition; > right = containingBlockWidth - (*left + *marginLeft + borderLeft + paddingLeft + *width + paddingRight + borderRight + *marginRight); > } else { >- right = displayBox.right(); >+ right = staticHorizontalPosition; > left = containingBlockWidth - (*marginLeft + borderLeft + paddingLeft + *width + paddingRight + borderRight + *marginRight + *right); > } > } else if (!width && !right && left) { >@@ -365,7 +406,7 @@ FormattingContext::Geometry::VerticalGeometry FormattingContext::Geometry::outOf > > if (!top && !bottom) { > // #1 >- top = displayBox.top(); >+ top = staticVerticalPositionForOutOfFlowPositioned(layoutContext, layoutBox); > } > > if (!bottom) { >@@ -438,10 +479,11 @@ FormattingContext::Geometry::HorizontalGeometry FormattingContext::Geometry::out > > if (!left && !right) { > // #1 >+ auto staticHorizontalPosition = staticHorizontalPositionForOutOfFlowPositioned(layoutContext, layoutBox); > if (isLeftToRightDirection) >- left = displayBox.left(); >+ left = staticHorizontalPosition; > else >- right = displayBox.right(); >+ right = staticHorizontalPosition; > } > > if (!left || !right) { >diff --git a/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp b/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp >index ba65b7edb4ddc0162e5757790ccf453eef527eb8..37e8d2a185ed44c8aabbf969555f28bcf6f5ffbd 100644 >--- a/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp >+++ b/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp >@@ -265,31 +265,6 @@ FormattingContext::Geometry::WidthAndMargin BlockFormattingContext::Geometry::in > return { width, margin }; > } > >-FormattingContext::Geometry::Position BlockFormattingContext::Geometry::staticPositionForOutOfFlowPositioned(const LayoutContext& layoutContext, const Box& layoutBox) >-{ >- // FIXME: This is certainly only really needed when top/bottom left/right are auto. >- ASSERT(layoutBox.isOutOfFlowPositioned()); >- LayoutUnit top; >- LayoutUnit left; >- // Resolve top/left all the way up to the containing block. >- auto* containingBlock = layoutBox.containingBlock(); >- for (auto* parent = layoutBox.parent(); parent; parent = parent->parent()) { >- auto& displayBox = *layoutContext.displayBoxForLayoutBox(*parent); >- top += (displayBox.top() + displayBox.contentBoxTop()); >- left += (displayBox.left() + displayBox.contentBoxLeft()); >- if (parent == containingBlock) >- break; >- } >- // Add sibling offset >- if (auto* previousInFlowSibling = layoutBox.previousInFlowSibling()) { >- auto& previousInFlowDisplayBox = *layoutContext.displayBoxForLayoutBox(*previousInFlowSibling); >- top += previousInFlowDisplayBox.bottom() + previousInFlowDisplayBox.marginBottom(); >- } >- >- LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position] -> out-of-flow -> static -> top(" << top << "px) left(" << left << "px) layoutBox(" << &layoutBox << ")"); >- return { left, top }; >-} >- > FormattingContext::Geometry::Position BlockFormattingContext::Geometry::staticPosition(LayoutContext& layoutContext, const Box& layoutBox) > { > // https://www.w3.org/TR/CSS22/visuren.html#block-formatting >@@ -298,9 +273,6 @@ FormattingContext::Geometry::Position BlockFormattingContext::Geometry::staticPo > // Vertical margins between adjacent block-level boxes in a block formatting context collapse. > // In a block formatting context, each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). > >- if (layoutBox.isOutOfFlowPositioned()) >- return staticPositionForOutOfFlowPositioned(layoutContext, layoutBox); >- > LayoutUnit top; > auto& containingBlockDisplayBox = *layoutContext.displayBoxForLayoutBox(*layoutBox.containingBlock()); > if (auto* previousInFlowSibling = layoutBox.previousInFlowSibling()) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
koivisto
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 187096
: 343708