Diff
Modified: trunk/Source/WebCore/ChangeLog (266124 => 266125)
--- trunk/Source/WebCore/ChangeLog 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/ChangeLog 2020-08-25 16:39:10 UTC (rev 266125)
@@ -1,3 +1,28 @@
+2020-08-25 Zalan Bujtas <[email protected]>
+
+ [LFC][IFC] The initial alignment baseline is always set by the strut
+ https://bugs.webkit.org/show_bug.cgi?id=214785
+
+ Reviewed by Antti Koivisto.
+
+ Let's just use the strut ascent as the initial alignment baseline.
+
+ * layout/FormattingContext.h:
+ (WebCore::Layout::FormattingContext::root const):
+ * layout/inlineformatting/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
+ (WebCore::Layout::InlineFormattingContext::constraintsForLine):
+ * layout/inlineformatting/InlineFormattingContext.h:
+ * layout/inlineformatting/InlineFormattingContextQuirks.cpp:
+ (WebCore::Layout::InlineFormattingContext::Quirks::initialLineHeight const):
+ (WebCore::Layout::InlineFormattingContext::Quirks::lineHeightConstraints const): Deleted.
+ * layout/inlineformatting/InlineLineBox.h:
+ (WebCore::Layout::LineBox::LineBox):
+ * layout/inlineformatting/InlineLineBuilder.cpp:
+ (WebCore::Layout::LineBuilder::initialize):
+ (WebCore::Layout::LineBuilder::root const):
+ * layout/inlineformatting/InlineLineBuilder.h:
+
2020-08-25 Darin Adler <[email protected]>
REGRESSION (r266028): platform/ios/ios/fast/coordinates/range-client-rects.html
Modified: trunk/Source/WebCore/layout/FormattingContext.h (266124 => 266125)
--- trunk/Source/WebCore/layout/FormattingContext.h 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/FormattingContext.h 2020-08-25 16:39:10 UTC (rev 266125)
@@ -107,11 +107,11 @@
TableNeedsAccessToTableWrapper
};
const Display::Box& geometryForBox(const Box&, Optional<EscapeReason> = WTF::nullopt) const;
+ const ContainerBox& root() const { return *m_root; }
protected:
using LayoutQueue = Vector<const Box*>;
- const ContainerBox& root() const { return *m_root; }
LayoutState& layoutState() const;
const FormattingState& formattingState() const { return m_formattingState; }
FormattingState& formattingState() { return m_formattingState; }
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (266124 => 266125)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2020-08-25 16:39:10 UTC (rev 266125)
@@ -256,7 +256,7 @@
auto layoutRange = LineLayoutContext::InlineItemRange { 0 , inlineItems.size() };
while (!layoutRange.isEmpty()) {
// Only the horiztonal available width is constrained when computing intrinsic width.
- lineBuilder.initialize(LineBuilder::Constraints { { }, availableWidth, false, { } });
+ lineBuilder.initialize(LineBuilder::Constraints { { }, availableWidth, { }, false });
auto lineContent = lineLayoutContext.layoutLine(lineBuilder, layoutRange, { });
layoutRange.start = *lineContent.trailingInlineItemIndex + 1;
// FIXME: Use line logical left and right to take floats into account.
@@ -398,7 +398,7 @@
{
auto lineLogicalLeft = horizontalConstraints.logicalLeft;
auto lineLogicalRight = lineLogicalLeft + horizontalConstraints.logicalWidth;
- auto lineHeightAndBaseline = quirks().lineHeightConstraints(root());
+ auto initialLineHeight = quirks().initialLineHeight(root());
auto lineIsConstrainedByFloat = false;
auto floatingContext = FloatingContext { root(), *this, formattingState().floatingState() };
@@ -405,7 +405,7 @@
// Check for intruding floats and adjust logical left/available width for this line accordingly.
if (!floatingContext.isEmpty()) {
// FIXME: Add support for variable line height, where the intrusive floats should be probed as the line height grows.
- auto floatConstraints = floatingContext.constraints(toLayoutUnit(lineLogicalTop), toLayoutUnit(lineLogicalTop + lineHeightAndBaseline.height));
+ auto floatConstraints = floatingContext.constraints(toLayoutUnit(lineLogicalTop), toLayoutUnit(lineLogicalTop + initialLineHeight));
// Check if these constraints actually put limitation on the line.
if (floatConstraints.left && floatConstraints.left->x <= lineLogicalLeft)
floatConstraints.left = { };
@@ -461,7 +461,7 @@
return geometry().computedTextIndent(root, horizontalConstraints).valueOr(InlineLayoutUnit { });
};
lineLogicalLeft += computedTextIndent();
- return LineBuilder::Constraints { { lineLogicalLeft, lineLogicalTop }, lineLogicalRight - lineLogicalLeft, lineIsConstrainedByFloat, lineHeightAndBaseline };
+ return LineBuilder::Constraints { { lineLogicalLeft, lineLogicalTop }, lineLogicalRight - lineLogicalLeft, initialLineHeight, lineIsConstrainedByFloat };
}
void InlineFormattingContext::setDisplayBoxesForLine(const LineLayoutContext::LineContent& lineContent, const HorizontalConstraints& horizontalConstraints)
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (266124 => 266125)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2020-08-25 16:39:10 UTC (rev 266125)
@@ -51,7 +51,7 @@
class Quirks : public FormattingContext::Quirks {
public:
bool lineDescentNeedsCollapsing(const LineBuilder::RunList&) const;
- LineBuilder::Constraints::HeightAndBaseline lineHeightConstraints(const ContainerBox& formattingRoot) const;
+ InlineLayoutUnit initialLineHeight(const ContainerBox& formattingRoot) const;
private:
friend class InlineFormattingContext;
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp (266124 => 266125)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp 2020-08-25 16:39:10 UTC (rev 266125)
@@ -28,9 +28,6 @@
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-#include "InlineLineBuilder.h"
-#include "LayoutState.h"
-
namespace WebCore {
namespace Layout {
@@ -71,24 +68,13 @@
return true;
}
-LineBuilder::Constraints::HeightAndBaseline InlineFormattingContext::Quirks::lineHeightConstraints(const ContainerBox& formattingRoot) const
+InlineLayoutUnit InlineFormattingContext::Quirks::initialLineHeight(const ContainerBox& formattingRoot) const
{
- // 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.
- InlineLayoutUnit strutHeight = formattingRoot.style().computedLineHeight();
- auto strutBaseline = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), strutHeight).ascent;
- if (layoutState().inNoQuirksMode())
- return { strutHeight, strutBaseline, { } };
-
- auto lineHeight = formattingRoot.style().lineHeight();
- if (lineHeight.isPercentOrCalculated()) {
- auto initialBaseline = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), 0_lu).ascent;
- return { initialBaseline, initialBaseline, AscentAndDescent { strutBaseline, strutHeight - strutBaseline } };
- }
- // FIXME: The only reason why we use intValue() here is to match current inline tree (integral)behavior.
- InlineLayoutUnit initialLineHeight = lineHeight.intValue();
- auto initialBaseline = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), initialLineHeight).ascent;
- return { initialLineHeight, initialBaseline, AscentAndDescent { strutBaseline, strutHeight - strutBaseline } };
+ InlineLayoutUnit computedLineHeight = formattingRoot.style().computedLineHeight();
+ // Negative lineHeight value means the line-height is not set
+ if (layoutState().inNoQuirksMode() || !formattingRoot.style().lineHeight().isNegative())
+ return computedLineHeight;
+ return LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), computedLineHeight).height();
}
}
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h (266124 => 266125)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h 2020-08-25 16:39:10 UTC (rev 266125)
@@ -50,7 +50,7 @@
AscentAndDescent ascentAndDescent;
};
- LineBox(const Display::InlineRect&, const AscentAndDescent&, InlineLayoutUnit alignmentBaseline);
+ LineBox(const Display::InlineRect&, const AscentAndDescent&);
LineBox() = default;
const Display::InlineRect& logicalRect() const { return m_rect; }
@@ -125,9 +125,9 @@
InlineBox m_rootInlineBox;
};
-inline LineBox::LineBox(const Display::InlineRect& rect, const AscentAndDescent& ascentAndDescent, InlineLayoutUnit alignmentBaseline)
+inline LineBox::LineBox(const Display::InlineRect& rect, const AscentAndDescent& ascentAndDescent)
: m_rect(rect)
- , m_alignmentBaseline(alignmentBaseline)
+ , m_alignmentBaseline(ascentAndDescent.ascent)
, m_rootInlineBox(ascentAndDescent)
{
#if ASSERT_ENABLED
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp (266124 => 266125)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp 2020-08-25 16:39:10 UTC (rev 266125)
@@ -79,22 +79,16 @@
void LineBuilder::initialize(const Constraints& constraints)
{
- ASSERT(m_isIntrinsicSizing || constraints.heightAndBaseline);
-
- InlineLayoutUnit initialLineHeight = 0;
- InlineLayoutUnit initialBaseline = 0;
- if (constraints.heightAndBaseline) {
- m_initialStrut = constraints.heightAndBaseline->strut;
- initialLineHeight = constraints.heightAndBaseline->height;
- initialBaseline = constraints.heightAndBaseline->baseline;
- } else
- m_initialStrut = { };
-
- auto lineRect = Display::InlineRect { constraints.logicalTopLeft, 0_lu, initialLineHeight };
- auto ascentAndDescent = AscentAndDescent { initialBaseline, initialLineHeight - initialBaseline };
- m_lineBox = LineBox { lineRect, ascentAndDescent, initialBaseline };
m_lineLogicalWidth = constraints.availableLogicalWidth;
m_hasIntrusiveFloat = constraints.lineIsConstrainedByFloat;
+ auto initialLineHeight = constraints.lineHeight;
+ auto lineRect = Display::InlineRect { constraints.logicalTopLeft, 0_lu, initialLineHeight };
+ auto ascentAndDescent = LineBuilder::halfLeadingMetrics(root().style().fontMetrics(), initialLineHeight);
+ m_lineBox = LineBox { lineRect, ascentAndDescent };
+ if (!layoutState().inNoQuirksMode())
+ m_initialStrut = AscentAndDescent { ascentAndDescent.ascent, initialLineHeight - ascentAndDescent.ascent };
+ else
+ m_initialStrut = { };
resetContent();
}
@@ -727,6 +721,11 @@
return m_inlineFormattingContext;
}
+const ContainerBox& LineBuilder::root() const
+{
+ return formattingContext().root();
+}
+
LineBuilder::TrimmableTrailingContent::TrimmableTrailingContent(RunList& runs)
: m_runs(runs)
{
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h (266124 => 266125)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h 2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h 2020-08-25 16:39:10 UTC (rev 266125)
@@ -46,13 +46,8 @@
struct Constraints {
InlineLayoutPoint logicalTopLeft;
InlineLayoutUnit availableLogicalWidth { 0 };
+ InlineLayoutUnit lineHeight { 0 };
bool lineIsConstrainedByFloat { false };
- struct HeightAndBaseline {
- InlineLayoutUnit height { 0 };
- InlineLayoutUnit baseline { 0 };
- Optional<AscentAndDescent> strut;
- };
- Optional<HeightAndBaseline> heightAndBaseline;
};
enum class IntrinsicSizing { No, Yes };
@@ -192,6 +187,7 @@
LayoutState& layoutState() const;
const InlineFormattingContext& formattingContext() const;
+ const ContainerBox& root() const;
struct TrimmableTrailingContent {
TrimmableTrailingContent(RunList&);