Diff
Modified: trunk/Source/WebCore/ChangeLog (246104 => 246105)
--- trunk/Source/WebCore/ChangeLog 2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/ChangeLog 2019-06-05 14:47:20 UTC (rev 246105)
@@ -1,3 +1,26 @@
+2019-06-05 Zalan Bujtas <[email protected]>
+
+ [LFC][IFC] Move inline item height computation to a dedicated function
+ https://bugs.webkit.org/show_bug.cgi?id=198550
+ <rdar://problem/51424223>
+
+ Reviewed by Antti Koivisto.
+
+ The inlineItem height value is not available during preferred width computation (hence optional).
+
+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+ (WebCore::Layout::UncommittedContent::add):
+ (WebCore::Layout::inlineItemWidth):
+ (WebCore::Layout::inlineItemHeight):
+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+ * layout/inlineformatting/InlineLine.cpp:
+ (WebCore::Layout::Line::appendInlineContainerStart):
+ (WebCore::Layout::Line::appendInlineContainerEnd):
+ (WebCore::Layout::Line::appendTextContent):
+ (WebCore::Layout::Line::appendNonReplacedInlineBox):
+ (WebCore::Layout::Line::appendReplacedInlineBox):
+ * layout/inlineformatting/InlineLine.h:
+
2019-06-01 Antoine Quint <[email protected]>
[Pointer Events] Add support for chorded button interactions
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246104 => 246105)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-05 14:47:20 UTC (rev 246105)
@@ -44,10 +44,10 @@
struct UncommittedContent {
struct Run {
const InlineItem& inlineItem;
- LayoutUnit logicalWidth;
+ Line::InlineItemSize size;
// FIXME: add optional breaking context (start and end position) for split text content.
};
- void add(const InlineItem&, LayoutUnit logicalWidth);
+ void add(const InlineItem&, const Line::InlineItemSize&);
void reset();
Vector<Run> runs() { return m_uncommittedRuns; }
@@ -60,10 +60,10 @@
LayoutUnit m_width;
};
-void UncommittedContent::add(const InlineItem& inlineItem, LayoutUnit logicalWidth)
+void UncommittedContent::add(const InlineItem& inlineItem, const Line::InlineItemSize& size)
{
- m_uncommittedRuns.append({ inlineItem, logicalWidth });
- m_width += logicalWidth;
+ m_uncommittedRuns.append({ inlineItem, size });
+ m_width += size.logicalWidth;
}
void UncommittedContent::reset()
@@ -103,6 +103,12 @@
ASSERT(layoutState.hasDisplayBox(layoutBox));
auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);
+ if (layoutBox.isFloatingPositioned())
+ return displayBox.marginBoxWidth();
+
+ if (layoutBox.isReplaced())
+ return displayBox.width();
+
if (inlineItem.isContainerStart())
return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
@@ -109,13 +115,33 @@
if (inlineItem.isContainerEnd())
return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
- if (inlineItem.isFloat())
- return displayBox.marginBoxWidth();
-
+ // Non-replaced inline box (e.g. inline-block)
return displayBox.width();
}
+static LayoutUnit inlineItemHeight(const LayoutState& layoutState, const InlineItem& inlineItem)
+{
+ auto& fontMetrics = inlineItem.style().fontMetrics();
+ if (inlineItem.isLineBreak() || is<InlineTextItem>(inlineItem))
+ return fontMetrics.height();
+ auto& layoutBox = inlineItem.layoutBox();
+ ASSERT(layoutState.hasDisplayBox(layoutBox));
+ auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);
+
+ if (layoutBox.isFloatingPositioned())
+ return displayBox.marginBox().height();
+
+ if (layoutBox.isReplaced())
+ return displayBox.height();
+
+ if (inlineItem.isContainerStart() || inlineItem.isContainerEnd())
+ return fontMetrics.height() + displayBox.verticalBorder() + displayBox.verticalPadding().valueOr(0);
+
+ // Non-replaced inline box (e.g. inline-block)
+ return displayBox.height();
+}
+
static std::unique_ptr<Line> constructLine(const LayoutState& layoutState, const FloatingState& floatingState, const Box& formattingRoot,
LayoutUnit lineLogicalTop, LayoutUnit availableWidth)
{
@@ -165,38 +191,18 @@
committedInlineItemCount += uncommittedContent.size();
for (auto& uncommittedRun : uncommittedContent.runs()) {
auto& inlineItem = uncommittedRun.inlineItem;
- if (inlineItem.isHardLineBreak()) {
+ if (inlineItem.isHardLineBreak())
line->appendHardLineBreak(inlineItem);
- continue;
- }
-
- auto width = uncommittedRun.logicalWidth;
- auto& fontMetrics = inlineItem.style().fontMetrics();
- if (is<InlineTextItem>(inlineItem)) {
- line->appendTextContent(downcast<InlineTextItem>(inlineItem), { width, fontMetrics.height() });
- continue;
- }
-
- auto& layoutBox = inlineItem.layoutBox();
- auto& displayBox = layoutState().displayBoxForLayoutBox(layoutBox);
-
- if (inlineItem.isContainerStart()) {
- auto containerHeight = fontMetrics.height() + displayBox.verticalBorder() + displayBox.verticalPadding().valueOr(0);
- line->appendInlineContainerStart(inlineItem, { width, containerHeight });
- continue;
- }
-
- if (inlineItem.isContainerEnd()) {
- line->appendInlineContainerEnd(inlineItem, { width, 0 });
- continue;
- }
-
- if (layoutBox.isReplaced()) {
- line->appendReplacedInlineBox(inlineItem, { width, displayBox.height() });
- continue;
- }
-
- line->appendNonReplacedInlineBox(inlineItem, { width, displayBox.height() });
+ else if (is<InlineTextItem>(inlineItem))
+ line->appendTextContent(downcast<InlineTextItem>(inlineItem), uncommittedRun.size);
+ else if (inlineItem.isContainerStart())
+ line->appendInlineContainerStart(inlineItem, uncommittedRun.size);
+ else if (inlineItem.isContainerEnd())
+ line->appendInlineContainerEnd(inlineItem, uncommittedRun.size);
+ else if (inlineItem.layoutBox().isReplaced())
+ line->appendReplacedInlineBox(inlineItem, uncommittedRun.size);
+ else
+ line->appendNonReplacedInlineBox(inlineItem, uncommittedRun.size);
}
uncommittedContent.reset();
};
@@ -212,10 +218,10 @@
auto availableWidth = line->availableWidth() - uncommittedContent.width();
auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width();
auto& inlineItem = lineInput.inlineItems[inlineItemIndex];
- auto inlineItemWidth = WebCore::Layout::inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
+ auto itemLogicalWidth = inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
// FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
- auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
if (breakingContext.isAtBreakingOpportunity)
commitPendingContent();
@@ -243,12 +249,12 @@
continue;
}
if (inlineItem->isHardLineBreak()) {
- uncommittedContent.add(*inlineItem, inlineItemWidth);
+ uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
commitPendingContent();
return closeLine();
}
- uncommittedContent.add(*inlineItem, inlineItemWidth);
+ uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
if (breakingContext.isAtBreakingOpportunity)
commitPendingContent();
}
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (246104 => 246105)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-06-05 14:47:20 UTC (rev 246105)
@@ -119,7 +119,7 @@
m_contentLogicalWidth += logicalRect.width();
}
-void Line::appendInlineContainerStart(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendInlineContainerStart(const InlineItem& inlineItem, InlineItemSize runSize)
{
auto& layoutBox = inlineItem.layoutBox();
auto& style = layoutBox.style();
@@ -138,18 +138,18 @@
alignAndAdjustLineHeight();
auto& displayBox = m_layoutState.displayBoxForLayoutBox(layoutBox);
auto logicalTop = -fontMetrics.ascent() - displayBox.borderTop() - displayBox.paddingTop().valueOr(0);
- auto logicalRect = Display::Rect { logicalTop, contentLogicalRight(), runSize.width(), runSize.height() };
+ auto logicalRect = Display::Rect { logicalTop, contentLogicalRight(), runSize.logicalWidth, runSize.logicalHeight.valueOr(0) };
appendNonBreakableSpace(inlineItem, logicalRect);
}
-void Line::appendInlineContainerEnd(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendInlineContainerEnd(const InlineItem& inlineItem, InlineItemSize runSize)
{
// This is really just a placeholder to mark the end of the inline level container.
- auto logicalRect = Display::Rect { 0, contentLogicalRight(), runSize.width(), runSize.height() };
+ auto logicalRect = Display::Rect { 0, contentLogicalRight(), runSize.logicalWidth, runSize.logicalHeight.valueOr(0) };
appendNonBreakableSpace(inlineItem, logicalRect);
}
-void Line::appendTextContent(const InlineTextItem& inlineItem, LayoutSize runSize)
+void Line::appendTextContent(const InlineTextItem& inlineItem, InlineItemSize runSize)
{
auto isTrimmable = TextUtil::isTrimmableContent(inlineItem);
if (!isTrimmable)
@@ -177,7 +177,7 @@
// Collapsed line items don't contribute to the line width.
auto isCompletelyCollapsed = shouldCollapseCompletely();
auto canBeExtended = !isCompletelyCollapsed && !inlineItem.isCollapsed();
- auto logicalRect = Display::Rect { -inlineItem.style().fontMetrics().ascent(), contentLogicalRight(), runSize.width(), runSize.height() };
+ auto logicalRect = Display::Rect { -inlineItem.style().fontMetrics().ascent(), contentLogicalRight(), runSize.logicalWidth, runSize.logicalHeight.valueOr(0) };
auto textContext = Display::Run::TextContext { inlineItem.start(), inlineItem.isCollapsed() ? 1 : inlineItem.length() };
auto displayRun = Display::Run(logicalRect, textContext);
@@ -186,13 +186,13 @@
m_trimmableContent.add(lineItem.get());
m_content->runs().append(WTFMove(lineItem));
- m_contentLogicalWidth += isCompletelyCollapsed ? LayoutUnit() : runSize.width();
+ m_contentLogicalWidth += isCompletelyCollapsed ? LayoutUnit() : runSize.logicalWidth;
}
-void Line::appendNonReplacedInlineBox(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendNonReplacedInlineBox(const InlineItem& inlineItem, InlineItemSize runSize)
{
+ auto inlineBoxHeight = runSize.logicalHeight.valueOr(0);
auto alignAndAdjustLineHeight = [&] {
- auto inlineBoxHeight = runSize.height();
// FIXME: We need to look inside the inline-block's formatting context and check the lineboxes (if any) to be able to baseline align.
if (inlineItem.layoutBox().establishesInlineFormattingContext()) {
if (inlineBoxHeight == logicalHeight())
@@ -209,16 +209,16 @@
alignAndAdjustLineHeight();
auto& displayBox = m_layoutState.displayBoxForLayoutBox(inlineItem.layoutBox());
- auto logicalTop = -runSize.height();
+ auto logicalTop = -inlineBoxHeight;
auto horizontalMargin = displayBox.horizontalMargin();
- auto logicalRect = Display::Rect { logicalTop, contentLogicalRight() + horizontalMargin.start, runSize.width(), runSize.height() };
+ auto logicalRect = Display::Rect { logicalTop, contentLogicalRight() + horizontalMargin.start, runSize.logicalWidth, inlineBoxHeight };
m_content->runs().append(std::make_unique<Content::Run>(Display::Run { logicalRect }, inlineItem, false, false));
- m_contentLogicalWidth += (runSize.width() + horizontalMargin.start + horizontalMargin.end);
+ m_contentLogicalWidth += (runSize.logicalWidth + horizontalMargin.start + horizontalMargin.end);
m_trimmableContent.clear();
}
-void Line::appendReplacedInlineBox(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendReplacedInlineBox(const InlineItem& inlineItem, InlineItemSize runSize)
{
// FIXME Surely replaced boxes behave differently.
appendNonReplacedInlineBox(inlineItem, runSize);
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (246104 => 246105)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-06-05 14:47:20 UTC (rev 246105)
@@ -75,11 +75,15 @@
};
std::unique_ptr<Content> close();
- void appendTextContent(const InlineTextItem&, LayoutSize);
- void appendNonReplacedInlineBox(const InlineItem&, LayoutSize);
- void appendReplacedInlineBox(const InlineItem&, LayoutSize);
- void appendInlineContainerStart(const InlineItem&, LayoutSize);
- void appendInlineContainerEnd(const InlineItem&, LayoutSize);
+ struct InlineItemSize {
+ LayoutUnit logicalWidth;
+ Optional<LayoutUnit> logicalHeight;
+ };
+ void appendTextContent(const InlineTextItem&, InlineItemSize);
+ void appendNonReplacedInlineBox(const InlineItem&, InlineItemSize);
+ void appendReplacedInlineBox(const InlineItem&, InlineItemSize);
+ void appendInlineContainerStart(const InlineItem&, InlineItemSize);
+ void appendInlineContainerEnd(const InlineItem&, InlineItemSize);
void appendHardLineBreak(const InlineItem&);
bool hasContent() const { return !m_content->isVisuallyEmpty(); }