aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout/table.rs32
-rw-r--r--components/layout/table_row.rs38
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-bottom-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-bottom-color-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-bottom-width-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-conflict-style-101.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-left-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-left-color-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-left-width-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-right-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-right-color-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/border-right-width-applies-to-004.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/vertical-align-121.htm.ini3
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json24
-rw-r--r--tests/wpt/mozilla/tests/css/border_collapse_row_a.html31
-rw-r--r--tests/wpt/mozilla/tests/css/border_collapse_row_ref.html34
-rw-r--r--tests/wpt/mozilla/tests/css/border_collapse_simple_a.html13
17 files changed, 147 insertions, 58 deletions
diff --git a/components/layout/table.rs b/components/layout/table.rs
index 96475f4a9e2..a67312d1bc3 100644
--- a/components/layout/table.rs
+++ b/components/layout/table.rs
@@ -311,12 +311,13 @@ impl Flow for TableFlow {
&mut self.collapsed_block_direction_border_widths_for_table);
previous_collapsed_block_end_borders =
PreviousBlockCollapsedBorders::FromPreviousRow(
- row.final_collapsed_borders.block_end.clone())
+ row.final_collapsed_borders.block_end.clone());
}
first_row = false
- }
+ };
}
+
computation.surrounding_size = computation.surrounding_size +
self.total_horizontal_spacing();
@@ -425,7 +426,7 @@ impl Flow for TableFlow {
collapsed_inline_direction_border_widths_for_table,
&mut collapsed_block_direction_border_widths_for_table);
}
- })
+ });
}
fn assign_block_size<'a>(&mut self, _: &'a LayoutContext<'a>) {
@@ -589,7 +590,7 @@ impl ColumnIntrinsicInlineSize {
///
/// TODO(pcwalton): There will probably be some `border-collapse`-related info in here too
/// eventually.
-#[derive(RustcEncodable, Clone, Copy)]
+#[derive(RustcEncodable, Clone, Copy, Debug)]
pub struct ColumnComputedInlineSize {
/// The computed size of this inline column.
pub size: Au,
@@ -629,27 +630,21 @@ fn perform_border_collapse_for_row(child_table_row: &mut TableRowFlow,
next_block_borders: NextBlockCollapsedBorders,
inline_spacing: &mut Vec<Au>,
block_spacing: &mut Vec<Au>) {
+ let number_of_borders_inline_direction = child_table_row.preliminary_collapsed_borders.inline.len();
// Compute interior inline borders.
for (i, this_inline_border) in child_table_row.preliminary_collapsed_borders
.inline
- .iter()
+ .iter_mut()
.enumerate() {
child_table_row.final_collapsed_borders.inline.push_or_set(i, *this_inline_border);
+ if i == 0 {
+ child_table_row.final_collapsed_borders.inline[i].combine(&table_inline_borders.start);
+ } else if i + 1 == number_of_borders_inline_direction {
+ child_table_row.final_collapsed_borders.inline[i].combine(&table_inline_borders.end);
+ }
let inline_spacing = inline_spacing.get_mut_or_push(i, Au(0));
- *inline_spacing = cmp::max(*inline_spacing, this_inline_border.width)
- }
-
- // Collapse edge interior borders with the table.
- if let Some(ref mut first_inline_borders) = child_table_row.final_collapsed_borders
- .inline
- .get_mut(0) {
- first_inline_borders.combine(&table_inline_borders.start)
- }
- if let Some(ref mut last_inline_borders) = child_table_row.final_collapsed_borders
- .inline
- .last_mut() {
- last_inline_borders.combine(&table_inline_borders.end)
+ *inline_spacing = cmp::max(*inline_spacing, child_table_row.final_collapsed_borders.inline[i].width)
}
// Compute block-start borders.
@@ -777,6 +772,7 @@ impl TableLikeFlow for BlockFlow {
}
/// Inline collapsed borders for the table itself.
+#[derive(Debug)]
struct TableInlineCollapsedBorders {
/// The table border at the start of the inline direction.
start: CollapsedBorder,
diff --git a/components/layout/table_row.rs b/components/layout/table_row.rs
index a941905e5e9..d3066ff0a6a 100644
--- a/components/layout/table_row.rs
+++ b/components/layout/table_row.rs
@@ -245,10 +245,13 @@ impl Flow for TableRowFlow {
.style()
.get_inheritedtable()
.border_collapse == border_collapse::T::collapse;
- // FIXME(pcwalton): Shouldn't use `CollapsedBorder::new()` here.
- self.preliminary_collapsed_borders.reset(CollapsedBorder::new());
+ let row_style = &*self.block_flow.fragment.style;
+ self.preliminary_collapsed_borders.reset(
+ CollapsedBorder::inline_start(&row_style,
+ CollapsedBorderProvenance::FromTableRow));
{
+ let children_count = self.block_flow.base.children.len();
let mut iterator = self.block_flow.base.child_iter_mut().enumerate().peekable();
while let Some((i, kid)) = iterator.next() {
assert!(kid.is_table_cell());
@@ -268,6 +271,8 @@ impl Flow for TableRowFlow {
// Perform border collapse if necessary.
if collapsing_borders {
perform_inline_direction_border_collapse_for_row(
+ row_style,
+ children_count,
i,
child_table_cell,
&mut iterator,
@@ -829,10 +834,20 @@ pub struct BorderCollapseInfoForChildTableCell<'a> {
/// table row. This is done eagerly here so that at least the inline inside border collapse
/// computations can be parallelized across all the rows of the table.
fn perform_inline_direction_border_collapse_for_row(
+ row_style: &ServoComputedValues,
+ children_count: usize,
child_index: usize,
child_table_cell: &mut TableCellFlow,
iterator: &mut Peekable<Enumerate<MutFlowListIterator>>,
preliminary_collapsed_borders: &mut CollapsedBordersForRow) {
+ // In the first cell, combine its border with the one coming from the row.
+ if child_index == 0 {
+ let first_inline_border = &mut preliminary_collapsed_borders.inline[0];
+ first_inline_border.combine(
+ &CollapsedBorder::inline_start(&*child_table_cell.block_flow.fragment.style,
+ CollapsedBorderProvenance::FromPreviousTableCell));
+ }
+
let inline_collapsed_border = preliminary_collapsed_borders.inline.push_or_set(
child_index + 1,
CollapsedBorder::inline_end(&*child_table_cell.block_flow.fragment.style,
@@ -845,12 +860,25 @@ fn perform_inline_direction_border_collapse_for_row(
CollapsedBorderProvenance::FromNextTableCell))
};
- let block_start_border =
+ // In the last cell, also take into account the border that may
+ // come from the row.
+ if child_index + 1 == children_count {
+ inline_collapsed_border.combine(
+ &CollapsedBorder::inline_end(&row_style,
+ CollapsedBorderProvenance::FromTableRow));
+ }
+
+ let mut block_start_border =
CollapsedBorder::block_start(&*child_table_cell.block_flow.fragment.style,
CollapsedBorderProvenance::FromNextTableCell);
+ block_start_border.combine(
+ &CollapsedBorder::block_start(row_style, CollapsedBorderProvenance::FromTableRow));
preliminary_collapsed_borders.block_start.push_or_set(child_index, block_start_border);
- let block_end_border =
+ let mut block_end_border =
CollapsedBorder::block_end(&*child_table_cell.block_flow.fragment.style,
- CollapsedBorderProvenance::FromPreviousTableCell);
+ CollapsedBorderProvenance::FromPreviousTableCell);
+ block_end_border.combine(
+ &CollapsedBorder::block_end(row_style, CollapsedBorderProvenance::FromTableRow));
+
preliminary_collapsed_borders.block_end.push_or_set(child_index, block_end_border);
}
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-bottom-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-bottom-applies-to-004.htm.ini
deleted file mode 100644
index cb7bc34f4aa..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-bottom-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-bottom-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-bottom-color-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-bottom-color-applies-to-004.htm.ini
deleted file mode 100644
index 58052df51f7..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-bottom-color-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-bottom-color-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-bottom-width-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-bottom-width-applies-to-004.htm.ini
deleted file mode 100644
index 085387ca440..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-bottom-width-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-bottom-width-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-conflict-style-101.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-conflict-style-101.htm.ini
deleted file mode 100644
index 4267eba2649..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-conflict-style-101.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-conflict-style-101.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-left-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-left-applies-to-004.htm.ini
deleted file mode 100644
index 33c1edd3ed2..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-left-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-left-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-left-color-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-left-color-applies-to-004.htm.ini
deleted file mode 100644
index 366584c2505..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-left-color-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-left-color-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-left-width-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-left-width-applies-to-004.htm.ini
deleted file mode 100644
index 1738c9b0873..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-left-width-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-left-width-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-right-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-right-applies-to-004.htm.ini
deleted file mode 100644
index 13778865155..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-right-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-right-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-right-color-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-right-color-applies-to-004.htm.ini
deleted file mode 100644
index 74d5389878e..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-right-color-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-right-color-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-right-width-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-right-width-applies-to-004.htm.ini
deleted file mode 100644
index 6d43191e6da..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/border-right-width-applies-to-004.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[border-right-width-applies-to-004.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/vertical-align-121.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/vertical-align-121.htm.ini
deleted file mode 100644
index e6e98afb794..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/vertical-align-121.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[vertical-align-121.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index 48caf7e5b3d..d94defbd2d7 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -804,6 +804,18 @@
"url": "/_mozilla/css/border_collapse_missing_cell_a.html"
}
],
+ "css/border_collapse_row_a.html": [
+ {
+ "path": "css/border_collapse_row_a.html",
+ "references": [
+ [
+ "/_mozilla/css/border_collapse_row_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/border_collapse_row_a.html"
+ }
+ ],
"css/border_collapse_rowgroup_a.html": [
{
"path": "css/border_collapse_rowgroup_a.html",
@@ -10150,6 +10162,18 @@
"url": "/_mozilla/css/border_collapse_missing_cell_a.html"
}
],
+ "css/border_collapse_row_a.html": [
+ {
+ "path": "css/border_collapse_row_a.html",
+ "references": [
+ [
+ "/_mozilla/css/border_collapse_row_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/border_collapse_row_a.html"
+ }
+ ],
"css/border_collapse_rowgroup_a.html": [
{
"path": "css/border_collapse_rowgroup_a.html",
diff --git a/tests/wpt/mozilla/tests/css/border_collapse_row_a.html b/tests/wpt/mozilla/tests/css/border_collapse_row_a.html
new file mode 100644
index 00000000000..25848243af1
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/border_collapse_row_a.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>row border collapse test</title>
+ <link rel="match" href="border_collapse_row_ref.html">
+ <style>
+ table {
+ border-collapse: collapse;
+ }
+ td {
+ width: 64px;
+ height: 32px;
+ }
+ .tr_with_border {
+ border-top: 2px solid black;
+ border-right: 2px solid black;
+ border-bottom: 2px solid black;
+ }
+ </style>
+ </head>
+ <body>
+ <table>
+ <tr><td></td><td></td></tr>
+ <tr class="tr_with_border"><td></td><td></td></tr>
+ <tr class="tr_with_border"><td></td><td></td></tr>
+ <tr class="tr_with_border"><td></td><td></td></tr>
+ <tr class="tr_with_border"><td></td><td></td></tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/mozilla/tests/css/border_collapse_row_ref.html b/tests/wpt/mozilla/tests/css/border_collapse_row_ref.html
new file mode 100644
index 00000000000..969b493d880
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/border_collapse_row_ref.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>row border collapse test - reference</title>
+ <style>
+ table {
+ border-collapse: collapse;
+ }
+ td {
+ width: 64px;
+ height: 32px;
+ }
+ .td_left {
+ border-top: 2px solid black;
+ border-bottom: 2px solid black;
+ }
+ .td_right {
+ border-top: 2px solid black;
+ border-right: 2px solid black;
+ border-bottom: 2px solid black;
+ }
+ </style>
+ </head>
+ <body>
+ <table>
+ <tr><td></td><td></td></tr>
+ <tr><td class="td_left"></td><td class="td_right"</td></tr>
+ <tr><td class="td_left"></td><td class="td_right"</td></tr>
+ <tr><td class="td_left"></td><td class="td_right"</td></tr>
+ <tr><td class="td_left"></td><td class="td_right"</td></tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/mozilla/tests/css/border_collapse_simple_a.html b/tests/wpt/mozilla/tests/css/border_collapse_simple_a.html
index afed02bcb60..2a2676b9987 100644
--- a/tests/wpt/mozilla/tests/css/border_collapse_simple_a.html
+++ b/tests/wpt/mozilla/tests/css/border_collapse_simple_a.html
@@ -8,6 +8,9 @@
FIXME(pcwalton): This is currently offset by -2px in block and inline directions because we
don't correctly handle collapsed borders when calculating `table_border_padding` in
`table_wrapper.rs`.
+
+ FIXME(gpoesia): This test does not behave exactly like Gecko yet, because cell5's
+ height is currently 2px smaller in Servo.
-->
<link rel=match href=border_collapse_simple_ref.html>
<style>
@@ -19,7 +22,7 @@ html {
}
body {
/* See `FIXME` above. */
- padding: 2px;
+ padding-top: 2px;
}
table {
border-collapse: collapse;
@@ -28,14 +31,20 @@ table {
td {
border: 2px solid black;
padding: 16px;
- width: 32px;
+ width: 30px;
height: 32px;
}
td.cell5 {
border: 30px solid black;
+ width: 32px;
}
td.cell6 {
border: 4px solid black;
+ width: 32px;
+}
+
+#row1 td {
+ height: 32px;
}
</style>
</head>