aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs5
-rw-r--r--components/script/dom/htmlimageelement.rs41
2 files changed, 30 insertions, 16 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 671177f95db..2e100a92960 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -28,7 +28,6 @@ use euclid::matrix2d::Matrix2D;
use euclid::point::Point2D;
use euclid::rect::Rect;
use euclid::size::Size2D;
-use ipc_channel::ipc;
use canvas_traits::{CanvasMsg, Canvas2dMsg, CanvasCommonMsg};
use canvas_traits::{FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle, RepetitionStyle};
@@ -38,7 +37,7 @@ use msg::constellation_msg::Msg as ConstellationMsg;
use net_traits::image_cache_task::{ImageCacheChan, ImageResponse};
use net_traits::image::base::PixelFormat;
-use ipc_channel::ipc::IpcSender;
+use ipc_channel::ipc::{self, IpcSender};
use num::{Float, ToPrimitive};
use std::borrow::ToOwned;
use std::cell::RefCell;
@@ -341,7 +340,7 @@ impl CanvasRenderingContext2D {
let window = window_from_node(canvas.r());
let window = window.r();
let image_cache = window.image_cache_task();
- let (response_chan, response_port) = channel();
+ let (response_chan, response_port) = ipc::channel().unwrap();
image_cache.request_image(url, ImageCacheChan(response_chan), None);
let result = response_port.recv().unwrap();
result.image_response
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index 6580e4f42a5..e98aa2110f5 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -23,9 +23,12 @@ use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
use dom::node::{document_from_node, Node, NodeTypeId, NodeHelpers, NodeDamage, window_from_node};
use dom::virtualmethods::VirtualMethods;
use dom::window::WindowHelpers;
+use script_task::{Runnable, ScriptChan, ScriptMsg};
use util::str::DOMString;
use string_cache::Atom;
+use ipc_channel::ipc;
+use ipc_channel::router::ROUTER;
use net_traits::image::base::Image;
use net_traits::image_cache_task::{ImageResponder, ImageResponse};
use url::{Url, UrlParser};
@@ -62,27 +65,27 @@ trait PrivateHTMLImageElementHelpers {
fn update_image(self, value: Option<(DOMString, &Url)>);
}
-/// This is passed to the image cache when the src attribute
-/// changes. It is returned via a message to the script task,
-/// which marks the element as dirty and triggers a reflow.
-struct Responder {
+struct ImageResponseHandlerRunnable {
element: Trusted<HTMLImageElement>,
+ image: ImageResponse,
}
-impl Responder {
- fn new(element: Trusted<HTMLImageElement>) -> Responder {
- Responder {
- element: element
+impl ImageResponseHandlerRunnable {
+ fn new(element: Trusted<HTMLImageElement>, image: ImageResponse)
+ -> ImageResponseHandlerRunnable {
+ ImageResponseHandlerRunnable {
+ element: element,
+ image: image,
}
}
}
-impl ImageResponder for Responder {
- fn respond(&self, image: ImageResponse) {
+impl Runnable for ImageResponseHandlerRunnable {
+ fn handler(self: Box<Self>) {
// Update the image field
let element = self.element.root();
let element_ref = element.r();
- *element_ref.image.borrow_mut() = match image {
+ *element_ref.image.borrow_mut() = match self.image {
ImageResponse::Loaded(image) | ImageResponse::PlaceholderLoaded(image) => {
Some(image)
}
@@ -130,8 +133,20 @@ impl<'a> PrivateHTMLImageElementHelpers for &'a HTMLImageElement {
*self.url.borrow_mut() = Some(img_url.clone());
let trusted_node = Trusted::new(window.get_cx(), self, window.script_chan());
- let responder = box Responder::new(trusted_node);
- image_cache.request_image(img_url, window.image_cache_chan(), Some(responder));
+ let (responder_sender, responder_receiver) = ipc::channel().unwrap();
+ let script_chan = window.script_chan();
+ ROUTER.add_route(responder_receiver.to_opaque(), box move |message| {
+ // Return the image via a message to the script task, which marks the element
+ // as dirty and triggers a reflow.
+ let image_response = message.to().unwrap();
+ script_chan.send(ScriptMsg::RunnableMsg(box ImageResponseHandlerRunnable::new(
+ trusted_node.clone(),
+ image_response))).unwrap();
+ });
+
+ image_cache.request_image(img_url,
+ window.image_cache_chan(),
+ Some(ImageResponder::new(responder_sender)));
}
}
}