Title: [254404] trunk/Source/WebCore
Revision
254404
Author
[email protected]
Date
2020-01-11 16:05:51 -0800 (Sat, 11 Jan 2020)

Log Message

[LFC][BFC] BlockFormattingContext::computeEstimatedVerticalPositionForAncestors should take ConstraintsPair<HorizontalConstraints>
https://bugs.webkit.org/show_bug.cgi?id=206121
<rdar://problem/58499492>

Reviewed by Antti Koivisto.

This prevents computeEstimatedVerticalPositionForAncestors from reading geometry outside of the formatting context.

* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::layoutFormattingContextRoot):
(WebCore::Layout::BlockFormattingContext::computeStaticVerticalPosition):
(WebCore::Layout::BlockFormattingContext::computeStaticPosition):
(WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPosition):
(WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForAncestors):
(WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot):
(WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear):
* layout/blockformatting/BlockFormattingContext.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (254403 => 254404)


--- trunk/Source/WebCore/ChangeLog	2020-01-12 00:03:11 UTC (rev 254403)
+++ trunk/Source/WebCore/ChangeLog	2020-01-12 00:05:51 UTC (rev 254404)
@@ -1,5 +1,25 @@
 2020-01-11  Zalan Bujtas  <[email protected]>
 
+        [LFC][BFC] BlockFormattingContext::computeEstimatedVerticalPositionForAncestors should take ConstraintsPair<HorizontalConstraints>
+        https://bugs.webkit.org/show_bug.cgi?id=206121
+        <rdar://problem/58499492>
+
+        Reviewed by Antti Koivisto.
+
+        This prevents computeEstimatedVerticalPositionForAncestors from reading geometry outside of the formatting context.
+
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::layoutFormattingContextRoot):
+        (WebCore::Layout::BlockFormattingContext::computeStaticVerticalPosition):
+        (WebCore::Layout::BlockFormattingContext::computeStaticPosition):
+        (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPosition):
+        (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForAncestors):
+        (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot):
+        (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear):
+        * layout/blockformatting/BlockFormattingContext.h:
+
+2020-01-11  Zalan Bujtas  <[email protected]>
+
         [LFC] Introduce BlockFormattingContext::ConstraintsPair
         https://bugs.webkit.org/show_bug.cgi?id=206119
         <rdar://problem/58498745>

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (254403 => 254404)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-01-12 00:03:11 UTC (rev 254403)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-01-12 00:05:51 UTC (rev 254404)
@@ -200,7 +200,7 @@
     auto adjustedHorizontalConstraints = ConstraintsPair<HorizontalConstraints> { horizontalConstraints.root, { horizontalConstraints.containingBlock.logicalLeft, availableWidth } };
 
     computeBorderAndPadding(layoutBox, adjustedHorizontalConstraints.containingBlock);
-    computeStaticVerticalPosition(floatingContext, layoutBox, verticalConstraints);
+    computeStaticVerticalPosition(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);
     computeWidthAndMargin(layoutBox, adjustedHorizontalConstraints);
     computeStaticHorizontalPosition(layoutBox, adjustedHorizontalConstraints);
 
@@ -241,13 +241,13 @@
     LOG_WITH_STREAM(FormattingContextLayout, stream << "End: move in-flow positioned children -> parent: " << &layoutBox);
 }
 
