Diff
Modified: trunk/Source/WebCore/ChangeLog (246633 => 246634)
--- trunk/Source/WebCore/ChangeLog 2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/ChangeLog 2019-06-20 15:18:27 UTC (rev 246634)
@@ -1,5 +1,27 @@
2019-06-20 Zalan Bujtas <[email protected]>
+ [LFC][IFC] Make the initial strut explicit
+ https://bugs.webkit.org/show_bug.cgi?id=199057
+ <rdar://problem/51927864>
+
+ Reviewed by Antti Koivisto.
+
+ The strut always sets the initial vertical constraints on the new line in strict mode. However in quirks mode
+ we can ignore it as long as there's no baseline type content on the line.
+
+ * layout/inlineformatting/InlineFormattingContext.h:
+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+ * layout/inlineformatting/InlineFormattingContextQuirks.cpp:
+ (WebCore::Layout::InlineFormattingContext::Quirks::lineHeightConstraints):
+ * layout/inlineformatting/InlineLine.cpp:
+ (WebCore::Layout::Line::appendTextContent):
+ (WebCore::Layout::Line::appendHardLineBreak):
+ (WebCore::Layout::Line::adjustBaselineAndLineHeight):
+ * layout/inlineformatting/InlineLine.h:
+
+2019-06-20 Zalan Bujtas <[email protected]>
+
[LFC][IFC] Introduce Line::InitialConstraints
https://bugs.webkit.org/show_bug.cgi?id=199056
<rdar://problem/51927597>
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (246633 => 246634)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-06-20 15:18:27 UTC (rev 246634)
@@ -97,6 +97,7 @@
class Quirks {
public:
static bool lineDescentNeedsCollapsing(const LayoutState&, const Line::Content&);
+ static Line::InitialConstraints::HeightAndBaseline lineHeightConstraints(const LayoutState&, const Box& formattingRoot);
};
class Geometry : public FormattingContext::Geometry {
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246633 => 246634)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-20 15:18:27 UTC (rev 246634)
@@ -127,13 +127,10 @@
InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const
{
- auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
- auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
auto initialLineConstraints = Line::InitialConstraints {
lineInput.horizontalConstraint.logicalTopLeft,
lineInput.horizontalConstraint.availableLogicalWidth,
- mimimumLineHeight,
- initialBaselineOffset
+ Quirks::lineHeightConstraints(layoutState(), m_formattingRoot)
};
auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment };
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp (246633 => 246634)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp 2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp 2019-06-20 15:18:27 UTC (rev 246634)
@@ -82,7 +82,27 @@
return true;
}
+Line::InitialConstraints::HeightAndBaseline InlineFormattingContext::Quirks::lineHeightConstraints(const LayoutState& layoutState, const Box& formattingRoot)
+{
+ // computedLineHeight takes font-size into account when line-height is not set.
+ // Strut is the imaginary box that we put on every line. It sets the initial vertical constraints for each new line.
+ auto strutHeight = formattingRoot.style().computedLineHeight();
+ auto strutBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), strutHeight).ascent;
+ if (layoutState.inNoQuirksMode())
+ return { strutHeight, strutBaselineOffset, { } };
+
+ auto lineHeight = formattingRoot.style().lineHeight();
+ if (lineHeight.isPercentOrCalculated()) {
+ auto initialBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), { }).ascent;
+ return { initialBaselineOffset, initialBaselineOffset, LineBox::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
+ }
+ // FIXME: The only reason why we use intValue() here is to match current inline tree (integral)behavior.
+ auto initialLineHeight = LayoutUnit { lineHeight.intValue() };
+ auto initialBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), initialLineHeight).ascent;
+ return { initialLineHeight, initialBaselineOffset, LineBox::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
}
+
}
+}
#endif
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (246633 => 246634)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-06-20 15:18:27 UTC (rev 246634)
@@ -48,8 +48,9 @@
: m_layoutState(layoutState)
, m_content(std::make_unique<Line::Content>())
, m_logicalTopLeft(initialConstraints.topLeft)
- , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset })
- , m_contentLogicalHeight(initialConstraints.height)
+ , m_baseline({ initialConstraints.heightAndBaseline.baselineOffset, initialConstraints.heightAndBaseline.height - initialConstraints.heightAndBaseline.baselineOffset })
+ , m_initialStrut(initialConstraints.heightAndBaseline.strut)
+ , m_contentLogicalHeight(initialConstraints.heightAndBaseline.height)
, m_lineLogicalWidth(initialConstraints.availableWidth)
, m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
{
@@ -254,8 +255,11 @@
auto logicalRect = Display::Rect { };
logicalRect.setLeft(contentLogicalRight());
logicalRect.setWidth(logicalWidth);
- if (!m_skipVerticalAligment)
- logicalRect.setHeight(inlineItemContentHeight(inlineItem));
+ if (!m_skipVerticalAligment) {
+ auto runHeight = inlineItemContentHeight(inlineItem);
+ logicalRect.setHeight(runHeight);
+ adjustBaselineAndLineHeight(inlineItem, runHeight);
+ }
auto textContext = Content::Run::TextContext { inlineItem.start(), inlineItem.isCollapsed() ? 1 : inlineItem.length() };
auto lineItem = std::make_unique<Content::Run>(inlineItem, logicalRect, textContext, isCompletelyCollapsed, canBeExtended);
@@ -295,14 +299,16 @@
auto logicalRect = Display::Rect { };
logicalRect.setLeft(contentLogicalRight());
logicalRect.setWidth({ });
- if (!m_skipVerticalAligment)
+ if (!m_skipVerticalAligment) {
+ adjustBaselineAndLineHeight(inlineItem, { });
logicalRect.setHeight(logicalHeight());
+ }
m_content->runs().append(std::make_unique<Content::Run>(inlineItem, logicalRect, Content::Run::TextContext { }, false, false));
}
void Line::adjustBaselineAndLineHeight(const InlineItem& inlineItem, LayoutUnit runHeight)
{
- ASSERT(!inlineItem.isContainerEnd() && !inlineItem.isText());
+ ASSERT(!inlineItem.isContainerEnd());
auto& layoutBox = inlineItem.layoutBox();
auto& style = layoutBox.style();
@@ -316,6 +322,16 @@
m_contentLogicalHeight = std::max(m_contentLogicalHeight, baselineAlignedContentHeight());
return;
}
+ // Apply initial strut if needed.
+ if (inlineItem.isText() || inlineItem.isHardLineBreak()) {
+ if (!m_initialStrut)
+ return;
+ m_baseline.ascent = std::max(m_initialStrut->ascent, m_baseline.ascent);
+ m_baseline.descent = std::max(m_initialStrut->descent, m_baseline.descent);
+ m_contentLogicalHeight = std::max(m_contentLogicalHeight, baselineAlignedContentHeight());
+ m_initialStrut = { };
+ return;
+ }
// Replaced and non-replaced inline level box.
switch (inlineItem.style().verticalAlign()) {
case VerticalAlign::Baseline:
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (246633 => 246634)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-06-20 15:18:27 UTC (rev 246634)
@@ -41,8 +41,12 @@
struct InitialConstraints {
LayoutPoint topLeft;
LayoutUnit availableWidth;
- LayoutUnit height;
- LayoutUnit baselineOffset;
+ struct HeightAndBaseline {
+ LayoutUnit height;
+ LayoutUnit baselineOffset;
+ Optional<LineBox::Baseline> strut;
+ };
+ HeightAndBaseline heightAndBaseline;
};
enum class SkipVerticalAligment { No, Yes };
Line(const LayoutState&, const InitialConstraints&, SkipVerticalAligment);
@@ -141,6 +145,7 @@
LineBox::Baseline m_baseline;
LayoutUnit m_baselineTop;
+ Optional<LineBox::Baseline> m_initialStrut;
LayoutUnit m_contentLogicalHeight;
LayoutUnit m_lineLogicalWidth;
bool m_skipVerticalAligment { false };