diff options
Diffstat (limited to 'components/layout/fragment.rs')
-rw-r--r-- | components/layout/fragment.rs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 542fd5dd416..d60785c1df1 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -11,7 +11,7 @@ use context::LayoutContext; use floats::ClearType; use flow; use flow::Flow; -use flow_ref::FlowRef; +use flow_ref::{self, FlowRef}; use incremental::{self, RestyleDamage}; use inline::{InlineFragmentContext, InlineFragmentNodeInfo, InlineMetrics}; use layout_debug; @@ -1248,6 +1248,7 @@ impl Fragment { } /// Computes the intrinsic inline-sizes of this fragment. + #[allow(unsafe_code)] pub fn compute_intrinsic_inline_sizes(&mut self) -> IntrinsicISizesContribution { let mut result = self.style_specified_intrinsic_inline_size(); match self.specific { @@ -1260,11 +1261,11 @@ impl Fragment { SpecificFragmentInfo::TableRow | SpecificFragmentInfo::TableWrapper | SpecificFragmentInfo::InlineAbsoluteHypothetical(_) => {} - SpecificFragmentInfo::InlineBlock(ref mut info) => { + SpecificFragmentInfo::InlineBlock(ref info) => { let block_flow = info.flow_ref.as_block(); result.union_block(&block_flow.base.intrinsic_inline_sizes) } - SpecificFragmentInfo::InlineAbsolute(ref mut info) => { + SpecificFragmentInfo::InlineAbsolute(ref info) => { let block_flow = info.flow_ref.as_block(); result.union_block(&block_flow.base.intrinsic_inline_sizes) } @@ -1619,6 +1620,7 @@ impl Fragment { /// Assigns replaced inline-size, padding, and margins for this fragment only if it is replaced /// content per CSS 2.1 § 10.3.2. + #[allow(unsafe_code)] pub fn assign_replaced_inline_size_if_necessary<'a>(&'a mut self, container_inline_size: Au) { match self.specific { SpecificFragmentInfo::Generic | @@ -1647,7 +1649,7 @@ impl Fragment { match self.specific { SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut info) => { - let block_flow = info.flow_ref.as_mut_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut info.flow_ref) }.as_mut_block(); block_flow.base.position.size.inline = block_flow.base.intrinsic_inline_sizes.preferred_inline_size; @@ -1655,7 +1657,7 @@ impl Fragment { self.border_box.size.inline = Au(0); } SpecificFragmentInfo::InlineBlock(ref mut info) => { - let block_flow = info.flow_ref.as_mut_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut info.flow_ref) }.as_mut_block(); self.border_box.size.inline = max(block_flow.base.intrinsic_inline_sizes.minimum_inline_size, block_flow.base.intrinsic_inline_sizes.preferred_inline_size); @@ -1663,7 +1665,7 @@ impl Fragment { block_flow.base.block_container_writing_mode = self.style.writing_mode; } SpecificFragmentInfo::InlineAbsolute(ref mut info) => { - let block_flow = info.flow_ref.as_mut_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut info.flow_ref) }.as_mut_block(); self.border_box.size.inline = max(block_flow.base.intrinsic_inline_sizes.minimum_inline_size, block_flow.base.intrinsic_inline_sizes.preferred_inline_size); @@ -1711,6 +1713,7 @@ impl Fragment { /// been assigned first. /// /// Ideally, this should follow CSS 2.1 § 10.6.2. + #[allow(unsafe_code)] pub fn assign_replaced_block_size_if_necessary(&mut self, containing_block_block_size: Option<Au>) { match self.specific { SpecificFragmentInfo::Generic | @@ -1767,18 +1770,18 @@ impl Fragment { } SpecificFragmentInfo::InlineBlock(ref mut info) => { // Not the primary fragment, so we do not take the noncontent size into account. - let block_flow = info.flow_ref.as_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut info.flow_ref) }.as_block(); self.border_box.size.block = block_flow.base.position.size.block + block_flow.fragment.margin.block_start_end() } SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut info) => { // Not the primary fragment, so we do not take the noncontent size into account. - let block_flow = info.flow_ref.as_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut info.flow_ref) }.as_block(); self.border_box.size.block = block_flow.base.position.size.block; } SpecificFragmentInfo::InlineAbsolute(ref mut info) => { // Not the primary fragment, so we do not take the noncontent size into account. - let block_flow = info.flow_ref.as_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut info.flow_ref) }.as_block(); self.border_box.size.block = block_flow.base.position.size.block + block_flow.fragment.margin.block_start_end() } @@ -1904,9 +1907,10 @@ impl Fragment { /// Determines the inline sizes of inline-block fragments. These cannot be fully computed until /// inline size assignment has run for the child flow: thus it is computed "late", during /// block size assignment. + #[allow(unsafe_code)] pub fn update_late_computed_replaced_inline_size_if_necessary(&mut self) { if let SpecificFragmentInfo::InlineBlock(ref mut inline_block_info) = self.specific { - let block_flow = inline_block_info.flow_ref.as_block(); + let block_flow = unsafe { flow_ref::deref_mut(&mut inline_block_info.flow_ref) }.as_block(); let margin = block_flow.fragment.style.logical_margin(); self.border_box.size.inline = block_flow.fragment.border_box.size.inline + MaybeAuto::from_style(margin.inline_start, Au(0)).specified_or_zero() + @@ -1914,21 +1918,25 @@ impl Fragment { } } + #[allow(unsafe_code)] pub fn update_late_computed_inline_position_if_necessary(&mut self) { match self.specific { SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut info) => { let position = self.border_box.start.i; - info.flow_ref.update_late_computed_inline_position_if_necessary(position) + unsafe { flow_ref::deref_mut(&mut info.flow_ref) } + .update_late_computed_inline_position_if_necessary(position) } _ => {} } } + #[allow(unsafe_code)] pub fn update_late_computed_block_position_if_necessary(&mut self) { match self.specific { SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut info) => { let position = self.border_box.start.b; - info.flow_ref.update_late_computed_block_position_if_necessary(position) + unsafe { flow_ref::deref_mut(&mut info.flow_ref) } + .update_late_computed_block_position_if_necessary(position) } _ => {} } |