Skip to content

Commit

Permalink
Pick the first or last baseline as appropriate
Browse files Browse the repository at this point in the history
The old logic was always picking the last baseline, but this should only
happen for inline-blocks.

Since replaced elements and flex containers aren't currently setting
their baselines, this is only an improvement for inline-tables.
  • Loading branch information
Loirooriol committed Mar 22, 2024
1 parent 82813a6 commit 16ef6ff
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 4 deletions.
21 changes: 17 additions & 4 deletions components/layout_2020/flow/inline.rs
Expand Up @@ -101,7 +101,9 @@ use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
use crate::flow::float::{FloatBox, SequentialLayoutState};
use crate::flow::FlowLayout;
use crate::formatting_contexts::{Baselines, IndependentFormattingContext};
use crate::formatting_contexts::{
Baselines, IndependentFormattingContext, NonReplacedFormattingContextContents,
};
use crate::fragment_tree::{
BaseFragmentInfo, BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment, FragmentFlags,
PositioningFragment,
Expand Down Expand Up @@ -2114,9 +2116,8 @@ impl IndependentFormattingContext {
}

let size = &pbm_sums.sum().into() + &fragment.content_rect.size;
let baseline_offset = fragment
.baselines
.last
let baseline_offset = self
.pick_baseline(&fragment.baselines)
.map(|baseline| pbm_sums.block_start + baseline)
.unwrap_or(size.block.into());

Expand All @@ -2139,6 +2140,18 @@ impl IndependentFormattingContext {
ifc.have_deferred_soft_wrap_opportunity = true;
}

/// Picks either the first or the last baseline, depending on `baseline-source`.
/// <https://drafts.csswg.org/css-inline/#baseline-source>
fn pick_baseline(&self, baselines: &Baselines) -> Option<Au> {
// TODO: Currently this only supports the initial `baseline-source: auto`.
if let Self::NonReplaced(non_replaced) = self {
if let NonReplacedFormattingContextContents::Flow(_) = non_replaced.contents {
return baselines.last;
}
}
baselines.first
}

fn get_block_sizes_and_baseline_offset(
&self,
ifc: &InlineFormattingContextState,
Expand Down
@@ -0,0 +1,2 @@
[table-vertical-align-baseline-009.xht]
expected: FAIL
13 changes: 13 additions & 0 deletions tests/wpt/meta/MANIFEST.json
Expand Up @@ -106880,6 +106880,19 @@
{}
]
],
"table-vertical-align-baseline-009.xht": [
"4620848ddc19661b5ddfaa34cefc9c9eee266dcb",
[
null,
[
[
"/css/CSS2/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"table-visual-layout-017.xht": [
"25067cb68385a520a10a31949d742b520c7e9cd6",
[
Expand Down
@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>CSS Test: Test for baseline alignment of table cells</title>
<link rel="author" title="Oriol Brufau" href="obrufau@igalia.com" />
<link rel="help" href="https://github.com/servo/servo/issues/31651" />
<link rel="help" href="https://drafts.csswg.org/css2/#height-layout" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="The baseline of the table should be aligned with the baseline of the cell in the first row." />
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style><![CDATA[
span {
font: 50px/1 Ahem;
color: green;
}
]]></style>
</head>
<body>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="float: left; position: relative; font-size: 0; background: red">
<span style="position: absolute; left: 0; bottom: 0">X</span>
<span>X</span>
<span style="display: inline-table">
<span style="display: table-row">X</span>
<span style="display: table-row">X</span>
</span>
</div>
</body>
</html>

0 comments on commit 16ef6ff

Please sign in to comment.