Skip to content

Commit

Permalink
Take origin from window instead of creating a new one in case of reflow
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kunalmohan committed Feb 15, 2020
1 parent 3475790 commit a5b43b7
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 6 deletions.
2 changes: 2 additions & 0 deletions components/layout/context.rs
Expand Up @@ -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()
Expand All @@ -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);
}
Expand Down
16 changes: 12 additions & 4 deletions components/layout_thread/lib.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -644,13 +644,18 @@ impl LayoutThread {
guards: StylesheetGuards<'a>,
script_initiated_layout: bool,
snapshot_map: &'a SnapshotMap,
origin: Option<ImmutableOrigin>,
) -> 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(),
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions components/script/dom/window.rs
Expand Up @@ -1622,6 +1622,7 @@ impl Window {
document: self.Document().upcast::<Node>().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(),
Expand Down
3 changes: 2 additions & 1 deletion components/script_layout_interface/lib.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -138,6 +138,7 @@ pub struct PendingImage {
pub state: PendingImageState,
pub node: UntrustedNodeAddress,
pub id: PendingImageId,
pub origin: ImmutableOrigin,
}

pub struct HTMLMediaData {
Expand Down
4 changes: 3 additions & 1 deletion components/script_layout_interface/message.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit a5b43b7

Please sign in to comment.