-void BlockFormattingContext::computeStaticVerticalPosition(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
+void BlockFormattingContext::computeStaticVerticalPosition(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
 {
     formattingState().displayBox(layoutBox).setTop(geometry().staticVerticalPosition(layoutBox, verticalConstraints.containingBlock));
     if (layoutBox.hasFloatClear())
-        computeEstimatedVerticalPositionForFloatClear(floatingContext, layoutBox);
+        computeEstimatedVerticalPositionForFloatClear(floatingContext, layoutBox, horizontalConstraints);
     else if (layoutBox.establishesFormattingContext())
-        computeEstimatedVerticalPositionForFormattingRoot(layoutBox);
+        computeEstimatedVerticalPositionForFormattingRoot(layoutBox, horizontalConstraints);
 }
 
 void BlockFormattingContext::computeStaticHorizontalPosition(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
@@ -257,13 +257,12 @@
 
 void BlockFormattingContext::computeStaticPosition(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
 {
-    computeStaticVerticalPosition(floatingContext, layoutBox, verticalConstraints);
+    computeStaticVerticalPosition(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);
     computeStaticHorizontalPosition(layoutBox, horizontalConstraints);
 }
 
-void BlockFormattingContext::computeEstimatedVerticalPosition(const Box& layoutBox)
+void BlockFormattingContext::computeEstimatedVerticalPosition(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints)
 {
-    auto horizontalConstraints = Geometry::horizontalConstraintsForInFlow(geometryForBox(*layoutBox.containingBlock()));
     auto computedVerticalMargin = geometry().computedVerticalMargin(layoutBox, horizontalConstraints);
     auto usedNonCollapsedMargin = UsedVerticalMargin::NonCollapsedValues { computedVerticalMargin.before.valueOr(0), computedVerticalMargin.after.valueOr(0) };
     auto estimatedMarginBefore = marginCollapse().estimatedMarginBefore(layoutBox, usedNonCollapsedMargin);
@@ -280,7 +279,7 @@
 #endif
 }
 
-void BlockFormattingContext::computeEstimatedVerticalPositionForAncestors(const Box& layoutBox)
+void BlockFormattingContext::computeEstimatedVerticalPositionForAncestors(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
 {
     // We only need to estimate margin top for float related layout (formatting context roots avoid floats).
     ASSERT(layoutBox.isFloatAvoider() || layoutBox.establishesInlineFormattingContext());
@@ -298,40 +297,43 @@
         // FIXME: with incremental layout, we might actually have a valid (non-estimated) margin top as well.
         if (hasEstimatedMarginBefore(*ancestor))
             return;
-        computeEstimatedVerticalPosition(*ancestor);
+        auto horizontalConstraintsForAncestor = horizontalConstraints.root;
+        if (ancestor->containingBlock() != &root())
+            horizontalConstraintsForAncestor = Geometry::horizontalConstraintsForInFlow(geometryForBox(*ancestor->containingBlock()));
+        computeEstimatedVerticalPosition(*ancestor, horizontalConstraintsForAncestor);
     }
 }
 
-void BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot(const Box& layoutBox)
+void BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
 {
     ASSERT(layoutBox.establishesFormattingContext());
     ASSERT(!layoutBox.hasFloatClear());
 
     if (layoutBox.isFloatingPositioned()) {
-        computeEstimatedVerticalPositionForAncestors(layoutBox);
+        computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints);
         return;
     }
 
-    computeEstimatedVerticalPosition(layoutBox);
-    computeEstimatedVerticalPositionForAncestors(layoutBox);
+    computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock);
+    computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints);
 
     // If the inline formatting root is also the root for the floats (happens when the root box also establishes a block formatting context)
     // the floats are in the coordinate system of this root. No need to find the final vertical position.
     auto inlineContextInheritsFloats = layoutBox.establishesInlineFormattingContextOnly();
     if (inlineContextInheritsFloats) {
-        computeEstimatedVerticalPosition(layoutBox);
-        computeEstimatedVerticalPositionForAncestors(layoutBox);
+        computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock);
+        computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints);
     }
 }
 
-void BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear(const FloatingContext& floatingContext, const Box& layoutBox)
+void BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
 {
     ASSERT(layoutBox.hasFloatClear());
     if (floatingContext.isEmpty())
         return;
     // The static position with clear requires margin esitmation to see if clearance is needed.
-    computeEstimatedVerticalPosition(layoutBox);
-    computeEstimatedVerticalPositionForAncestors(layoutBox);
+    computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock);
+    computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints);
     auto verticalPositionAndClearance = floatingContext.verticalPositionWithClearance(layoutBox);
     if (!verticalPositionAndClearance.position) {
         ASSERT(!verticalPositionAndClearance.clearance);

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h (254403 => 254404)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h	2020-01-12 00:03:11 UTC (rev 254403)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h	2020-01-12 00:05:51 UTC (rev 254404)
@@ -64,15 +64,15 @@
     void computeHeightAndMargin(const Box&, const ConstraintsPair<HorizontalConstraints>&);
 
     void computeStaticHorizontalPosition(const Box&, const ConstraintsPair<HorizontalConstraints>&);
-    void computeStaticVerticalPosition(const FloatingContext&, const Box&, const ConstraintsPair<VerticalConstraints>&);
+    void computeStaticVerticalPosition(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
     void computeStaticPosition(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
     void computeFloatingPosition(const FloatingContext&, const Box&);
     void computePositionToAvoidFloats(const FloatingContext&, const Box&);
 
-    void computeEstimatedVerticalPosition(const Box&);
-    void computeEstimatedVerticalPositionForAncestors(const Box&);
-    void computeEstimatedVerticalPositionForFormattingRoot(const Box&);
-    void computeEstimatedVerticalPositionForFloatClear(const FloatingContext&, const Box&);
+    void computeEstimatedVerticalPosition(const Box&, const HorizontalConstraints&);
+    void computeEstimatedVerticalPositionForAncestors(const Box&, const ConstraintsPair<HorizontalConstraints>&);
+    void computeEstimatedVerticalPositionForFormattingRoot(const Box&, const ConstraintsPair<HorizontalConstraints>&);
+    void computeEstimatedVerticalPositionForFloatClear(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&);
 
     IntrinsicWidthConstraints computedIntrinsicWidthConstraints() override;
     LayoutUnit verticalPositionWithMargin(const Box&, const UsedVerticalMargin&) const;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to