Title: [241250] trunk/Source/WebCore
- Revision
- 241250
- Author
- [email protected]
- Date
- 2019-02-10 10:03:52 -0800 (Sun, 10 Feb 2019)
Log Message
[LFC][IFC] Add intrinsic width support for inline-block boxes
https://bugs.webkit.org/show_bug.cgi?id=194479
Reviewed by Antti Koivisto.
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):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (241249 => 241250)
--- trunk/Source/WebCore/ChangeLog 2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/ChangeLog 2019-02-10 18:03:52 UTC (rev 241250)
@@ -1,5 +1,28 @@
2019-02-10 Zalan Bujtas <[email protected]>
+ [LFC][IFC] Add intrinsic width support for inline-block boxes
+ https://bugs.webkit.org/show_bug.cgi?id=194479
+
+ Reviewed by Antti Koivisto.
+
+ 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-10 Zalan Bujtas <[email protected]>
+
[LFC][IFC] Add intrinsic width support for replaced boxes
https://bugs.webkit.org/show_bug.cgi?id=194478
Modified: trunk/Source/WebCore/layout/LayoutUnits.h (241249 => 241250)
--- trunk/Source/WebCore/layout/LayoutUnits.h 2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/layout/LayoutUnits.h 2019-02-10 18:03:52 UTC (rev 241250)
@@ -132,6 +132,10 @@
{
}
+ explicit UsedHorizontalValues()
+ {
+ }
+
Optional<LayoutUnit> containingBlockWidth;
Optional<LayoutUnit> width;
Optional<UsedHorizontalMargin> margin;
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (241249 => 241250)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2019-02-10 18:03:52 UTC (rev 241250)
@@ -94,20 +94,27 @@
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;
- auto usedValues = UsedHorizontalValues { { }, { }, { } };
+ 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 @@
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 @@
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);
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (241249 => 241250)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-02-10 18:03:52 UTC (rev 241250)
@@ -86,6 +86,7 @@
};
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;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes