mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Fix percentages in the padding of a table-cell (#31430)
This commit is contained in:
parent
b9e217c480
commit
b07505417e
4 changed files with 139 additions and 4 deletions
|
@ -67,6 +67,7 @@ struct TableLayout<'a> {
|
||||||
row_sizes: Vec<Au>,
|
row_sizes: Vec<Au>,
|
||||||
row_baselines: Vec<Au>,
|
row_baselines: Vec<Au>,
|
||||||
cells_laid_out: Vec<Vec<Option<CellLayout>>>,
|
cells_laid_out: Vec<Vec<Option<CellLayout>>>,
|
||||||
|
basis_for_cell_padding_percentage: Au,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -98,6 +99,7 @@ impl<'a> TableLayout<'a> {
|
||||||
row_sizes: Vec::new(),
|
row_sizes: Vec::new(),
|
||||||
row_baselines: Vec::new(),
|
row_baselines: Vec::new(),
|
||||||
cells_laid_out: Vec::new(),
|
cells_laid_out: Vec::new(),
|
||||||
|
basis_for_cell_padding_percentage: Au::zero(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,9 +169,15 @@ impl<'a> TableLayout<'a> {
|
||||||
.max(max_size.inline.min(size.inline))
|
.max(max_size.inline.min(size.inline))
|
||||||
};
|
};
|
||||||
|
|
||||||
let pbm = cell.style.padding_border_margin(containing_block);
|
let inline_padding_border_sum = Au::from(
|
||||||
outer_min_content_width += pbm.padding_border_sums.inline;
|
cell.style
|
||||||
outer_max_content_width += pbm.padding_border_sums.inline;
|
.padding(writing_mode)
|
||||||
|
.percentages_relative_to(Length::zero())
|
||||||
|
.inline_sum() +
|
||||||
|
cell.style.border_width(writing_mode).inline_sum(),
|
||||||
|
);
|
||||||
|
outer_min_content_width += inline_padding_border_sum;
|
||||||
|
outer_max_content_width += inline_padding_border_sum;
|
||||||
|
|
||||||
row_measures[column_index] = CellOrColumnMeasure {
|
row_measures[column_index] = CellOrColumnMeasure {
|
||||||
content_sizes: ContentSizes {
|
content_sizes: ContentSizes {
|
||||||
|
@ -578,6 +586,10 @@ impl<'a> TableLayout<'a> {
|
||||||
// > border spacing (if any). This is the width that we will be able to allocate to the
|
// > border spacing (if any). This is the width that we will be able to allocate to the
|
||||||
// > columns.
|
// > columns.
|
||||||
self.assignable_width = used_width_of_table - inline_border_spacing;
|
self.assignable_width = used_width_of_table - inline_border_spacing;
|
||||||
|
|
||||||
|
// This is the amount that we will use to resolve percentages in the padding of cells.
|
||||||
|
// It matches what Gecko and Blink do, though they disagree when there is a big caption.
|
||||||
|
self.basis_for_cell_padding_percentage = used_width_of_table - border_spacing.inline * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Distribute width to columns, performing step 2.4 of table layout from
|
/// Distribute width to columns, performing step 2.4 of table layout from
|
||||||
|
@ -897,7 +909,7 @@ impl<'a> TableLayout<'a> {
|
||||||
let padding = cell
|
let padding = cell
|
||||||
.style
|
.style
|
||||||
.padding(containing_block.style.writing_mode)
|
.padding(containing_block.style.writing_mode)
|
||||||
.percentages_relative_to(Length::zero());
|
.percentages_relative_to(self.basis_for_cell_padding_percentage.into());
|
||||||
let inline_border_padding_sum = border.inline_sum() + padding.inline_sum();
|
let inline_border_padding_sum = border.inline_sum() + padding.inline_sum();
|
||||||
let mut total_width: CSSPixelLength =
|
let mut total_width: CSSPixelLength =
|
||||||
Length::from(total_width) - inline_border_padding_sum;
|
Length::from(total_width) - inline_border_padding_sum;
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[padding-percentage.html]
|
||||||
|
expected: FAIL
|
|
@ -243079,6 +243079,19 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"tentative": {
|
"tentative": {
|
||||||
|
"padding-percentage.html": [
|
||||||
|
"67f8009de365a32275232b5c5b008072a0c8fc17",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"paint": {
|
"paint": {
|
||||||
"background-image-column-collapsed.html": [
|
"background-image-column-collapsed.html": [
|
||||||
"6e6ae7a82cfd04c09989dcea682744eb79e982a7",
|
"6e6ae7a82cfd04c09989dcea682744eb79e982a7",
|
||||||
|
|
108
tests/wpt/tests/css/css-tables/tentative/padding-percentage.html
Normal file
108
tests/wpt/tests/css/css-tables/tentative/padding-percentage.html
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="author" title="Oriol Brufau" href="obrufau@igalia.com">
|
||||||
|
<link rel="match" href="/css/reference/ref-filled-green-100px-square.xht">
|
||||||
|
<meta name="assert" content="
|
||||||
|
When a table cell has a percentage in the inline axis of the table,
|
||||||
|
it should resolve against zero when computing the column sizes,
|
||||||
|
but once we know the final size of the table, it should re-resolve
|
||||||
|
against that size minus the leading and trailing border spacing.
|
||||||
|
This matches what Blink and Gecko do (WebKit is different).
|
||||||
|
|
||||||
|
Note that Blink and Gecko disagree in case there is a caption:
|
||||||
|
Blink still behaves as per above, while Gecko re-resolves against
|
||||||
|
the sum of column sizes plus the interleaved border spacings.
|
||||||
|
Due to the lack of interoperability, this test doesn't use captions.
|
||||||
|
">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
table {
|
||||||
|
border-spacing: 10px 0;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
td > div {
|
||||||
|
width: 100px;
|
||||||
|
height: 25px;
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
td > div.green {
|
||||||
|
position: relative;
|
||||||
|
background: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
There is one column, it's 100px wide. The percentage resolves against
|
||||||
|
that amount, so the padding becomes 100px.
|
||||||
|
There is an extra spacing of 10px before the 1st column,
|
||||||
|
that's why the table has a -110px margin.
|
||||||
|
-->
|
||||||
|
<table style="margin-left: -110px">
|
||||||
|
<td style="padding-left: 100%">
|
||||||
|
<div class="green"></div>
|
||||||
|
</td>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The 1st column is 110px wide, the 2nd column is 100px wide.
|
||||||
|
And they are separated by 10px, so that's a total of 220px.
|
||||||
|
The percentage resolves against that amount, so the padding
|
||||||
|
becomes 0.5 * 220px + 10px = 120px.
|
||||||
|
There is an extra spacing of 10px before the 1st column,
|
||||||
|
that's why the table has a -130px margin.
|
||||||
|
-->
|
||||||
|
<table style="margin-left: -130px">
|
||||||
|
<td style="padding-left: calc(50% + 10px)">
|
||||||
|
<div class="green"></div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div></div>
|
||||||
|
</td>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
There are 3 columns, each one is 100px wide. They are separated by 10px,
|
||||||
|
so that's a total of 100px * 3 + 10px * 2 = 320px.
|
||||||
|
The percentage resolves against that amount, so the padding becomes
|
||||||
|
320px - 100px = 220px.
|
||||||
|
There is an extra spacing of 10px before the 1st column,
|
||||||
|
that's why the table has a -230px margin.
|
||||||
|
-->
|
||||||
|
<table style="margin-left: -230px">
|
||||||
|
<td style="padding-left: calc(100% - 100px)">
|
||||||
|
<div class="green"></div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div></div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div></div>
|
||||||
|
</td>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
There are 4 columns, the 1st one is 330px wide, each one of the others
|
||||||
|
is 100px wide. They are separated by 10px, so that's a total of
|
||||||
|
330px + 100px * 3 + 10px * 3 = 660px.
|
||||||
|
The percentage resolves against that amount, so the padding becomes
|
||||||
|
0.5 * 660px + 230px = 560px.
|
||||||
|
There is an extra spacing of 10px before the 1st column,
|
||||||
|
that's why the table has a -570px margin.
|
||||||
|
-->
|
||||||
|
<table style="margin-left: -570px">
|
||||||
|
<td style="padding-left: calc(50% + 230px)">
|
||||||
|
<div class="green"></div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div></div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div></div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div></div>
|
||||||
|
</td>
|
||||||
|
</table>
|
Loading…
Add table
Add a link
Reference in a new issue