aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPu Xingyu <pu.stshine@gmail.com>2017-04-14 23:44:20 +0800
committerPu Xingyu <pu.stshine@gmail.com>2017-04-23 08:32:25 +0800
commit68f74d5cbe2ffeca8bb6144abeec258a89edc440 (patch)
treeb1b95aab3fc50f07e8bf1d042d2b72a4ee7de552
parent56435db820ad13d7fcb9acf9ce4fa84667234706 (diff)
downloadservo-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.
-rw-r--r--components/layout/block.rs3
-rw-r--r--components/layout/incremental.rs7
-rw-r--r--components/layout/sequential.rs19
-rw-r--r--components/layout_thread/lib.rs4
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/floats-038.htm.ini3
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/floats-wrap-bfc-002-left-table.htm.ini3
6 files changed, 25 insertions, 14 deletions
diff --git a/components/layout/block.rs b/components/layout/block.rs
index 9e28cf2095d..db74ab64074 100644
--- a/components/layout/block.rs
+++ b/components/layout/block.rs
@@ -43,6 +43,7 @@ use flow_list::FlowList;
use fragment::{CoordinateSystem, Fragment, FragmentBorderBoxIterator, Overflow};
use fragment::{IS_INLINE_FLEX_ITEM, IS_BLOCK_FLEX_ITEM};
use gfx_traits::print_tree::PrintTree;
+use incremental::RelayoutMode;
use layout_debug;
use model::{AdjoiningMargins, CollapsibleMargins, IntrinsicISizes, MarginCollapseInfo, MaybeAuto};
use model::{specified, specified_or_none};
@@ -1549,7 +1550,7 @@ impl BlockFlow {
self.assign_inline_sizes(layout_context);
// Re-run layout on our children.
for child in flow::mut_base(self).children.iter_mut() {
- sequential::traverse_flow_tree_preorder(child, layout_context);
+ sequential::traverse_flow_tree_preorder(child, layout_context, RelayoutMode::Force);
}
// Assign our final-final block size.
self.assign_block_size(layout_context);
diff --git a/components/layout/incremental.rs b/components/layout/incremental.rs
index d24cda3307b..dd6b125938f 100644
--- a/components/layout/incremental.rs
+++ b/components/layout/incremental.rs
@@ -7,6 +7,13 @@ use style::computed_values::float;
use style::selector_parser::RestyleDamage;
use style::servo::restyle_damage::{REFLOW, RECONSTRUCT_FLOW};
+/// Used in a flow traversal to indicate whether this re-layout should be incremental or not.
+#[derive(Clone, Copy, PartialEq)]
+pub enum RelayoutMode {
+ Incremental,
+ Force
+}
+
bitflags! {
pub flags SpecialRestyleDamage: u8 {
#[doc = "If this flag is set, we need to reflow the entire document. This is more or less a \
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,
diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs
index 9683afcbd29..c24e29b6b41 100644
--- a/components/layout_thread/lib.rs
+++ b/components/layout_thread/lib.rs
@@ -60,7 +60,7 @@ use layout::context::heap_size_of_persistent_local_context;
use layout::display_list_builder::ToGfxColor;
use layout::flow::{self, Flow, ImmutableFlowUtils, MutableFlowUtils, MutableOwnedFlowUtils};
use layout::flow_ref::FlowRef;
-use layout::incremental::{LayoutDamageComputation, REFLOW_ENTIRE_DOCUMENT};
+use layout::incremental::{LayoutDamageComputation, REFLOW_ENTIRE_DOCUMENT, RelayoutMode};
use layout::layout_debug;
use layout::opaque_node::OpaqueNodeMethods;
use layout::parallel;
@@ -810,7 +810,7 @@ impl LayoutThread {
fn solve_constraints(layout_root: &mut Flow,
layout_context: &LayoutContext) {
let _scope = layout_debug_scope!("solve_constraints");
- sequential::traverse_flow_tree_preorder(layout_root, layout_context);
+ sequential::traverse_flow_tree_preorder(layout_root, layout_context, RelayoutMode::Incremental);
}
/// Performs layout constraint solving in parallel.
diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-038.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-038.htm.ini
deleted file mode 100644
index ce5927d2e85..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/floats-038.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[floats-038.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-wrap-bfc-002-left-table.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-wrap-bfc-002-left-table.htm.ini
deleted file mode 100644
index ba75a408fd3..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/floats-wrap-bfc-002-left-table.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[floats-wrap-bfc-002-left-table.htm]
- type: reftest
- expected: FAIL