diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 872cb0aaac6..6c8221ecafd 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -2,10 +2,13 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use canvas_traits::canvas::{Canvas2dMsg, CanvasId, CanvasMsg}; +use canvas_traits::canvas::{ + Canvas2dMsg, CanvasId, CanvasImageData, CanvasMsg, FromLayoutMsg, FromScriptMsg, +}; use dom_struct::dom_struct; use euclid::default::{Point2D, Rect, Size2D}; -use ipc_channel::ipc::IpcSender; +use ipc_channel::ipc::{IpcSender, IpcSharedMemory}; +use profile_traits::ipc; use servo_url::ServoUrl; use crate::canvas_state::CanvasState; @@ -104,11 +107,6 @@ impl CanvasRenderingContext2D { self.canvas_state.send_canvas_2d_msg(msg) } - // TODO: Remove this - pub(crate) fn get_ipc_renderer(&self) -> IpcSender { - self.canvas_state.get_ipc_renderer().clone() - } - pub(crate) fn origin_is_clean(&self) -> bool { self.canvas_state.origin_is_clean() } @@ -125,6 +123,19 @@ impl CanvasRenderingContext2D { rect, ) } + + pub(crate) fn fetch_data(&self) -> IpcSharedMemory { + let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); + let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender), self.get_canvas_id()); + self.canvas_state.get_ipc_renderer().send(msg).unwrap(); + + receiver.recv().unwrap() + } + + pub(crate) fn send_data(&self, sender: IpcSender) { + let msg = CanvasMsg::FromLayout(FromLayoutMsg::SendData(sender), self.get_canvas_id()); + let _ = self.canvas_state.get_ipc_renderer().send(msg); + } } pub(crate) trait LayoutCanvasRenderingContext2DHelpers { diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 1511f22720d..0ec6b84b38e 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -400,17 +400,7 @@ impl HTMLCanvasElement { } let data = match self.context.borrow().as_ref() { - Some(CanvasContext::Context2d(context)) => { - let (sender, receiver) = - ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - let msg = CanvasMsg::FromScript( - FromScriptMsg::SendPixels(sender), - context.get_canvas_id(), - ); - context.get_ipc_renderer().send(msg).unwrap(); - - Some(receiver.recv().unwrap()) - }, + Some(CanvasContext::Context2d(context)) => Some(context.fetch_data()), Some(&CanvasContext::WebGL(_)) => { // TODO: add a method in WebGLRenderingContext to get the pixels. return None; diff --git a/components/script/dom/paintrenderingcontext2d.rs b/components/script/dom/paintrenderingcontext2d.rs index 352d948ab03..eec914086ab 100644 --- a/components/script/dom/paintrenderingcontext2d.rs +++ b/components/script/dom/paintrenderingcontext2d.rs @@ -4,7 +4,7 @@ use std::cell::Cell; -use canvas_traits::canvas::{CanvasImageData, CanvasMsg, FromLayoutMsg}; +use canvas_traits::canvas::CanvasImageData; use dom_struct::dom_struct; use euclid::{Scale, Size2D}; use ipc_channel::ipc::IpcSender; @@ -56,11 +56,7 @@ impl PaintRenderingContext2D { } pub(crate) fn send_data(&self, sender: IpcSender) { - let msg = CanvasMsg::FromLayout( - FromLayoutMsg::SendData(sender), - self.context.get_canvas_id(), - ); - let _ = self.context.get_ipc_renderer().send(msg); + self.context.send_data(sender); } pub(crate) fn take_missing_image_urls(&self) -> Vec {