mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Make image cache per-document rather than global
This commit is contained in:
parent
9eb6bb78b0
commit
72d7ee613b
25 changed files with 448 additions and 649 deletions
|
@ -62,7 +62,7 @@ use msg::constellation_msg::{FrameId, FrameType, PipelineId};
|
|||
use net_traits::{Metadata, NetworkError, ReferrerPolicy, ResourceThreads};
|
||||
use net_traits::filemanager_thread::RelativePos;
|
||||
use net_traits::image::base::{Image, ImageMetadata};
|
||||
use net_traits::image_cache_thread::{ImageCacheThread, PendingImageId};
|
||||
use net_traits::image_cache::{ImageCache, PendingImageId};
|
||||
use net_traits::request::{Request, RequestInit};
|
||||
use net_traits::response::{Response, ResponseBody};
|
||||
use net_traits::response::HttpsState;
|
||||
|
@ -321,7 +321,7 @@ unsafe_no_jsmanaged_fields!(bool, f32, f64, String, AtomicBool, AtomicUsize, Uui
|
|||
unsafe_no_jsmanaged_fields!(usize, u8, u16, u32, u64);
|
||||
unsafe_no_jsmanaged_fields!(isize, i8, i16, i32, i64);
|
||||
unsafe_no_jsmanaged_fields!(ServoUrl, ImmutableOrigin, MutableOrigin);
|
||||
unsafe_no_jsmanaged_fields!(Image, ImageMetadata, ImageCacheThread, PendingImageId);
|
||||
unsafe_no_jsmanaged_fields!(Image, ImageMetadata, ImageCache, PendingImageId);
|
||||
unsafe_no_jsmanaged_fields!(Metadata);
|
||||
unsafe_no_jsmanaged_fields!(NetworkError);
|
||||
unsafe_no_jsmanaged_fields!(Atom, Prefix, LocalName, Namespace, QualName);
|
||||
|
|
|
@ -40,7 +40,7 @@ use euclid::rect::Rect;
|
|||
use euclid::size::Size2D;
|
||||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use net_traits::image::base::PixelFormat;
|
||||
use net_traits::image_cache_thread::ImageResponse;
|
||||
use net_traits::image_cache::ImageResponse;
|
||||
use num_traits::ToPrimitive;
|
||||
use script_traits::ScriptMsg as ConstellationMsg;
|
||||
use servo_url::ServoUrl;
|
||||
|
|
|
@ -338,12 +338,12 @@ impl<'a> From<&'a WebGLContextAttributes> for GLContextAttributes {
|
|||
|
||||
pub mod utils {
|
||||
use dom::window::Window;
|
||||
use net_traits::image_cache_thread::{ImageResponse, UsePlaceholder, ImageOrMetadataAvailable};
|
||||
use net_traits::image_cache_thread::CanRequestImages;
|
||||
use net_traits::image_cache::{ImageResponse, UsePlaceholder, ImageOrMetadataAvailable};
|
||||
use net_traits::image_cache::CanRequestImages;
|
||||
use servo_url::ServoUrl;
|
||||
|
||||
pub fn request_image_from_cache(window: &Window, url: ServoUrl) -> ImageResponse {
|
||||
let image_cache = window.image_cache_thread();
|
||||
let image_cache = window.image_cache();
|
||||
let response =
|
||||
image_cache.find_image_or_metadata(url.into(),
|
||||
UsePlaceholder::No,
|
||||
|
|
|
@ -40,9 +40,9 @@ use ipc_channel::ipc;
|
|||
use ipc_channel::router::ROUTER;
|
||||
use net_traits::{FetchResponseListener, FetchMetadata, NetworkError, FetchResponseMsg};
|
||||
use net_traits::image::base::{Image, ImageMetadata};
|
||||
use net_traits::image_cache_thread::{ImageResponder, ImageResponse, PendingImageId, ImageState};
|
||||
use net_traits::image_cache_thread::{UsePlaceholder, ImageOrMetadataAvailable, CanRequestImages};
|
||||
use net_traits::image_cache_thread::ImageCacheThread;
|
||||
use net_traits::image_cache::{ImageResponder, ImageResponse, PendingImageId, ImageState};
|
||||
use net_traits::image_cache::{UsePlaceholder, ImageOrMetadataAvailable, CanRequestImages};
|
||||
use net_traits::image_cache::ImageCache;
|
||||
use net_traits::request::{RequestInit, Type as RequestType};
|
||||
use network_listener::{NetworkListener, PreInvoke};
|
||||
use num_traits::ToPrimitive;
|
||||
|
@ -120,8 +120,8 @@ impl Runnable for ImageResponseHandlerRunnable {
|
|||
|
||||
/// The context required for asynchronously loading an external image.
|
||||
struct ImageContext {
|
||||
/// A handle with which to communicate with the image cache.
|
||||
image_cache: ImageCacheThread,
|
||||
/// Reference to the script thread image cache.
|
||||
image_cache: Arc<ImageCache>,
|
||||
/// Indicates whether the request failed, and why
|
||||
status: Result<(), NetworkError>,
|
||||
/// The cache ID for this request.
|
||||
|
@ -186,7 +186,7 @@ impl HTMLImageElement {
|
|||
Some(LoadBlocker::new(&*document, LoadType::Image(img_url.clone())));
|
||||
}
|
||||
|
||||
fn add_cache_listener_for_element(image_cache: &ImageCacheThread,
|
||||
fn add_cache_listener_for_element(image_cache: Arc<ImageCache>,
|
||||
id: PendingImageId,
|
||||
elem: &HTMLImageElement) {
|
||||
let trusted_node = Trusted::new(elem);
|
||||
|
@ -197,8 +197,9 @@ impl HTMLImageElement {
|
|||
let wrapper = window.get_runnable_wrapper();
|
||||
let generation = elem.generation.get();
|
||||
ROUTER.add_route(responder_receiver.to_opaque(), box move |message| {
|
||||
// Return the image via a message to the script thread, which marks the element
|
||||
// as dirty and triggers a reflow.
|
||||
debug!("Got image {:?}", message);
|
||||
// Return the image via a message to the script thread, which marks
|
||||
// the element as dirty and triggers a reflow.
|
||||
let runnable = ImageResponseHandlerRunnable::new(
|
||||
trusted_node.clone(), message.to().unwrap(), generation);
|
||||
let _ = task_source.queue_with_wrapper(box runnable, &wrapper);
|
||||
|
@ -208,7 +209,7 @@ impl HTMLImageElement {
|
|||
}
|
||||
|
||||
let window = window_from_node(self);
|
||||
let image_cache = window.image_cache_thread();
|
||||
let image_cache = window.image_cache();
|
||||
let response =
|
||||
image_cache.find_image_or_metadata(img_url.clone().into(),
|
||||
UsePlaceholder::Yes,
|
||||
|
@ -223,7 +224,7 @@ impl HTMLImageElement {
|
|||
}
|
||||
|
||||
Err(ImageState::Pending(id)) => {
|
||||
add_cache_listener_for_element(image_cache, id, self);
|
||||
add_cache_listener_for_element(image_cache.clone(), id, self);
|
||||
}
|
||||
|
||||
Err(ImageState::LoadError) => {
|
||||
|
@ -242,7 +243,7 @@ impl HTMLImageElement {
|
|||
let window = window_from_node(self);
|
||||
|
||||
let context = Arc::new(Mutex::new(ImageContext {
|
||||
image_cache: window.image_cache_thread().clone(),
|
||||
image_cache: window.image_cache(),
|
||||
status: Ok(()),
|
||||
id: id,
|
||||
}));
|
||||
|
|
|
@ -42,7 +42,7 @@ use js::jsapi::{JSContext, JSObject, Type, Rooted};
|
|||
use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UndefinedValue};
|
||||
use js::typedarray::{TypedArray, TypedArrayElement, Float32, Int32};
|
||||
use net_traits::image::base::PixelFormat;
|
||||
use net_traits::image_cache_thread::ImageResponse;
|
||||
use net_traits::image_cache::ImageResponse;
|
||||
use offscreen_gl_context::{GLContextAttributes, GLLimits};
|
||||
use script_traits::ScriptMsg as ConstellationMsg;
|
||||
use std::cell::Cell;
|
||||
|
|
|
@ -62,8 +62,8 @@ use js::rust::Runtime;
|
|||
use layout_image::fetch_image_for_layout;
|
||||
use msg::constellation_msg::{FrameType, PipelineId};
|
||||
use net_traits::{ResourceThreads, ReferrerPolicy};
|
||||
use net_traits::image_cache_thread::{ImageResponder, ImageResponse};
|
||||
use net_traits::image_cache_thread::{PendingImageResponse, ImageCacheThread, PendingImageId};
|
||||
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
|
||||
use net_traits::image_cache::{PendingImageId, PendingImageResponse};
|
||||
use net_traits::storage_thread::StorageType;
|
||||
use num_traits::ToPrimitive;
|
||||
use open;
|
||||
|
@ -167,8 +167,8 @@ pub struct Window {
|
|||
#[ignore_heap_size_of = "task sources are hard"]
|
||||
file_reading_task_source: FileReadingTaskSource,
|
||||
navigator: MutNullableJS<Navigator>,
|
||||
#[ignore_heap_size_of = "channels are hard"]
|
||||
image_cache_thread: ImageCacheThread,
|
||||
#[ignore_heap_size_of = "Arc"]
|
||||
image_cache: Arc<ImageCache>,
|
||||
#[ignore_heap_size_of = "channels are hard"]
|
||||
image_cache_chan: Sender<ImageCacheMsg>,
|
||||
browsing_context: MutNullableJS<BrowsingContext>,
|
||||
|
@ -315,8 +315,8 @@ impl Window {
|
|||
(box SendableMainThreadScriptChan(tx), box rx)
|
||||
}
|
||||
|
||||
pub fn image_cache_thread(&self) -> &ImageCacheThread {
|
||||
&self.image_cache_thread
|
||||
pub fn image_cache(&self) -> Arc<ImageCache> {
|
||||
self.image_cache.clone()
|
||||
}
|
||||
|
||||
/// This can panic if it is called after the browsing context has been discarded
|
||||
|
@ -1227,7 +1227,7 @@ impl Window {
|
|||
let node = from_untrusted_node_address(js_runtime.rt(), image.node);
|
||||
|
||||
if let PendingImageState::Unrequested(ref url) = image.state {
|
||||
fetch_image_for_layout(url.clone(), &*node, id, self.image_cache_thread.clone());
|
||||
fetch_image_for_layout(url.clone(), &*node, id, self.image_cache.clone());
|
||||
}
|
||||
|
||||
let mut images = self.pending_layout_images.borrow_mut();
|
||||
|
@ -1239,7 +1239,7 @@ impl Window {
|
|||
ROUTER.add_route(responder_listener.to_opaque(), box move |message| {
|
||||
let _ = image_cache_chan.send((pipeline, message.to().unwrap()));
|
||||
});
|
||||
self.image_cache_thread.add_listener(id, ImageResponder::new(responder, id));
|
||||
self.image_cache.add_listener(id, ImageResponder::new(responder, id));
|
||||
nodes.push(JS::from_ref(&*node));
|
||||
}
|
||||
}
|
||||
|
@ -1703,7 +1703,7 @@ impl Window {
|
|||
history_task_source: HistoryTraversalTaskSource,
|
||||
file_task_source: FileReadingTaskSource,
|
||||
image_cache_chan: Sender<ImageCacheMsg>,
|
||||
image_cache_thread: ImageCacheThread,
|
||||
image_cache: Arc<ImageCache>,
|
||||
resource_threads: ResourceThreads,
|
||||
bluetooth_thread: IpcSender<BluetoothRequest>,
|
||||
mem_profiler_chan: MemProfilerChan,
|
||||
|
@ -1747,8 +1747,8 @@ impl Window {
|
|||
history_traversal_task_source: history_task_source,
|
||||
file_reading_task_source: file_task_source,
|
||||
image_cache_chan: image_cache_chan,
|
||||
image_cache: image_cache.clone(),
|
||||
navigator: Default::default(),
|
||||
image_cache_thread: image_cache_thread,
|
||||
history: Default::default(),
|
||||
browsing_context: Default::default(),
|
||||
document: Default::default(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue