mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
layout: Rewrite the block formatting context/float inline-size
speculation code. The old code tried to do the speculation as a single bottom-up pass after intrinsic inline-size calculation, which was unable to handle cases like this: <div> <div style="float: left">Foo</div> </div> <div> <div style="overflow: hidden">Bar</div> </div> No single bottom-up pass could possibly handle this case, because the inline-size of the float flowing out of the "Foo" block could never make it down to the "Bar" block, where it is needed for speculation. On the pages I tried, this regresses layout performance by 1%-2%. I first noticed this breaking some pages, like the Google SERPs, several months ago.
This commit is contained in:
parent
9b2ae3a62f
commit
b29719e36b
15 changed files with 346 additions and 184 deletions
|
@ -17,7 +17,6 @@ use flow::INLINE_POSITION_IS_STATIC;
|
|||
use flow::IS_ABSOLUTELY_POSITIONED;
|
||||
use flow::ImmutableFlowUtils;
|
||||
use flow::{Flow, FlowClass, OpaqueFlow};
|
||||
use flow::{HAS_LEFT_FLOATED_DESCENDANTS, HAS_RIGHT_FLOATED_DESCENDANTS};
|
||||
use fragment::{Fragment, FragmentBorderBoxIterator, Overflow};
|
||||
use gfx::display_list::{StackingContext, StackingContextId};
|
||||
use incremental::{REFLOW, REFLOW_OUT_OF_FLOW};
|
||||
|
@ -26,7 +25,7 @@ use model::MaybeAuto;
|
|||
use model::{IntrinsicISizes};
|
||||
use std::cmp::max;
|
||||
use std::sync::Arc;
|
||||
use style::computed_values::{flex_direction, float};
|
||||
use style::computed_values::flex_direction;
|
||||
use style::logical_geometry::LogicalSize;
|
||||
use style::properties::style_structs;
|
||||
use style::properties::{ComputedValues, TComputedValues};
|
||||
|
@ -324,25 +323,10 @@ impl Flow for FlexFlow {
|
|||
// TODO(zentner): We need to re-order the items at some point. However, all the operations
|
||||
// here ignore order, so we can afford to do it later, if necessary.
|
||||
|
||||
// `flex item`s (our children) cannot be floated. Furthermore, they all establish BFC's.
|
||||
// Therefore, we do not have to handle any floats here.
|
||||
|
||||
let mut flags = self.block_flow.base.flags;
|
||||
flags.remove(HAS_LEFT_FLOATED_DESCENDANTS);
|
||||
flags.remove(HAS_RIGHT_FLOATED_DESCENDANTS);
|
||||
|
||||
match self.main_mode {
|
||||
Mode::Inline => self.inline_mode_bubble_inline_sizes(),
|
||||
Mode::Block => self.block_mode_bubble_inline_sizes()
|
||||
}
|
||||
|
||||
// Although our children can't be floated, we can.
|
||||
match self.block_flow.fragment.style().get_box().float {
|
||||
float::T::none => {}
|
||||
float::T::left => flags.insert(HAS_LEFT_FLOATED_DESCENDANTS),
|
||||
float::T::right => flags.insert(HAS_RIGHT_FLOATED_DESCENDANTS),
|
||||
}
|
||||
self.block_flow.base.flags = flags
|
||||
}
|
||||
|
||||
fn assign_inline_sizes(&mut self, layout_context: &LayoutContext) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue