[css-grid] Fix grid container baseline alignment for orthogonal items
Grid container baseline was wrongly computed when done in reference
to an orthogonal item.
The fix is a simple change in LayoutGrid::FirstLineBoxBaseline()
to use LogicalTopForChild() so it takes into account grid container
and item writing modes.
BUG=943003
TEST=external/wpt/css/css-grid/alignment/grid-container-baseline-001.html
Change-Id: I86301933ac9ec30f6fee138cd49981bb79a4484e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1528183
Reviewed-by: Javier Fernandez <jfernandez@igalia.com>
Reviewed-by: Oriol Brufau <obrufau@igalia.com>
Commit-Queue: Manuel Rego <rego@igalia.com>
Cr-Commit-Position: refs/heads/master@{#641633}
diff --git a/third_party/blink/renderer/core/layout/layout_grid.cc b/third_party/blink/renderer/core/layout/layout_grid.cc
index 11df0a8..666eb24 100644
--- a/third_party/blink/renderer/core/layout/layout_grid.cc
+++ b/third_party/blink/renderer/core/layout/layout_grid.cc
@@ -1659,7 +1659,7 @@
LineDirectionMode direction =
IsHorizontalWritingMode() ? kHorizontalLine : kVerticalLine;
return SynthesizedBaselineFromBorderBox(*baseline_child, direction) +
- baseline_child->LogicalTop();
+ LogicalTopForChild(*baseline_child);
}
return baseline + baseline_child->LogicalTop();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-container-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-container-baseline-001.html
new file mode 100644
index 0000000..d352977
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-container-baseline-001.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid container baseline</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-baselines">
+<meta name="assert" content="Grid container baseline should match the element with 'align-self: baseline' in the first row, even if it's an orthogonal element.">
+<style>
+.wrapper {
+ position: relative;
+ margin: 10px;
+}
+
+.grid {
+ display: inline-grid;
+ grid-auto-flow: column;
+ background: grey;
+}
+
+.i1 {
+ width: 150px;
+ height: 100px;
+ background: magenta;
+}
+
+.i2 {
+ align-self: baseline;
+ width: 75px;
+ height: 50px;
+ background: cyan;
+}
+
+.i3 {
+ width: 100px;
+ height: 75px;
+ background: yellow;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.wrapper')">
+
+<div class="wrapper" style="writing-mode: horizontal-tb;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-y="40"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" data-offset-y="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-y="40"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: horizontal-tb;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-y="40"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" style="writing-mode: vertical-lr;" data-offset-y="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-y="40"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: horizontal-tb;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-y="40"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" style="writing-mode: vertical-rl;" data-offset-y="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-y="40"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-lr;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" data-offset-x="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-lr;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" style="writing-mode: horizontal-tb;" data-offset-x="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-lr; text-orientation: sideways;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" data-offset-x="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-lr; text-orientation: sideways;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" style="writing-mode: horizontal-tb;" data-offset-x="0"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-rl;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" data-offset-x="75"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-rl;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" style="writing-mode: horizontal-tb;" data-offset-x="75"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="65"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-rl; text-orientation: sideways;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" data-offset-x="75"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+</div>
+
+<div class="wrapper" style="writing-mode: vertical-rl; text-orientation: sideways;">
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+ <div class="grid">
+ <div class="i1"></div>
+ <div class="i2" style="writing-mode: horizontal-tb;" data-offset-x="75"></div>
+ <div class="i3"></div>
+ </div>
+ <div style="display: inline-block; width: 20px; height: 10px; background: black" data-offset-x="75"></div>
+</div>
+
+</body>