layout: Move overflow calculation to be a separate, sequential,

bottom-up pass.

Right now, the only reason that overflow calculation works is that we
rely on script inducing extra reflows that are sent for display. This
was preventing #10021 from landing.

This change regresses layout performance by about 1% in my tests.

Fixes #7797 properly.
This commit is contained in:
Patrick Walton 2016-03-17 14:28:37 -07:00
parent 2d6283c64b
commit 5ea8c34276
7 changed files with 60 additions and 17 deletions

View file

@ -14,6 +14,7 @@ use flow_ref::{self, FlowRef};
use fragment::FragmentBorderBoxIterator;
use generated_content::ResolveGeneratedContent;
use gfx::display_list::{DisplayListEntry, StackingContext};
use incremental::STORE_OVERFLOW;
use style::dom::TNode;
use style::traversal::DomTraversalContext;
use traversal::{AssignBSizes, AssignISizes};
@ -117,3 +118,18 @@ pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut FlowRef,
doit(flow_ref::deref_mut(root), 0, iterator, &Point2D::zero());
}
pub fn store_overflow(layout_context: &LayoutContext, flow: &mut Flow) {
if !flow::base(flow).restyle_damage.contains(STORE_OVERFLOW) {
return
}
for mut kid in flow::mut_base(flow).child_iter() {
store_overflow(layout_context, kid);
}
flow.store_overflow(layout_context);
flow::mut_base(flow).restyle_damage.remove(STORE_OVERFLOW);
}