aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/fragment.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/fragment.rs')
-rw-r--r--components/layout/fragment.rs32
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)
}
_ => {}
}