mirror of
https://github.com/servo/servo.git
synced 2025-07-23 15:23:42 +01:00
Pick the first or last baseline as appropriate (#31705)
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.
This commit is contained in:
parent
a53632c0e5
commit
e77dc36842
4 changed files with 61 additions and 4 deletions
|
@ -101,7 +101,9 @@ use crate::cell::ArcRefCell;
|
||||||
use crate::context::LayoutContext;
|
use crate::context::LayoutContext;
|
||||||
use crate::flow::float::{FloatBox, SequentialLayoutState};
|
use crate::flow::float::{FloatBox, SequentialLayoutState};
|
||||||
use crate::flow::FlowLayout;
|
use crate::flow::FlowLayout;
|
||||||
use crate::formatting_contexts::{Baselines, IndependentFormattingContext};
|
use crate::formatting_contexts::{
|
||||||
|
Baselines, IndependentFormattingContext, NonReplacedFormattingContextContents,
|
||||||
|
};
|
||||||
use crate::fragment_tree::{
|
use crate::fragment_tree::{
|
||||||
BaseFragmentInfo, BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment, FragmentFlags,
|
BaseFragmentInfo, BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment, FragmentFlags,
|
||||||
PositioningFragment,
|
PositioningFragment,
|
||||||
|
@ -2114,9 +2116,8 @@ impl IndependentFormattingContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
let size = &pbm_sums.sum().into() + &fragment.content_rect.size;
|
let size = &pbm_sums.sum().into() + &fragment.content_rect.size;
|
||||||
let baseline_offset = fragment
|
let baseline_offset = self
|
||||||
.baselines
|
.pick_baseline(&fragment.baselines)
|
||||||
.last
|
|
||||||
.map(|baseline| pbm_sums.block_start + baseline)
|
.map(|baseline| pbm_sums.block_start + baseline)
|
||||||
.unwrap_or(size.block.into());
|
.unwrap_or(size.block.into());
|
||||||
|
|
||||||
|
@ -2139,6 +2140,18 @@ impl IndependentFormattingContext {
|
||||||
ifc.have_deferred_soft_wrap_opportunity = true;
|
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(
|
fn get_block_sizes_and_baseline_offset(
|
||||||
&self,
|
&self,
|
||||||
ifc: &InlineFormattingContextState,
|
ifc: &InlineFormattingContextState,
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[table-vertical-align-baseline-009.xht]
|
||||||
|
expected: FAIL
|
|
@ -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": [
|
"table-visual-layout-017.xht": [
|
||||||
"25067cb68385a520a10a31949d742b520c7e9cd6",
|
"25067cb68385a520a10a31949d742b520c7e9cd6",
|
||||||
[
|
[
|
||||||
|
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue