diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index 8237908656f..429690702b1 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -949,12 +949,17 @@ impl Constellation { &mut self, size: &Size2D, attributes: GLContextAttributes, - response_sender: IpcSender<(IpcSender, 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() + response_sender: IpcSender, usize), String>>) { + let response = match WebGLPaintTask::start(*size, attributes) { + Ok((out_of_process_sender, in_process_sender)) => { + let id = self.webgl_paint_tasks.len(); + self.webgl_paint_tasks.push(in_process_sender); + Ok((out_of_process_sender, id)) + }, + Err(msg) => Err(msg.to_owned()), + }; + + response_sender.send(response).unwrap() } fn handle_webdriver_msg(&mut self, msg: WebDriverCommandMsg) { diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs index 26b5a97ce09..36bd8279319 100644 --- a/components/msg/constellation_msg.rs +++ b/components/msg/constellation_msg.rs @@ -268,7 +268,7 @@ pub enum Msg { /// WebGL uses the GPU and we don't want to give untrusted content access to the GPU.) CreateWebGLPaintTask(Size2D, GLContextAttributes, - IpcSender<(IpcSender, usize)>), + IpcSender, usize), String>>), } #[derive(Clone, Eq, PartialEq, Deserialize, Serialize)] diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 78a2567cbd2..750edfb8329 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -64,20 +64,23 @@ impl WebGLRenderingContext { canvas: &HTMLCanvasElement, size: Size2D, attrs: GLContextAttributes) - -> Result { + -> Result { 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_id: renderer_id, - ipc_renderer: ipc_renderer, - last_error: Cell::new(None), - canvas: JS::from_ref(canvas), + let result = receiver.recv().unwrap(); + + result.map(|(ipc_renderer, renderer_id)| { + WebGLRenderingContext { + reflector_: Reflector::new(), + global: GlobalField::from_rooted(&global), + renderer_id: renderer_id, + ipc_renderer: ipc_renderer, + last_error: Cell::new(None), + canvas: JS::from_ref(canvas), + } }) }