servo: Merge #5694 - layout: Generate anonymous table objects as necessary per CSS 2.1 § 17.2.1 (from pcwalton:anonymous-table-objects); r=mbrubeck

Improves Facebook Timeline.

r? @mbrubeck

Source-Repo: https://github.com/servo/servo
Source-Revision: 2fd5ecf3d7b93addb42d42d46e440451043a2f43
This commit is contained in:
Patrick Walton 2015-04-28 07:13:53 -05:00
Родитель 720d8f833e
Коммит b0e909be0c
1 изменённых файлов: 40 добавлений и 3 удалений

Просмотреть файл

@ -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);