Bug 243940 - REGRESSION(252825@main): wpt /css/CSS2/visudet/inline-block-baseline-011.xht & inline-block-baseline-014.xht
Summary: REGRESSION(252825@main): wpt /css/CSS2/visudet/inline-block-baseline-011.xht ...
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: Layout and Rendering (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL: http://wpt.live/css/CSS2/visudet/inli...
Keywords: InRadar, WPTImpact
Depends on:
Blocks:
 
Reported: 2022-08-15 09:32 PDT by Sam Sneddon [:gsnedders]
Modified: 2023-11-24 18:19 PST (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Comment 1 Radar WebKit Bug Importer 2022-08-15 09:33:04 PDT
<rdar://problem/98673438>
Comment 2 zalan 2022-08-15 20:33:05 PDT
This is about integral based alignment vs. non-integral based box model values
e.g:
vertical-align: -0.5px; -> turns into 0px
margin-bottom: 0.5px; -> stays at 0.5px

these tests trigger this mismatch through the combination of 'font-size: 15px' and 'align/margin -> 0.5em'.

Legacy line layout is historically integral based, while IFC is not, currently it is forced to match legacy behavior through explicit flooring/ceiling of certain values.
Comment 3 zalan 2022-08-16 08:32:05 PDT
This is actually broken (and probably has been broken forever) with legacy line layout and now IFC just matches this broken behavior. :(
Comment 4 zalan 2022-08-16 09:11:49 PDT
Not forcing integral rounding fixes the issue (see below). So while 252825@main looks like the regression point, it never worked in IFC either, it was just covered by the directional rounding bug -which got corrected in 252825@main.
The actual cause of this bug is the explicit rounding we need to do in IFC to match legacy line layout behavior.

diff --git a/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h b/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h
index 0ac8876b9a15..16420dd6b53c 100644
--- a/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h
+++ b/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h
@@ -123,11 +123,11 @@ private:
 
     // FIXME: Remove legacy rounding.
     void setLogicalWidth(InlineLayoutUnit logicalWidth) { m_logicalRect.setWidth(logicalWidth); }
-    void setLogicalHeight(InlineLayoutUnit logicalHeight) { m_logicalRect.setHeight(roundToInt(logicalHeight)); }
-    void setLogicalTop(InlineLayoutUnit logicalTop) { m_logicalRect.setTop(logicalTop >= 0 ? roundToInt(logicalTop) : -roundToInt(-logicalTop)); }
-    void setAscent(InlineLayoutUnit ascent) { m_ascent = roundToInt(ascent); }
-    void setDescent(InlineLayoutUnit descent) { m_descent = roundToInt(descent); }
-    void setLayoutBounds(const LayoutBounds& layoutBounds) { m_layoutBounds = { InlineLayoutUnit(roundToInt(layoutBounds.ascent)), InlineLayoutUnit(roundToInt(layoutBounds.descent)) }; }
+    void setLogicalHeight(InlineLayoutUnit logicalHeight) { m_logicalRect.setHeight(logicalHeight); }
+    void setLogicalTop(InlineLayoutUnit logicalTop) { m_logicalRect.setTop(logicalTop); }
+    void setAscent(InlineLayoutUnit ascent) { m_ascent = ascent; }
+    void setDescent(InlineLayoutUnit descent) { m_descent = descent; }
+    void setLayoutBounds(const LayoutBounds& layoutBounds) { m_layoutBounds = { InlineLayoutUnit(layoutBounds.ascent), InlineLayoutUnit(layoutBounds.descent) }; }
 
     void setIsFirstBox() { m_isFirstWithinLayoutBox = true; }
     void setIsLastBox() { m_isLastWithinLayoutBox = true; }