WebKit Bugzilla
Attachment 361625 Details for
Bug 194479
: [LFC][IFC] Add intrinsic width support for inline-block boxes
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
Patch.txt (text/plain), 6.44 KB, created by
zalan
on 2019-02-09 22:59:34 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-02-09 22:59:34 PST
Size:
6.44 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 442982594e9..61eadcd92ae 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,26 @@ >+2019-02-09 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][IFC] Add intrinsic width support for inline-block boxes >+ https://bugs.webkit.org/show_bug.cgi?id=194479 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Compute the intrinsic width for the inline-block (formatting context root) and set it as the content box width while >+ laying out the content for the min/max width. >+ >+ <div style="position: absolute">before<span id=inline-block style="display: inline-block">inline_block content<span>after</div> >+ >+ The "inline-block" formatting root returns "inline_block" width for the minimum and "inline_block width" for >+ the maximum width. These min/max values are used to figure out the intrinsic width for the parent <div>. >+ >+ * layout/inlineformatting/InlineFormattingContext.cpp: >+ (WebCore::Layout::InlineFormattingContext::instrinsicWidthConstraints const): >+ (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthForFormattingContextRoot const): >+ (WebCore::Layout::InlineFormattingContext::computeMargin const): >+ * layout/inlineformatting/InlineFormattingContext.h: >+ * page/FrameViewLayoutContext.cpp: >+ (WebCore::layoutUsingFormattingContext): >+ > 2019-02-09 Zalan Bujtas <zalan@apple.com> > > [LFC][IFC] Add intrinsic width support for replaced boxes >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp >index f2d5fa63ab6..a13cc824fd9 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp >@@ -94,20 +94,27 @@ void InlineFormattingContext::layout() const > > FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsicWidthConstraints() const > { >- ASSERT(!layoutState().formattingStateForBox(root()).instrinsicWidthConstraints(root())); > ASSERT(is<Container>(root())); > > auto& layoutState = this->layoutState(); > auto& root = downcast<Container>(this->root()); >+ if (auto instrinsicWidthConstraints = layoutState.formattingStateForBox(root).instrinsicWidthConstraints(root)) >+ return *instrinsicWidthConstraints; > >+ Vector<const Box*> formattingContextRootList; > auto usedValues = UsedHorizontalValues { { }, { }, { } }; > auto* layoutBox = root.firstInFlowOrFloatingChild(); > while (layoutBox) { >- if (layoutBox->establishesFormattingContext()) >+ if (layoutBox->isFloatingPositioned()) > ASSERT_NOT_IMPLEMENTED_YET(); >- else if (layoutBox->isReplaced() || is<Container>(*layoutBox)) { >+ else if (layoutBox->isInlineBlockBox()) { >+ computeIntrinsicWidthForFormattingContextRoot(*layoutBox); >+ formattingContextRootList.append(layoutBox); >+ } else if (layoutBox->isReplaced() || is<Container>(*layoutBox)) { > computeBorderAndPadding(*layoutBox, usedValues); >- if (layoutBox->isReplaced()) >+ // inline-block and replaced. >+ auto needsWidthComputation = layoutBox->isReplaced() || layoutBox->establishesFormattingContext(); >+ if (needsWidthComputation) > computeWidthAndMargin(*layoutBox, usedValues); > else { > // Simple inline container with no intrinsic width <span>. >@@ -124,6 +131,13 @@ FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsi > LayoutUnit maxContentLogicalRight; > auto lineBreaker = InlineLineBreaker { layoutState, formattingState().inlineContent(), inlineRunProvider.runs() }; > LayoutUnit lineLogicalRight; >+ >+ // Switch to the min/max formatting root width values before formatting the lines. >+ for (auto* formattingRoot : formattingContextRootList) { >+ auto instrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).instrinsicWidthConstraints(*formattingRoot); >+ layoutState.displayBoxForLayoutBox(*formattingRoot).setContentBoxWidth(availableWidth ? instrinsicWidths->maximum : instrinsicWidths->minimum); >+ } >+ > while (auto run = lineBreaker.nextRun(lineLogicalRight, availableWidth, !lineLogicalRight)) { > if (run->position == InlineLineBreaker::Run::Position::LineBegin) > lineLogicalRight = 0; >@@ -139,11 +153,20 @@ FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsi > return instrinsicWidthConstraints; > } > >+void InlineFormattingContext::computeIntrinsicWidthForFormattingContextRoot(const Box& layoutBox) const >+{ >+ ASSERT(layoutBox.establishesFormattingContext()); >+ >+ auto usedValues = UsedHorizontalValues { { }, { }, { } }; >+ computeBorderAndPadding(layoutBox, usedValues); >+ computeMargin(downcast<InlineContainer>(layoutBox), usedValues); >+ layoutState().createFormattingContext(layoutBox)->instrinsicWidthConstraints(); >+} >+ > void InlineFormattingContext::computeMargin(const InlineContainer& inlineContainer, UsedHorizontalValues usedValues) const > { >- // Non-replaced, non-formatting root containers (<span></span>) don't have width property -> non width computation. >+ // Non-replaced and formatting root containers (<span></span>) don't have width property -> non width computation. > ASSERT(!inlineContainer.replaced()); >- ASSERT(!inlineContainer.establishesFormattingContext()); > > auto& displayBox = layoutState().displayBoxForLayoutBox(inlineContainer); > auto computedHorizontalMargin = Geometry::computedHorizontalMargin(inlineContainer, usedValues); >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >index ffa70e9c907..6f9c7acba94 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >@@ -86,6 +86,7 @@ private: > }; > > void layoutFormattingContextRoot(const Box&, UsedHorizontalValues) const; >+ void computeIntrinsicWidthForFormattingContextRoot(const Box&) const; > void computeWidthAndHeightForReplacedInlineBox(const Box&, UsedHorizontalValues) const; > void computeMargin(const InlineContainer&, UsedHorizontalValues) const; > void computeBorderAndPadding(const Box&, UsedHorizontalValues) const;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
koivisto
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 194479
: 361625