diff --git a/components/layout_2020/table/construct.rs b/components/layout_2020/table/construct.rs index db7d515aa3e..61f939e9300 100644 --- a/components/layout_2020/table/construct.rs +++ b/components/layout_2020/table/construct.rs @@ -370,82 +370,85 @@ impl TableBuilder { } fn move_row_group_to_front(&mut self, index_to_move: usize) { - if index_to_move == 0 { - return; - } - - // Move the slots associated with this group. - let row_range = self.table.row_groups[index_to_move].track_range.clone(); - let removed_slots: Vec> = self - .table - .slots - .splice(row_range.clone(), std::iter::empty()) - .collect(); - self.table.slots.splice(0..0, removed_slots); - - // Move the rows associated with this group. - let removed_rows: Vec = self - .table - .rows - .splice(row_range, std::iter::empty()) - .collect(); - self.table.rows.splice(0..0, removed_rows); - // Move the group itself. - let removed_row_group = self.table.row_groups.remove(index_to_move); - self.table.row_groups.insert(0, removed_row_group); + if index_to_move > 0 { + let removed_row_group = self.table.row_groups.remove(index_to_move); + self.table.row_groups.insert(0, removed_row_group); - for row in self.table.rows.iter_mut() { - match row.group_index.as_mut() { - Some(group_index) if *group_index < index_to_move => *group_index += 1, - Some(group_index) if *group_index == index_to_move => *group_index = 0, - _ => {}, + for row in self.table.rows.iter_mut() { + match row.group_index.as_mut() { + Some(group_index) if *group_index < index_to_move => *group_index += 1, + Some(group_index) if *group_index == index_to_move => *group_index = 0, + _ => {}, + } } } - // Do this now, rather than after possibly moving a `` row group to the end, - // because moving row groups depends on an accurate `track_range` in every group. - self.regenerate_track_ranges(); + let row_range = self.table.row_groups[0].track_range.clone(); + if row_range.start > 0 { + // Move the slots associated with the moved group. + let removed_slots: Vec> = self + .table + .slots + .splice(row_range.clone(), std::iter::empty()) + .collect(); + self.table.slots.splice(0..0, removed_slots); + + // Move the rows associated with the moved group. + let removed_rows: Vec = self + .table + .rows + .splice(row_range, std::iter::empty()) + .collect(); + self.table.rows.splice(0..0, removed_rows); + + // Do this now, rather than after possibly moving a `` row group to the end, + // because moving row groups depends on an accurate `track_range` in every group. + self.regenerate_track_ranges(); + } } fn move_row_group_to_end(&mut self, index_to_move: usize) { let last_row_group_index = self.table.row_groups.len() - 1; - if index_to_move == last_row_group_index { - return; - } - - // Move the slots associated with this group. - let row_range = self.table.row_groups[index_to_move].track_range.clone(); - let removed_slots: Vec> = self - .table - .slots - .splice(row_range.clone(), std::iter::empty()) - .collect(); - self.table.slots.extend(removed_slots); - - // Move the rows associated with this group. - let removed_rows: Vec = self - .table - .rows - .splice(row_range, std::iter::empty()) - .collect(); - self.table.rows.extend(removed_rows); // Move the group itself. - let removed_row_group = self.table.row_groups.remove(index_to_move); - self.table.row_groups.push(removed_row_group); + if index_to_move < last_row_group_index { + let removed_row_group = self.table.row_groups.remove(index_to_move); + self.table.row_groups.push(removed_row_group); - for row in self.table.rows.iter_mut() { - match row.group_index.as_mut() { - Some(group_index) if *group_index > index_to_move => *group_index -= 1, - Some(group_index) if *group_index == index_to_move => { - *group_index = last_row_group_index - }, - _ => {}, + for row in self.table.rows.iter_mut() { + match row.group_index.as_mut() { + Some(group_index) if *group_index > index_to_move => *group_index -= 1, + Some(group_index) if *group_index == index_to_move => { + *group_index = last_row_group_index + }, + _ => {}, + } } } - self.regenerate_track_ranges(); + let row_range = self.table.row_groups[last_row_group_index] + .track_range + .clone(); + if row_range.end < self.table.rows.len() { + // Move the slots associated with the moved group. + let removed_slots: Vec> = self + .table + .slots + .splice(row_range.clone(), std::iter::empty()) + .collect(); + self.table.slots.extend(removed_slots); + + // Move the rows associated with the moved group. + let removed_rows: Vec = self + .table + .rows + .splice(row_range, std::iter::empty()) + .collect(); + self.table.rows.extend(removed_rows); + + self.regenerate_track_ranges(); + } } /// Turn all rowspan=0 rows into the real value to avoid having to make the calculation diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 7b19a43e09f..bf77ff912e0 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -108798,6 +108798,32 @@ {} ] ], + "table-footer-group-001.xht": [ + "e32e2dac22df85b038237fbd59a9fb8d85708ff6", + [ + null, + [ + [ + "/css/CSS2/tables/table-row-group-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "table-header-group-001.xht": [ + "0d8f4798052d5ff68fc2fd05e7d5ec29d107b3ec", + [ + null, + [ + [ + "/css/CSS2/tables/table-row-group-001-ref.xht", + "==" + ] + ], + {} + ] + ], "table-height-algorithm-008a.xht": [ "eaaf04f759be858bbe0d8b103930748bfd4bf1e7", [ @@ -108863,6 +108889,19 @@ {} ] ], + "table-row-group-001.xht": [ + "a0f7966e35e68b0fea10309dcdc83b51e2e15372", + [ + null, + [ + [ + "/css/CSS2/tables/table-row-group-001-ref.xht", + "==" + ] + ], + {} + ] + ], "table-vertical-align-baseline-001.xht": [ "1862eb41f7f14cb6f77320f6e1e3fa7986c9ff00", [ @@ -391423,6 +391462,10 @@ "8ea849424688a0f3a3b9a345b32e53b6ad1d76c5", [] ], + "table-row-group-001-ref.xht": [ + "c58134ae3594a80e3512b1aeac8957ec0d3a1ef9", + [] + ], "table-vertical-align-baseline-001-ref.xht": [ "9d4b753a6dd0c1cba08d83d80180459e4f2ad593", [] @@ -849035,13 +849078,6 @@ {} ] ], - "table-footer-group-001.xht": [ - "fb2338caf47a312e9580e04333ada107762c4a9b", - [ - null, - {} - ] - ], "table-footer-group-002.xht": [ "a041b45789125f283f5f033417ec5d397b73f29c", [ @@ -849063,13 +849099,6 @@ {} ] ], - "table-header-group-001.xht": [ - "0b3a595cb77ba8f90ab87c2ec34cbdf29ddf0a06", - [ - null, - {} - ] - ], "table-header-group-002.xht": [ "0e03b0a045f8ff3bee300288f0fac4f4c3469021", [ @@ -849609,13 +849638,6 @@ {} ] ], - "table-row-group-001.xht": [ - "d5a85400ae64a21080c424aeae2b7f919b818426", - [ - null, - {} - ] - ], "table-valign-001.xht": [ "021a3e76e04eee628237b1a8473ab0d7b5e9c282", [ diff --git a/tests/wpt/tests/css/CSS2/tables/table-footer-group-001.xht b/tests/wpt/tests/css/CSS2/tables/table-footer-group-001.xht index fb2338caf47..e32e2dac22d 100644 --- a/tests/wpt/tests/css/CSS2/tables/table-footer-group-001.xht +++ b/tests/wpt/tests/css/CSS2/tables/table-footer-group-001.xht @@ -4,6 +4,7 @@ CSS Test: Table-footer-group +