From f0954f8799f7d52476f694fd7bbda86c03229f5d Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 14 Apr 2015 15:57:32 -0700 Subject: [PATCH] =?UTF-8?q?layout:=20Generate=20anonymous=20table=20object?= =?UTF-8?q?s=20as=20necessary=20per=20CSS=202.1=20=C2=A7=2017.2.1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improves Facebook Timeline. --- components/layout/construct.rs | 43 +++++++++++++++++++++++++++-- tests/ref/basic.list | 1 + tests/ref/table_cell_float_a.html | 29 +++++++++++++++++++ tests/ref/table_cell_float_ref.html | 31 +++++++++++++++++++++ 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 tests/ref/table_cell_float_a.html create mode 100644 tests/ref/table_cell_float_ref.html diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 8bac5dccb72..f945e8bb526 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -302,6 +302,41 @@ impl<'a> FlowConstructor<'a> { Fragment::new(node, specific_fragment_info) } + /// Generates anonymous table objects per CSS 2.1 ยง 17.2.1. + fn generate_anonymous_table_flows_if_necessary(&mut self, + flow: &mut FlowRef, + child: &mut FlowRef, + child_node: &ThreadSafeLayoutNode) { + if !flow.is_block_flow() { + return + } + + if child.is_table_cell() { + let fragment = Fragment::new(child_node, SpecificFragmentInfo::TableRow); + let mut new_child = FlowRef::new(box TableRowFlow::from_node_and_fragment(child_node, + fragment)); + new_child.add_new_child(child.clone()); + child.finish(); + *child = new_child + } + if child.is_table_row() || child.is_table_rowgroup() { + let fragment = Fragment::new(child_node, SpecificFragmentInfo::Table); + let mut new_child = FlowRef::new(box TableFlow::from_node_and_fragment(child_node, + fragment)); + new_child.add_new_child(child.clone()); + child.finish(); + *child = new_child + } + if child.is_table() { + let fragment = Fragment::new(child_node, SpecificFragmentInfo::TableWrapper); + let mut new_child = + FlowRef::new(box TableWrapperFlow::from_node_and_fragment(child_node, fragment)); + new_child.add_new_child(child.clone()); + child.finish(); + *child = new_child + } + } + /// Creates an inline flow from a set of inline fragments, then adds it as a child of the given /// flow or pushes it onto the given flow list. /// @@ -393,12 +428,13 @@ impl<'a> FlowConstructor<'a> { first_fragment: &mut bool) { match kid.swap_out_construction_result() { ConstructionResult::None => {} - ConstructionResult::Flow(kid_flow, kid_abs_descendants) => { + ConstructionResult::Flow(mut kid_flow, kid_abs_descendants) => { // If kid_flow is TableCaptionFlow, kid_flow should be added under // TableWrapperFlow. if flow.is_table() && kid_flow.is_table_caption() { - self.set_flow_construction_result(&kid, ConstructionResult::Flow(kid_flow, - Descendants::new())) + self.set_flow_construction_result(&kid, + ConstructionResult::Flow(kid_flow, + Descendants::new())) } else if flow.need_anonymous_flow(&*kid_flow) { consecutive_siblings.push(kid_flow) } else { @@ -417,6 +453,7 @@ impl<'a> FlowConstructor<'a> { let consecutive_siblings = mem::replace(consecutive_siblings, vec!()); self.generate_anonymous_missing_child(consecutive_siblings, flow, node); } + self.generate_anonymous_table_flows_if_necessary(flow, &mut kid_flow, &kid); flow.add_new_child(kid_flow); } abs_descendants.push_descendants(kid_abs_descendants); diff --git a/tests/ref/basic.list b/tests/ref/basic.list index e762048e1ca..d308411cb5c 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -289,6 +289,7 @@ experimental == rtl_simple.html rtl_simple_ref.html == table_auto_width.html table_auto_width_ref.html == table_caption_bottom_a.html table_caption_bottom_ref.html == table_caption_top_a.html table_caption_top_ref.html +== table_cell_float_a.html table_cell_float_ref.html == table_colspan_fixed_a.html table_colspan_fixed_ref.html == table_colspan_simple_a.html table_colspan_simple_ref.html == table_containing_block_a.html table_containing_block_ref.html diff --git a/tests/ref/table_cell_float_a.html b/tests/ref/table_cell_float_a.html new file mode 100644 index 00000000000..aafc61c7023 --- /dev/null +++ b/tests/ref/table_cell_float_a.html @@ -0,0 +1,29 @@ + + + + + + + +
+
+ + + diff --git a/tests/ref/table_cell_float_ref.html b/tests/ref/table_cell_float_ref.html new file mode 100644 index 00000000000..8c4eee36c3f --- /dev/null +++ b/tests/ref/table_cell_float_ref.html @@ -0,0 +1,31 @@ + + + + + + + +
+
+ + +