Skip to content

Commit

Permalink
[last-baseline] Clamp first/last baselines to border-box...
Browse files Browse the repository at this point in the history
... if in a scroll container.

See: w3c/csswg-drafts#7660

Effectively if we are in a scroll container (overflow:hidden or
overflow:scroll) clamp the baselines to the border-box edges.

Bug: 885175
Change-Id: I9c53e736fa156c5239384a5d11154a27643a6ac8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3925659
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: David Grogan <dgrogan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1054237}
  • Loading branch information
bfgeek authored and Chromium LUCI CQ committed Oct 3, 2022
1 parent 351e8c5 commit 75f43ae
Show file tree
Hide file tree
Showing 15 changed files with 569 additions and 4 deletions.
20 changes: 16 additions & 4 deletions third_party/blink/renderer/core/layout/ng/ng_box_fragment.h
Expand Up @@ -30,8 +30,14 @@ class CORE_EXPORT NGBoxFragment final : public NGFragment {
}

absl::optional<LayoutUnit> FirstBaseline() const {
return IsWritingModeEqual() ? PhysicalBoxFragment().FirstBaseline()
: absl::nullopt;
if (!IsWritingModeEqual())
return absl::nullopt;

auto baseline = PhysicalBoxFragment().FirstBaseline();
if (baseline && physical_fragment_.IsScrollContainer())
baseline = std::max(LayoutUnit(), std::min(*baseline, BlockSize()));

return baseline;
}

LayoutUnit FirstBaselineOrSynthesize(FontBaseline baseline_type) const {
Expand All @@ -45,8 +51,14 @@ class CORE_EXPORT NGBoxFragment final : public NGFragment {
}

absl::optional<LayoutUnit> LastBaseline() const {
return IsWritingModeEqual() ? PhysicalBoxFragment().LastBaseline()
: absl::nullopt;
if (!IsWritingModeEqual())
return absl::nullopt;

auto baseline = PhysicalBoxFragment().LastBaseline();
if (baseline && physical_fragment_.IsScrollContainer())
baseline = std::max(LayoutUnit(), std::min(*baseline, BlockSize()));

return baseline;
}

LayoutUnit LastBaselineOrSynthesize(FontBaseline baseline_type) const {
Expand Down
Expand Up @@ -457,6 +457,9 @@ crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-flex
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-grid-001.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-grid-002.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-grid-003.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-overflow-001.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-overflow-002.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-overflow-003.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-table-001.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-table-002.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/alignment/flex-align-baseline-table-003.html [ Failure ]
Expand Down Expand Up @@ -609,6 +612,9 @@ crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-flex-0
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-grid-001.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-grid-002.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-grid-003.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-overflow-001.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-overflow-002.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-overflow-003.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-table-001.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-table-002.html [ Failure ]
crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-align-baseline-table-003.html [ Failure ]
Expand Down
@@ -0,0 +1,90 @@
<!DOCTYPE html>
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7660">
<style>
.target {
display: flex;
position: relative;
line-height: 0;
font-size: 20px;
inline-size: 300px;
margin-block: 10px;
padding: 10px;
border: solid 3px;
}

.inner {
overflow: hidden;
inline-size: 100px;
block-size: 80px;
margin: 10px;
border: solid 5px;
padding: 10px;
font-size: 30px;
}

span {
display: inline-block;
width: 1em;
height: 1em;
outline: solid cyan 3px;
outline-offset: -3px;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<body onload="checkLayout('.target > *')">

<div class="target" style="align-items: first baseline;">
<div data-offset-y="45"><span></span><br><span></span></div>
<div class="inner" data-offset-y="20">
<div>
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-y="55"><span></span><br><span></span></div>
<div class="inner" data-offset-y="20">
<div>
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: first baseline;">
<div data-offset-y="10"><span></span><br><span></span></div>
<div class="inner" data-offset-y="30">
<div style="margin-block-start: -200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-y="10"><span></span><br><span></span></div>
<div class="inner" data-offset-y="50">
<div style="margin-block-start: -200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: first baseline;">
<div data-offset-y="110"><span></span><br><span></span></div>
<div class="inner" data-offset-y="20">
<div style="margin-block-start: 200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-y="90"><span></span><br><span></span></div>
<div class="inner" data-offset-y="20">
<div style="margin-block-start: 200px;">
<span></span><br><span></span>
</div>
</div>
</div>
@@ -0,0 +1,91 @@
<!DOCTYPE html>
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7660">
<style>
.target {
display: flex;
position: relative;
line-height: 0;
font-size: 20px;
inline-size: 300px;
margin-block: 10px;
padding: 10px;
border: solid 3px;
writing-mode: vertical-rl;
}

.inner {
overflow: hidden;
inline-size: 100px;
block-size: 80px;
margin: 10px;
border: solid 5px;
padding: 10px;
font-size: 30px;
}

span {
display: inline-block;
width: 1em;
height: 1em;
outline: solid cyan 3px;
outline-offset: -3px;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<body onload="checkLayout('.target > *')">

<div class="target" style="align-items: first baseline;">
<div data-offset-x="70"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div>
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-x="60"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div>
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: first baseline;">
<div data-offset-x="100"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div style="margin-block-start: -200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-x="120"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div style="margin-block-start: -200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: first baseline;">
<div data-offset-x="10"><span></span><br><span></span></div>
<div class="inner" data-offset-x="40">
<div style="margin-block-start: 200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-x="10"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div style="margin-block-start: 200px;">
<span></span><br><span></span>
</div>
</div>
</div>
@@ -0,0 +1,91 @@
<!DOCTYPE html>
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7660">
<style>
.target {
display: flex;
position: relative;
line-height: 0;
font-size: 20px;
inline-size: 300px;
margin-block: 10px;
padding: 10px;
border: solid 3px;
writing-mode: vertical-lr;
}

.inner {
overflow: hidden;
inline-size: 100px;
block-size: 80px;
margin: 10px;
border: solid 5px;
padding: 10px;
font-size: 30px;
}

span {
display: inline-block;
width: 1em;
height: 1em;
outline: solid cyan 3px;
outline-offset: -3px;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<body onload="checkLayout('.target > *')">

<div class="target" style="align-items: first baseline;">
<div data-offset-x="40"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div>
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-x="50"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div>
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: first baseline;">
<div data-offset-x="10"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div style="margin-block-start: -200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-x="10"><span></span><br><span></span></div>
<div class="inner" data-offset-x="40">
<div style="margin-block-start: -200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: first baseline;">
<div data-offset-x="120"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div style="margin-block-start: 200px;">
<span></span><br><span></span>
</div>
</div>
</div>

<div class="target" style="align-items: last baseline;">
<div data-offset-x="100"><span></span><br><span></span></div>
<div class="inner" data-offset-x="20">
<div style="margin-block-start: 200px;">
<span></span><br><span></span>
</div>
</div>
</div>

0 comments on commit 75f43ae

Please sign in to comment.