aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2015-07-13 17:02:35 -0700
committerPatrick Walton <pcwalton@mimiga.net>2015-07-25 00:50:12 -0700
commitbb99b2f3c8813919c476930c709b73d3cfbc8c83 (patch)
tree15641e7ed77b46ab61bab772fa3c63b7e8e8d619 /components
parent886c08c393f51499490702eaf97fc770273a2600 (diff)
downloadservo-bb99b2f3c8813919c476930c709b73d3cfbc8c83.tar.gz
servo-bb99b2f3c8813919c476930c709b73d3cfbc8c83.zip
script: Make most of 2D canvas and WebGL run over IPC.
To actually make the multiprocess communication work, we'll need to reroute the task creation to the pipeline or the compositor. But this works as a first step.
Diffstat (limited to 'components')
-rw-r--r--components/canvas/Cargo.toml6
-rw-r--r--components/canvas/canvas_paint_task.rs44
-rw-r--r--components/canvas/lib.rs2
-rw-r--r--components/canvas/webgl_paint_task.rs66
-rw-r--r--components/canvas_traits/Cargo.toml11
-rw-r--r--components/canvas_traits/lib.rs98
-rw-r--r--components/compositing/Cargo.toml10
-rw-r--r--components/compositing/constellation.rs48
-rw-r--r--components/compositing/lib.rs3
-rw-r--r--components/gfx/paint_task.rs10
-rw-r--r--components/layout/Cargo.toml5
-rw-r--r--components/layout/context.rs5
-rw-r--r--components/layout/display_list_builder.rs24
-rw-r--r--components/layout/fragment.rs9
-rw-r--r--components/layout/layout_task.rs10
-rw-r--r--components/layout/wrapper.rs13
-rw-r--r--components/msg/Cargo.toml7
-rw-r--r--components/msg/constellation_msg.rs12
-rw-r--r--components/msg/lib.rs2
-rw-r--r--components/script/Cargo.toml5
-rw-r--r--components/script/dom/bindings/global.rs10
-rw-r--r--components/script/dom/bindings/trace.rs8
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs170
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs11
-rw-r--r--components/script/dom/htmlcanvaselement.rs29
-rw-r--r--components/script/dom/webglbuffer.rs13
-rw-r--r--components/script/dom/webglframebuffer.rs14
-rw-r--r--components/script/dom/webglprogram.rs17
-rw-r--r--components/script/dom/webglrenderbuffer.rs14
-rw-r--r--components/script/dom/webglrenderingcontext.rs118
-rw-r--r--components/script/dom/webglshader.rs16
-rw-r--r--components/script/dom/webgltexture.rs13
-rw-r--r--components/script/dom/worker.rs3
-rw-r--r--components/script/dom/workerglobalscope.rs11
-rw-r--r--components/servo/Cargo.lock71
-rw-r--r--components/style/Cargo.toml6
-rw-r--r--components/util/Cargo.toml5
37 files changed, 615 insertions, 304 deletions
diff --git a/components/canvas/Cargo.toml b/components/canvas/Cargo.toml
index 92081f00c16..d466d425aad 100644
--- a/components/canvas/Cargo.toml
+++ b/components/canvas/Cargo.toml
@@ -30,9 +30,13 @@ features = ["texture_surface"]
[dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel"
+[dependencies.cssparser]
+version = "0.3"
+features = [ "serde-serialization" ]
+
[dependencies]
log = "0.3"
-cssparser = "0.3.1"
num = "0.1.24"
gleam = "0.1"
euclid = "0.1"
+
diff --git a/components/canvas/canvas_paint_task.rs b/components/canvas/canvas_paint_task.rs
index af00d817ab6..0b5e96ff921 100644
--- a/components/canvas/canvas_paint_task.rs
+++ b/components/canvas/canvas_paint_task.rs
@@ -11,6 +11,8 @@ use euclid::matrix2d::Matrix2D;
use euclid::point::Point2D;
use euclid::rect::Rect;
use euclid::size::Size2D;
+use ipc_channel::ipc::{self, IpcSender};
+use ipc_channel::router::ROUTER;
use layers::platform::surface::NativeSurface;
use gfx_traits::color;
use ipc_channel::ipc::IpcSharedMemory;
@@ -161,13 +163,19 @@ impl<'a> CanvasPaintTask<'a> {
}
}
- pub fn start(size: Size2D<i32>) -> Sender<CanvasMsg> {
- let (chan, port) = channel::<CanvasMsg>();
+ /// Creates a new `CanvasPaintTask` and returns the out-of-process sender and the in-process
+ /// sender for it.
+ pub fn start(size: Size2D<i32>) -> (IpcSender<CanvasMsg>, Sender<CanvasMsg>) {
+ // TODO(pcwalton): Ask the pipeline to create this for us instead of spawning it directly.
+ // This will be needed for multiprocess Servo.
+ let (out_of_process_chan, out_of_process_port) = ipc::channel::<CanvasMsg>().unwrap();
+ let (in_process_chan, in_process_port) = channel();
+ ROUTER.route_ipc_receiver_to_mpsc_sender(out_of_process_port, in_process_chan.clone());
spawn_named("CanvasTask".to_owned(), move || {
let mut painter = CanvasPaintTask::new(size);
-
loop {
- match port.recv().unwrap() {
+ let msg = in_process_port.recv();
+ match msg.unwrap() {
CanvasMsg::Canvas2d(message) => {
match message {
Canvas2dMsg::FillRect(ref rect) => painter.fill_rect(rect),
@@ -225,17 +233,28 @@ impl<'a> CanvasPaintTask<'a> {
match message {
CanvasCommonMsg::Close => break,
CanvasCommonMsg::Recreate(size) => painter.recreate(size),
- CanvasCommonMsg::SendPixelContents(chan) =>
- painter.send_pixel_contents(chan),
- CanvasCommonMsg::SendNativeSurface(chan) =>
- painter.send_native_surface(chan),
}
},
+ CanvasMsg::FromLayout(message) => {
+ match message {
+ FromLayoutMsg::SendPixelContents(chan) => {
+ painter.send_pixel_contents(chan)
+ }
+ }
+ }
+ CanvasMsg::FromPaint(message) => {
+ match message {
+ FromPaintMsg::SendNativeSurface(chan) => {
+ painter.send_native_surface(chan)
+ }
+ }
+ }
CanvasMsg::WebGL(_) => panic!("Wrong message sent to Canvas2D task"),
}
}
});
- chan
+
+ (out_of_process_chan, in_process_chan)
}
fn save_context_state(&mut self) {
@@ -516,7 +535,7 @@ impl<'a> CanvasPaintTask<'a> {
self.drawtarget = CanvasPaintTask::create(size);
}
- fn send_pixel_contents(&mut self, chan: Sender<IpcSharedMemory>) {
+ fn send_pixel_contents(&mut self, chan: IpcSender<IpcSharedMemory>) {
self.drawtarget.snapshot().get_data_surface().with_data(|element| {
chan.send(IpcSharedMemory::from_bytes(element)).unwrap();
})
@@ -528,7 +547,10 @@ impl<'a> CanvasPaintTask<'a> {
unimplemented!()
}
- fn get_image_data(&self, mut dest_rect: Rect<f64>, canvas_size: Size2D<f64>, chan: Sender<Vec<u8>>) {
+ fn get_image_data(&self,
+ mut dest_rect: Rect<f64>,
+ canvas_size: Size2D<f64>,
+ chan: IpcSender<Vec<u8>>) {
if dest_rect.size.width < 0.0 {
dest_rect.size.width = -dest_rect.size.width;
dest_rect.origin.x -= dest_rect.size.width;
diff --git a/components/canvas/lib.rs b/components/canvas/lib.rs
index b78f552f9bb..443c9b901f8 100644
--- a/components/canvas/lib.rs
+++ b/components/canvas/lib.rs
@@ -13,12 +13,12 @@ extern crate azure;
extern crate cssparser;
extern crate euclid;
extern crate gfx_traits;
+extern crate ipc_channel;
extern crate util;
extern crate gleam;
extern crate num;
extern crate layers;
extern crate offscreen_gl_context;
-extern crate ipc_channel;
#[macro_use]
extern crate log;
diff --git a/components/canvas/webgl_paint_task.rs b/components/canvas/webgl_paint_task.rs
index 8af5e547c3a..fdf75e05cb5 100644
--- a/components/canvas/webgl_paint_task.rs
+++ b/components/canvas/webgl_paint_task.rs
@@ -2,7 +2,8 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::{CanvasMsg, CanvasWebGLMsg, CanvasCommonMsg, WebGLShaderParameter, WebGLFramebufferBindingRequest};
+use canvas_traits::{CanvasMsg, CanvasWebGLMsg, CanvasCommonMsg, FromLayoutMsg, FromPaintMsg};
+use canvas_traits::{WebGLShaderParameter, WebGLFramebufferBindingRequest};
use euclid::size::Size2D;
use core::nonzero::NonZero;
use gleam::gl;
@@ -16,7 +17,8 @@ use std::sync::mpsc::{channel, Sender};
use util::vec::byte_swap;
use layers::platform::surface::NativeSurface;
use offscreen_gl_context::{GLContext, GLContextAttributes, ColorAttachmentType};
-use ipc_channel::ipc::IpcSharedMemory;
+use ipc_channel::ipc::{self, IpcSender, IpcSharedMemory};
+use ipc_channel::router::ROUTER;
pub struct WebGLPaintTask {
size: Size2D<i32>,
@@ -135,45 +137,58 @@ impl WebGLPaintTask {
}
}
- pub fn start(size: Size2D<i32>, attrs: GLContextAttributes) -> Result<Sender<CanvasMsg>, &'static str> {
- let (chan, port) = channel::<CanvasMsg>();
+ /// Creates a new `WebGLPaintTask` and returns the out-of-process sender and the in-process
+ /// sender for it.
+ pub fn start(size: Size2D<i32>, attrs: GLContextAttributes)
+ -> Result<(IpcSender<CanvasMsg>, Sender<CanvasMsg>), &'static str> {
+ let (out_of_process_chan, out_of_process_port) = ipc::channel::<CanvasMsg>().unwrap();
+ let (in_process_chan, in_process_port) = channel();
+ ROUTER.route_ipc_receiver_to_mpsc_sender(out_of_process_port, in_process_chan.clone());
let mut painter = try!(WebGLPaintTask::new(size, attrs));
spawn_named("WebGLTask".to_owned(), move || {
painter.init();
loop {
- match port.recv().unwrap() {
+ match in_process_port.recv().unwrap() {
CanvasMsg::WebGL(message) => painter.handle_webgl_message(message),
CanvasMsg::Common(message) => {
match message {
CanvasCommonMsg::Close => break,
- CanvasCommonMsg::SendPixelContents(chan) =>
- painter.send_pixel_contents(chan),
- CanvasCommonMsg::SendNativeSurface(chan) =>
- painter.send_native_surface(chan),
// TODO(ecoal95): handle error nicely
CanvasCommonMsg::Recreate(size) => painter.recreate(size).unwrap(),
}
},
+ CanvasMsg::FromLayout(message) => {
+ match message {
+ FromLayoutMsg::SendPixelContents(chan) =>
+ painter.send_pixel_contents(chan),
+ }
+ }
+ CanvasMsg::FromPaint(message) => {
+ match message {
+ FromPaintMsg::SendNativeSurface(chan) =>
+ painter.send_native_surface(chan),
+ }
+ }
CanvasMsg::Canvas2d(_) => panic!("Wrong message sent to WebGLTask"),
}
}
});
- Ok(chan)
+ Ok((out_of_process_chan, in_process_chan))
}
#[inline]
- fn get_context_attributes(&self, sender: Sender<GLContextAttributes>) {
+ fn get_context_attributes(&self, sender: IpcSender<GLContextAttributes>) {
sender.send(*self.gl_context.borrow_attributes()).unwrap()
}
#[inline]
- fn send_drawing_buffer_width(&self, sender: Sender<i32>) {
+ fn send_drawing_buffer_width(&self, sender: IpcSender<i32>) {
sender.send(self.size.width).unwrap()
}
#[inline]
- fn send_drawing_buffer_height(&self, sender: Sender<i32>) {
+ fn send_drawing_buffer_height(&self, sender: IpcSender<i32>) {
sender.send(self.size.height).unwrap()
}
@@ -234,7 +249,7 @@ impl WebGLPaintTask {
gl::clear_color(r, g, b, a);
}
- fn create_buffer(&self, chan: Sender<Option<NonZero<u32>>>) {
+ fn create_buffer(&self, chan: IpcSender<Option<NonZero<u32>>>) {
let buffer = gl::gen_buffers(1)[0];
let buffer = if buffer == 0 {
None
@@ -244,7 +259,7 @@ impl WebGLPaintTask {
chan.send(buffer).unwrap();
}
- fn create_framebuffer(&self, chan: Sender<Option<NonZero<u32>>>) {
+ fn create_framebuffer(&self, chan: IpcSender<Option<NonZero<u32>>>) {
let framebuffer = gl::gen_framebuffers(1)[0];
let framebuffer = if framebuffer == 0 {
None
@@ -254,7 +269,7 @@ impl WebGLPaintTask {
chan.send(framebuffer).unwrap();
}
- fn create_renderbuffer(&self, chan: Sender<Option<NonZero<u32>>>) {
+ fn create_renderbuffer(&self, chan: IpcSender<Option<NonZero<u32>>>) {
let renderbuffer = gl::gen_renderbuffers(1)[0];
let renderbuffer = if renderbuffer == 0 {
None
@@ -264,7 +279,7 @@ impl WebGLPaintTask {
chan.send(renderbuffer).unwrap();
}
- fn create_texture(&self, chan: Sender<Option<NonZero<u32>>>) {
+ fn create_texture(&self, chan: IpcSender<Option<NonZero<u32>>>) {
let texture = gl::gen_framebuffers(1)[0];
let texture = if texture == 0 {
None
@@ -274,7 +289,7 @@ impl WebGLPaintTask {
chan.send(texture).unwrap();
}
- fn create_program(&self, chan: Sender<Option<NonZero<u32>>>) {
+ fn create_program(&self, chan: IpcSender<Option<NonZero<u32>>>) {
let program = gl::create_program();
let program = if program == 0 {
None
@@ -284,7 +299,7 @@ impl WebGLPaintTask {
chan.send(program).unwrap();
}
- fn create_shader(&self, shader_type: u32, chan: Sender<Option<NonZero<u32>>>) {
+ fn create_shader(&self, shader_type: u32, chan: IpcSender<Option<NonZero<u32>>>) {
let shader = gl::create_shader(shader_type);
let shader = if shader == 0 {
None
@@ -368,7 +383,7 @@ impl WebGLPaintTask {
gl::enable_vertex_attrib_array(attrib_id);
}
- fn get_attrib_location(&self, program_id: u32, name: String, chan: Sender<Option<i32>> ) {
+ fn get_attrib_location(&self, program_id: u32, name: String, chan: IpcSender<Option<i32>> ) {
let attrib_location = gl::get_attrib_location(program_id, &name);
let attrib_location = if attrib_location == -1 {
@@ -380,14 +395,17 @@ impl WebGLPaintTask {
chan.send(attrib_location).unwrap();
}
- fn get_shader_info_log(&self, shader_id: u32, chan: Sender<Option<String>>) {
+ fn get_shader_info_log(&self, shader_id: u32, chan: IpcSender<Option<String>>) {
// TODO(ecoal95): Right now we always return a value, we should
// check for gl errors and return None there
let info = gl::get_shader_info_log(shader_id);
chan.send(Some(info)).unwrap();
}
- fn get_shader_parameter(&self, shader_id: u32, param_id: u32, chan: Sender<WebGLShaderParameter>) {
+ fn get_shader_parameter(&self,
+ shader_id: u32,
+ param_id: u32,
+ chan: IpcSender<WebGLShaderParameter>) {
let result = match param_id {
gl::SHADER_TYPE =>
WebGLShaderParameter::Int(gl::get_shader_iv(shader_id, param_id)),
@@ -399,7 +417,7 @@ impl WebGLPaintTask {
chan.send(result).unwrap();
}
- fn get_uniform_location(&self, program_id: u32, name: String, chan: Sender<Option<i32>>) {
+ fn get_uniform_location(&self, program_id: u32, name: String, chan: IpcSender<Option<i32>>) {
let location = gl::get_uniform_location(program_id, &name);
let location = if location == -1 {
None
@@ -441,7 +459,7 @@ impl WebGLPaintTask {
gl::viewport(x, y, width, height);
}
- fn send_pixel_contents(&mut self, chan: Sender<IpcSharedMemory>) {
+ fn send_pixel_contents(&mut self, chan: IpcSender<IpcSharedMemory>) {
// FIXME(#5652, dmarcos) Instead of a readback strategy we have
// to layerize the canvas.
// TODO(pcwalton): We'd save a copy if we had an `IpcSharedMemoryBuilder` abstraction that
diff --git a/components/canvas_traits/Cargo.toml b/components/canvas_traits/Cargo.toml
index 27bb9a0fb26..bd0a53301ac 100644
--- a/components/canvas_traits/Cargo.toml
+++ b/components/canvas_traits/Cargo.toml
@@ -22,6 +22,15 @@ git = "https://github.com/ecoal95/rust-offscreen-rendering-context"
[dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel"
+[dependencies.serde]
+version = "0.4"
+features = [ "nightly" ]
+
+[dependencies.cssparser]
+version = "0.3"
+features = [ "serde-serialization" ]
+
[dependencies]
-cssparser = "0.3.1"
euclid = "0.1"
+serde_macros = "0.4"
+
diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs
index b8103c8f9a9..48cabed045c 100644
--- a/components/canvas_traits/lib.rs
+++ b/components/canvas_traits/lib.rs
@@ -5,7 +5,11 @@
#![crate_name = "canvas_traits"]
#![crate_type = "rlib"]
#![feature(core)]
+#![feature(custom_derive)]
#![feature(nonzero)]
+#![feature(plugin)]
+#![plugin(serde_macros)]
+
extern crate core;
extern crate azure;
extern crate euclid;
@@ -14,6 +18,7 @@ extern crate gfx_traits;
extern crate ipc_channel;
extern crate layers;
extern crate offscreen_gl_context;
+extern crate serde;
use azure::azure::{AzFloat, AzColor};
use azure::azure_hl::{DrawTarget, Pattern, ColorPattern};
@@ -26,28 +31,51 @@ use euclid::point::Point2D;
use euclid::rect::Rect;
use euclid::size::Size2D;
use gfx_traits::color;
-use std::sync::mpsc::{Sender};
+use ipc_channel::ipc::{IpcSender, IpcSharedMemory};
+use std::sync::mpsc::Sender;
use layers::platform::surface::NativeSurface;
use offscreen_gl_context::GLContextAttributes;
+use serde::{Deserialize, Deserializer, Serialize, Serializer};
use core::nonzero::NonZero;
-use ipc_channel::ipc::IpcSharedMemory;
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub enum CanvasMsg {
Canvas2d(Canvas2dMsg),
Common(CanvasCommonMsg),
+ FromLayout(FromLayoutMsg),
+ FromPaint(FromPaintMsg),
WebGL(CanvasWebGLMsg),
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub enum CanvasCommonMsg {
Close,
Recreate(Size2D<i32>),
- SendPixelContents(Sender<IpcSharedMemory>),
- SendNativeSurface(Sender<NativeSurface>),
+}
+
+#[derive(Clone, Deserialize, Serialize)]
+pub enum FromLayoutMsg {
+ SendPixelContents(IpcSender<IpcSharedMemory>),
}
#[derive(Clone)]
+pub enum FromPaintMsg {
+ SendNativeSurface(Sender<NativeSurface>),
+}
+
+impl Serialize for FromPaintMsg {
+ fn serialize<S>(&self, _: &mut S) -> Result<(),S::Error> where S: Serializer {
+ panic!("can't serialize a `FromPaintMsg`!")
+ }
+}
+
+impl Deserialize for FromPaintMsg {
+ fn deserialize<D>(_: &mut D) -> Result<FromPaintMsg,D::Error> where D: Deserializer {
+ panic!("can't deserialize a `FromPaintMsg`!")
+ }
+}
+
+#[derive(Clone, Deserialize, Serialize)]
pub enum Canvas2dMsg {
Arc(Point2D<f32>, f32, f32, f32, bool),
ArcTo(Point2D<f32>, Point2D<f32>, f32),
@@ -60,7 +88,7 @@ pub enum Canvas2dMsg {
ClosePath,
Fill,
FillRect(Rect<f32>),
- GetImageData(Rect<f64>, Size2D<f64>, Sender<Vec<u8>>),
+ GetImageData(Rect<f64>, Size2D<f64>, IpcSender<Vec<u8>>),
LineTo(Point2D<f32>),
MoveTo(Point2D<f32>),
PutImageData(Vec<u8>, Rect<f64>, Option<Rect<f64>>),
@@ -85,9 +113,9 @@ pub enum Canvas2dMsg {
SetShadowColor(RGBA),
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub enum CanvasWebGLMsg {
- GetContextAttributes(Sender<GLContextAttributes>),
+ GetContextAttributes(IpcSender<GLContextAttributes>),
ActiveTexture(u32),
BlendColor(f32, f32, f32, f32),
BlendEquation(u32),
@@ -99,12 +127,12 @@ pub enum CanvasWebGLMsg {
Clear(u32),
ClearColor(f32, f32, f32, f32),
CompileShader(u32),
- CreateBuffer(Sender<Option<NonZero<u32>>>),
- CreateFramebuffer(Sender<Option<NonZero<u32>>>),
- CreateRenderbuffer(Sender<Option<NonZero<u32>>>),
- CreateTexture(Sender<Option<NonZero<u32>>>),
- CreateProgram(Sender<Option<NonZero<u32>>>),
- CreateShader(u32, Sender<Option<NonZero<u32>>>),
+ CreateBuffer(IpcSender<Option<NonZero<u32>>>),
+ CreateFramebuffer(IpcSender<Option<NonZero<u32>>>),
+ CreateRenderbuffer(IpcSender<Option<NonZero<u32>>>),
+ CreateTexture(IpcSender<Option<NonZero<u32>>>),
+ CreateProgram(IpcSender<Option<NonZero<u32>>>),
+ CreateShader(u32, IpcSender<Option<NonZero<u32>>>),
DeleteBuffer(u32),
DeleteFramebuffer(u32),
DeleteRenderbuffer(u32),
@@ -117,21 +145,21 @@ pub enum CanvasWebGLMsg {
BindTexture(u32, u32),
DrawArrays(u32, i32, i32),
EnableVertexAttribArray(u32),
- GetShaderInfoLog(u32, Sender<Option<String>>),
- GetShaderParameter(u32, u32, Sender<WebGLShaderParameter>),
- GetAttribLocation(u32, String, Sender<Option<i32>>),
- GetUniformLocation(u32, String, Sender<Option<i32>>),
+ GetShaderInfoLog(u32, IpcSender<Option<String>>),
+ GetShaderParameter(u32, u32, IpcSender<WebGLShaderParameter>),
+ GetAttribLocation(u32, String, IpcSender<Option<i32>>),
+ GetUniformLocation(u32, String, IpcSender<Option<i32>>),
LinkProgram(u32),
ShaderSource(u32, String),
Uniform4fv(i32, Vec<f32>),
UseProgram(u32),
VertexAttribPointer2f(u32, i32, bool, i32, i64),
Viewport(i32, i32, i32, i32),
- DrawingBufferWidth(Sender<i32>),
- DrawingBufferHeight(Sender<i32>),
+ DrawingBufferWidth(IpcSender<i32>),
+ DrawingBufferHeight(IpcSender<i32>),
}
-#[derive(Clone, Copy, PartialEq)]
+#[derive(Clone, Copy, PartialEq, Deserialize, Serialize)]
pub enum WebGLError {
InvalidEnum,
InvalidOperation,
@@ -142,26 +170,26 @@ pub enum WebGLError {
pub type WebGLResult<T> = Result<T, WebGLError>;
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub enum WebGLFramebufferBindingRequest {
Explicit(u32),
Default,
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub enum WebGLShaderParameter {
Int(i32),
Bool(bool),
Invalid,
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub struct CanvasGradientStop {
pub offset: f64,
pub color: RGBA,
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub struct LinearGradientStyle {
pub x0: f64,
pub y0: f64,
@@ -183,7 +211,7 @@ impl LinearGradientStyle {
}
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub struct RadialGradientStyle {
pub x0: f64,
pub y0: f64,
@@ -209,7 +237,7 @@ impl RadialGradientStyle {
}
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub struct SurfaceStyle {
pub surface_data: Vec<u8>,
pub surface_size: Size2D<i32>,
@@ -230,7 +258,7 @@ impl SurfaceStyle {
}
-#[derive(Clone)]
+#[derive(Clone, Deserialize, Serialize)]
pub enum FillOrStrokeStyle {
Color(RGBA),
LinearGradient(LinearGradientStyle),
@@ -293,7 +321,7 @@ impl FillOrStrokeStyle {
}
}
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum LineCapStyle {
Butt = 0,
Round = 1,
@@ -319,7 +347,7 @@ impl LineCapStyle {
}
}
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum LineJoinStyle {
Round = 0,
Bevel = 1,
@@ -345,7 +373,7 @@ impl LineJoinStyle {
}
}
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum RepetitionStyle {
Repeat,
RepeatX,
@@ -365,7 +393,7 @@ impl RepetitionStyle {
}
}
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum CompositionStyle {
SrcIn,
SrcOut,
@@ -431,7 +459,7 @@ impl CompositionStyle {
}
}
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum BlendingStyle {
Multiply,
Screen,
@@ -513,7 +541,7 @@ impl BlendingStyle {
}
}
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum CompositionOrBlending {
Composition(CompositionStyle),
Blending(BlendingStyle),
diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml
index c26633d2e41..6d75015d7b3 100644
--- a/components/compositing/Cargo.toml
+++ b/components/compositing/Cargo.toml
@@ -40,6 +40,12 @@ path = "../util"
[dependencies.devtools_traits]
path = "../devtools_traits"
+[dependencies.canvas_traits]
+path = "../canvas_traits"
+
+[dependencies.canvas]
+path = "../canvas"
+
[dependencies.azure]
git = "https://github.com/servo/rust-azure"
@@ -56,6 +62,10 @@ git = "https://github.com/aweinstock314/rust-clipboard"
[dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel"
+[dependencies.offscreen_gl_context]
+git = "https://github.com/ecoal95/rust-offscreen-rendering-context"
+features = ["texture_surface"]
+
[dependencies]
log = "0.3"
num = "0.1.24"
diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs
index 93192981dc7..b3ef5dab7d1 100644
--- a/components/compositing/constellation.rs
+++ b/components/compositing/constellation.rs
@@ -11,6 +11,9 @@
use pipeline::{Pipeline, CompositionPipeline};
+use canvas::canvas_paint_task::CanvasPaintTask;
+use canvas::webgl_paint_task::WebGLPaintTask;
+use canvas_traits::CanvasMsg;
use compositor_task::CompositorProxy;
use compositor_task::Msg as CompositorMsg;
use devtools_traits::{DevtoolsControlChan, DevtoolsControlMsg};
@@ -35,6 +38,7 @@ use msg::webdriver_msg;
use net_traits::{self, ResourceTask};
use net_traits::image_cache_task::ImageCacheTask;
use net_traits::storage_task::{StorageTask, StorageTaskMsg};
+use offscreen_gl_context::GLContextAttributes;
use profile_traits::mem;
use profile_traits::time;
use script_traits::{CompositorEvent, ConstellationControlMsg, LayoutControlMsg};
@@ -44,7 +48,7 @@ use std::collections::HashMap;
use std::io::{self, Write};
use std::marker::PhantomData;
use std::mem::replace;
-use std::sync::mpsc::{Receiver, channel};
+use std::sync::mpsc::{Receiver, Sender, channel};
use style::viewport::ViewportConstraints;
use url::Url;
use util::cursor::Cursor;
@@ -126,7 +130,13 @@ pub struct Constellation<LTF, STF> {
clipboard_ctx: Option<ClipboardContext>,
/// Bits of state used to interact with the webdriver implementation
- webdriver: WebDriverData
+ webdriver: WebDriverData,
+
+ /// A list of in-process senders to `CanvasPaintTask`s.
+ canvas_paint_tasks: Vec<Sender<CanvasMsg>>,
+
+ /// A list of in-process senders to `WebGLPaintTask`s.
+ webgl_paint_tasks: Vec<Sender<CanvasMsg>>,
}
/// Stores the navigation context for a single frame in the frame tree.
@@ -255,7 +265,9 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
} else {
None
},
- webdriver: WebDriverData::new()
+ webdriver: WebDriverData::new(),
+ canvas_paint_tasks: Vec::new(),
+ webgl_paint_tasks: Vec::new(),
};
constellation.run();
});
@@ -487,6 +499,14 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
debug!("constellation got head parsed message");
self.compositor_proxy.send(CompositorMsg::HeadParsed);
}
+ ConstellationMsg::CreateCanvasPaintTask(size, sender) => {
+ debug!("constellation got create-canvas-paint-task message");
+ self.handle_create_canvas_paint_task_msg(&size, sender)
+ }
+ ConstellationMsg::CreateWebGLPaintTask(size, attributes, sender) => {
+ debug!("constellation got create-WebGL-paint-task message");
+ self.handle_create_webgl_paint_task_msg(&size, attributes, sender)
+ }
}
true
}
@@ -907,6 +927,28 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
}
}
+ fn handle_create_canvas_paint_task_msg(
+ &mut self,
+ size: &Size2D<i32>,
+ response_sender: IpcSender<(IpcSender<CanvasMsg>, usize)>) {
+ let id = self.canvas_paint_tasks.len();
+ let (out_of_process_sender, in_process_sender) = CanvasPaintTask::start(*size);
+ self.canvas_paint_tasks.push(in_process_sender);
+ response_sender.send((out_of_process_sender, id)).unwrap()
+ }
+
+ fn handle_create_webgl_paint_task_msg(
+ &mut self,
+ size: &Size2D<i32>,
+ attributes: GLContextAttributes,
+ response_sender: IpcSender<(IpcSender<CanvasMsg>, usize)>) {
+ let id = self.webgl_paint_tasks.len();
+ let (out_of_process_sender, in_process_sender) =
+ WebGLPaintTask::start(*size, attributes).unwrap();
+ self.webgl_paint_tasks.push(in_process_sender);
+ response_sender.send((out_of_process_sender, id)).unwrap()
+ }
+
fn handle_webdriver_msg(&mut self, msg: WebDriverCommandMsg) {
// Find the script channel for the given parent pipeline,
// and pass the event to that script task.
diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs
index 396cf9b5b1b..0cdafd6af59 100644
--- a/components/compositing/lib.rs
+++ b/components/compositing/lib.rs
@@ -11,12 +11,15 @@
extern crate log;
extern crate azure;
+extern crate canvas;
+extern crate canvas_traits;
extern crate devtools_traits;
extern crate euclid;
extern crate gfx;
extern crate ipc_channel;
extern crate layers;
extern crate layout_traits;
+extern crate offscreen_gl_context;
extern crate png;
extern crate script_traits;
extern crate msg;
diff --git a/components/gfx/paint_task.rs b/components/gfx/paint_task.rs
index e3730ff894a..69251d0b0ae 100644
--- a/components/gfx/paint_task.rs
+++ b/components/gfx/paint_task.rs
@@ -11,15 +11,15 @@ use paint_context::PaintContext;
use azure::azure_hl::{SurfaceFormat, Color, DrawTarget, BackendType};
use azure::AzFloat;
+use canvas_traits::CanvasMsg;
use euclid::Matrix4;
use euclid::point::Point2D;
use euclid::rect::Rect;
use euclid::size::Size2D;
-use ipc_channel::ipc;
+use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
use layers::platform::surface::{NativeDisplay, NativeSurface};
use layers::layers::{BufferRequest, LayerBuffer, LayerBufferSet};
-use canvas_traits::CanvasMsg;
use msg::compositor_msg::{Epoch, FrameTreeId, LayerId, LayerKind};
use msg::compositor_msg::{LayerProperties, PaintListener, ScrollPolicy};
use msg::constellation_msg::Msg as ConstellationMsg;
@@ -30,7 +30,7 @@ use profile_traits::time::{self, profile};
use rand::{self, Rng};
use std::borrow::ToOwned;
use std::mem as std_mem;
-use std::sync::{Arc, Mutex};
+use std::sync::Arc;
use std::sync::mpsc::{Receiver, Sender, channel};
use std::collections::HashMap;
use url::Url;
@@ -72,7 +72,7 @@ pub struct PaintRequest {
pub enum Msg {
PaintInit(Epoch, Arc<StackingContext>),
- CanvasLayer(LayerId, Arc<Mutex<Sender<CanvasMsg>>>),
+ CanvasLayer(LayerId, IpcSender<CanvasMsg>),
Paint(Vec<PaintRequest>, FrameTreeId),
PaintPermissionGranted,
PaintPermissionRevoked,
@@ -122,7 +122,7 @@ pub struct PaintTask<C> {
worker_threads: Vec<WorkerThreadProxy>,
/// A map to track the canvas specific layers
- canvas_map: HashMap<LayerId, Arc<Mutex<Sender<CanvasMsg>>>>,
+ canvas_map: HashMap<LayerId, IpcSender<CanvasMsg>>,
}
// If we implement this as a function, we get borrowck errors from borrowing
diff --git a/components/layout/Cargo.toml b/components/layout/Cargo.toml
index 8ca55095ac8..314b3da4b72 100644
--- a/components/layout/Cargo.toml
+++ b/components/layout/Cargo.toml
@@ -55,6 +55,10 @@ git = "https://github.com/servo/rust-selectors"
[dependencies.clock_ticks]
git = "https://github.com/tomaka/clock_ticks"
+[dependencies.cssparser]
+version = "0.3"
+features = [ "serde-serialization" ]
+
[dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel"
@@ -66,7 +70,6 @@ url = "0.2.36"
bitflags = "0.3"
rustc-serialize = "0.3"
libc = "0.1"
-cssparser = "0.3.1"
smallvec = "0.1"
string_cache = "0.1"
string_cache_plugin = "0.1"
diff --git a/components/layout/context.rs b/components/layout/context.rs
index cd7615e1a97..c97d14a2ed2 100644
--- a/components/layout/context.rs
+++ b/components/layout/context.rs
@@ -15,6 +15,7 @@ use euclid::{Rect, Size2D};
use gfx::display_list::OpaqueNode;
use gfx::font_cache_task::FontCacheTask;
use gfx::font_context::FontContext;
+use ipc_channel::ipc::IpcSender;
use msg::constellation_msg::ConstellationChan;
use net_traits::image::base::Image;
use net_traits::image_cache_task::{ImageCacheChan, ImageCacheTask, ImageResponse, ImageState};
@@ -24,7 +25,7 @@ use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::collections::hash_state::DefaultState;
use std::rc::Rc;
-use std::sync::{Arc, Mutex};
+use std::sync::Arc;
use std::sync::mpsc::{channel, Sender};
use style::selector_matching::Stylist;
use url::Url;
@@ -120,7 +121,7 @@ pub struct SharedLayoutContext {
pub new_animations_sender: Sender<Animation>,
/// A channel to send canvas renderers to paint task, in order to correctly paint the layers
- pub canvas_layers_sender: Sender<(LayerId, Option<Arc<Mutex<Sender<CanvasMsg>>>>)>,
+ pub canvas_layers_sender: Sender<(LayerId, IpcSender<CanvasMsg>)>,
/// The visible rects for each layer, as reported to us by the compositor.
pub visible_rects: Arc<HashMap<LayerId, Rect<Au>, DefaultState<FnvHasher>>>,
diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs
index f13dee8fa5d..2c09a1be973 100644
--- a/components/layout/display_list_builder.rs
+++ b/components/layout/display_list_builder.rs
@@ -21,6 +21,7 @@ use list_item::ListItemFlow;
use model::{self, MaybeAuto, ToGfxMatrix, ToAu};
use table_cell::CollapsedBordersForCell;
+use canvas_traits::{CanvasMsg, FromLayoutMsg};
use euclid::{Point2D, Point3D, Rect, Size2D, SideOffsets2D};
use euclid::Matrix4;
use gfx_traits::color;
@@ -32,7 +33,7 @@ use gfx::display_list::{GradientStop, ImageDisplayItem, LineDisplayItem};
use gfx::display_list::{OpaqueNode, SolidColorDisplayItem};
use gfx::display_list::{StackingContext, TextDisplayItem, TextOrientation};
use gfx::paint_task::{PaintLayer, THREAD_TINT_COLORS};
-use ipc_channel::ipc::IpcSharedMemory;
+use ipc_channel::ipc::{self, IpcSharedMemory};
use msg::compositor_msg::{ScrollPolicy, LayerId};
use msg::constellation_msg::ConstellationChan;
use msg::constellation_msg::Msg as ConstellationMsg;
@@ -41,6 +42,7 @@ use net_traits::image::base::{Image, PixelFormat};
use std::cmp;
use std::default::Default;
use std::sync::Arc;
+use std::sync::mpsc::channel;
use std::f32;
use style::computed_values::filter::Filter;
use style::computed_values::{background_attachment, background_clip, background_origin,
@@ -60,9 +62,6 @@ use util::geometry::{Au, ZERO_POINT};
use util::logical_geometry::{LogicalPoint, LogicalRect, LogicalSize, WritingMode};
use util::opts;
-use canvas_traits::{CanvasMsg, CanvasCommonMsg};
-use std::sync::mpsc::channel;
-
/// A possible `PaintLayer` for an stacking context
pub enum StackingContextLayer {
Existing(PaintLayer),
@@ -1099,11 +1098,11 @@ impl FragmentDisplayListBuilding for Fragment {
.computed_inline_size.map_or(0, |w| w.to_px() as usize);
let height = canvas_fragment_info.replaced_image_fragment_info
.computed_block_size.map_or(0, |h| h.to_px() as usize);
- let (sender, receiver) = channel::<IpcSharedMemory>();
- let canvas_data = match canvas_fragment_info.renderer {
- Some(ref renderer) => {
- renderer.lock().unwrap().send(CanvasMsg::Common(
- CanvasCommonMsg::SendPixelContents(sender))).unwrap();
+ let (sender, receiver) = ipc::channel::<IpcSharedMemory>().unwrap();
+ let canvas_data = match canvas_fragment_info.ipc_renderer {
+ Some(ref ipc_renderer) => {
+ ipc_renderer.lock().unwrap().send(CanvasMsg::FromLayout(
+ FromLayoutMsg::SendPixelContents(sender))).unwrap();
receiver.recv().unwrap()
},
None => IpcSharedMemory::from_byte(0xFFu8, width * height * 4),
@@ -1248,8 +1247,11 @@ impl FragmentDisplayListBuilding for Fragment {
// task
if let SpecificFragmentInfo::Canvas(ref fragment_info) = self.specific {
let layer_id = layer.as_ref().unwrap().id;
- layout_context.shared.canvas_layers_sender
- .send((layer_id, fragment_info.renderer.clone())).unwrap();
+ if let Some(ref ipc_renderer) = fragment_info.ipc_renderer {
+ layout_context.shared
+ .canvas_layers_sender
+ .send((layer_id, (*ipc_renderer.lock().unwrap()).clone())).unwrap();
+ }
}
let transform_style = self.style().get_used_transform_style();
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs
index ebd206cb2a8..9b9aad64ee3 100644
--- a/components/layout/fragment.rs
+++ b/components/layout/fragment.rs
@@ -24,6 +24,7 @@ use euclid::{Point2D, Rect, Size2D};
use gfx::display_list::{BLUR_INFLATION_FACTOR, OpaqueNode};
use gfx::text::glyph::CharIndex;
use gfx::text::text_run::{TextRun, TextRunSlice};
+use ipc_channel::ipc::IpcSender;
use msg::constellation_msg::{ConstellationChan, Msg, PipelineId, SubpageId};
use net_traits::image::base::Image;
use net_traits::image_cache_task::UsePlaceholder;
@@ -32,7 +33,6 @@ use std::borrow::ToOwned;
use std::cmp::{max, min};
use std::collections::LinkedList;
use std::fmt;
-use std::sync::mpsc::Sender;
use std::sync::{Arc, Mutex};
use string_cache::Atom;
use style::computed_values::content::ContentItem;
@@ -291,7 +291,8 @@ impl InlineAbsoluteFragmentInfo {
#[derive(Clone)]
pub struct CanvasFragmentInfo {
pub replaced_image_fragment_info: ReplacedImageFragmentInfo,
- pub renderer: Option<Arc<Mutex<Sender<CanvasMsg>>>>,
+ pub renderer_id: Option<usize>,
+ pub ipc_renderer: Option<Arc<Mutex<IpcSender<CanvasMsg>>>>,
}
impl CanvasFragmentInfo {
@@ -300,7 +301,9 @@ impl CanvasFragmentInfo {
replaced_image_fragment_info: ReplacedImageFragmentInfo::new(node,
Some(Au::from_px(node.canvas_width() as i32)),
Some(Au::from_px(node.canvas_height() as i32))),
- renderer: node.renderer().map(|rec| Arc::new(Mutex::new(rec))),
+ renderer_id: node.canvas_renderer_id(),
+ ipc_renderer: node.canvas_ipc_renderer()
+ .map(|renderer| Arc::new(Mutex::new(renderer))),
}
}
diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs
index 6adb14a4c68..a6c92306273 100644
--- a/components/layout/layout_task.rs
+++ b/components/layout/layout_task.rs
@@ -39,7 +39,7 @@ use gfx::display_list::StackingContext;
use gfx::font_cache_task::FontCacheTask;
use gfx::paint_task::Msg as PaintMsg;
use gfx::paint_task::{PaintChan, PaintLayer};
-use ipc_channel::ipc::{self, IpcReceiver};
+use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use ipc_channel::router::ROUTER;
use layout_traits::LayoutTaskFactory;
use log;
@@ -197,8 +197,8 @@ pub struct LayoutTask {
/// To receive a canvas renderer associated to a layer, this message is propagated
/// to the paint chan
- pub canvas_layers_receiver: Receiver<(LayerId, Option<Arc<Mutex<Sender<CanvasMsg>>>>)>,
- pub canvas_layers_sender: Sender<(LayerId, Option<Arc<Mutex<Sender<CanvasMsg>>>>)>,
+ pub canvas_layers_receiver: Receiver<(LayerId, IpcSender<CanvasMsg>)>,
+ pub canvas_layers_sender: Sender<(LayerId, IpcSender<CanvasMsg>)>,
/// A mutex to allow for fast, read-only RPC of layout's internal data
/// structures, while still letting the LayoutTask modify them.
@@ -1030,9 +1030,7 @@ impl LayoutTask {
// Send new canvas renderers to the paint task
while let Ok((layer_id, renderer)) = self.canvas_layers_receiver.try_recv() {
// Just send if there's an actual renderer
- if let Some(renderer) = renderer {
- self.paint_chan.send(PaintMsg::CanvasLayer(layer_id, renderer));
- }
+ self.paint_chan.send(PaintMsg::CanvasLayer(layer_id, renderer));
}
// Perform post-style recalculation layout passes.
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs
index de71b66bc7c..6bdc6d1f98e 100644
--- a/components/layout/wrapper.rs
+++ b/components/layout/wrapper.rs
@@ -38,6 +38,7 @@ use data::{LayoutDataFlags, LayoutDataWrapper, PrivateLayoutData};
use opaque_node::OpaqueNodeMethods;
use gfx::display_list::OpaqueNode;
+use ipc_channel::ipc::IpcSender;
use script::dom::attr::AttrValue;
use script::dom::bindings::codegen::InheritTypes::{CharacterDataCast, ElementCast};
use script::dom::bindings::codegen::InheritTypes::{HTMLIFrameElementCast, HTMLCanvasElementCast};
@@ -63,7 +64,6 @@ use std::borrow::ToOwned;
use std::cell::{Ref, RefMut};
use std::marker::PhantomData;
use std::mem;
-use std::sync::mpsc::Sender;
use string_cache::{Atom, Namespace};
use style::computed_values::content::ContentItem;
use style::computed_values::{content, display, white_space};
@@ -904,10 +904,17 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
}
}
- pub fn renderer(&self) -> Option<Sender<CanvasMsg>> {
+ pub fn canvas_renderer_id(&self) -> Option<usize> {
unsafe {
let canvas_element = HTMLCanvasElementCast::to_layout_js(self.get_jsmanaged());
- canvas_element.and_then(|elem| elem.get_renderer())
+ canvas_element.and_then(|elem| elem.get_renderer_id())
+ }
+ }
+
+ pub fn canvas_ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>> {
+ unsafe {
+ let canvas_element = HTMLCanvasElementCast::to_layout_js(self.get_jsmanaged());
+ canvas_element.and_then(|elem| elem.get_ipc_renderer())
}
}
diff --git a/components/msg/Cargo.toml b/components/msg/Cargo.toml
index b2d239c8c34..edb799eee14 100644
--- a/components/msg/Cargo.toml
+++ b/components/msg/Cargo.toml
@@ -13,6 +13,9 @@ path = "../style"
[dependencies.util]
path = "../util"
+[dependencies.canvas_traits]
+path = "../canvas_traits"
+
[dependencies.azure]
git = "https://github.com/servo/rust-azure"
@@ -34,6 +37,10 @@ features = [ "serde_serialization" ]
[dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel"
+[dependencies.offscreen_gl_context]
+git = "https://github.com/ecoal95/rust-offscreen-rendering-context"
+features = ["texture_surface"]
+
[dependencies]
bitflags = "0.3"
rustc-serialize = "0.3.4"
diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs
index 16c90b670d1..fcd9afdf7f0 100644
--- a/components/msg/constellation_msg.rs
+++ b/components/msg/constellation_msg.rs
@@ -7,13 +7,15 @@
use compositor_msg::Epoch;
+use canvas_traits::CanvasMsg;
use euclid::rect::Rect;
-use euclid::size::TypedSize2D;
+use euclid::size::{Size2D, TypedSize2D};
use euclid::scale_factor::ScaleFactor;
use hyper::header::Headers;
use hyper::method::Method;
use ipc_channel::ipc::IpcSender;
use layers::geometry::DevicePixel;
+use offscreen_gl_context::GLContextAttributes;
use png::Image;
use util::cursor::Cursor;
use util::geometry::{PagePx, ViewportPx};
@@ -257,6 +259,14 @@ pub enum Msg {
NewFavicon(Url),
/// <head> tag finished parsing
HeadParsed,
+ /// Requests that a new 2D canvas thread be created. (This is done in the constellation because
+ /// 2D canvases may use the GPU and we don't want to give untrusted content access to the GPU.)
+ CreateCanvasPaintTask(Size2D<i32>, IpcSender<(IpcSender<CanvasMsg>, usize)>),
+ /// Requests that a new WebGL thread be created. (This is done in the constellation because
+ /// WebGL uses the GPU and we don't want to give untrusted content access to the GPU.)
+ CreateWebGLPaintTask(Size2D<i32>,
+ GLContextAttributes,
+ IpcSender<(IpcSender<CanvasMsg>, usize)>),
}
#[derive(Clone, Eq, PartialEq, Deserialize, Serialize)]
diff --git a/components/msg/lib.rs b/components/msg/lib.rs
index 35aa6444b0f..4c2dd1f999b 100644
--- a/components/msg/lib.rs
+++ b/components/msg/lib.rs
@@ -7,10 +7,12 @@
extern crate azure;
#[macro_use] extern crate bitflags;
+extern crate canvas_traits;
extern crate euclid;
extern crate hyper;
extern crate ipc_channel;
extern crate layers;
+extern crate offscreen_gl_context;
extern crate png;
extern crate rustc_serialize;
extern crate serde;
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml
index cdb925ff5eb..d5bd0e1b4fa 100644
--- a/components/script/Cargo.toml
+++ b/components/script/Cargo.toml
@@ -58,6 +58,10 @@ features = ["query_encoding", "serde_serialization"]
[dependencies.offscreen_gl_context]
git = "https://github.com/ecoal95/rust-offscreen-rendering-context"
+[dependencies.cssparser]
+version = "0.3"
+features = [ "serde-serialization" ]
+
[dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel"
@@ -73,7 +77,6 @@ time = "0.1.12"
bitflags = "0.3"
rustc-serialize = "0.3"
libc = "0.1"
-cssparser = "0.3.1"
unicase = "0.1"
num = "0.1.24"
websocket = "0.12"
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs
index 85dd955628b..5335db1d928 100644
--- a/components/script/dom/bindings/global.rs
+++ b/components/script/dom/bindings/global.rs
@@ -17,7 +17,7 @@ use dom::window::{self, WindowHelpers};
use devtools_traits::DevtoolsControlChan;
use script_task::{ScriptChan, ScriptPort, ScriptMsg, ScriptTask};
-use msg::constellation_msg::{PipelineId, WorkerId};
+use msg::constellation_msg::{ConstellationChan, PipelineId, WorkerId};
use net_traits::ResourceTask;
use profile_traits::mem;
@@ -91,6 +91,14 @@ impl<'a> GlobalRef<'a> {
}
}
+ /// Get a `ConstellationChan` to send messages to the constellation channel when available.
+ pub fn constellation_chan(&self) -> ConstellationChan {
+ match *self {
+ GlobalRef::Window(window) => window.constellation_chan(),
+ GlobalRef::Worker(worker) => worker.constellation_chan(),
+ }
+ }
+
/// Get a `DevtoolsControlChan` to send messages to Devtools
/// task when available.
pub fn devtools_chan(&self) -> Option<DevtoolsControlChan> {
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 079f1ecbafc..a2c82b80722 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -62,8 +62,8 @@ use msg::compositor_msg::ScriptListener;
use msg::constellation_msg::ConstellationChan;
use net_traits::image::base::Image;
use profile_traits::mem::ProfilerChan;
-use serde::Serialize;
use util::str::{LengthOrPercentageOrAuto};
+use serde::{Deserialize, Serialize};
use std::cell::{Cell, UnsafeCell, RefCell};
use std::collections::{HashMap, HashSet};
use std::collections::hash_state::HashState;
@@ -332,21 +332,21 @@ impl<A,B> JSTraceable for fn(A) -> B {
}
}
-impl JSTraceable for ScriptListener {
+impl<T> JSTraceable for IpcSender<T> where T: Deserialize + Serialize {
#[inline]
fn trace(&self, _: *mut JSTracer) {
// Do nothing
}
}
-impl JSTraceable for Box<LayoutRPC+'static> {
+impl JSTraceable for ScriptListener {
#[inline]
fn trace(&self, _: *mut JSTracer) {
// Do nothing
}
}
-impl<T> JSTraceable for IpcSender<T> where T: Serialize {
+impl JSTraceable for Box<LayoutRPC+'static> {
#[inline]
fn trace(&self, _: *mut JSTracer) {
// Do nothing
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 4d9ea26c6b7..671177f95db 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -28,20 +28,22 @@ 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};
use canvas_traits::{LineCapStyle, LineJoinStyle, CompositionOrBlending};
-use canvas::canvas_paint_task::CanvasPaintTask;
+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 num::{Float, ToPrimitive};
use std::borrow::ToOwned;
use std::cell::RefCell;
use std::fmt;
-use std::sync::mpsc::{channel, Sender};
+use std::sync::mpsc::channel;
use util::str::DOMString;
use url::Url;
@@ -60,7 +62,8 @@ pub enum CanvasFillOrStrokeStyle {
pub struct CanvasRenderingContext2D {
reflector_: Reflector,
global: GlobalField,
- renderer: Sender<CanvasMsg>,
+ renderer_id: usize,
+ ipc_renderer: IpcSender<CanvasMsg>,
canvas: JS<HTMLCanvasElement>,
state: RefCell<CanvasContextState>,
saved_states: RefCell<Vec<CanvasContextState>>,
@@ -115,10 +118,15 @@ impl CanvasContextState {
impl CanvasRenderingContext2D {
fn new_inherited(global: GlobalRef, canvas: &HTMLCanvasElement, size: Size2D<i32>)
-> CanvasRenderingContext2D {
+ let (sender, receiver) = ipc::channel().unwrap();
+ let constellation_chan = global.constellation_chan();
+ constellation_chan.0.send(ConstellationMsg::CreateCanvasPaintTask(size, sender)).unwrap();
+ let (ipc_renderer, renderer_id) = receiver.recv().unwrap();
CanvasRenderingContext2D {
reflector_: Reflector::new(),
global: GlobalField::from_rooted(&global),
- renderer: CanvasPaintTask::start(size),
+ renderer_id: renderer_id,
+ ipc_renderer: ipc_renderer,
canvas: JS::from_ref(canvas),
state: RefCell::new(CanvasContextState::new()),
saved_states: RefCell::new(Vec::new()),
@@ -132,7 +140,9 @@ impl CanvasRenderingContext2D {
}
pub fn recreate(&self, size: Size2D<i32>) {
- self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size)))
+ .unwrap();
}
fn mark_as_dirty(&self) {
@@ -142,7 +152,9 @@ impl CanvasRenderingContext2D {
}
fn update_transform(&self) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetTransform(self.state.borrow().transform))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetTransform(self.state.borrow().transform)))
+ .unwrap()
}
// It is used by DrawImage to calculate the size of the source and destination rectangles based
@@ -237,17 +249,19 @@ impl CanvasRenderingContext2D {
None => return Err(InvalidState),
};
- let renderer = context.r().get_renderer();
- let (sender, receiver) = channel::<Vec<u8>>();
+ let renderer = context.r().get_ipc_renderer();
+ let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap();
// Reads pixels from source image
- renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect, image_size, sender))).unwrap();
+ renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect,
+ image_size,
+ sender))).unwrap();
let imagedata = receiver.recv().unwrap();
// Writes pixels to destination canvas
CanvasMsg::Canvas2d(
Canvas2dMsg::DrawImage(imagedata, source_rect.size, dest_rect, source_rect, smoothing_enabled))
};
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
self.mark_as_dirty();
Ok(())
}
@@ -265,9 +279,13 @@ impl CanvasRenderingContext2D {
}
let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(
- image_data, image_size, dest_rect,
- source_rect, smoothing_enabled))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(image_data,
+ image_size,
+ dest_rect,
+ source_rect,
+ smoothing_enabled)))
+ .unwrap();
self.mark_as_dirty();
Ok(())
}
@@ -282,7 +300,9 @@ impl CanvasRenderingContext2D {
let img = match self.request_image_from_cache(url) {
ImageResponse::Loaded(img) => img,
- ImageResponse::PlaceholderLoaded(_) | ImageResponse::None => return None,
+ ImageResponse::PlaceholderLoaded(_) | ImageResponse::None => {
+ return None
+ }
};
let image_size = Size2D::new(img.width as f64, img.height as f64);
@@ -308,8 +328,8 @@ impl CanvasRenderingContext2D {
let canvas_size = canvas_element.get_size();
let image_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64);
- let renderer = context.r().get_renderer();
- let (sender, receiver) = channel::<Vec<u8>>();
+ let renderer = context.r().get_ipc_renderer();
+ let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap();
// Reads pixels from source canvas
renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect, image_size, sender))).unwrap();
@@ -341,24 +361,34 @@ impl CanvasRenderingContext2D {
}
pub trait CanvasRenderingContext2DHelpers {
- fn get_renderer(self) -> Sender<CanvasMsg>;
+ fn get_renderer_id(self) -> usize;
+ fn get_ipc_renderer(self) -> IpcSender<CanvasMsg>;
}
impl<'a> CanvasRenderingContext2DHelpers for &'a CanvasRenderingContext2D {
- fn get_renderer(self) -> Sender<CanvasMsg> {
- self.renderer.clone()
+ fn get_renderer_id(self) -> usize {
+ self.renderer_id
+ }
+ fn get_ipc_renderer(self) -> IpcSender<CanvasMsg> {
+ self.ipc_renderer.clone()
}
}
pub trait LayoutCanvasRenderingContext2DHelpers {
#[allow(unsafe_code)]
- unsafe fn get_renderer(&self) -> Sender<CanvasMsg>;
+ unsafe fn get_renderer_id(&self) -> usize;
+ #[allow(unsafe_code)]
+ unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg>;
}
impl LayoutCanvasRenderingContext2DHelpers for LayoutJS<CanvasRenderingContext2D> {
#[allow(unsafe_code)]
- unsafe fn get_renderer(&self) -> Sender<CanvasMsg> {
- (*self.unsafe_get()).renderer.clone()
+ unsafe fn get_renderer_id(&self) -> usize {
+ (*self.unsafe_get()).renderer_id
+ }
+ #[allow(unsafe_code)]
+ unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg> {
+ (*self.unsafe_get()).ipc_renderer.clone()
}
}
@@ -380,7 +410,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
// https://html.spec.whatwg.org/multipage/#dom-context-2d-save
fn Save(self) {
self.saved_states.borrow_mut().push(self.state.borrow().clone());
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SaveContext)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SaveContext)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-restore
@@ -388,7 +418,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
let mut saved_states = self.saved_states.borrow_mut();
if let Some(state) = saved_states.pop() {
self.state.borrow_mut().clone_from(&state);
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::RestoreContext)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::RestoreContext)).unwrap();
}
}
@@ -480,7 +510,9 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
}
self.state.borrow_mut().global_alpha = alpha;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalAlpha(alpha as f32))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalAlpha(alpha as f32)))
+ .unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-globalcompositeoperation
@@ -496,14 +528,16 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
fn SetGlobalCompositeOperation(self, op_str: DOMString) {
if let Some(op) = CompositionOrBlending::from_str(&op_str) {
self.state.borrow_mut().global_composition = op;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalComposition(op))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalComposition(op)))
+ .unwrap()
}
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-fillrect
fn FillRect(self, x: f64, y: f64, width: f64, height: f64) {
if let Some(rect) = self.create_drawable_rect(x, y, width, height) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillRect(rect))).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillRect(rect))).unwrap();
self.mark_as_dirty();
}
}
@@ -511,7 +545,9 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
// https://html.spec.whatwg.org/multipage/#dom-context-2d-clearrect
fn ClearRect(self, x: f64, y: f64, width: f64, height: f64) {
if let Some(rect) = self.create_drawable_rect(x, y, width, height) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClearRect(rect))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::ClearRect(rect)))
+ .unwrap();
self.mark_as_dirty();
}
}
@@ -519,38 +555,40 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokerect
fn StrokeRect(self, x: f64, y: f64, width: f64, height: f64) {
if let Some(rect) = self.create_drawable_rect(x, y, width, height) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::StrokeRect(rect))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::StrokeRect(rect)))
+ .unwrap();
self.mark_as_dirty();
}
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-beginpath
fn BeginPath(self) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::BeginPath)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::BeginPath)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-closepath
fn ClosePath(self) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClosePath)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClosePath)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-fill
fn Fill(self, _: CanvasWindingRule) {
// TODO: Process winding rule
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Fill)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Fill)).unwrap();
self.mark_as_dirty();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-stroke
fn Stroke(self) {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Stroke)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Stroke)).unwrap();
self.mark_as_dirty();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-clip
fn Clip(self, _: CanvasWindingRule) {
// TODO: Process winding rule
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Clip)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Clip)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage
@@ -728,7 +766,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
let msg = CanvasMsg::Canvas2d(
Canvas2dMsg::MoveTo(
Point2D::new(x as f32, y as f32)));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-lineto
@@ -740,7 +778,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
let msg = CanvasMsg::Canvas2d(
Canvas2dMsg::LineTo(
Point2D::new(x as f32, y as f32)));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-rect
@@ -749,7 +787,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
let rect = Rect::new(Point2D::new(x as f32, y as f32),
Size2D::new(width as f32, height as f32));
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::Rect(rect));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
}
}
@@ -764,7 +802,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
Canvas2dMsg::QuadraticCurveTo(
Point2D::new(cpx as f32, cpy as f32),
Point2D::new(x as f32, y as f32)));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-beziercurveto
@@ -779,7 +817,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
Point2D::new(cp1x as f32, cp1y as f32),
Point2D::new(cp2x as f32, cp2y as f32),
Point2D::new(x as f32, y as f32)));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-arc
@@ -800,7 +838,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
Point2D::new(x as f32, y as f32), r as f32,
start as f32, end as f32, ccw));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
Ok(())
}
@@ -818,7 +856,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
Point2D::new(cp1x as f32, cp1y as f32),
Point2D::new(cp2x as f32, cp2y as f32),
r as f32));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
Ok(())
}
@@ -854,8 +892,9 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
match parse_color(&string) {
Ok(rgba) => {
self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Color(rgba);
- self.renderer
- .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(FillOrStrokeStyle::Color(rgba))))
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(
+ FillOrStrokeStyle::Color(rgba))))
.unwrap();
}
_ => {}
@@ -866,7 +905,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
JS::from_ref(gradient.r()));
let msg = CanvasMsg::Canvas2d(
Canvas2dMsg::SetStrokeStyle(gradient.r().to_fill_or_stroke_style()));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
},
_ => {}
}
@@ -893,8 +932,9 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
match parse_color(&string) {
Ok(rgba) => {
self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Color(rgba);
- self.renderer
- .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(FillOrStrokeStyle::Color(rgba))))
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(
+ FillOrStrokeStyle::Color(rgba))))
.unwrap()
}
_ => {}
@@ -905,10 +945,10 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
JS::from_rooted(&gradient));
let msg = CanvasMsg::Canvas2d(
Canvas2dMsg::SetFillStyle(gradient.r().to_fill_or_stroke_style()));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
}
StringOrCanvasGradientOrCanvasPattern::eCanvasPattern(pattern) => {
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(
pattern.r().to_fill_or_stroke_style()))).unwrap();
}
}
@@ -947,12 +987,14 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
return Err(IndexSize)
}
- let (sender, receiver) = channel::<Vec<u8>>();
+ let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap();
let dest_rect = Rect::new(Point2D::new(sx as f64, sy as f64),
Size2D::new(sw as f64, sh as f64));
let canvas_size = self.canvas.root().r().get_size();
let canvas_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64);
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender)))
+ .unwrap();
let data = receiver.recv().unwrap();
Ok(ImageData::new(self.global.root().r(), sw.abs().to_u32().unwrap(), sh.abs().to_u32().unwrap(), Some(data)))
}
@@ -975,7 +1017,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
let image_data_rect = Rect::new(Point2D::new(dx, dy), image_data_size);
let dirty_rect = None;
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
self.mark_as_dirty();
}
@@ -1003,7 +1045,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
let dirty_rect = Some(Rect::new(Point2D::new(dirtyX, dirtyY),
Size2D::new(dirtyWidth, dirtyHeight)));
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect));
- self.renderer.send(msg).unwrap();
+ self.ipc_renderer.send(msg).unwrap();
self.mark_as_dirty();
}
@@ -1106,7 +1148,9 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
}
self.state.borrow_mut().line_width = width;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineWidth(width as f32))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineWidth(width as f32)))
+ .unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-linecap
@@ -1123,7 +1167,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
fn SetLineCap(self, cap_str: DOMString) {
if let Some(cap) = LineCapStyle::from_str(&cap_str) {
self.state.borrow_mut().line_cap = cap;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineCap(cap))).unwrap()
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineCap(cap))).unwrap()
}
}
@@ -1141,7 +1185,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
fn SetLineJoin(self, join_str: DOMString) {
if let Some(join) = LineJoinStyle::from_str(&join_str) {
self.state.borrow_mut().line_join = join;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineJoin(join))).unwrap()
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineJoin(join))).unwrap()
}
}
@@ -1158,7 +1202,9 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
}
self.state.borrow_mut().miter_limit = limit;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetMiterLimit(limit as f32))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetMiterLimit(limit as f32)))
+ .unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsetx
@@ -1172,7 +1218,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
return;
}
self.state.borrow_mut().shadow_offset_x = value;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetX(value))).unwrap()
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetX(value))).unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsety
@@ -1186,7 +1232,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
return;
}
self.state.borrow_mut().shadow_offset_y = value;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetY(value))).unwrap()
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetY(value))).unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowblur
@@ -1200,7 +1246,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
return;
}
self.state.borrow_mut().shadow_blur = value;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowBlur(value))).unwrap()
+ self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowBlur(value))).unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowcolor
@@ -1214,14 +1260,16 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D {
fn SetShadowColor(self, value: DOMString) {
if let Ok(color) = parse_color(&value) {
self.state.borrow_mut().shadow_color = color;
- self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowColor(color))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowColor(color)))
+ .unwrap()
}
}
}
impl Drop for CanvasRenderingContext2D {
fn drop(&mut self) {
- self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
}
}
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index cf8c22f81d7..6c27b895906 100644
--- a/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/components/script/dom/dedicatedworkerglobalscope.rs
@@ -24,7 +24,7 @@ use dom::workerglobalscope::WorkerGlobalScopeTypeId;
use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource, ScriptPort};
use script_task::StackRootTLS;
-use msg::constellation_msg::PipelineId;
+use msg::constellation_msg::{ConstellationChan, PipelineId};
use devtools_traits::DevtoolsControlChan;
@@ -113,6 +113,7 @@ impl DedicatedWorkerGlobalScope {
devtools_chan: Option<DevtoolsControlChan>,
runtime: Rc<Runtime>,
resource_task: ResourceTask,
+ constellation_chan: ConstellationChan,
parent_sender: Box<ScriptChan+Send>,
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>)
@@ -120,7 +121,7 @@ impl DedicatedWorkerGlobalScope {
DedicatedWorkerGlobalScope {
workerglobalscope: WorkerGlobalScope::new_inherited(
WorkerGlobalScopeTypeId::DedicatedGlobalScope, worker_url,
- runtime, resource_task, mem_profiler_chan, devtools_chan),
+ runtime, resource_task, mem_profiler_chan, devtools_chan, constellation_chan),
id: id,
receiver: receiver,
own_sender: own_sender,
@@ -135,13 +136,14 @@ impl DedicatedWorkerGlobalScope {
devtools_chan: Option<DevtoolsControlChan>,
runtime: Rc<Runtime>,
resource_task: ResourceTask,
+ constellation_chan: ConstellationChan,
parent_sender: Box<ScriptChan+Send>,
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>)
-> Root<DedicatedWorkerGlobalScope> {
let scope = box DedicatedWorkerGlobalScope::new_inherited(
worker_url, id, mem_profiler_chan, devtools_chan, runtime.clone(), resource_task,
- parent_sender, own_sender, receiver);
+ constellation_chan, parent_sender, own_sender, receiver);
DedicatedWorkerGlobalScopeBinding::Wrap(runtime.cx(), scope)
}
}
@@ -153,6 +155,7 @@ impl DedicatedWorkerGlobalScope {
devtools_chan: Option<DevtoolsControlChan>,
worker: TrustedWorkerAddress,
resource_task: ResourceTask,
+ constellation_chan: ConstellationChan,
parent_sender: Box<ScriptChan+Send>,
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) {
@@ -180,7 +183,7 @@ impl DedicatedWorkerGlobalScope {
let parent_sender_for_reporter = parent_sender.clone();
let global = DedicatedWorkerGlobalScope::new(
url, id, mem_profiler_chan.clone(), devtools_chan, runtime.clone(), resource_task,
- parent_sender, own_sender, receiver);
+ constellation_chan, parent_sender, own_sender, receiver);
// FIXME(njn): workers currently don't have a unique ID suitable for using in reporter
// registration (#6631), so we instead use a random number and cross our fingers.
let reporter_name = format!("worker-reporter-{}", random::<u64>());
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index a01a2c4fe26..3c52d99ea4f 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::CanvasMsg;
use dom::attr::Attr;
use dom::attr::AttrHelpers;
use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding;
@@ -27,12 +26,13 @@ use dom::webglrenderingcontext::{WebGLRenderingContext, LayoutCanvasWebGLRenderi
use util::str::{DOMString, parse_unsigned_integer};
use js::jsapi::{JSContext, HandleValue};
use offscreen_gl_context::GLContextAttributes;
+use canvas_traits::CanvasMsg;
+use ipc_channel::ipc::IpcSender;
use euclid::size::Size2D;
use std::cell::Cell;
use std::default::Default;
-use std::sync::mpsc::Sender;
const DEFAULT_WIDTH: u32 = 300;
const DEFAULT_HEIGHT: u32 = 150;
@@ -106,7 +106,9 @@ impl HTMLCanvasElement {
pub trait LayoutHTMLCanvasElementHelpers {
#[allow(unsafe_code)]
- unsafe fn get_renderer(&self) -> Option<Sender<CanvasMsg>>;
+ unsafe fn get_renderer_id(&self) -> Option<usize>;
+ #[allow(unsafe_code)]
+ unsafe fn get_ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>>;
#[allow(unsafe_code)]
unsafe fn get_canvas_width(&self) -> u32;
#[allow(unsafe_code)]
@@ -115,14 +117,25 @@ pub trait LayoutHTMLCanvasElementHelpers {
impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
#[allow(unsafe_code)]
- unsafe fn get_renderer(&self) -> Option<Sender<CanvasMsg>> {
+ unsafe fn get_renderer_id(&self) -> Option<usize> {
+ let ref canvas = *self.unsafe_get();
+ if let Some(context) = canvas.context.get() {
+ match context {
+ CanvasContext::Context2d(context) => Some(context.to_layout().get_renderer_id()),
+ CanvasContext::WebGL(context) => Some(context.to_layout().get_renderer_id()),
+ }
+ } else {
+ None
+ }
+ }
+
+ #[allow(unsafe_code)]
+ unsafe fn get_ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>> {
let ref canvas = *self.unsafe_get();
if let Some(context) = canvas.context.get() {
match context {
- CanvasContext::Context2d(context)
- => Some(context.to_layout().get_renderer()),
- CanvasContext::WebGL(context)
- => Some(context.to_layout().get_renderer()),
+ CanvasContext::Context2d(context) => Some(context.to_layout().get_ipc_renderer()),
+ CanvasContext::WebGL(context) => Some(context.to_layout().get_ipc_renderer()),
}
} else {
None
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs
index 4970b577bb7..432caf6276c 100644
--- a/components/script/dom/webglbuffer.rs
+++ b/components/script/dom/webglbuffer.rs
@@ -10,7 +10,7 @@ use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
use canvas_traits::{CanvasMsg, CanvasWebGLMsg};
-use std::sync::mpsc::{channel, Sender};
+use ipc_channel::ipc::{self, IpcSender};
use std::cell::Cell;
#[dom_struct]
@@ -18,11 +18,11 @@ pub struct WebGLBuffer {
webgl_object: WebGLObject,
id: u32,
is_deleted: Cell<bool>,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
}
impl WebGLBuffer {
- fn new_inherited(renderer: Sender<CanvasMsg>, id: u32) -> WebGLBuffer {
+ fn new_inherited(renderer: IpcSender<CanvasMsg>, id: u32) -> WebGLBuffer {
WebGLBuffer {
webgl_object: WebGLObject::new_inherited(),
id: id,
@@ -31,15 +31,16 @@ impl WebGLBuffer {
}
}
- pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLBuffer>> {
- let (sender, receiver) = channel();
+ pub fn maybe_new(global: GlobalRef, renderer: IpcSender<CanvasMsg>)
+ -> Option<Root<WebGLBuffer>> {
+ let (sender, receiver) = ipc::channel().unwrap();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateBuffer(sender))).unwrap();
let result = receiver.recv().unwrap();
result.map(|buffer_id| WebGLBuffer::new(global, renderer, *buffer_id))
}
- pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLBuffer> {
+ pub fn new(global: GlobalRef, renderer: IpcSender<CanvasMsg>, id: u32) -> Root<WebGLBuffer> {
reflect_dom_object(box WebGLBuffer::new_inherited(renderer, id), global, WebGLBufferBinding::Wrap)
}
}
diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs
index 26773ca4b17..2a67bb4dbcb 100644
--- a/components/script/dom/webglframebuffer.rs
+++ b/components/script/dom/webglframebuffer.rs
@@ -10,7 +10,7 @@ use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLFramebufferBindingRequest};
-use std::sync::mpsc::{channel, Sender};
+use ipc_channel::ipc::{self, IpcSender};
use std::cell::Cell;
#[dom_struct]
@@ -18,11 +18,11 @@ pub struct WebGLFramebuffer {
webgl_object: WebGLObject,
id: u32,
is_deleted: Cell<bool>,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
}
impl WebGLFramebuffer {
- fn new_inherited(renderer: Sender<CanvasMsg>, id: u32) -> WebGLFramebuffer {
+ fn new_inherited(renderer: IpcSender<CanvasMsg>, id: u32) -> WebGLFramebuffer {
WebGLFramebuffer {
webgl_object: WebGLObject::new_inherited(),
id: id,
@@ -31,15 +31,17 @@ impl WebGLFramebuffer {
}
}
- pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLFramebuffer>> {
- let (sender, receiver) = channel();
+ pub fn maybe_new(global: GlobalRef, renderer: IpcSender<CanvasMsg>)
+ -> Option<Root<WebGLFramebuffer>> {
+ let (sender, receiver) = ipc::channel().unwrap();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateFramebuffer(sender))).unwrap();
let result = receiver.recv().unwrap();
result.map(|fb_id| WebGLFramebuffer::new(global, renderer, *fb_id))
}
- pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLFramebuffer> {
+ pub fn new(global: GlobalRef, renderer: IpcSender<CanvasMsg>, id: u32)
+ -> Root<WebGLFramebuffer> {
reflect_dom_object(box WebGLFramebuffer::new_inherited(renderer, id), global, WebGLFramebufferBinding::Wrap)
}
}
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs
index 71e0d2e6616..a61fc22c905 100644
--- a/components/script/dom/webglprogram.rs
+++ b/components/script/dom/webglprogram.rs
@@ -14,7 +14,7 @@ use dom::webglrenderingcontext::MAX_UNIFORM_AND_ATTRIBUTE_LEN;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLResult, WebGLError};
-use std::sync::mpsc::{channel, Sender};
+use ipc_channel::ipc::{self, IpcSender};
use std::cell::Cell;
#[dom_struct]
@@ -24,11 +24,11 @@ pub struct WebGLProgram {
is_deleted: Cell<bool>,
fragment_shader: MutNullableHeap<JS<WebGLShader>>,
vertex_shader: MutNullableHeap<JS<WebGLShader>>,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
}
impl WebGLProgram {
- fn new_inherited(renderer: Sender<CanvasMsg>, id: u32) -> WebGLProgram {
+ fn new_inherited(renderer: IpcSender<CanvasMsg>, id: u32) -> WebGLProgram {
WebGLProgram {
webgl_object: WebGLObject::new_inherited(),
id: id,
@@ -39,15 +39,16 @@ impl WebGLProgram {
}
}
- pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLProgram>> {
- let (sender, receiver) = channel();
+ pub fn maybe_new(global: GlobalRef, renderer: IpcSender<CanvasMsg>)
+ -> Option<Root<WebGLProgram>> {
+ let (sender, receiver) = ipc::channel().unwrap();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateProgram(sender))).unwrap();
let result = receiver.recv().unwrap();
result.map(|program_id| WebGLProgram::new(global, renderer, *program_id))
}
- pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLProgram> {
+ pub fn new(global: GlobalRef, renderer: IpcSender<CanvasMsg>, id: u32) -> Root<WebGLProgram> {
reflect_dom_object(box WebGLProgram::new_inherited(renderer, id), global, WebGLProgramBinding::Wrap)
}
}
@@ -112,7 +113,7 @@ impl<'a> WebGLProgramHelpers for &'a WebGLProgram {
return Ok(None);
}
- let (sender, receiver) = channel();
+ let (sender, receiver) = ipc::channel().unwrap();
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetAttribLocation(self.id, name, sender))).unwrap();
Ok(receiver.recv().unwrap())
}
@@ -128,7 +129,7 @@ impl<'a> WebGLProgramHelpers for &'a WebGLProgram {
return Ok(None);
}
- let (sender, receiver) = channel();
+ let (sender, receiver) = ipc::channel().unwrap();
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetUniformLocation(self.id, name, sender))).unwrap();
Ok(receiver.recv().unwrap())
}
diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs
index d7084564ec3..cfe3fb21261 100644
--- a/components/script/dom/webglrenderbuffer.rs
+++ b/components/script/dom/webglrenderbuffer.rs
@@ -10,7 +10,7 @@ use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
use canvas_traits::{CanvasMsg, CanvasWebGLMsg};
-use std::sync::mpsc::{channel, Sender};
+use ipc_channel::ipc::{self, IpcSender};
use std::cell::Cell;
#[dom_struct]
@@ -18,11 +18,11 @@ pub struct WebGLRenderbuffer {
webgl_object: WebGLObject,
id: u32,
is_deleted: Cell<bool>,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
}
impl WebGLRenderbuffer {
- fn new_inherited(renderer: Sender<CanvasMsg>, id: u32) -> WebGLRenderbuffer {
+ fn new_inherited(renderer: IpcSender<CanvasMsg>, id: u32) -> WebGLRenderbuffer {
WebGLRenderbuffer {
webgl_object: WebGLObject::new_inherited(),
id: id,
@@ -31,15 +31,17 @@ impl WebGLRenderbuffer {
}
}
- pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLRenderbuffer>> {
- let (sender, receiver) = channel();
+ pub fn maybe_new(global: GlobalRef, renderer: IpcSender<CanvasMsg>)
+ -> Option<Root<WebGLRenderbuffer>> {
+ let (sender, receiver) = ipc::channel().unwrap();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateRenderbuffer(sender))).unwrap();
let result = receiver.recv().unwrap();
result.map(|renderbuffer_id| WebGLRenderbuffer::new(global, renderer, *renderbuffer_id))
}
- pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLRenderbuffer> {
+ pub fn new(global: GlobalRef, renderer: IpcSender<CanvasMsg>, id: u32)
+ -> Root<WebGLRenderbuffer> {
reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), global, WebGLRenderbufferBinding::Wrap)
}
}
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 123c1e200c3..4dcd1705782 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas::webgl_paint_task::WebGLPaintTask;
use canvas_traits::
{CanvasMsg, CanvasWebGLMsg, CanvasCommonMsg, WebGLError,
WebGLShaderParameter, WebGLFramebufferBindingRequest};
@@ -23,14 +22,16 @@ use dom::webglshader::{WebGLShader, WebGLShaderHelpers};
use dom::webglprogram::{WebGLProgram, WebGLProgramHelpers};
use dom::webgluniformlocation::{WebGLUniformLocation, WebGLUniformLocationHelpers};
use euclid::size::Size2D;
+use ipc_channel::ipc::{self, IpcSender};
use js::jsapi::{JSContext, JSObject, RootedValue};
use js::jsapi::{JS_GetFloat32ArrayData, JS_GetObjectAsArrayBufferView};
use js::jsval::{JSVal, UndefinedValue, NullValue, Int32Value, BooleanValue};
+use msg::constellation_msg::Msg as ConstellationMsg;
use std::cell::Cell;
use std::mem;
use std::ptr;
use std::slice;
-use std::sync::mpsc::{channel, Sender};
+use std::sync::mpsc::channel;
use util::str::DOMString;
use offscreen_gl_context::GLContextAttributes;
@@ -52,7 +53,8 @@ macro_rules! handle_potential_webgl_error {
pub struct WebGLRenderingContext {
reflector_: Reflector,
global: GlobalField,
- renderer: Sender<CanvasMsg>,
+ renderer_id: usize,
+ ipc_renderer: IpcSender<CanvasMsg>,
canvas: JS<HTMLCanvasElement>,
last_error: Cell<Option<WebGLError>>,
}
@@ -63,12 +65,17 @@ impl WebGLRenderingContext {
size: Size2D<i32>,
attrs: GLContextAttributes)
-> Result<WebGLRenderingContext, &'static str> {
- let chan = try!(WebGLPaintTask::start(size, attrs));
-
+ let (sender, receiver) = ipc::channel().unwrap();
+ let constellation_chan = global.constellation_chan();
+ constellation_chan.0
+ .send(ConstellationMsg::CreateWebGLPaintTask(size, attrs, sender))
+ .unwrap();
+ let (ipc_renderer, renderer_id) = receiver.recv().unwrap();
Ok(WebGLRenderingContext {
reflector_: Reflector::new(),
global: GlobalField::from_rooted(&global),
- renderer: chan,
+ renderer_id: renderer_id,
+ ipc_renderer: ipc_renderer,
last_error: Cell::new(None),
canvas: JS::from_ref(canvas),
})
@@ -87,13 +94,13 @@ impl WebGLRenderingContext {
}
pub fn recreate(&self, size: Size2D<i32>) {
- self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap();
}
}
impl Drop for WebGLRenderingContext {
fn drop(&mut self) {
- self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
}
}
@@ -105,15 +112,19 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
fn DrawingBufferWidth(self) -> i32 {
- let (sender, receiver) = channel();
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawingBufferWidth(sender))).unwrap();
+ let (sender, receiver) = ipc::channel().unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawingBufferWidth(sender)))
+ .unwrap();
receiver.recv().unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
fn DrawingBufferHeight(self) -> i32 {
- let (sender, receiver) = channel();
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawingBufferHeight(sender))).unwrap();
+ let (sender, receiver) = ipc::channel().unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawingBufferHeight(sender)))
+ .unwrap();
receiver.recv().unwrap()
}
@@ -151,10 +162,11 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.2
fn GetContextAttributes(self) -> Option<WebGLContextAttributes> {
- let (sender, receiver) = channel();
+ let (sender, receiver) = ipc::channel().unwrap();
// If the send does not succeed, assume context lost
- if let Err(_) = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetContextAttributes(sender))) {
+ if let Err(_) = self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::GetContextAttributes(sender))) {
return None;
}
let attrs = receiver.recv().unwrap();
@@ -180,32 +192,36 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ActiveTexture(self, texture: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::ActiveTexture(texture))).unwrap();
+ self.ipc_renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::ActiveTexture(texture))).unwrap();
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn BlendColor(self, r: f32, g: f32, b: f32, a: f32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendColor(r, g, b, a))).unwrap();
+ self.ipc_renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendColor(r, g, b, a))).unwrap();
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn BlendEquation(self, mode: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendEquation(mode))).unwrap();
+ self.ipc_renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendEquation(mode))).unwrap();
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn BlendEquationSeparate(self, mode_rgb: u32, mode_alpha: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendEquationSeparate(mode_rgb, mode_alpha))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendEquationSeparate(mode_rgb, mode_alpha)))
+ .unwrap();
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn BlendFunc(self, src_factor: u32, dest_factor: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendFunc(src_factor, dest_factor))).unwrap();
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::BlendFunc(src_factor, dest_factor)))
+ .unwrap();
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn BlendFuncSeparate(self, src_rgb: u32, dest_rgb: u32, src_alpha: u32, dest_alpha: u32) {
- self.renderer.send(
+ self.ipc_renderer.send(
CanvasMsg::WebGL(CanvasWebGLMsg::BlendFuncSeparate(src_rgb, dest_rgb, src_alpha, dest_alpha))).unwrap();
}
@@ -224,7 +240,9 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
buffer.bind(target)
} else {
// Unbind the current buffer
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BindBuffer(target, 0))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::BindBuffer(target, 0)))
+ .unwrap()
}
}
@@ -235,7 +253,7 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
} else {
// Bind the default framebuffer
let cmd = CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Default);
- self.renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
+ self.ipc_renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
}
}
@@ -245,7 +263,9 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
renderbuffer.bind(target)
} else {
// Unbind the currently bound renderbuffer
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BindRenderbuffer(target, 0))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::BindRenderbuffer(target, 0)))
+ .unwrap()
}
}
@@ -274,17 +294,21 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
let data_vec_length = length / mem::size_of::<f32>() as u32;
slice::from_raw_parts(data_f32, data_vec_length as usize).to_vec()
};
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BufferData(target, data_vec, usage))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::BufferData(target, data_vec, usage)))
+ .unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
fn Clear(self, mask: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::Clear(mask))).unwrap()
+ self.ipc_renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::Clear(mask))).unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ClearColor(self, red: f32, green: f32, blue: f32, alpha: f32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::ClearColor(red, green, blue, alpha))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::ClearColor(red, green, blue, alpha)))
+ .unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
@@ -298,34 +322,34 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// generated objects, either here or in the webgl task
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
fn CreateBuffer(self) -> Option<Root<WebGLBuffer>> {
- WebGLBuffer::maybe_new(self.global.root().r(), self.renderer.clone())
+ WebGLBuffer::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6
fn CreateFramebuffer(self) -> Option<Root<WebGLFramebuffer>> {
- WebGLFramebuffer::maybe_new(self.global.root().r(), self.renderer.clone())
+ WebGLFramebuffer::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7
fn CreateRenderbuffer(self) -> Option<Root<WebGLRenderbuffer>> {
- WebGLRenderbuffer::maybe_new(self.global.root().r(), self.renderer.clone())
+ WebGLRenderbuffer::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
fn CreateTexture(self) -> Option<Root<WebGLTexture>> {
- WebGLTexture::maybe_new(self.global.root().r(), self.renderer.clone())
+ WebGLTexture::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn CreateProgram(self) -> Option<Root<WebGLProgram>> {
- WebGLProgram::maybe_new(self.global.root().r(), self.renderer.clone())
+ WebGLProgram::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
// TODO(ecoal95): Check if constants are cross-platform or if we must make a translation
// between WebGL constants and native ones.
fn CreateShader(self, shader_type: u32) -> Option<Root<WebGLShader>> {
- WebGLShader::maybe_new(self.global.root().r(), self.renderer.clone(), shader_type)
+ WebGLShader::maybe_new(self.global.root().r(), self.ipc_renderer.clone(), shader_type)
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
@@ -372,12 +396,16 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
fn DrawArrays(self, mode: u32, first: i32, count: i32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawArrays(mode, first, count))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawArrays(mode, first, count)))
+ .unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
fn EnableVertexAttribArray(self, attrib_id: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::EnableVertexAttribArray(attrib_id))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::EnableVertexAttribArray(attrib_id)))
+ .unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
@@ -466,7 +494,9 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
let data_f32 = JS_GetFloat32ArrayData(data, ptr::null());
slice::from_raw_parts(data_f32, 4).to_vec()
};
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::Uniform4fv(uniform_id, data_vec))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::Uniform4fv(uniform_id, data_vec)))
+ .unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
@@ -483,7 +513,7 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
constants::FLOAT => {
let msg = CanvasMsg::WebGL(
CanvasWebGLMsg::VertexAttribPointer2f(attrib_id, size, normalized, stride, offset));
- self.renderer.send(msg).unwrap()
+ self.ipc_renderer.send(msg).unwrap()
}
_ => panic!("VertexAttribPointer: Data Type not supported")
}
@@ -492,7 +522,9 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4
fn Viewport(self, x: i32, y: i32, width: i32, height: i32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::Viewport(x, y, width, height))).unwrap()
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(CanvasWebGLMsg::Viewport(x, y, width, height)))
+ .unwrap()
}
}
@@ -512,12 +544,18 @@ impl<'a> WebGLRenderingContextHelpers for &'a WebGLRenderingContext {
pub trait LayoutCanvasWebGLRenderingContextHelpers {
#[allow(unsafe_code)]
- unsafe fn get_renderer(&self) -> Sender<CanvasMsg>;
+ unsafe fn get_renderer_id(&self) -> usize;
+ #[allow(unsafe_code)]
+ unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg>;
}
impl LayoutCanvasWebGLRenderingContextHelpers for LayoutJS<WebGLRenderingContext> {
#[allow(unsafe_code)]
- unsafe fn get_renderer(&self) -> Sender<CanvasMsg> {
- (*self.unsafe_get()).renderer.clone()
+ unsafe fn get_renderer_id(&self) -> usize {
+ (*self.unsafe_get()).renderer_id
+ }
+ #[allow(unsafe_code)]
+ unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg> {
+ (*self.unsafe_get()).ipc_renderer.clone()
}
}
diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs
index f5d40b16699..40c26d40c90 100644
--- a/components/script/dom/webglshader.rs
+++ b/components/script/dom/webglshader.rs
@@ -12,7 +12,7 @@ use dom::webglobject::WebGLObject;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLResult, WebGLError, WebGLShaderParameter};
-use std::sync::mpsc::{channel, Sender};
+use ipc_channel::ipc::{self, IpcSender};
use std::cell::Cell;
use std::cell::RefCell;
@@ -24,11 +24,11 @@ pub struct WebGLShader {
source: RefCell<Option<String>>,
is_deleted: Cell<bool>,
// TODO(ecoal95): Evaluate moving this to `WebGLObject`
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
}
impl WebGLShader {
- fn new_inherited(renderer: Sender<CanvasMsg>, id: u32, shader_type: u32) -> WebGLShader {
+ fn new_inherited(renderer: IpcSender<CanvasMsg>, id: u32, shader_type: u32) -> WebGLShader {
WebGLShader {
webgl_object: WebGLObject::new_inherited(),
id: id,
@@ -40,9 +40,9 @@ impl WebGLShader {
}
pub fn maybe_new(global: GlobalRef,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
shader_type: u32) -> Option<Root<WebGLShader>> {
- let (sender, receiver) = channel();
+ let (sender, receiver) = ipc::channel().unwrap();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateShader(shader_type, sender))).unwrap();
let result = receiver.recv().unwrap();
@@ -50,7 +50,7 @@ impl WebGLShader {
}
pub fn new(global: GlobalRef,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
id: u32,
shader_type: u32) -> Root<WebGLShader> {
reflect_dom_object(
@@ -95,7 +95,7 @@ impl<'a> WebGLShaderHelpers for &'a WebGLShader {
/// glGetShaderInfoLog
fn info_log(self) -> Option<String> {
- let (sender, receiver) = channel();
+ let (sender, receiver) = ipc::channel().unwrap();
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetShaderInfoLog(self.id, sender))).unwrap();
receiver.recv().unwrap()
}
@@ -107,7 +107,7 @@ impl<'a> WebGLShaderHelpers for &'a WebGLShader {
_ => return Err(WebGLError::InvalidEnum),
}
- let (sender, receiver) = channel();
+ let (sender, receiver) = ipc::channel().unwrap();
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetShaderParameter(self.id, param_id, sender))).unwrap();
Ok(receiver.recv().unwrap())
}
diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs
index ab934a5f47d..06664a01f3d 100644
--- a/components/script/dom/webgltexture.rs
+++ b/components/script/dom/webgltexture.rs
@@ -10,7 +10,7 @@ use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
use canvas_traits::{CanvasMsg, CanvasWebGLMsg};
-use std::sync::mpsc::{channel, Sender};
+use ipc_channel::ipc::{self, IpcSender};
use std::cell::Cell;
#[dom_struct]
@@ -18,11 +18,11 @@ pub struct WebGLTexture {
webgl_object: WebGLObject,
id: u32,
is_deleted: Cell<bool>,
- renderer: Sender<CanvasMsg>,
+ renderer: IpcSender<CanvasMsg>,
}
impl WebGLTexture {
- fn new_inherited(renderer: Sender<CanvasMsg>, id: u32) -> WebGLTexture {
+ fn new_inherited(renderer: IpcSender<CanvasMsg>, id: u32) -> WebGLTexture {
WebGLTexture {
webgl_object: WebGLObject::new_inherited(),
id: id,
@@ -31,15 +31,16 @@ impl WebGLTexture {
}
}
- pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLTexture>> {
- let (sender, receiver) = channel();
+ pub fn maybe_new(global: GlobalRef, renderer: IpcSender<CanvasMsg>)
+ -> Option<Root<WebGLTexture>> {
+ let (sender, receiver) = ipc::channel().unwrap();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateTexture(sender))).unwrap();
let result = receiver.recv().unwrap();
result.map(|texture_id| WebGLTexture::new(global, renderer, *texture_id))
}
- pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLTexture> {
+ pub fn new(global: GlobalRef, renderer: IpcSender<CanvasMsg>, id: u32) -> Root<WebGLTexture> {
reflect_dom_object(box WebGLTexture::new_inherited(renderer, id), global, WebGLTextureBinding::Wrap)
}
}
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index 257ecbdcef1..26fd1ff7421 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -70,6 +70,7 @@ impl Worker {
};
let resource_task = global.resource_task();
+ let constellation_chan = global.constellation_chan();
let (sender, receiver) = channel();
let worker = Worker::new(global, sender.clone());
@@ -91,7 +92,7 @@ impl Worker {
DedicatedWorkerGlobalScope::run_worker_scope(
worker_url, global.pipeline(), global.mem_profiler_chan(), global.devtools_chan(),
- worker_ref, resource_task, global.script_chan(), sender, receiver);
+ worker_ref, resource_task, constellation_chan, global.script_chan(), sender, receiver);
Ok(worker)
}
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index 260476859e9..8d473f6f081 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -22,7 +22,7 @@ use timers::{IsInterval, TimerId, TimerManager, TimerCallback};
use devtools_traits::DevtoolsControlChan;
-use msg::constellation_msg::{PipelineId, WorkerId};
+use msg::constellation_msg::{ConstellationChan, PipelineId, WorkerId};
use profile_traits::mem;
use net_traits::{load_whole_resource, ResourceTask};
use util::str::DOMString;
@@ -55,6 +55,7 @@ pub struct WorkerGlobalScope {
timers: TimerManager,
mem_profiler_chan: mem::ProfilerChan,
devtools_chan: Option<DevtoolsControlChan>,
+ constellation_chan: ConstellationChan,
}
impl WorkerGlobalScope {
@@ -63,7 +64,8 @@ impl WorkerGlobalScope {
runtime: Rc<Runtime>,
resource_task: ResourceTask,
mem_profiler_chan: mem::ProfilerChan,
- devtools_chan: Option<DevtoolsControlChan>) -> WorkerGlobalScope {
+ devtools_chan: Option<DevtoolsControlChan>,
+ constellation_chan: ConstellationChan) -> WorkerGlobalScope {
WorkerGlobalScope {
eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)),
next_worker_id: Cell::new(WorkerId(0)),
@@ -77,6 +79,7 @@ impl WorkerGlobalScope {
timers: TimerManager::new(),
mem_profiler_chan: mem_profiler_chan,
devtools_chan: devtools_chan,
+ constellation_chan: constellation_chan,
}
}
@@ -88,6 +91,10 @@ impl WorkerGlobalScope {
self.devtools_chan.clone()
}
+ pub fn constellation_chan(&self) -> ConstellationChan {
+ self.constellation_chan.clone()
+ }
+
#[inline]
pub fn eventtarget<'a>(&'a self) -> &'a EventTarget {
&self.eventtarget
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock
index 0fa5a851ac7..4032837508f 100644
--- a/components/servo/Cargo.lock
+++ b/components/servo/Cargo.lock
@@ -61,7 +61,7 @@ dependencies = [
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-text 0.1.0 (git+https://github.com/servo/core-text-rs)",
"egl 0.1.0 (git+https://github.com/servo/rust-egl)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"freetype 0.1.0 (git+https://github.com/servo/rust-freetype)",
"freetype-sys 2.4.11 (git+https://github.com/servo/libfreetype2)",
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -92,8 +92,8 @@ version = "0.0.1"
dependencies = [
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
"canvas_traits 0.0.1",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx_traits 0.0.1",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
@@ -109,12 +109,14 @@ name = "canvas_traits"
version = "0.0.1"
dependencies = [
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx_traits 0.0.1",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"layers 0.1.0 (git+https://github.com/servo/rust-layers)",
"offscreen_gl_context 0.1.0 (git+https://github.com/ecoal95/rust-offscreen-rendering-context)",
+ "serde 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_macros 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -158,11 +160,13 @@ name = "compositing"
version = "0.0.1"
dependencies = [
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
+ "canvas 0.0.1",
+ "canvas_traits 0.0.1",
"clipboard 0.0.1 (git+https://github.com/aweinstock314/rust-clipboard)",
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-text 0.1.0 (git+https://github.com/servo/core-text-rs)",
"devtools_traits 0.0.1",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx 0.0.1",
"gfx_traits 0.0.1",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -175,6 +179,7 @@ dependencies = [
"net 0.0.1",
"net_traits 0.0.1",
"num 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "offscreen_gl_context 0.1.0 (git+https://github.com/ecoal95/rust-offscreen-rendering-context)",
"png 0.1.0 (git+https://github.com/servo/rust-png)",
"profile_traits 0.0.1",
"script_traits 0.0.1",
@@ -224,11 +229,13 @@ dependencies = [
[[package]]
name = "cssparser"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"encoding 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
"matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_macros 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -339,7 +346,7 @@ dependencies = [
[[package]]
name = "euclid"
-version = "0.1.2"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"log 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -431,7 +438,7 @@ dependencies = [
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-text 0.1.0 (git+https://github.com/servo/core-text-rs)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"fontconfig 0.1.0 (git+https://github.com/servo/rust-fontconfig)",
"freetype 0.1.0 (git+https://github.com/servo/rust-freetype)",
@@ -533,7 +540,7 @@ dependencies = [
"cgl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"compositing 0.0.1",
"egl 0.1.0 (git+https://github.com/servo/rust-egl)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"glutin 0.0.26 (git+https://github.com/servo/glutin?branch=servo)",
"layers 0.1.0 (git+https://github.com/servo/rust-layers)",
@@ -633,7 +640,7 @@ source = "git+https://github.com/servo/io-surface-rs#f772aa79f487d1722ec6ad3d3c3
dependencies = [
"cgl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -690,7 +697,7 @@ dependencies = [
"cgl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"egl 0.1.0 (git+https://github.com/servo/rust-egl)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"glx 0.0.1 (git+https://github.com/servo/rust-glx)",
"io-surface 0.1.0 (git+https://github.com/servo/io-surface-rs)",
@@ -710,9 +717,9 @@ dependencies = [
"canvas 0.0.1",
"canvas_traits 0.0.1",
"clock_ticks 0.0.6 (git+https://github.com/tomaka/clock_ticks)",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx 0.0.1",
"gfx_traits 0.0.1",
@@ -743,7 +750,7 @@ dependencies = [
name = "layout_traits"
version = "0.0.1"
dependencies = [
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx 0.0.1",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"msg 0.0.1",
@@ -836,12 +843,14 @@ version = "0.0.1"
dependencies = [
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
"bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "canvas_traits 0.0.1",
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
"io-surface 0.1.0 (git+https://github.com/servo/io-surface-rs)",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"layers 0.1.0 (git+https://github.com/servo/rust-layers)",
+ "offscreen_gl_context 0.1.0 (git+https://github.com/ecoal95/rust-offscreen-rendering-context)",
"png 0.1.0 (git+https://github.com/servo/rust-png)",
"rustc-serialize 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -857,7 +866,7 @@ version = "0.0.1"
dependencies = [
"cookie 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
"devtools_traits 0.0.1",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"flate2 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -890,7 +899,7 @@ dependencies = [
name = "net_traits"
version = "0.0.1"
dependencies = [
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"log 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -936,7 +945,7 @@ source = "git+https://github.com/ecoal95/rust-offscreen-rendering-context#724d47
dependencies = [
"cgl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"gl_generator 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"khronos_api 0.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1142,10 +1151,10 @@ dependencies = [
"bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"canvas 0.0.1",
"canvas_traits 0.0.1",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"devtools_traits 0.0.1",
"encoding 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"html5ever 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1191,7 +1200,7 @@ name = "script_traits"
version = "0.0.1"
dependencies = [
"devtools_traits 0.0.1",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1",
@@ -1209,7 +1218,7 @@ version = "0.1.0"
source = "git+https://github.com/servo/rust-selectors#625734e1e8d70c012672b248adca302d0276fe08"
dependencies = [
"bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"quicksort 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1260,7 +1269,7 @@ source = "git+https://github.com/servo/skia#62a452b39294d94e60f279eacbb71a0b3296
dependencies = [
"cgl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"egl 0.1.0 (git+https://github.com/servo/rust-egl)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"expat-sys 2.1.0 (git+https://github.com/servo/libexpat)",
"freetype-sys 2.4.11 (git+https://github.com/servo/libfreetype2)",
"gleam 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1326,9 +1335,9 @@ name = "style"
version = "0.0.1"
dependencies = [
"bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1350,8 +1359,8 @@ dependencies = [
name = "style_tests"
version = "0.0.1"
dependencies = [
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"selectors 0.1.0 (git+https://github.com/servo/rust-selectors)",
"string_cache 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1448,8 +1457,8 @@ version = "0.0.1"
dependencies = [
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
"bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1468,7 +1477,7 @@ dependencies = [
name = "util_tests"
version = "0.0.1"
dependencies = [
- "euclid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
"plugins 0.0.1",
"util 0.0.1",
diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml
index 8d256b02270..8f44f13e47b 100644
--- a/components/style/Cargo.toml
+++ b/components/style/Cargo.toml
@@ -15,10 +15,13 @@ path = "../plugins"
[dependencies.util]
path = "../util"
-
[dependencies.selectors]
git = "https://github.com/servo/rust-selectors"
+[dependencies.cssparser]
+version = "0.3"
+features = [ "serde-serialization" ]
+
[dependencies]
log = "0.3"
encoding = "0.2"
@@ -27,7 +30,6 @@ rustc-serialize = "0.3"
matches = "0.1"
url = "0.2.36"
bitflags = "0.3"
-cssparser = "0.3.2"
num = "0.1.24"
lazy_static = "0.1.10"
smallvec = "0.1"
diff --git a/components/util/Cargo.toml b/components/util/Cargo.toml
index c7457ffa276..a61600c8d5a 100644
--- a/components/util/Cargo.toml
+++ b/components/util/Cargo.toml
@@ -21,6 +21,10 @@ path = "../plugins"
[dependencies.azure]
git = "https://github.com/servo/rust-azure"
+[dependencies.cssparser]
+version = "0.3"
+features = [ "serde-serialization" ]
+
[dependencies]
log = "0.3"
bitflags = "0.3"
@@ -29,7 +33,6 @@ rand = "0.3"
rustc-serialize = "0.3"
smallvec = "0.1"
num_cpus = "0.2.2"
-cssparser = "0.3.1"
num = "0.1.24"
url = "0.2.36"
euclid = "0.1"