Changeset 249441 in webkit
- Timestamp:
- Sep 3, 2019 1:05:49 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r249440 r249441 1 2019-09-03 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][Floating] Replace all LayoutState::displayBoxForLayoutBox() calls with FormattingContext::displayBoxForLayoutBox() 4 https://bugs.webkit.org/show_bug.cgi?id=201414 5 <rdar://problem/54963302> 6 7 Reviewed by Antti Koivisto. 8 9 Fix the final LayoutState::displayBoxForLayoutBox() callsites. Now all displayBoxForLayoutBox() calls are directed to the 10 established FormattingContext. 11 12 * layout/FormattingContext.cpp: 13 (WebCore::Layout::mapHorizontalPositionToAncestor): 14 (WebCore::Layout::FormattingContext::mapLeftToAncestor const): 15 (WebCore::Layout::FormattingContext::mapRightToAncestor const): 16 (WebCore::Layout::FormattingContext::mapBoxToAncestor const): 17 (WebCore::Layout::FormattingContext::mapTopToAncestor const): 18 (WebCore::Layout::FormattingContext::mapPointToAncestor const): 19 (WebCore::Layout::FormattingContext::mapPointToDescendent const): 20 (WebCore::Layout::FormattingContext::mapLeftToAncestor): Deleted. 21 (WebCore::Layout::FormattingContext::mapRightToAncestor): Deleted. 22 (WebCore::Layout::FormattingContext::mapBoxToAncestor): Deleted. 23 (WebCore::Layout::FormattingContext::mapTopToAncestor): Deleted. 24 (WebCore::Layout::FormattingContext::mapPointToAncestor): Deleted. 25 (WebCore::Layout::FormattingContext::mapPointToDescendent): Deleted. 26 * layout/FormattingContext.h: 27 (WebCore::Layout::FormattingContext::root const): 28 (WebCore::Layout::FormattingContext::formattingState const): 29 * layout/blockformatting/BlockFormattingContext.cpp: 30 (WebCore::Layout::BlockFormattingContext::layout): 31 (WebCore::Layout::BlockFormattingContext::usedAvailableWidthForFloatAvoider const): 32 * layout/floats/FloatingContext.cpp: 33 (WebCore::Layout::mapToFormattingContextRoot): 34 (WebCore::Layout::FloatingContext::FloatingContext): 35 (WebCore::Layout::FloatingContext::positionForFloat const): 36 (WebCore::Layout::FloatingContext::positionForFormattingContextRoot const): 37 (WebCore::Layout::FloatingContext::verticalPositionWithClearance const): 38 (WebCore::Layout::FloatingContext::constraints const): 39 (WebCore::Layout::FloatingContext::append): 40 * layout/floats/FloatingContext.h: 41 (WebCore::Layout::FloatingContext::formattingContext const): 42 (WebCore::Layout::FloatingContext::root const): 43 * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: 44 (WebCore::Layout::InlineFormattingContext::InlineLayout::layout const): 45 (WebCore::Layout::InlineFormattingContext::InlineLayout::createDisplayRuns const): 46 1 47 2019-09-03 Zalan Bujtas <zalan@apple.com> 2 48 -
trunk/Source/WebCore/layout/FormattingContext.cpp
r249356 r249441 149 149 } 150 150 151 static LayoutUnit mapHorizontalPositionToAncestor(const LayoutState& layoutState, LayoutUnit horizontalPosition, const Container& containingBlock, const Container& ancestor)151 static LayoutUnit mapHorizontalPositionToAncestor(const FormattingContext& formattingContext, LayoutUnit horizontalPosition, const Container& containingBlock, const Container& ancestor) 152 152 { 153 153 // "horizontalPosition" is in the coordinate system of the "containingBlock". -> map from containingBlock to ancestor. … … 156 156 ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor)); 157 157 for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock()) 158 horizontalPosition += layoutState.displayBoxForLayoutBox(*container).left();158 horizontalPosition += formattingContext.displayBoxForLayoutBox(*container).left(); 159 159 return horizontalPosition; 160 160 } 161 161 162 162 // FIXME: turn these into templates. 163 LayoutUnit FormattingContext::mapLeftToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)163 LayoutUnit FormattingContext::mapLeftToAncestor(const Box& layoutBox, const Container& ancestor) const 164 164 { 165 165 ASSERT(layoutBox.containingBlock()); 166 return mapHorizontalPositionToAncestor( layoutState, layoutState.displayBoxForLayoutBox(layoutBox).left(), *layoutBox.containingBlock(), ancestor);167 } 168 169 LayoutUnit FormattingContext::mapRightToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)166 return mapHorizontalPositionToAncestor(*this, displayBoxForLayoutBox(layoutBox).left(), *layoutBox.containingBlock(), ancestor); 167 } 168 169 LayoutUnit FormattingContext::mapRightToAncestor(const Box& layoutBox, const Container& ancestor) const 170 170 { 171 171 ASSERT(layoutBox.containingBlock()); 172 return mapHorizontalPositionToAncestor( layoutState, layoutState.displayBoxForLayoutBox(layoutBox).right(), *layoutBox.containingBlock(), ancestor);173 } 174 175 Display::Box FormattingContext::mapBoxToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)172 return mapHorizontalPositionToAncestor(*this, displayBoxForLayoutBox(layoutBox).right(), *layoutBox.containingBlock(), ancestor); 173 } 174 175 Display::Box FormattingContext::mapBoxToAncestor(const Box& layoutBox, const Container& ancestor) const 176 176 { 177 177 ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor)); 178 auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);178 auto& displayBox = displayBoxForLayoutBox(layoutBox); 179 179 auto topLeft = displayBox.topLeft(); 180 180 for (auto* containingBlock = layoutBox.containingBlock(); containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock()) 181 topLeft.moveBy( layoutState.displayBoxForLayoutBox(*containingBlock).topLeft());181 topLeft.moveBy(displayBoxForLayoutBox(*containingBlock).topLeft()); 182 182 183 183 auto mappedDisplayBox = Display::Box(displayBox); … … 186 186 } 187 187 188 LayoutUnit FormattingContext::mapTopToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)188 LayoutUnit FormattingContext::mapTopToAncestor(const Box& layoutBox, const Container& ancestor) const 189 189 { 190 190 ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor)); 191 auto top = layoutState.displayBoxForLayoutBox(layoutBox).top();191 auto top = displayBoxForLayoutBox(layoutBox).top(); 192 192 for (auto* container = layoutBox.containingBlock(); container && container != &ancestor; container = container->containingBlock()) 193 top += layoutState.displayBoxForLayoutBox(*container).top();193 top += displayBoxForLayoutBox(*container).top(); 194 194 return top; 195 195 } 196 196 197 Point FormattingContext::mapPointToAncestor( const LayoutState& layoutState, Point position, const Container& from, const Container& to)197 Point FormattingContext::mapPointToAncestor(Point position, const Container& from, const Container& to) const 198 198 { 199 199 if (&from == &to) … … 202 202 auto mappedPosition = position; 203 203 for (auto* container = &from; container && container != &to; container = container->containingBlock()) 204 mappedPosition.moveBy( layoutState.displayBoxForLayoutBox(*container).topLeft());204 mappedPosition.moveBy(displayBoxForLayoutBox(*container).topLeft()); 205 205 return mappedPosition; 206 206 } 207 207 208 Point FormattingContext::mapPointToDescendent( const LayoutState& layoutState, Point point, const Container& from, const Container& to)208 Point FormattingContext::mapPointToDescendent(Point point, const Container& from, const Container& to) const 209 209 { 210 210 // "point" is in the coordinate system of the "from" container. … … 213 213 ASSERT(to.isContainingBlockDescendantOf(from)); 214 214 for (auto* container = &to; container && container != &from; container = container->containingBlock()) 215 point.moveBy( -layoutState.displayBoxForLayoutBox(*container).topLeft());215 point.moveBy(displayBoxForLayoutBox(*container).topLeft()); 216 216 return point; 217 217 } -
trunk/Source/WebCore/layout/FormattingContext.h
r249356 r249441 62 62 virtual IntrinsicWidthConstraints computedIntrinsicWidthConstraints() = 0; 63 63 64 static Display::Box mapBoxToAncestor(const LayoutState&, const Box&, const Container& ancestor);65 static LayoutUnit mapTopToAncestor(const LayoutState&, const Box&, const Container& ancestor);66 static LayoutUnit mapLeftToAncestor(const LayoutState&, const Box&, const Container& ancestor);67 static LayoutUnit mapRightToAncestor(const LayoutState&, const Box&, const Container& ancestor);68 static Point mapPointToAncestor(const LayoutState&, Point, const Container& from, const Container& to);69 static Point mapPointToDescendent(const LayoutState&, Point, const Container& from, const Container& to);64 Display::Box mapBoxToAncestor(const Box&, const Container& ancestor) const; 65 LayoutUnit mapTopToAncestor(const Box&, const Container& ancestor) const; 66 LayoutUnit mapLeftToAncestor(const Box&, const Container& ancestor) const; 67 LayoutUnit mapRightToAncestor(const Box&, const Container& ancestor) const; 68 Point mapPointToAncestor(Point, const Container& from, const Container& to) const; 69 Point mapPointToDescendent(Point, const Container& from, const Container& to) const; 70 70 71 71 bool isBlockFormattingContext() const { return root().establishesBlockFormattingContext(); } … … 76 76 bool hasDisplayBox(const Box& layoutBox) const { return layoutState().hasDisplayBox(layoutBox); } 77 77 78 const Box& root() const { return *m_root; } 79 78 80 protected: 79 81 using LayoutQueue = Vector<const Box*>; … … 81 83 LayoutState& layoutState() const; 82 84 FormattingState& formattingState() const { return m_formattingState; } 83 const Box& root() const { return *m_root; }84 85 85 86 void computeBorderAndPadding(const Box&, Optional<UsedHorizontalValues> = WTF::nullopt); -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp
r249439 r249441 63 63 auto& formattingRoot = downcast<Container>(root()); 64 64 LayoutQueue layoutQueue; 65 auto floatingContext = FloatingContext { formattingRoot, formattingState().floatingState() };65 auto floatingContext = FloatingContext { *this, formattingState().floatingState() }; 66 66 // This is a post-order tree traversal layout. 67 67 // The root container layout is done in the formatting context it lives in, not that one it creates, so let's start with the first child. … … 128 128 // Vertical static position is not computed yet, so let's just estimate it for now. 129 129 auto& formattingRoot = downcast<Container>(root()); 130 auto verticalPosition = FormattingContext::mapTopToAncestor(layoutState(),layoutBox, formattingRoot);130 auto verticalPosition = mapTopToAncestor(layoutBox, formattingRoot); 131 131 auto constraints = floatingContext.constraints({ verticalPosition }); 132 132 if (!constraints.left && !constraints.right) … … 140 140 if (&containingBlock != &formattingRoot) { 141 141 // Move containing block left/right to the root's coordinate system. 142 containingBlockLeft = FormattingContext::mapLeftToAncestor(layoutState(),containingBlock, formattingRoot);143 containingBlockRight = FormattingContext::mapRightToAncestor(layoutState(),containingBlock, formattingRoot);142 containingBlockLeft = mapLeftToAncestor(containingBlock, formattingRoot); 143 containingBlockRight = mapRightToAncestor(containingBlock, formattingRoot); 144 144 } 145 145 auto containingBlockContentBoxLeft = containingBlockLeft + containingBlockDisplayBox.borderLeft() + containingBlockDisplayBox.paddingLeft().valueOr(0); -
trunk/Source/WebCore/layout/floats/FloatingContext.cpp
r249439 r249441 156 156 HorizontalEdges containingBlockContentBox; 157 157 }; 158 static AbsoluteCoordinateValuesForFloatAvoider mapToFormattingContextRoot(const Box& layoutBox, const Container& formattingContextRoot, const LayoutState& layoutState)158 static AbsoluteCoordinateValuesForFloatAvoider mapToFormattingContextRoot(const Box& layoutBox, const Container& formattingContextRoot, const FormattingContext& formattingContext) 159 159 { 160 160 auto& containingBlock = *layoutBox.containingBlock(); 161 auto displayBox = FormattingContext::mapBoxToAncestor(layoutState,layoutBox, formattingContextRoot);161 auto displayBox = formattingContext.mapBoxToAncestor(layoutBox, formattingContextRoot); 162 162 163 163 if (&containingBlock == &formattingContextRoot) { 164 auto containingBlockDisplayBox = layoutState.displayBoxForLayoutBox(containingBlock);164 auto containingBlockDisplayBox = formattingContext.displayBoxForLayoutBox(containingBlock); 165 165 return { displayBox, { }, { containingBlockDisplayBox.contentBoxLeft(), containingBlockDisplayBox.contentBoxRight() } }; 166 166 } 167 auto containingBlockAbsoluteDisplayBox = FormattingContext::mapBoxToAncestor(layoutState,containingBlock, formattingContextRoot);167 auto containingBlockAbsoluteDisplayBox = formattingContext.mapBoxToAncestor(containingBlock, formattingContextRoot); 168 168 auto containingBlockLeft = containingBlockAbsoluteDisplayBox.left(); 169 169 return { displayBox, containingBlockAbsoluteDisplayBox.topLeft(), { containingBlockLeft + containingBlockAbsoluteDisplayBox.contentBoxLeft(), containingBlockLeft + containingBlockAbsoluteDisplayBox.contentBoxRight() } }; 170 170 } 171 171 172 FloatingContext::FloatingContext(const Container& formattingContextRoot, FloatingState& floatingState)173 : m_ root(makeWeakPtr(formattingContextRoot))172 FloatingContext::FloatingContext(const FormattingContext& formattingContext, FloatingState& floatingState) 173 : m_formattingContext(formattingContext) 174 174 , m_floatingState(floatingState) 175 175 { … … 182 182 183 183 if (isEmpty()) { 184 auto& displayBox = layoutState().displayBoxForLayoutBox(layoutBox);184 auto& displayBox = formattingContext().displayBoxForLayoutBox(layoutBox); 185 185 186 186 auto alignWithContainingBlock = [&]() -> Position { 187 187 // If there is no floating to align with, push the box to the left/right edge of its containing block's content box. 188 auto& containingBlockDisplayBox = layoutState().displayBoxForLayoutBox(*layoutBox.containingBlock());188 auto& containingBlockDisplayBox = formattingContext().displayBoxForLayoutBox(*layoutBox.containingBlock()); 189 189 190 190 if (layoutBox.isLeftFloatingPositioned()) … … 199 199 200 200 // Find the top most position where the float box fits. 201 auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), layoutState());201 auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), formattingContext()); 202 202 203 203 Optional<LayoutUnit> previousFloatAbsoluteTop; … … 219 219 return { }; 220 220 221 auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), layoutState());221 auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), formattingContext()); 222 222 auto floatAvoider = FloatAvoider { layoutBox, absoluteDisplayBoxCoordinates.displayBox, absoluteDisplayBoxCoordinates.containingBlockTopLeft, absoluteDisplayBoxCoordinates.containingBlockContentBox }; 223 223 findPositionForFormattingContextRoot(floatAvoider); … … 244 244 // 1. The amount necessary to place the border edge of the block even with the bottom outer edge of the lowest float that is to be cleared. 245 245 // 2. The amount necessary to place the top border edge of the block at its hypothetical position. 246 auto& layoutState = this->layoutState(); 247 auto rootRelativeTop = FormattingContext::mapTopToAncestor(layoutState, layoutBox, downcast<Container>(m_floatingState.root())); 246 auto rootRelativeTop = formattingContext().mapTopToAncestor(layoutBox, downcast<Container>(m_floatingState.root())); 248 247 auto clearance = *floatBottom - rootRelativeTop; 249 248 if (clearance <= 0) … … 253 252 if (auto* previousInFlowSibling = layoutBox.previousInFlowSibling()) { 254 253 // Does this box with clearance actually collapse its margin before with the previous inflow box's margin after? 255 auto verticalMargin = layoutState.displayBoxForLayoutBox(layoutBox).verticalMargin();254 auto verticalMargin = formattingContext().displayBoxForLayoutBox(layoutBox).verticalMargin(); 256 255 if (verticalMargin.hasCollapsedValues() && verticalMargin.collapsedValues().before) { 257 auto previousVerticalMargin = layoutState.displayBoxForLayoutBox(*previousInFlowSibling).verticalMargin();256 auto previousVerticalMargin = formattingContext().displayBoxForLayoutBox(*previousInFlowSibling).verticalMargin(); 258 257 auto collapsedMargin = *verticalMargin.collapsedValues().before; 259 258 auto nonCollapsedMargin = previousVerticalMargin.after() + verticalMargin.before(); … … 273 272 return { Position { rootRelativeTop }, clearance }; 274 273 275 auto containingBlockRootRelativeTop = FormattingContext::mapTopToAncestor(layoutState,*layoutBox.containingBlock(), downcast<Container>(m_floatingState.root()));274 auto containingBlockRootRelativeTop = formattingContext().mapTopToAncestor(*layoutBox.containingBlock(), downcast<Container>(m_floatingState.root())); 276 275 return { Position { rootRelativeTop - containingBlockRootRelativeTop }, clearance }; 277 276 }; … … 304 303 305 304 if (coordinateMappingIsRequired) { 306 adjustedPosition = FormattingContext::mapPointToAncestor(layoutState(),adjustedPosition, root(), downcast<Container>(floatingState().root()));305 adjustedPosition = formattingContext().mapPointToAncestor(adjustedPosition, root(), downcast<Container>(floatingState().root())); 307 306 adjustingDelta = { adjustedPosition.x, adjustedPosition.y - verticalPosition }; 308 307 } … … 344 343 void FloatingContext::append(const Box& floatBox) 345 344 { 346 floatingState().append(FloatingState::FloatItem { floatBox, FormattingContext::mapBoxToAncestor(layoutState(),floatBox, downcast<Container>(floatingState().root())) });345 floatingState().append(FloatingState::FloatItem { floatBox, formattingContext().mapBoxToAncestor(floatBox, downcast<Container>(floatingState().root())) }); 347 346 } 348 347 -
trunk/Source/WebCore/layout/floats/FloatingContext.h
r249439 r249441 29 29 30 30 #include "FloatingState.h" 31 #include "FormattingContext.h" 32 #include "LayoutContainer.h" 31 33 #include "LayoutUnits.h" 32 34 #include <wtf/IsoMalloc.h> … … 38 40 class FloatAvoider; 39 41 class Box; 40 class Container;41 42 class FloatingPair; 42 43 class LayoutState; … … 47 48 WTF_MAKE_ISO_ALLOCATED(FloatingContext); 48 49 public: 49 FloatingContext(const Container& formattingContextRoot, FloatingState&);50 FloatingContext(const FormattingContext&, FloatingState&); 50 51 51 52 FloatingState& floatingState() const { return m_floatingState; } … … 72 73 private: 73 74 LayoutState& layoutState() const { return m_floatingState.layoutState(); } 74 const Container& root() const { return *m_root; } 75 const FormattingContext& formattingContext() const { return m_formattingContext; } 76 const Container& root() const { return downcast<Container>(formattingContext().root()); } 75 77 76 78 void findPositionForFloatBox(FloatBox&) const; 77 79 void findPositionForFormattingContextRoot(FloatAvoider&) const; 78 80 79 WeakPtr<const Container> m_root;81 const FormattingContext& m_formattingContext; 80 82 FloatingState& m_floatingState; 81 83 }; -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
r249439 r249441 283 283 auto& formattingRoot = this->formattingRoot(); 284 284 auto& formattingRootDisplayBox = formattingContext.displayBoxForLayoutBox(formattingRoot); 285 auto floatingContext = FloatingContext { formatting Root, layoutState.establishedFormattingState(formattingRoot).floatingState() };285 auto floatingContext = FloatingContext { formattingContext, layoutState.establishedFormattingState(formattingRoot).floatingState() }; 286 286 287 287 auto lineLogicalTop = formattingRootDisplayBox.contentBoxTop(); … … 365 365 auto& formattingContext = this->formattingContext(); 366 366 auto& formattingState = downcast<InlineFormattingState>(layoutState.establishedFormattingState(formattingRoot())); 367 auto floatingContext = FloatingContext { formatting Root(), formattingState.floatingState() };367 auto floatingContext = FloatingContext { formattingContext, formattingState.floatingState() }; 368 368 369 369 // Move floats to their final position.
Note: See TracChangeset
for help on using the changeset viewer.