From a5b43b7df10cc73d8203f7ee0c3a5e1a1bb1d9f5 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 15 Feb 2020 23:32:09 +0530 Subject: [PATCH] Take origin from window instead of creating a new one in case of reflow Everytime a new LayoutContext was created, it created a new origin which caused endless stream of image loads to occur in case of reflow. The reason for this was that the existing image, although cached successfully, was not used because the entry in hashmap did not match because of different(new) origin. This is solved by storing the origin of a window in enum ScriptReflow and used in creating new LayoutContext in case of reflow. --- components/layout/context.rs | 2 ++ components/layout_thread/lib.rs | 16 ++++++++++++---- components/script/dom/window.rs | 1 + components/script_layout_interface/lib.rs | 3 ++- components/script_layout_interface/message.rs | 4 +++- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/components/layout/context.rs b/components/layout/context.rs index 90b427b0e15..1374ba175f9 100644 --- a/components/layout/context.rs +++ b/components/layout/context.rs @@ -140,6 +140,7 @@ impl<'a> LayoutContext<'a> { state: PendingImageState::Unrequested(url), node: node.to_untrusted_node_address(), id: id, + origin: self.origin.clone(), }; self.pending_images .as_ref() @@ -160,6 +161,7 @@ impl<'a> LayoutContext<'a> { state: PendingImageState::PendingResponse, node: node.to_untrusted_node_address(), id: id, + origin: self.origin.clone(), }; pending_images.lock().unwrap().push(image); } diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 10ff2f2569b..47b195c4884 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -93,7 +93,7 @@ use servo_atoms::Atom; use servo_config::opts; use servo_config::pref; use servo_geometry::MaxRect; -use servo_url::ServoUrl; +use servo_url::{ImmutableOrigin, ServoUrl}; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; use std::collections::HashMap; @@ -644,13 +644,18 @@ impl LayoutThread { guards: StylesheetGuards<'a>, script_initiated_layout: bool, snapshot_map: &'a SnapshotMap, + origin: Option, ) -> LayoutContext<'a> { let thread_local_style_context_creation_data = ThreadLocalStyleContextCreationInfo::new(self.new_animations_sender.clone()); LayoutContext { id: self.id, - origin: self.url.origin(), + origin: if let Some(origin) = origin { + origin + } else { + self.url.origin() + }, style_context: SharedStyleContext { stylist: &self.stylist, options: GLOBAL_STYLE_DATA.options.clone(), @@ -1341,6 +1346,8 @@ impl LayoutThread { Au::from_f32_px(initial_viewport.height), ); + let origin = data.origin.clone(); + // Calculate the actual viewport as per DEVICE-ADAPT ยง 6 // If the entire flow tree is invalid, then it will be reflowed anyhow. let document_shared_lock = document.style_shared_lock(); @@ -1482,7 +1489,8 @@ impl LayoutThread { self.stylist.flush(&guards, Some(element), Some(&map)); // Create a layout context for use throughout the following passes. - let mut layout_context = self.build_layout_context(guards.clone(), true, &map); + let mut layout_context = + self.build_layout_context(guards.clone(), true, &map, Some(origin)); let pool; let (thread_pool, num_threads) = if self.parallel_flag { @@ -1738,7 +1746,7 @@ impl LayoutThread { ua_or_user: &ua_or_user_guard, }; let snapshots = SnapshotMap::new(); - let mut layout_context = self.build_layout_context(guards, false, &snapshots); + let mut layout_context = self.build_layout_context(guards, false, &snapshots, None); let invalid_nodes = { // Perform an abbreviated style recalc that operates without access to the DOM. diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 65a60176559..1abd30ecc4a 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1622,6 +1622,7 @@ impl Window { document: self.Document().upcast::().to_trusted_node_address(), stylesheets_changed, window_size: self.window_size.get(), + origin: self.origin().immutable().clone(), reflow_goal, script_join_chan: join_chan, dom_count: self.Document().dom_count(), diff --git a/components/script_layout_interface/lib.rs b/components/script_layout_interface/lib.rs index ad333209033..ef9382378cb 100644 --- a/components/script_layout_interface/lib.rs +++ b/components/script_layout_interface/lib.rs @@ -23,7 +23,7 @@ use ipc_channel::ipc::IpcSender; use libc::c_void; use net_traits::image_cache::PendingImageId; use script_traits::UntrustedNodeAddress; -use servo_url::ServoUrl; +use servo_url::{ImmutableOrigin, ServoUrl}; use std::ptr::NonNull; use std::sync::atomic::AtomicIsize; use style::data::ElementData; @@ -138,6 +138,7 @@ pub struct PendingImage { pub state: PendingImageState, pub node: UntrustedNodeAddress, pub id: PendingImageId, + pub origin: ImmutableOrigin, } pub struct HTMLMediaData { diff --git a/components/script_layout_interface/message.rs b/components/script_layout_interface/message.rs index 9bfeddb2ea2..aeefadc7213 100644 --- a/components/script_layout_interface/message.rs +++ b/components/script_layout_interface/message.rs @@ -18,7 +18,7 @@ use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as Cons use script_traits::{ScrollState, UntrustedNodeAddress, WindowSizeData}; use servo_arc::Arc as ServoArc; use servo_atoms::Atom; -use servo_url::ServoUrl; +use servo_url::{ImmutableOrigin, ServoUrl}; use std::sync::atomic::AtomicBool; use std::sync::Arc; use style::context::QuirksMode; @@ -216,6 +216,8 @@ pub struct ScriptReflow { pub reflow_goal: ReflowGoal, /// The number of objects in the dom #10110 pub dom_count: u32, + /// The current window origin + pub origin: ImmutableOrigin, } pub struct LayoutThreadInit {