Changeset 256702 in webkit
- Timestamp:
- Feb 15, 2020, 7:17:40 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r256701 r256702 1 2020-02-15 Zalan Bujtas <zalan@apple.com> 2 3 [LFC] Introduce OutOfFlowHorizontalConstraints 4 https://bugs.webkit.org/show_bug.cgi?id=207805 5 <rdar://problem/59482286> 6 7 Reviewed by Antti Koivisto. 8 9 Borders and paddings are resolved against the containing block's content box as if the box was an in-flow box. 10 11 * layout/FormattingContext.cpp: 12 (WebCore::Layout::FormattingContext::layoutOutOfFlowContent): 13 * layout/FormattingContext.h: 14 * layout/FormattingContextGeometry.cpp: 15 (WebCore::Layout::FormattingContext::Geometry::horizontalConstraintsForOutOfFlow): 16 * layout/LayoutContext.cpp: 17 (WebCore::Layout::LayoutContext::layoutFormattingContextSubtree): 18 * layout/LayoutUnits.h: 19 * layout/blockformatting/BlockFormattingContext.cpp: 20 (WebCore::Layout::BlockFormattingContext::layoutInFlowContent): 21 * layout/inlineformatting/InlineFormattingContext.cpp: 22 (WebCore::Layout::InlineFormattingContext::layoutInFlowContent): 23 1 24 2020-02-15 Zalan Bujtas <zalan@apple.com> 2 25 -
trunk/Source/WebCore/layout/FormattingContext.cpp
r256417 r256702 133 133 } 134 134 135 void FormattingContext::layoutOutOfFlowContent(InvalidationState& invalidationState, const HorizontalConstraints& rootHorizontalConstraints, const VerticalConstraints& rootVerticalConstraints)135 void FormattingContext::layoutOutOfFlowContent(InvalidationState& invalidationState, const OutOfFlowHorizontalConstraints& rootHorizontalConstraints, const VerticalConstraints& rootVerticalConstraints) 136 136 { 137 137 LOG_WITH_STREAM(FormattingContextLayout, stream << "Start: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root()); … … 139 139 collectOutOfFlowDescendantsIfNeeded(); 140 140 141 auto horizontalConstraintsFor OutOfFlowBox = [&] (const auto& outOfFlowBox) {141 auto horizontalConstraintsForLayoutBox = [&] (const auto& outOfFlowBox) { 142 142 auto* containingBlock = outOfFlowBox.containingBlock(); 143 143 ASSERT(containingBlock); … … 147 147 }; 148 148 149 auto verticalConstraintsFor OutOfFlowBox = [&] (const auto& outOfFlowBox) {149 auto verticalConstraintsForLayoutBox = [&] (const auto& outOfFlowBox) { 150 150 auto* containingBlock = outOfFlowBox.containingBlock(); 151 151 ASSERT(containingBlock); … … 160 160 continue; 161 161 162 auto horizontalConstraints = horizontalConstraintsForOutOfFlowBox(*outOfFlowBox);163 auto verticalConstraints = verticalConstraintsForOutOfFlowBox(*outOfFlowBox);164 // Borders and paddings are resolved against the containing block's content box like if this box was an in-flow box.165 auto& outOfFlowRootDisplayBox = geometryForBox(*outOfFlowBox); 166 computeBorderAndPadding(*outOfFlowBox, Geometry::horizontalConstraintsForInFlow(outOfFlowRootDisplayBox));162 auto outOfFlowHorizontalConstraints = horizontalConstraintsForLayoutBox(*outOfFlowBox); 163 auto horizontalConstraintsForBorderAndPadding = HorizontalConstraints { outOfFlowHorizontalConstraints.value.logicalLeft, outOfFlowHorizontalConstraints.borderAndPaddingSpecificWidth }; 164 computeBorderAndPadding(*outOfFlowBox, horizontalConstraintsForBorderAndPadding); 165 166 auto horizontalConstraints = outOfFlowHorizontalConstraints.value; 167 167 computeOutOfFlowHorizontalGeometry(*outOfFlowBox, horizontalConstraints); 168 if (!is<ContainerBox>(*outOfFlowBox) || !downcast<ContainerBox>(*outOfFlowBox).hasChild()) { 169 computeOutOfFlowVerticalGeometry(*outOfFlowBox, horizontalConstraints, verticalConstraints); 170 continue; 171 } 172 173 auto& outOfFlowRootContainer = downcast<ContainerBox>(*outOfFlowBox); 174 auto formattingContext = LayoutContext::createFormattingContext(outOfFlowRootContainer, layoutState()); 175 if (outOfFlowRootContainer.hasInFlowOrFloatingChild()) 176 formattingContext->layoutInFlowContent(invalidationState, Geometry::horizontalConstraintsForInFlow(outOfFlowRootDisplayBox), Geometry::verticalConstraintsForInFlow(outOfFlowRootDisplayBox)); 177 computeOutOfFlowVerticalGeometry(outOfFlowRootContainer, horizontalConstraints, verticalConstraints); 178 formattingContext->layoutOutOfFlowContent(invalidationState, Geometry::horizontalConstraintsForInFlow(outOfFlowRootDisplayBox), Geometry::verticalConstraintsForInFlow(outOfFlowRootDisplayBox)); 168 if (is<ContainerBox>(*outOfFlowBox)) { 169 auto& containerBox = downcast<ContainerBox>(*outOfFlowBox); 170 auto& containerDisplayBox = geometryForBox(containerBox); 171 172 if (containerBox.hasInFlowOrFloatingChild()) { 173 auto horizontalConstraintsForInFlowContent = Geometry::horizontalConstraintsForInFlow(containerDisplayBox); 174 auto verticalConstraintsForInFlowContent = Geometry::verticalConstraintsForInFlow(containerDisplayBox); 175 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState()); 176 formattingContext->layoutInFlowContent(invalidationState, horizontalConstraintsForInFlowContent, verticalConstraintsForInFlowContent); 177 } 178 computeOutOfFlowVerticalGeometry(containerBox, horizontalConstraints, verticalConstraintsForLayoutBox(containerBox)); 179 if (containerBox.hasChild()) { 180 auto horizontalConstraintsForOutOfFlowContent = Geometry::horizontalConstraintsForOutOfFlow(containerDisplayBox); 181 auto verticalConstraintsForOutOfFlowContent = Geometry::verticalConstraintsForOutOfFlow(containerDisplayBox); 182 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState()); 183 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlowContent, verticalConstraintsForOutOfFlowContent); 184 } 185 } else 186 computeOutOfFlowVerticalGeometry(*outOfFlowBox, horizontalConstraints, verticalConstraintsForLayoutBox(*outOfFlowBox)); 179 187 } 180 188 LOG_WITH_STREAM(FormattingContextLayout, stream << "End: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root()); -
trunk/Source/WebCore/layout/FormattingContext.h
r256417 r256702 67 67 68 68 virtual void layoutInFlowContent(InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&) = 0; 69 void layoutOutOfFlowContent(InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&);69 void layoutOutOfFlowContent(InvalidationState&, const OutOfFlowHorizontalConstraints&, const VerticalConstraints&); 70 70 71 71 struct IntrinsicWidthConstraints { … … 147 147 LayoutUnit contentHeightForFormattingContextRoot(const Box&) const; 148 148 149 static HorizontalConstraints horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry);149 static OutOfFlowHorizontalConstraints horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry); 150 150 static VerticalConstraints verticalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry); 151 151 static HorizontalConstraints horizontalConstraintsForInFlow(const Display::Box& containingBlockGeometry); -
trunk/Source/WebCore/layout/FormattingContextGeometry.cpp
r256417 r256702 1102 1102 } 1103 1103 1104 HorizontalConstraints FormattingContext::Geometry::horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry) 1105 { 1106 return HorizontalConstraints { containingBlockGeometry.paddingBoxLeft(), containingBlockGeometry.paddingBoxWidth() }; 1104 OutOfFlowHorizontalConstraints FormattingContext::Geometry::horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry) 1105 { 1106 return OutOfFlowHorizontalConstraints { 1107 HorizontalConstraints { containingBlockGeometry.paddingBoxLeft(), containingBlockGeometry.paddingBoxWidth() }, 1108 containingBlockGeometry.contentBoxWidth() }; 1107 1109 } 1108 1110 -
trunk/Source/WebCore/layout/LayoutContext.cpp
r256417 r256702 104 104 // It also means that the formattingContextRoot has to have a valid/clean geometry at this point. 105 105 { 106 auto horizontalConstraints = HorizontalConstraints { displayBox.paddingBoxLeft(), displayBox.paddingBoxWidth() };106 auto horizontalConstraints = OutOfFlowHorizontalConstraints { HorizontalConstraints { displayBox.paddingBoxLeft(), displayBox.paddingBoxWidth() }, displayBox.contentBoxWidth() }; 107 107 auto verticalConstraints = VerticalConstraints { displayBox.paddingBoxTop(), displayBox.paddingBoxHeight() }; 108 108 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraints, verticalConstraints); -
trunk/Source/WebCore/layout/LayoutUnits.h
r254666 r256702 158 158 }; 159 159 160 struct OutOfFlowHorizontalConstraints { 161 HorizontalConstraints value; 162 // Borders and paddings are resolved against the containing block's content box as if the box was an in-flow box. 163 LayoutUnit borderAndPaddingSpecificWidth; 164 }; 165 160 166 struct VerticalConstraints { 161 167 LayoutUnit logicalTop; -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp
r256417 r256702 127 127 if (layoutBox.establishesFormattingContext()) { 128 128 if (is<ContainerBox>(layoutBox) && downcast<ContainerBox>(layoutBox).hasInFlowOrFloatingChild()) { 129 auto& containerBox = downcast<ContainerBox>(layoutBox); 129 130 // Layout the inflow descendants of this formatting context root. 130 precomputeVerticalPositionForFormattingRoot(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);131 auto& rootDisplayBox = geometryForBox( layoutBox);132 auto horizontalConstraintsFor FormattingContext = Geometry::horizontalConstraintsForInFlow(rootDisplayBox);133 auto verticalConstraintsFor FormattingContext = Geometry::verticalConstraintsForInFlow(rootDisplayBox);134 LayoutContext::createFormattingContext( downcast<ContainerBox>(layoutBox), layoutState())->layoutInFlowContent(invalidationState, horizontalConstraintsForFormattingContext, verticalConstraintsForFormattingContext);131 precomputeVerticalPositionForFormattingRoot(floatingContext, containerBox, horizontalConstraints, verticalConstraints); 132 auto& rootDisplayBox = geometryForBox(containerBox); 133 auto horizontalConstraintsForInFlowContent = Geometry::horizontalConstraintsForInFlow(rootDisplayBox); 134 auto verticalConstraintsForInFlowContent = Geometry::verticalConstraintsForInFlow(rootDisplayBox); 135 LayoutContext::createFormattingContext(containerBox, layoutState())->layoutInFlowContent(invalidationState, horizontalConstraintsForInFlowContent, verticalConstraintsForInFlowContent); 135 136 } 136 137 break; … … 152 153 // Now that we computed the root's height, we can layout the out-of-flow descendants. 153 154 if (is<ContainerBox>(layoutBox) && downcast<ContainerBox>(layoutBox).hasChild()) { 154 auto& rootDisplayBox = geometryForBox(layoutBox); 155 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(rootDisplayBox); 156 auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(rootDisplayBox); 157 LayoutContext::createFormattingContext(downcast<ContainerBox>(layoutBox), layoutState())->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow); 155 auto& containerBox = downcast<ContainerBox>(layoutBox); 156 auto& rootDisplayBox = geometryForBox(containerBox); 157 auto horizontalConstraintsForOutOfFlowContent = Geometry::horizontalConstraintsForOutOfFlow(rootDisplayBox); 158 auto verticalConstraintsForOutOfFlowContent = Geometry::verticalConstraintsForOutOfFlow(rootDisplayBox); 159 LayoutContext::createFormattingContext(containerBox, layoutState())->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlowContent, verticalConstraintsForOutOfFlowContent); 158 160 } 159 161 } -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r256701 r256702 90 90 if (layoutBox->isAtomicInlineLevelBox()) { 91 91 // Inline-blocks, inline-tables and replaced elements (img, video) can be sized but not yet positioned. 92 computeBorderAndPadding(*layoutBox, horizontalConstraints); 93 computeWidthAndMargin(*layoutBox, horizontalConstraints); 94 auto createsFormattingContext = layoutBox->isInlineBlockBox() || layoutBox->isInlineTableBox(); 95 auto hasInFlowOrFloatingChild = is<ContainerBox>(*layoutBox) && downcast<ContainerBox>(*layoutBox).hasInFlowOrFloatingChild(); 96 if (createsFormattingContext && hasInFlowOrFloatingChild) { 97 auto formattingContext = LayoutContext::createFormattingContext(downcast<ContainerBox>(*layoutBox), layoutState()); 98 formattingContext->layoutInFlowContent(invalidationState, horizontalConstraints, verticalConstraints); 99 } 100 computeHeightAndMargin(*layoutBox, horizontalConstraints); 101 if (createsFormattingContext && is<ContainerBox>(*layoutBox) && downcast<ContainerBox>(*layoutBox).hasChild()) { 102 auto& displayBox = geometryForBox(*layoutBox); 103 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(displayBox); 104 auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(displayBox); 105 auto formattingContext = LayoutContext::createFormattingContext(downcast<ContainerBox>(*layoutBox), layoutState()); 106 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow); 92 if (layoutBox->establishesFormattingContext()) { 93 ASSERT(is<ContainerBox>(*layoutBox)); 94 ASSERT(layoutBox->isInlineBlockBox() || layoutBox->isInlineTableBox()); 95 auto& containerBox = downcast<ContainerBox>(*layoutBox); 96 computeBorderAndPadding(containerBox, horizontalConstraints); 97 computeWidthAndMargin(containerBox, horizontalConstraints); 98 99 auto& rootDisplayBox = geometryForBox(containerBox); 100 if (containerBox.hasInFlowOrFloatingChild()) { 101 auto horizontalConstraintsForInFlowContent = Geometry::horizontalConstraintsForInFlow(rootDisplayBox); 102 auto verticalConstraintsForInFlowContent = Geometry::verticalConstraintsForInFlow(rootDisplayBox); 103 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState()); 104 formattingContext->layoutInFlowContent(invalidationState, horizontalConstraintsForInFlowContent, verticalConstraintsForInFlowContent); 105 } 106 computeHeightAndMargin(containerBox, horizontalConstraints); 107 if (containerBox.hasChild()) { 108 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(rootDisplayBox); 109 auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(rootDisplayBox); 110 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState()); 111 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow); 112 } 113 } else { 114 // Replaced and other type of leaf atomic inline boxes. 115 computeBorderAndPadding(*layoutBox, horizontalConstraints); 116 computeWidthAndMargin(*layoutBox, horizontalConstraints); 117 computeHeightAndMargin(*layoutBox, horizontalConstraints); 107 118 } 108 119 } else if (layoutBox->isInlineBox()) {
Note:
See TracChangeset
for help on using the changeset viewer.