Changeset 254405 in webkit
- Timestamp:
- Jan 11, 2020 4:16:25 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r254404 r254405 1 2020-01-11 Zalan Bujtas <zalan@apple.com> 2 3 [LFC] BlockFormattingContext::verticalPositionWithMargin should take VerticalConstraints 4 https://bugs.webkit.org/show_bug.cgi?id=206122 5 <rdar://problem/58500207> 6 7 Reviewed by Antti Koivisto. 8 9 This prevents verticalPositionWithMargin from reading geometry outside of the formatting context. 10 11 * layout/blockformatting/BlockFormattingContext.cpp: 12 (WebCore::Layout::BlockFormattingContext::layoutInFlowContent): 13 (WebCore::Layout::BlockFormattingContext::layoutFormattingContextRoot): 14 (WebCore::Layout::BlockFormattingContext::computeStaticVerticalPosition): 15 (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPosition): 16 (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForAncestors): 17 (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot): 18 (WebCore::Layout::BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear): 19 (WebCore::Layout::BlockFormattingContext::computeHeightAndMargin): 20 (WebCore::Layout::BlockFormattingContext::verticalPositionWithMargin const): 21 * layout/blockformatting/BlockFormattingContext.h: 22 1 23 2020-01-11 Zalan Bujtas <zalan@apple.com> 2 24 -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp
r254404 r254405 139 139 auto& layoutBox = *layoutQueue.takeLast(); 140 140 auto horizontalConstraints = horizontalConstraintsForLayoutBox(layoutBox); 141 auto verticalConstraints = verticalConstraintsForLayoutBox(layoutBox); 141 142 // Formatting root boxes are special-cased and they don't come here. 142 143 ASSERT(!layoutBox.establishesFormattingContext()); 143 computeHeightAndMargin(layoutBox, horizontalConstraints );144 computeHeightAndMargin(layoutBox, horizontalConstraints, verticalConstraints); 144 145 // Move in-flow positioned children to their final position. 145 146 placeInFlowPositionedChildren(layoutBox, horizontalConstraints); … … 212 213 formattingContext->layoutInFlowContent(invalidationState, Geometry::horizontalConstraintsForInFlow(rootContainerDisplayBox), Geometry::verticalConstraintsForInFlow(rootContainerDisplayBox)); 213 214 // Come back and finalize the root's geometry. 214 computeHeightAndMargin(rootContainer, adjustedHorizontalConstraints );215 computeHeightAndMargin(rootContainer, adjustedHorizontalConstraints, verticalConstraints); 215 216 // Now that we computed the root's height, we can go back and layout the out-of-flow content. 216 217 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(rootContainerDisplayBox); … … 218 219 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow); 219 220 } else 220 computeHeightAndMargin(layoutBox, adjustedHorizontalConstraints );221 computeHeightAndMargin(layoutBox, adjustedHorizontalConstraints, verticalConstraints); 221 222 // Float related final positioning. 222 223 if (layoutBox.isFloatingPositioned()) { … … 246 247 formattingState().displayBox(layoutBox).setTop(geometry().staticVerticalPosition(layoutBox, verticalConstraints.containingBlock)); 247 248 if (layoutBox.hasFloatClear()) 248 computeEstimatedVerticalPositionForFloatClear(floatingContext, layoutBox, horizontalConstraints );249 computeEstimatedVerticalPositionForFloatClear(floatingContext, layoutBox, horizontalConstraints, verticalConstraints); 249 250 else if (layoutBox.establishesFormattingContext()) 250 computeEstimatedVerticalPositionForFormattingRoot(layoutBox, horizontalConstraints );251 computeEstimatedVerticalPositionForFormattingRoot(layoutBox, horizontalConstraints, verticalConstraints); 251 252 } 252 253 … … 262 263 } 263 264 264 void BlockFormattingContext::computeEstimatedVerticalPosition(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints )265 void BlockFormattingContext::computeEstimatedVerticalPosition(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints) 265 266 { 266 267 auto computedVerticalMargin = geometry().computedVerticalMargin(layoutBox, horizontalConstraints); … … 274 275 auto verticalMargin = UsedVerticalMargin { nonCollapsedValues, collapsedValues }; 275 276 displayBox.setVerticalMargin(verticalMargin); 276 displayBox.setTop(verticalPositionWithMargin(layoutBox, verticalMargin ));277 displayBox.setTop(verticalPositionWithMargin(layoutBox, verticalMargin, verticalConstraints)); 277 278 #if ASSERT_ENABLED 278 279 displayBox.setHasEstimatedMarginBefore(); … … 280 281 } 281 282 282 void BlockFormattingContext::computeEstimatedVerticalPositionForAncestors(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints )283 void BlockFormattingContext::computeEstimatedVerticalPositionForAncestors(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints) 283 284 { 284 285 // We only need to estimate margin top for float related layout (formatting context roots avoid floats). … … 298 299 if (hasEstimatedMarginBefore(*ancestor)) 299 300 return; 300 auto horizontalConstraintsForAncestor = horizontalConstraints.root; 301 if (ancestor->containingBlock() != &root()) 302 horizontalConstraintsForAncestor = Geometry::horizontalConstraintsForInFlow(geometryForBox(*ancestor->containingBlock())); 303 computeEstimatedVerticalPosition(*ancestor, horizontalConstraintsForAncestor); 304 } 305 } 306 307 void BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints) 301 auto horizontalConstraintsForAncestor = [&] { 302 auto* containingBlock = layoutBox.containingBlock(); 303 return containingBlock == &root() ? horizontalConstraints.root : Geometry::horizontalConstraintsForInFlow(geometryForBox(*containingBlock)); 304 }; 305 auto verticalConstraintsForAncestor = [&] { 306 auto* containingBlock = layoutBox.containingBlock(); 307 return containingBlock == &root() ? verticalConstraints.root : Geometry::verticalConstraintsForInFlow(geometryForBox(*containingBlock)); 308 }; 309 computeEstimatedVerticalPosition(*ancestor, horizontalConstraintsForAncestor(), verticalConstraintsForAncestor()); 310 } 311 } 312 313 void BlockFormattingContext::computeEstimatedVerticalPositionForFormattingRoot(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints) 308 314 { 309 315 ASSERT(layoutBox.establishesFormattingContext()); … … 311 317 312 318 if (layoutBox.isFloatingPositioned()) { 313 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints );319 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints); 314 320 return; 315 321 } 316 322 317 computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock );318 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints );323 computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock, verticalConstraints.containingBlock); 324 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints); 319 325 320 326 // If the inline formatting root is also the root for the floats (happens when the root box also establishes a block formatting context) … … 322 328 auto inlineContextInheritsFloats = layoutBox.establishesInlineFormattingContextOnly(); 323 329 if (inlineContextInheritsFloats) { 324 computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock );325 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints );326 } 327 } 328 329 void BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints )330 computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock, verticalConstraints.containingBlock); 331 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints); 332 } 333 } 334 335 void BlockFormattingContext::computeEstimatedVerticalPositionForFloatClear(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints) 330 336 { 331 337 ASSERT(layoutBox.hasFloatClear()); … … 333 339 return; 334 340 // The static position with clear requires margin esitmation to see if clearance is needed. 335 computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock );336 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints );341 computeEstimatedVerticalPosition(layoutBox, horizontalConstraints.containingBlock, verticalConstraints.containingBlock); 342 computeEstimatedVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints); 337 343 auto verticalPositionAndClearance = floatingContext.verticalPositionWithClearance(layoutBox); 338 344 if (!verticalPositionAndClearance.position) { … … 415 421 } 416 422 417 void BlockFormattingContext::computeHeightAndMargin(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints )423 void BlockFormattingContext::computeHeightAndMargin(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints) 418 424 { 419 425 auto compute = [&](Optional<LayoutUnit> usedHeight) -> ContentHeightAndMargin { … … 464 470 ASSERT(!hasEstimatedMarginBefore(layoutBox) || estimatedMarginBefore(layoutBox).usedValue() == verticalMargin.before()); 465 471 removeEstimatedMarginBefore(layoutBox); 466 displayBox.setTop(verticalPositionWithMargin(layoutBox, verticalMargin ));472 displayBox.setTop(verticalPositionWithMargin(layoutBox, verticalMargin, verticalConstraints.containingBlock)); 467 473 displayBox.setContentBoxHeight(contentHeightAndMargin.contentHeight); 468 474 displayBox.setVerticalMargin(verticalMargin); … … 519 525 } 520 526 521 LayoutUnit BlockFormattingContext::verticalPositionWithMargin(const Box& layoutBox, const UsedVerticalMargin& verticalMargin ) const527 LayoutUnit BlockFormattingContext::verticalPositionWithMargin(const Box& layoutBox, const UsedVerticalMargin& verticalMargin, const VerticalConstraints& verticalConstraints) const 522 528 { 523 529 ASSERT(!layoutBox.isOutOfFlowPositioned()); … … 548 554 } 549 555 550 auto& containingBlock = *layoutBox.containingBlock(); 551 auto containingBlockContentBoxTop = geometryForBox(containingBlock).contentBoxTop(); 556 auto containingBlockContentBoxTop = verticalConstraints.logicalTop; 552 557 // Adjust vertical position depending whether this box directly or indirectly adjoins with its parent. 553 558 auto directlyAdjoinsParent = !layoutBox.previousInFlowSibling(); … … 571 576 } 572 577 // At this point this box indirectly (via collapsed through previous in-flow siblings) adjoins the parent. Let's check if it margin collapses with the parent. 578 auto& containingBlock = *layoutBox.containingBlock(); 573 579 ASSERT(containingBlock.firstInFlowChild()); 574 580 ASSERT(containingBlock.firstInFlowChild() != &layoutBox); -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h
r254404 r254405 62 62 63 63 void computeWidthAndMargin(const Box&, const ConstraintsPair<HorizontalConstraints>&); 64 void computeHeightAndMargin(const Box&, const ConstraintsPair<HorizontalConstraints>& );64 void computeHeightAndMargin(const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&); 65 65 66 66 void computeStaticHorizontalPosition(const Box&, const ConstraintsPair<HorizontalConstraints>&); … … 70 70 void computePositionToAvoidFloats(const FloatingContext&, const Box&); 71 71 72 void computeEstimatedVerticalPosition(const Box&, const HorizontalConstraints& );73 void computeEstimatedVerticalPositionForAncestors(const Box&, const ConstraintsPair<HorizontalConstraints>& );74 void computeEstimatedVerticalPositionForFormattingRoot(const Box&, const ConstraintsPair<HorizontalConstraints>& );75 void computeEstimatedVerticalPositionForFloatClear(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>& );72 void computeEstimatedVerticalPosition(const Box&, const HorizontalConstraints&, const VerticalConstraints&); 73 void computeEstimatedVerticalPositionForAncestors(const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&); 74 void computeEstimatedVerticalPositionForFormattingRoot(const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&); 75 void computeEstimatedVerticalPositionForFloatClear(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&); 76 76 77 77 IntrinsicWidthConstraints computedIntrinsicWidthConstraints() override; 78 LayoutUnit verticalPositionWithMargin(const Box&, const UsedVerticalMargin& ) const;78 LayoutUnit verticalPositionWithMargin(const Box&, const UsedVerticalMargin&, const VerticalConstraints&) const; 79 79 80 80 // This class implements positioning and sizing for boxes participating in a block formatting context.
Note: See TracChangeset
for help on using the changeset viewer.