Changeset 256702 in webkit


Ignore:
Timestamp:
Feb 15, 2020, 7:17:40 AM (6 years ago)
Author:
Alan Bujtas
Message:

[LFC] Introduce OutOfFlowHorizontalConstraints
https://bugs.webkit.org/show_bug.cgi?id=207805
<rdar://problem/59482286>

Reviewed by Antti Koivisto.

Borders and paddings are resolved against the containing block's content box as if the box was an in-flow box.

  • layout/FormattingContext.cpp:

(WebCore::Layout::FormattingContext::layoutOutOfFlowContent):

  • layout/FormattingContext.h:
  • layout/FormattingContextGeometry.cpp:

(WebCore::Layout::FormattingContext::Geometry::horizontalConstraintsForOutOfFlow):

  • layout/LayoutContext.cpp:

(WebCore::Layout::LayoutContext::layoutFormattingContextSubtree):

  • layout/LayoutUnits.h:
  • layout/blockformatting/BlockFormattingContext.cpp:

(WebCore::Layout::BlockFormattingContext::layoutInFlowContent):

  • layout/inlineformatting/InlineFormattingContext.cpp:

(WebCore::Layout::InlineFormattingContext::layoutInFlowContent):

Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r256701 r256702  
     12020-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
    1242020-02-15  Zalan Bujtas  <zalan@apple.com>
    225
  • trunk/Source/WebCore/layout/FormattingContext.cpp

    r256417 r256702  
    133133}
    134134
    135 void FormattingContext::layoutOutOfFlowContent(InvalidationState& invalidationState, const HorizontalConstraints& rootHorizontalConstraints, const VerticalConstraints& rootVerticalConstraints)
     135void FormattingContext::layoutOutOfFlowContent(InvalidationState& invalidationState, const OutOfFlowHorizontalConstraints& rootHorizontalConstraints, const VerticalConstraints& rootVerticalConstraints)
    136136{
    137137    LOG_WITH_STREAM(FormattingContextLayout, stream << "Start: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root());
     
    139139    collectOutOfFlowDescendantsIfNeeded();
    140140
    141     auto horizontalConstraintsForOutOfFlowBox = [&] (const auto& outOfFlowBox) {
     141    auto horizontalConstraintsForLayoutBox = [&] (const auto& outOfFlowBox) {
    142142        auto* containingBlock = outOfFlowBox.containingBlock();
    143143        ASSERT(containingBlock);
     
    147147    };
    148148
    149     auto verticalConstraintsForOutOfFlowBox = [&] (const auto& outOfFlowBox) {
     149    auto verticalConstraintsForLayoutBox = [&] (const auto& outOfFlowBox) {
    150150        auto* containingBlock = outOfFlowBox.containingBlock();
    151151        ASSERT(containingBlock);
     
    160160            continue;
    161161
    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;
    167167        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));
    179187    }
    180188    LOG_WITH_STREAM(FormattingContextLayout, stream << "End: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root());
  • trunk/Source/WebCore/layout/FormattingContext.h

    r256417 r256702  
    6767
    6868    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&);
    7070
    7171    struct IntrinsicWidthConstraints {
     
    147147        LayoutUnit contentHeightForFormattingContextRoot(const Box&) const;
    148148
    149         static HorizontalConstraints horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry);
     149        static OutOfFlowHorizontalConstraints horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry);
    150150        static VerticalConstraints verticalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry);
    151151        static HorizontalConstraints horizontalConstraintsForInFlow(const Display::Box& containingBlockGeometry);
  • trunk/Source/WebCore/layout/FormattingContextGeometry.cpp

    r256417 r256702  
    11021102}
    11031103
    1104 HorizontalConstraints FormattingContext::Geometry::horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry)
    1105 {
    1106     return HorizontalConstraints { containingBlockGeometry.paddingBoxLeft(), containingBlockGeometry.paddingBoxWidth() };
     1104OutOfFlowHorizontalConstraints FormattingContext::Geometry::horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry)
     1105{
     1106    return OutOfFlowHorizontalConstraints {
     1107        HorizontalConstraints { containingBlockGeometry.paddingBoxLeft(), containingBlockGeometry.paddingBoxWidth() },
     1108        containingBlockGeometry.contentBoxWidth() };
    11071109}
    11081110
  • trunk/Source/WebCore/layout/LayoutContext.cpp

    r256417 r256702  
    104104    // It also means that the formattingContextRoot has to have a valid/clean geometry at this point.
    105105    {
    106         auto horizontalConstraints = HorizontalConstraints { displayBox.paddingBoxLeft(), displayBox.paddingBoxWidth() };
     106        auto horizontalConstraints = OutOfFlowHorizontalConstraints { HorizontalConstraints { displayBox.paddingBoxLeft(), displayBox.paddingBoxWidth() }, displayBox.contentBoxWidth() };
    107107        auto verticalConstraints = VerticalConstraints { displayBox.paddingBoxTop(), displayBox.paddingBoxHeight() };
    108108        formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraints, verticalConstraints);
  • trunk/Source/WebCore/layout/LayoutUnits.h

    r254666 r256702  
    158158};
    159159
     160struct 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
    160166struct VerticalConstraints {
    161167    LayoutUnit logicalTop;
  • trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp

    r256417 r256702  
    127127            if (layoutBox.establishesFormattingContext()) {
    128128                if (is<ContainerBox>(layoutBox) && downcast<ContainerBox>(layoutBox).hasInFlowOrFloatingChild()) {
     129                    auto& containerBox = downcast<ContainerBox>(layoutBox);
    129130                    // Layout the inflow descendants of this formatting context root.
    130                     precomputeVerticalPositionForFormattingRoot(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);
    131                     auto& rootDisplayBox = geometryForBox(layoutBox);
    132                     auto horizontalConstraintsForFormattingContext = Geometry::horizontalConstraintsForInFlow(rootDisplayBox);
    133                     auto verticalConstraintsForFormattingContext = 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);
    135136                }
    136137                break;
     
    152153                // Now that we computed the root's height, we can layout the out-of-flow descendants.
    153154                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);
    158160                }
    159161            }
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp

    r256701 r256702  
    9090        if (layoutBox->isAtomicInlineLevelBox()) {
    9191            // 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);
    107118            }
    108119        } else if (layoutBox->isInlineBox()) {
Note: See TracChangeset for help on using the changeset viewer.