diff options
Diffstat (limited to 'components/layout/construct.rs')
-rw-r--r-- | components/layout/construct.rs | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 046fd19afc4..bbfe17d22b7 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -15,7 +15,7 @@ use app_units::Au; use block::BlockFlow; -use context::LayoutContext; +use context::{LayoutContext, with_thread_local_font_context}; use data::{HAS_NEWLY_CONSTRUCTED_FLOW, PersistentLayoutData}; use flex::FlexFlow; use floats::FloatKind; @@ -315,7 +315,7 @@ impl InlineFragmentsAccumulator { /// An object that knows how to create flows. pub struct FlowConstructor<'a, N: ThreadSafeLayoutNode> { /// The layout context. - pub layout_context: &'a LayoutContext<'a>, + pub layout_context: &'a LayoutContext, /// Satisfy the compiler about the unused parameters, which we use to improve the ergonomics of /// the ensuing impl {} by removing the need to parameterize all the methods individually. phantom2: PhantomData<N>, @@ -324,7 +324,7 @@ pub struct FlowConstructor<'a, N: ThreadSafeLayoutNode> { impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> FlowConstructor<'a, ConcreteThreadSafeLayoutNode> { /// Creates a new flow constructor. - pub fn new(layout_context: &'a LayoutContext<'a>) -> Self { + pub fn new(layout_context: &'a LayoutContext) -> Self { FlowConstructor { layout_context: layout_context, phantom2: PhantomData, @@ -351,12 +351,12 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> } Some(LayoutNodeType::Element(LayoutElementType::HTMLImageElement)) => { let image_info = box ImageFragmentInfo::new(node.image_url(), - &self.layout_context.shared); + &self.layout_context); SpecificFragmentInfo::Image(image_info) } Some(LayoutNodeType::Element(LayoutElementType::HTMLObjectElement)) => { let image_info = box ImageFragmentInfo::new(node.object_data(), - &self.layout_context.shared); + &self.layout_context); SpecificFragmentInfo::Image(image_info) } Some(LayoutNodeType::Element(LayoutElementType::HTMLTableElement)) => { @@ -434,8 +434,10 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> // for runs might collapse so much whitespace away that only hypothetical fragments // remain. In that case the inline flow will compute its ascent and descent to be zero. let scanned_fragments = - TextRunScanner::new().scan_for_runs(&mut self.layout_context.font_context(), - fragments.fragments); + with_thread_local_font_context(self.layout_context, |font_context| { + TextRunScanner::new().scan_for_runs(font_context, + mem::replace(&mut fragments.fragments, LinkedList::new())) + }); let mut inline_flow_ref = FlowRef::new(Arc::new(InlineFlow::from_fragments(scanned_fragments, node.style(self.style_context()).writing_mode))); @@ -464,8 +466,9 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> // FIXME(#6503): Use Arc::get_mut().unwrap() here. let inline_flow = FlowRef::deref_mut(&mut inline_flow_ref).as_mut_inline(); inline_flow.minimum_line_metrics = - inline_flow.minimum_line_metrics(&mut self.layout_context.font_context(), - &node.style(self.style_context())) + with_thread_local_font_context(self.layout_context, |font_context| { + inline_flow.minimum_line_metrics(font_context, &node.style(self.style_context())) + }); } inline_flow_ref.finish(); @@ -1216,7 +1219,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> let marker_fragments = match node.style(self.style_context()).get_list().list_style_image { Either::First(ref url_value) => { let image_info = box ImageFragmentInfo::new(url_value.url().map(|u| u.clone()), - &self.layout_context.shared); + &self.layout_context); vec![Fragment::new(node, SpecificFragmentInfo::Image(image_info), self.layout_context)] } Either::Second(_none) => { @@ -1232,9 +1235,11 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> SpecificFragmentInfo::UnscannedText( box UnscannedTextFragmentInfo::new(text, None)), self.layout_context)); - let marker_fragments = TextRunScanner::new().scan_for_runs( - &mut self.layout_context.font_context(), - unscanned_marker_fragments); + let marker_fragments = + with_thread_local_font_context(self.layout_context, |mut font_context| { + TextRunScanner::new().scan_for_runs(&mut font_context, + unscanned_marker_fragments) + }); marker_fragments.fragments } ListStyleTypeContent::GeneratedContent(info) => { |