From bc908458ff24e42cc0c1ad32df44481456737bdb Mon Sep 17 00:00:00 2001 From: ecoal95 Date: Tue, 28 Jul 2015 16:58:53 +0200 Subject: [PATCH] webgl: Make context creation fallible. Fixes #6806 --- components/compositing/constellation.rs | 17 +++++++++------ components/msg/constellation_msg.rs | 2 +- .../script/dom/webglrenderingcontext.rs | 21 +++++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index 695c6688e9a..cf00da98960 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -942,12 +942,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 fcd9afdf7f0..6a11c7eb729 100644 --- a/components/msg/constellation_msg.rs +++ b/components/msg/constellation_msg.rs @@ -266,7 +266,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 4dcd1705782..f02cd0d9524 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), + } }) }