diff --git a/components/layout_2020/display_list.rs b/components/layout_2020/display_list.rs index 7e7e9579f26..28ffe729cc1 100644 --- a/components/layout_2020/display_list.rs +++ b/components/layout_2020/display_list.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::context::LayoutContext; use crate::fragments::{BoxFragment, Fragment}; use crate::geom::physical::{Rect, Vec2}; use embedder_traits::Cursor; @@ -25,8 +26,9 @@ pub struct WebRenderImageInfo { type ItemTag = (u64, u16); type HitInfo = Option; -pub struct DisplayListBuilder { +pub struct DisplayListBuilder<'a> { current_space_and_clip: wr::SpaceAndClipInfo, + pub context: &'a LayoutContext<'a>, pub wr: wr::DisplayListBuilder, /// Contentful paint, for the purpose of @@ -36,11 +38,16 @@ pub struct DisplayListBuilder { pub is_contentful: bool, } -impl DisplayListBuilder { - pub fn new(pipeline_id: wr::PipelineId, viewport_size: wr::units::LayoutSize) -> Self { +impl<'a> DisplayListBuilder<'a> { + pub fn new( + pipeline_id: wr::PipelineId, + context: &'a LayoutContext, + viewport_size: wr::units::LayoutSize, + ) -> Self { Self { current_space_and_clip: wr::SpaceAndClipInfo::root_scroll(pipeline_id), is_contentful: false, + context, wr: wr::DisplayListBuilder::new(pipeline_id, viewport_size), } } diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index b7b638ba1f4..780142684bd 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -1147,7 +1147,12 @@ impl LayoutThread { // Perform post-style recalculation layout passes. if let Some(root) = &*self.fragment_tree_root.borrow() { - self.perform_post_style_recalc_layout_passes(root, &data.reflow_goal, Some(&document)); + self.perform_post_style_recalc_layout_passes( + root, + &data.reflow_goal, + Some(&document), + &mut layout_context, + ); } self.first_reflow.set(false); @@ -1292,12 +1297,20 @@ impl LayoutThread { let author_shared_lock = self.document_shared_lock.clone().unwrap(); let author_guard = author_shared_lock.read(); let ua_or_user_guard = UA_STYLESHEETS.shared_lock.read(); - let _guards = StylesheetGuards { + let guards = StylesheetGuards { author: &author_guard, ua_or_user: &ua_or_user_guard, }; + let snapshots = SnapshotMap::new(); + let mut layout_context = self.build_layout_context(guards, false, &snapshots); - self.perform_post_style_recalc_layout_passes(root, &ReflowGoal::TickAnimations, None); + self.perform_post_style_recalc_layout_passes( + root, + &ReflowGoal::TickAnimations, + None, + &mut layout_context, + ); + assert!(layout_context.pending_images.is_none()); } } @@ -1306,6 +1319,7 @@ impl LayoutThread { fragment_tree: &layout::FragmentTreeRoot, reflow_goal: &ReflowGoal, document: Option<&ServoLayoutDocument>, + context: &mut LayoutContext, ) { if !reflow_goal.needs_display() { // Defer the paint step until the next ForDisplay. @@ -1325,7 +1339,8 @@ impl LayoutThread { self.viewport_size.width.to_f32_px(), self.viewport_size.height.to_f32_px(), )); - let mut display_list = DisplayListBuilder::new(self.id.to_webrender(), viewport_size); + let mut display_list = + DisplayListBuilder::new(self.id.to_webrender(), context, viewport_size); fragment_tree.build_display_list(&mut display_list, viewport_size); if self.dump_fragment_tree {