Changeset 254977 in webkit


Ignore:
Timestamp:
Jan 23, 2020 8:15:15 AM (4 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Do not special case formatting root layout
https://bugs.webkit.org/show_bug.cgi?id=206641
<rdar://problem/58823548>

Reviewed by Antti Koivisto.

Let's move out all the formatting context layout logic from layoutFormattingContextRoot.

  • layout/inlineformatting/InlineFormattingContext.cpp:

(WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
(WebCore::Layout::InlineFormattingContext::layoutFormattingContextRoot): Deleted.
(WebCore::Layout::InlineFormattingContext::computeHorizontalAndVerticalGeometry): Deleted.
(WebCore::Layout::InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox): Deleted.

  • layout/inlineformatting/InlineFormattingContext.h:
  • layout/layouttree/LayoutBox.cpp:

(WebCore::Layout::Box::isInlineTableBox const):
(WebCore::Layout::Box::isInlineLevelBox const):

  • layout/layouttree/LayoutBox.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r254976 r254977  
     12020-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
    1222020-01-23  Antti Koivisto  <antti@apple.com>
    223
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp

    r254961 r254977  
    7777    // 2. Collect the inline items (flatten the the layout tree) and place them on lines in bidirectional order.
    7878    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
    83116        layoutBox = nextInPreOrder(*layoutBox, root());
    84117    }
     
    127160        ASSERT(lineLogicalTop < inifitePoint.y);
    128161    }
    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({ });
    184162}
    185163
     
    317295    displayBox.setContentBoxHeight(contentHeightAndMargin.contentHeight);
    318296    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);
    330297}
    331298
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h

    r254853 r254977  
    7979
    8080    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&);
    8381
    8482    void computeIntrinsicWidthForFormattingRoot(const Box&, const HorizontalConstraints&);
    85     void computeWidthAndHeightForReplacedInlineBox(const Box&, const HorizontalConstraints&);
    8683    InlineLayoutUnit computedIntrinsicWidthForConstraint(const HorizontalConstraints&) const;
    8784
  • trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp

    r254961 r254977  
    295295}
    296296
     297bool Box::isInlineTableBox() const
     298{
     299    return m_style.display() == DisplayType::InlineTable;
     300}
     301
    297302bool Box::isBlockLevelBox() const
    298303{
     
    306311    // Inline level elements generate inline level boxes.
    307312    auto display = m_style.display();
    308     return display == DisplayType::Inline || isInlineBlockBox() || display == DisplayType::InlineTable;
     313    return display == DisplayType::Inline || isInlineBlockBox() || isInlineTableBox();
    309314}
    310315
  • trunk/Source/WebCore/layout/layouttree/LayoutBox.h

    r254961 r254977  
    113113    bool isAtomicInlineLevelBox() const;
    114114    bool isInlineBlockBox() const;
     115    bool isInlineTableBox() const;
    115116    bool isBlockContainerBox() const;
    116117    bool isInitialContainingBlock() const;
Note: See TracChangeset for help on using the changeset viewer.