aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/htmlimageelement.rs49
-rw-r--r--components/script/dom/window.rs29
2 files changed, 45 insertions, 33 deletions
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index f104330c741..61eed173994 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -36,10 +36,11 @@ use euclid::point::Point2D;
use html5ever_atoms::LocalName;
use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
-use net_traits::{FetchResponseListener, FetchMetadata, Metadata, NetworkError};
+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::request::{RequestInit, Type as RequestType};
use network_listener::{NetworkListener, PreInvoke};
use num_traits::ToPrimitive;
@@ -112,8 +113,6 @@ impl Runnable for ImageRequestRunnable {
let context = Arc::new(Mutex::new(ImageContext {
elem: trusted_node,
- data: vec!(),
- metadata: None,
url: this.img_url.clone(),
status: Ok(()),
id: this.id,
@@ -200,10 +199,6 @@ impl Runnable for ImageResponseHandlerRunnable {
struct ImageContext {
/// The element that initiated the request.
elem: Trusted<HTMLImageElement>,
- /// The response body received to date.
- data: Vec<u8>,
- /// The response metadata received to date.
- metadata: Option<Metadata>,
/// The initial URL requested.
url: ServoUrl,
/// Indicates whether the request failed, and why
@@ -212,21 +207,31 @@ struct ImageContext {
id: PendingImageId,
}
+impl ImageContext {
+ fn image_cache(&self) -> ImageCacheThread {
+ let elem = self.elem.root();
+ window_from_node(&*elem).image_cache_thread().clone()
+ }
+}
+
impl FetchResponseListener for ImageContext {
fn process_request_body(&mut self) {}
fn process_request_eof(&mut self) {}
fn process_response(&mut self, metadata: Result<FetchMetadata, NetworkError>) {
- self.metadata = metadata.ok().map(|meta| match meta {
- FetchMetadata::Unfiltered(m) => m,
- FetchMetadata::Filtered { unsafe_, .. } => unsafe_
+ self.image_cache().notify_pending_response(
+ self.id,
+ FetchResponseMsg::ProcessResponse(metadata.clone()));
+
+ let metadata = metadata.ok().map(|meta| {
+ match meta {
+ FetchMetadata::Unfiltered(m) => m,
+ FetchMetadata::Filtered { unsafe_, .. } => unsafe_
+ }
});
- let status_code = self.metadata.as_ref().and_then(|m| {
- match m.status {
- Some((c, _)) => Some(c),
- _ => None,
- }
+ let status_code = metadata.as_ref().and_then(|m| {
+ m.status.as_ref().map(|&(code, _)| code)
}).unwrap_or(0);
self.status = match status_code {
@@ -236,18 +241,20 @@ impl FetchResponseListener for ImageContext {
};
}
- fn process_response_chunk(&mut self, mut payload: Vec<u8>) {
+ fn process_response_chunk(&mut self, payload: Vec<u8>) {
if self.status.is_ok() {
- self.data.append(&mut payload);
+ self.image_cache().notify_pending_response(
+ self.id,
+ FetchResponseMsg::ProcessResponseChunk(payload));
}
}
- fn process_response_eof(&mut self, _response: Result<(), NetworkError>) {
+ fn process_response_eof(&mut self, response: Result<(), NetworkError>) {
let elem = self.elem.root();
let document = document_from_node(&*elem);
- let window = document.window();
- let image_cache = window.image_cache_thread();
- image_cache.store_complete_image_bytes(self.id, self.data.clone());
+ let image_cache = self.image_cache();
+ image_cache.notify_pending_response(self.id,
+ FetchResponseMsg::ProcessResponseEOF(response));
document.finish_load(LoadType::Image(self.url.clone()));
}
}
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index fcf6a0019c0..71dbdc8e8d4 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -59,8 +59,8 @@ use js::jsapi::{JS_GC, JS_GetRuntime};
use js::jsval::UndefinedValue;
use js::rust::Runtime;
use msg::constellation_msg::{FrameType, PipelineId};
+use net_traits::{FetchResponseMsg, NetworkError};
use net_traits::{ResourceThreads, ReferrerPolicy, FetchResponseListener, FetchMetadata};
-use net_traits::NetworkError;
use net_traits::image_cache_thread::{ImageResponder, ImageResponse};
use net_traits::image_cache_thread::{PendingImageResponse, ImageCacheThread, PendingImageId};
use net_traits::request::{Type as RequestType, RequestInit as FetchRequestInit};
@@ -1207,7 +1207,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);
+ fetch_image_for_layout(url.clone(), &*node, id, self.image_cache_thread.clone());
}
let mut images = self.pending_layout_images.borrow_mut();
@@ -1897,38 +1897,43 @@ impl Runnable for PostMessageHandler {
struct LayoutImageContext {
node: Trusted<Node>,
- data: Vec<u8>,
id: PendingImageId,
url: ServoUrl,
+ cache: ImageCacheThread,
}
impl FetchResponseListener for LayoutImageContext {
fn process_request_body(&mut self) {}
fn process_request_eof(&mut self) {}
- fn process_response(&mut self, _metadata: Result<FetchMetadata, NetworkError>) {/*XXXjdm*/}
+ fn process_response(&mut self, metadata: Result<FetchMetadata, NetworkError>) {
+ self.cache.notify_pending_response(
+ self.id,
+ FetchResponseMsg::ProcessResponse(metadata));
+ }
- fn process_response_chunk(&mut self, mut payload: Vec<u8>) {
- self.data.append(&mut payload);
+ fn process_response_chunk(&mut self, payload: Vec<u8>) {
+ self.cache.notify_pending_response(
+ self.id,
+ FetchResponseMsg::ProcessResponseChunk(payload));
}
- fn process_response_eof(&mut self, _response: Result<(), NetworkError>) {
+ fn process_response_eof(&mut self, response: Result<(), NetworkError>) {
let node = self.node.root();
let document = document_from_node(&*node);
- let window = document.window();
- let image_cache = window.image_cache_thread();
- image_cache.store_complete_image_bytes(self.id, self.data.clone());
+ self.cache.notify_pending_response(self.id,
+ FetchResponseMsg::ProcessResponseEOF(response));
document.finish_load(LoadType::Image(self.url.clone()));
}
}
impl PreInvoke for LayoutImageContext {}
-fn fetch_image_for_layout(url: ServoUrl, node: &Node, id: PendingImageId) {
+fn fetch_image_for_layout(url: ServoUrl, node: &Node, id: PendingImageId, cache: ImageCacheThread) {
let context = Arc::new(Mutex::new(LayoutImageContext {
node: Trusted::new(node),
- data: vec![],
id: id,
url: url.clone(),
+ cache: cache,
}));
let document = document_from_node(node);