Title: [256711] trunk/Source/WebCore
- Revision
- 256711
- Author
- [email protected]
- Date
- 2020-02-16 07:38:38 -0800 (Sun, 16 Feb 2020)
Log Message
[LFC][Float] Simplify BlockFormattingContext::usedAvailableWidthForFloatAvoider
https://bugs.webkit.org/show_bug.cgi?id=207823
<rdar://problem/59490669>
Reviewed by Antti Koivisto.
The containing block of this float avoider is either a non-avoider or a formatting context root avoider,
so we don't have to map the left position (and now LFC passes fast/block/block-only again).
* layout/FormattingContext.cpp:
(WebCore::Layout::mapHorizontalPositionToAncestor): Deleted.
(WebCore::Layout::FormattingContext::mapTopToFormattingContextRoot const): Deleted.
(WebCore::Layout::FormattingContext::mapLeftToFormattingContextRoot const): Deleted.
(WebCore::Layout::FormattingContext::mapRightToFormattingContextRoot const): Deleted.
* layout/FormattingContext.h:
* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::usedAvailableWidthForFloatAvoider):
(WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (256710 => 256711)
--- trunk/Source/WebCore/ChangeLog 2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/ChangeLog 2020-02-16 15:38:38 UTC (rev 256711)
@@ -1,5 +1,26 @@
2020-02-16 Zalan Bujtas <[email protected]>
+ [LFC][Float] Simplify BlockFormattingContext::usedAvailableWidthForFloatAvoider
+ https://bugs.webkit.org/show_bug.cgi?id=207823
+ <rdar://problem/59490669>
+
+ Reviewed by Antti Koivisto.
+
+ The containing block of this float avoider is either a non-avoider or a formatting context root avoider,
+ so we don't have to map the left position (and now LFC passes fast/block/block-only again).
+
+ * layout/FormattingContext.cpp:
+ (WebCore::Layout::mapHorizontalPositionToAncestor): Deleted.
+ (WebCore::Layout::FormattingContext::mapTopToFormattingContextRoot const): Deleted.
+ (WebCore::Layout::FormattingContext::mapLeftToFormattingContextRoot const): Deleted.
+ (WebCore::Layout::FormattingContext::mapRightToFormattingContextRoot const): Deleted.
+ * layout/FormattingContext.h:
+ * layout/blockformatting/BlockFormattingContext.cpp:
+ (WebCore::Layout::BlockFormattingContext::usedAvailableWidthForFloatAvoider):
+ (WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
+
+2020-02-16 Zalan Bujtas <[email protected]>
+
[LFC][BFC] Formatting context roots position their own relative children
https://bugs.webkit.org/show_bug.cgi?id=207822
<rdar://problem/59490353>
Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (256710 => 256711)
--- trunk/Source/WebCore/layout/FormattingContext.cpp 2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp 2020-02-16 15:38:38 UTC (rev 256711)
@@ -188,41 +188,6 @@
LOG_WITH_STREAM(FormattingContextLayout, stream << "End: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root());
}
-static LayoutUnit mapHorizontalPositionToAncestor(const FormattingContext& formattingContext, LayoutUnit horizontalPosition, const ContainerBox& containingBlock, const ContainerBox& ancestor)
-{
- // "horizontalPosition" is in the coordinate system of the "containingBlock". -> map from containingBlock to ancestor.
- if (&containingBlock == &ancestor)
- return horizontalPosition;
- ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor));
- for (auto* containerBox = &containingBlock; containerBox && containerBox != &ancestor; containerBox = containerBox->containingBlock())
- horizontalPosition += formattingContext.geometryForBox(*containerBox).left();
- return horizontalPosition;
-}
-
-// FIXME: turn these into templates.
-LayoutUnit FormattingContext::mapTopToFormattingContextRoot(const Box& layoutBox) const
-{
- ASSERT(layoutBox.containingBlock());
- auto& formattingContextRoot = root();
- ASSERT(layoutBox.isContainingBlockDescendantOf(formattingContextRoot));
- auto top = geometryForBox(layoutBox).top();
- for (auto* containerBox = layoutBox.containingBlock(); containerBox && containerBox != &formattingContextRoot; containerBox = containerBox->containingBlock())
- top += geometryForBox(*containerBox).top();
- return top;
-}
-
-LayoutUnit FormattingContext::mapLeftToFormattingContextRoot(const Box& layoutBox) const
-{
- ASSERT(layoutBox.containingBlock());
- return mapHorizontalPositionToAncestor(*this, geometryForBox(layoutBox).left(), *layoutBox.containingBlock(), root());
-}
-
-LayoutUnit FormattingContext::mapRightToFormattingContextRoot(const Box& layoutBox) const
-{
- ASSERT(layoutBox.containingBlock());
- return mapHorizontalPositionToAncestor(*this, geometryForBox(layoutBox).right(), *layoutBox.containingBlock(), root());
-}
-
const Display::Box& FormattingContext::geometryForBox(const Box& layoutBox, Optional<EscapeReason> escapeReason) const
{
UNUSED_PARAM(escapeReason);
Modified: trunk/Source/WebCore/layout/FormattingContext.h (256710 => 256711)
--- trunk/Source/WebCore/layout/FormattingContext.h 2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/layout/FormattingContext.h 2020-02-16 15:38:38 UTC (rev 256711)
@@ -77,10 +77,6 @@
};
virtual IntrinsicWidthConstraints computedIntrinsicWidthConstraints() = 0;
- LayoutUnit mapTopToFormattingContextRoot(const Box&) const;
- LayoutUnit mapLeftToFormattingContextRoot(const Box&) const;
- LayoutUnit mapRightToFormattingContextRoot(const Box&) const;
-
bool isBlockFormattingContext() const { return root().establishesBlockFormattingContext(); }
bool isInlineFormattingContext() const { return root().establishesInlineFormattingContext(); }
bool isTableFormattingContext() const { return root().establishesTableFormattingContext(); }
Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (256710 => 256711)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2020-02-16 15:38:38 UTC (rev 256711)
@@ -195,31 +195,29 @@
// Vertical static position is not computed yet, so let's just pre-compute it for now.
precomputeVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints);
precomputeVerticalPosition(layoutBox, horizontalConstraints.containingBlock, verticalConstraints.containingBlock);
- auto verticalPosition = mapTopToFormattingContextRoot(layoutBox);
- // FIXME: Check if the non-yet-computed height affects this computation - and whether we have to resolve it
- // at a later point or not (can't find this in the spec).
+
+ auto mapLogicalTopToFormattingContextRoot = [&] {
+ auto& formattingContextRoot = root();
+ ASSERT(layoutBox.isContainingBlockDescendantOf(formattingContextRoot));
+ auto top = geometryForBox(layoutBox).top();
+ for (auto* containerBox = layoutBox.containingBlock(); containerBox && containerBox != &formattingContextRoot; containerBox = containerBox->containingBlock())
+ top += geometryForBox(*containerBox).top();
+ return top;
+ };
+
+ auto verticalPosition = mapLogicalTopToFormattingContextRoot();
+ // FIXME: Check if the non-yet-computed height affects this computation - and whether we have to resolve it at a later point.
auto constraints = floatingContext.constraints(verticalPosition, verticalPosition);
if (!constraints.left && !constraints.right)
return { };
- auto& containingBlock = *layoutBox.containingBlock();
- auto& containingBlockGeometry = geometryForBox(containingBlock);
- auto availableWidth = containingBlockGeometry.contentBoxWidth();
-
- LayoutUnit containingBlockLeft;
- LayoutUnit containingBlockRight = containingBlockGeometry.right();
- if (&containingBlock != &root()) {
- // Move containing block left/right to the root's coordinate system.
- containingBlockLeft = mapLeftToFormattingContextRoot(containingBlock);
- containingBlockRight = mapRightToFormattingContextRoot(containingBlock);
- }
- auto containingBlockContentBoxLeft = containingBlockLeft + containingBlockGeometry.borderLeft() + containingBlockGeometry.paddingLeft().valueOr(0);
- auto containingBlockContentBoxRight = containingBlockRight - containingBlockGeometry.borderRight() + containingBlockGeometry.paddingRight().valueOr(0);
-
// Shrink the available space if the floats are actually intruding at this vertical position.
+ auto availableWidth = horizontalConstraints.containingBlock.logicalWidth;
if (constraints.left)
- availableWidth -= std::max<LayoutUnit>(0, constraints.left->x - containingBlockContentBoxLeft);
- if (constraints.right)
- availableWidth -= std::max<LayoutUnit>(0, containingBlockContentBoxRight - constraints.right->x);
+ availableWidth -= constraints.left->x;
+ if (constraints.right) {
+ // FIXME: Map the logicalRight to the root's coordinate system.
+ availableWidth -= std::max(0_lu, horizontalConstraints.containingBlock.logicalRight() - constraints.right->x);
+ }
return availableWidth;
}
@@ -358,7 +356,9 @@
return geometry().floatingWidthAndMargin(layoutBox, horizontalConstraints, { usedWidth, { } });
if (layoutBox.isFloatAvoider()) {
- auto availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair).valueOr(horizontalConstraints.logicalWidth);
+ auto availableWidth = horizontalConstraints.logicalWidth;
+ if (layoutBox.style().logicalWidth().isAuto())
+ availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair).valueOr(availableWidth);
return geometry().inFlowWidthAndMargin(layoutBox, { horizontalConstraints.logicalLeft, availableWidth }, { usedWidth, { } });
}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes