diff --git a/components/layout/block.rs b/components/layout/block.rs index 06a8c390630..40ab4fc4fc1 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -40,6 +40,7 @@ use flow::{ImmutableFlowUtils, LateAbsolutePositionInfo, MutableFlowUtils, Opaqu use flow::{LAYERS_NEEDED_FOR_DESCENDANTS, NEEDS_LAYER}; use flow::{PostorderFlowTraversal, PreorderFlowTraversal, mut_base}; use flow::{self, BaseFlow, EarlyAbsolutePositionInfo, ForceNonfloatedFlag, FlowClass, Flow}; +use flow_ref; use fragment::{CoordinateSystem, Fragment, FragmentBorderBoxIterator, HAS_LAYER}; use fragment::{SpecificFragmentInfo}; use incremental::{REFLOW, REFLOW_OUT_OF_FLOW}; @@ -494,6 +495,20 @@ impl<'a> PostorderFlowTraversal for AbsoluteStoreOverflowTraversal<'a> { } } + flow.mutate_fragments(&mut |f: &mut Fragment| { + match f.specific { + SpecificFragmentInfo::InlineBlock(ref mut info) => { + let block = flow_ref::deref_mut(&mut info.flow_ref); + (block.as_mut_block() as &mut Flow).early_store_overflow(self.layout_context); + } + SpecificFragmentInfo::InlineAbsolute(ref mut info) => { + let block = flow_ref::deref_mut(&mut info.flow_ref); + (block.as_mut_block() as &mut Flow).early_store_overflow(self.layout_context); + } + _ => (), + } + }); + flow.early_store_overflow(self.layout_context); } } diff --git a/components/layout/flow.rs b/components/layout/flow.rs index b4a457b341f..51321e75b2c 100644 --- a/components/layout/flow.rs +++ b/components/layout/flow.rs @@ -953,10 +953,11 @@ unsafe impl Sync for BaseFlow {} impl fmt::Debug for BaseFlow { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, - "@ {:?}, CC {}, ADC {}", + "@ {:?}, CC {}, ADC {}, Ovr {:?}", self.position, self.parallel.children_count.load(Ordering::SeqCst), - self.abs_descendants.len()) + self.abs_descendants.len(), + self.overflow) } } diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 924f3eaf80f..a7ab373afdb 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -2179,11 +2179,11 @@ impl Fragment { match self.specific { SpecificFragmentInfo::InlineBlock(ref info) => { let block_flow = info.flow_ref.as_block(); - overflow = overflow.union(&block_flow.compute_overflow()); + overflow = overflow.union(&flow::base(block_flow).overflow); } SpecificFragmentInfo::InlineAbsolute(ref info) => { let block_flow = info.flow_ref.as_block(); - overflow = overflow.union(&block_flow.compute_overflow()); + overflow = overflow.union(&flow::base(block_flow).overflow); } _ => (), } diff --git a/components/layout/inline.rs b/components/layout/inline.rs index 5b137ceade2..00043037f9d 100644 --- a/components/layout/inline.rs +++ b/components/layout/inline.rs @@ -8,7 +8,7 @@ use block::{AbsoluteAssignBSizesTraversal, AbsoluteStoreOverflowTraversal}; use context::LayoutContext; use display_list_builder::{FragmentDisplayListBuilding, InlineFlowDisplayListBuilding}; use floats::{FloatKind, Floats, PlacementInfo}; -use flow::{MutableFlowUtils, OpaqueFlow}; +use flow::{MutableFlowUtils, EarlyAbsolutePositionInfo, OpaqueFlow}; use flow::{self, BaseFlow, FlowClass, Flow, ForceNonfloatedFlag, IS_ABSOLUTELY_POSITIONED}; use flow_ref; use fragment::{CoordinateSystem, Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo}; @@ -1616,6 +1616,31 @@ impl Flow for InlineFlow { Au(0), -self.base.position.size.block)); + let containing_block_size = LogicalSize::new(writing_mode, + Au(0), + self.base.position.size.block); + self.mutate_fragments(&mut |f: &mut Fragment| { + match f.specific { + SpecificFragmentInfo::InlineBlock(ref mut info) => { + let block = flow_ref::deref_mut(&mut info.flow_ref); + flow::mut_base(block).early_absolute_position_info = EarlyAbsolutePositionInfo { + relative_containing_block_size: containing_block_size, + relative_containing_block_mode: writing_mode, + }; + (block.as_mut_block() as &mut Flow).late_store_overflow(layout_context); + } + SpecificFragmentInfo::InlineAbsolute(ref mut info) => { + let block = flow_ref::deref_mut(&mut info.flow_ref); + flow::mut_base(block).early_absolute_position_info = EarlyAbsolutePositionInfo { + relative_containing_block_size: containing_block_size, + relative_containing_block_mode: writing_mode, + }; + (block.as_mut_block() as &mut Flow).late_store_overflow(layout_context); + } + _ => (), + } + }); + self.base.restyle_damage.remove(REFLOW_OUT_OF_FLOW | REFLOW); } @@ -1817,7 +1842,11 @@ impl Flow for InlineFlow { impl fmt::Debug for InlineFlow { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?} - {:x} - {:?}", self.class(), self.base.debug_id(), self.fragments) + write!(f, "{:?} - {:x} - Ovr {:?} - {:?}", + self.class(), + self.base.debug_id(), + flow::base(self).overflow, + self.fragments) } } diff --git a/tests/ref/basic.list b/tests/ref/basic.list index c78d1452c9d..f862cf80d30 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -274,6 +274,7 @@ flaky_cpu == linebreak_simple_a.html linebreak_simple_b.html # Should be ==? != overflow_position_abs_inside_normal_a.html overflow_position_abs_inside_normal_b.html == overflow_position_abs_simple_a.html overflow_position_abs_simple_b.html +== overflow_position_rel_inline_block.html overflow_position_rel_inline_block_ref.html == overflow_scroll.html overflow_simple_b.html == overflow_simple_a.html overflow_simple_b.html == overflow_wrap_a.html overflow_wrap_ref.html diff --git a/tests/ref/overflow_position_rel_inline_block.html b/tests/ref/overflow_position_rel_inline_block.html new file mode 100644 index 00000000000..6aea81b8abe --- /dev/null +++ b/tests/ref/overflow_position_rel_inline_block.html @@ -0,0 +1,11 @@ + +
diff --git a/tests/ref/overflow_position_rel_inline_block_ref.html b/tests/ref/overflow_position_rel_inline_block_ref.html new file mode 100644 index 00000000000..c4f0ec97cb0 --- /dev/null +++ b/tests/ref/overflow_position_rel_inline_block_ref.html @@ -0,0 +1,9 @@ + +