Changeset 254977 in webkit
- Timestamp:
- Jan 23, 2020 8:15:15 AM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r254976 r254977 1 2020-01-23 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Do not special case formatting root layout 4 https://bugs.webkit.org/show_bug.cgi?id=206641 5 <rdar://problem/58823548> 6 7 Reviewed by Antti Koivisto. 8 9 Let's move out all the formatting context layout logic from layoutFormattingContextRoot. 10 11 * layout/inlineformatting/InlineFormattingContext.cpp: 12 (WebCore::Layout::InlineFormattingContext::layoutInFlowContent): 13 (WebCore::Layout::InlineFormattingContext::layoutFormattingContextRoot): Deleted. 14 (WebCore::Layout::InlineFormattingContext::computeHorizontalAndVerticalGeometry): Deleted. 15 (WebCore::Layout::InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox): Deleted. 16 * layout/inlineformatting/InlineFormattingContext.h: 17 * layout/layouttree/LayoutBox.cpp: 18 (WebCore::Layout::Box::isInlineTableBox const): 19 (WebCore::Layout::Box::isInlineLevelBox const): 20 * layout/layouttree/LayoutBox.h: 21 1 22 2020-01-23 Antti Koivisto <antti@apple.com> 2 23 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r254961 r254977 77 77 // 2. Collect the inline items (flatten the the layout tree) and place them on lines in bidirectional order. 78 78 while (layoutBox) { 79 if (layoutBox->establishesFormattingContext()) 80 layoutFormattingContextRoot(*layoutBox, invalidationState, horizontalConstraints, verticalConstraints); 81 else 82 computeHorizontalAndVerticalGeometry(*layoutBox, horizontalConstraints); 79 ASSERT(layoutBox->isInlineLevelBox()); 80 81 if (layoutBox->isAtomicInlineLevelBox()) { 82 // Inline-blocks, inline-tables and replaced elements (img, video) can be sized but not yet positioned. 83 computeBorderAndPadding(*layoutBox, horizontalConstraints); 84 computeWidthAndMargin(*layoutBox, horizontalConstraints); 85 auto createsFormattingContext = layoutBox->isInlineBlockBox() || layoutBox->isInlineTableBox(); 86 auto hasInFlowOrFloatingChild = is<Container>(*layoutBox) && downcast<Container>(*layoutBox).hasInFlowOrFloatingChild(); 87 if (createsFormattingContext && hasInFlowOrFloatingChild) { 88 auto formattingContext = LayoutContext::createFormattingContext(downcast<Container>(*layoutBox), layoutState()); 89 formattingContext->layoutInFlowContent(invalidationState, horizontalConstraints, verticalConstraints); 90 } 91 computeHeightAndMargin(*layoutBox, horizontalConstraints); 92 if (createsFormattingContext && is<Container>(*layoutBox) && downcast<Container>(*layoutBox).hasChild()) { 93 auto& displayBox = geometryForBox(*layoutBox); 94 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(displayBox); 95 auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(displayBox); 96 auto formattingContext = LayoutContext::createFormattingContext(downcast<Container>(*layoutBox), layoutState()); 97 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow); 98 } 99 } else if (layoutBox->isInlineBox()) { 100 if (layoutBox->isAnonymous() || layoutBox->isLineBreakBox()) { 101 // Text wrapper boxes are anonymous inline level boxes. Their computed border/padding/margins are 0. 102 auto& displayBox = formattingState().displayBox(*layoutBox); 103 displayBox.setVerticalMargin({ { }, { } }); 104 displayBox.setHorizontalMargin({ }); 105 displayBox.setBorder({ { }, { } }); 106 displayBox.setPadding({ }); 107 } else { 108 // Inline boxes (<span>) can't get sized/positioned yet. At this point we can only compute their margins, borders and paddings. 109 computeBorderAndPadding(*layoutBox, horizontalConstraints); 110 computeHorizontalMargin(*layoutBox, horizontalConstraints); 111 formattingState().displayBox(*layoutBox).setVerticalMargin({ { }, { } }); 112 } 113 } else 114 ASSERT_NOT_REACHED(); 115 83 116 layoutBox = nextInPreOrder(*layoutBox, root()); 84 117 } … … 127 160 ASSERT(lineLogicalTop < inifitePoint.y); 128 161 } 129 }130 131 void InlineFormattingContext::layoutFormattingContextRoot(const Box& formattingContextRoot, InvalidationState& invalidationState, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)132 {133 ASSERT(formattingContextRoot.isFloatingPositioned() || formattingContextRoot.isInlineBlockBox());134 135 computeBorderAndPadding(formattingContextRoot, horizontalConstraints);136 computeWidthAndMargin(formattingContextRoot, horizontalConstraints);137 if (!is<Container>(formattingContextRoot) || !downcast<Container>(formattingContextRoot).hasChild()) {138 computeHeightAndMargin(formattingContextRoot, horizontalConstraints);139 return;140 }141 // Swich over to the new formatting context (the one that the root creates).142 auto& rootContainer = downcast<Container>(formattingContextRoot);143 auto formattingContext = LayoutContext::createFormattingContext(rootContainer, layoutState());144 if (rootContainer.hasInFlowOrFloatingChild())145 formattingContext->layoutInFlowContent(invalidationState, horizontalConstraints, verticalConstraints);146 // Come back and finalize the root's height and margin.147 computeHeightAndMargin(rootContainer, horizontalConstraints);148 // Now that we computed the root's height, we can go back and layout the out-of-flow content.149 if (rootContainer.hasChild()) {150 auto& rootContainerDisplayBox = geometryForBox(rootContainer);151 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(rootContainerDisplayBox);152 auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(rootContainerDisplayBox);153 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow);154 }155 }156 157 void InlineFormattingContext::computeHorizontalAndVerticalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints)158 {159 if (layoutBox.isInlineBox() && !layoutBox.isAnonymous()) {160 // Inline boxes (<span>) can't get sized/positioned yet. At this point we can only compute their margins, borders and paddings.161 computeHorizontalMargin(layoutBox, horizontalConstraints);162 computeBorderAndPadding(layoutBox, horizontalConstraints);163 // Inline containers have 0 computed vertical margins.164 formattingState().displayBox(layoutBox).setVerticalMargin({ { }, { } });165 return;166 }167 168 if (layoutBox.isReplaced()) {169 // Replaced elements (img, video) can be sized but not yet positioned.170 computeBorderAndPadding(layoutBox, horizontalConstraints);171 computeWidthAndMargin(layoutBox, horizontalConstraints);172 computeHeightAndMargin(layoutBox, horizontalConstraints);173 return;174 }175 176 // These are actual text boxes. No margins, borders or paddings.177 ASSERT(layoutBox.isAnonymous() || layoutBox.isLineBreakBox());178 auto& displayBox = formattingState().displayBox(layoutBox);179 180 displayBox.setVerticalMargin({ { }, { } });181 displayBox.setHorizontalMargin({ });182 displayBox.setBorder({ { }, { } });183 displayBox.setPadding({ });184 162 } 185 163 … … 317 295 displayBox.setContentBoxHeight(contentHeightAndMargin.contentHeight); 318 296 displayBox.setVerticalMargin({ contentHeightAndMargin.nonCollapsedMargin, { } }); 319 }320 321 void InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints)322 {323 ASSERT(!layoutBox.isContainer());324 ASSERT(!layoutBox.establishesFormattingContext());325 ASSERT(layoutBox.replaced());326 327 computeBorderAndPadding(layoutBox, horizontalConstraints);328 computeWidthAndMargin(layoutBox, horizontalConstraints);329 computeHeightAndMargin(layoutBox, horizontalConstraints);330 297 } 331 298 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r254853 r254977 79 79 80 80 void lineLayout(InlineItems&, LineLayoutContext::InlineItemRange, const HorizontalConstraints&, const VerticalConstraints&); 81 void layoutFormattingContextRoot(const Box&, InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&);82 void computeHorizontalAndVerticalGeometry(const Box&, const HorizontalConstraints&);83 81 84 82 void computeIntrinsicWidthForFormattingRoot(const Box&, const HorizontalConstraints&); 85 void computeWidthAndHeightForReplacedInlineBox(const Box&, const HorizontalConstraints&);86 83 InlineLayoutUnit computedIntrinsicWidthForConstraint(const HorizontalConstraints&) const; 87 84 -
trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp
r254961 r254977 295 295 } 296 296 297 bool Box::isInlineTableBox() const 298 { 299 return m_style.display() == DisplayType::InlineTable; 300 } 301 297 302 bool Box::isBlockLevelBox() const 298 303 { … … 306 311 // Inline level elements generate inline level boxes. 307 312 auto display = m_style.display(); 308 return display == DisplayType::Inline || isInlineBlockBox() || display == DisplayType::InlineTable;313 return display == DisplayType::Inline || isInlineBlockBox() || isInlineTableBox(); 309 314 } 310 315 -
trunk/Source/WebCore/layout/layouttree/LayoutBox.h
r254961 r254977 113 113 bool isAtomicInlineLevelBox() const; 114 114 bool isInlineBlockBox() const; 115 bool isInlineTableBox() const; 115 116 bool isBlockContainerBox() const; 116 117 bool isInitialContainingBlock() const;
Note: See TracChangeset
for help on using the changeset viewer.