diff options
author | Pu Xingyu <pu.stshine@gmail.com> | 2017-04-14 23:44:20 +0800 |
---|---|---|
committer | Pu Xingyu <pu.stshine@gmail.com> | 2017-04-23 08:32:25 +0800 |
commit | 68f74d5cbe2ffeca8bb6144abeec258a89edc440 (patch) | |
tree | b1b95aab3fc50f07e8bf1d042d2b72a4ee7de552 /components/layout/sequential.rs | |
parent | 56435db820ad13d7fcb9acf9ce4fa84667234706 (diff) | |
download | servo-68f74d5cbe2ffeca8bb6144abeec258a89edc440.tar.gz servo-68f74d5cbe2ffeca8bb6144abeec258a89edc440.zip |
Force reflow in the sequential fallback of block format context
When reflowing a block format context during the inorder traversal,
propagate restyle damage manually to its children since they were
already reflowed.
Diffstat (limited to 'components/layout/sequential.rs')
-rw-r--r-- | components/layout/sequential.rs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/components/layout/sequential.rs b/components/layout/sequential.rs index ae493b443c5..399ef12df36 100644 --- a/components/layout/sequential.rs +++ b/components/layout/sequential.rs @@ -14,8 +14,9 @@ use flow::{PostorderFlowTraversal, PreorderFlowTraversal}; use flow::IS_ABSOLUTELY_POSITIONED; use fragment::FragmentBorderBoxIterator; use generated_content::ResolveGeneratedContent; +use incremental::RelayoutMode; use servo_config::opts; -use style::servo::restyle_damage::{REFLOW, STORE_OVERFLOW}; +use style::servo::restyle_damage::{REFLOW, REFLOW_OUT_OF_FLOW, STORE_OVERFLOW}; use traversal::{AssignBSizes, AssignISizes, BubbleISizes, BuildDisplayList}; pub use style::sequential::traverse_dom; @@ -38,16 +39,24 @@ pub fn resolve_generated_content(root: &mut Flow, layout_context: &LayoutContext } pub fn traverse_flow_tree_preorder(root: &mut Flow, - layout_context: &LayoutContext) { + layout_context: &LayoutContext, + relayout_mode: RelayoutMode) { fn doit(flow: &mut Flow, assign_inline_sizes: AssignISizes, - assign_block_sizes: AssignBSizes) { + assign_block_sizes: AssignBSizes, + relayout_mode: RelayoutMode) { + // Force reflow children during this traversal. This is needed when we failed + // the float speculation of a block formatting context and need to fix it. + if relayout_mode == RelayoutMode::Force { + flow::mut_base(flow).restyle_damage.insert(REFLOW_OUT_OF_FLOW | REFLOW); + } + if assign_inline_sizes.should_process(flow) { assign_inline_sizes.process(flow); } for kid in flow::child_iter_mut(flow) { - doit(kid, assign_inline_sizes, assign_block_sizes); + doit(kid, assign_inline_sizes, assign_block_sizes, relayout_mode); } if assign_block_sizes.should_process(flow) { @@ -66,7 +75,7 @@ pub fn traverse_flow_tree_preorder(root: &mut Flow, let assign_inline_sizes = AssignISizes { layout_context: &layout_context }; let assign_block_sizes = AssignBSizes { layout_context: &layout_context }; - doit(root, assign_inline_sizes, assign_block_sizes); + doit(root, assign_inline_sizes, assign_block_sizes, relayout_mode); } pub fn build_display_list_for_subtree<'a>(flow_root: &mut Flow, |