diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-17 09:57:12 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-17 10:19:59 +0200 |
commit | f58207b851494562f855b8fdb929a529d9850f44 (patch) | |
tree | 0b22eb4014bb7e83c6ef1c84f4b879a4b04f8fb4 | |
parent | 95dc54d216d63b7314214afc1b50025b73a132b1 (diff) | |
download | servo-f58207b851494562f855b8fdb929a529d9850f44.tar.gz servo-f58207b851494562f855b8fdb929a529d9850f44.zip |
Introduce MainThreadScriptMsg::RegisterPaintWorklet
This avoids the need for a generic task to send messages to the layout thread
through the main script thread.
-rw-r--r-- | components/script/dom/paintworkletglobalscope.rs | 4 | ||||
-rw-r--r-- | components/script/dom/workletglobalscope.rs | 44 | ||||
-rw-r--r-- | components/script/script_thread.rs | 52 | ||||
-rw-r--r-- | components/script_traits/lib.rs | 6 |
4 files changed, 67 insertions, 39 deletions
diff --git a/components/script/dom/paintworkletglobalscope.rs b/components/script/dom/paintworkletglobalscope.rs index 0a01e62cd9b..8eba2c8bb14 100644 --- a/components/script/dom/paintworkletglobalscope.rs +++ b/components/script/dom/paintworkletglobalscope.rs @@ -46,7 +46,6 @@ use js::rust::Runtime; use msg::constellation_msg::PipelineId; use net_traits::image::base::PixelFormat; use net_traits::image_cache::ImageCache; -use script_layout_interface::message::Msg; use script_traits::DrawAPaintImageResult; use script_traits::Painter; use servo_atoms::Atom; @@ -443,8 +442,7 @@ impl PaintWorkletGlobalScopeMethods for PaintWorkletGlobalScope { // Inform layout that there is a registered paint worklet. // TODO: layout will end up getting this message multiple times. let painter = self.painter(name.clone()); - let msg = Msg::RegisterPaint(name, properties, painter); - self.worklet_global.send_to_layout(msg); + self.worklet_global.register_paint_worklet(name, properties, painter); Ok(()) } diff --git a/components/script/dom/workletglobalscope.rs b/components/script/dom/workletglobalscope.rs index f603547bb19..210ede4172e 100644 --- a/components/script/dom/workletglobalscope.rs +++ b/components/script/dom/workletglobalscope.rs @@ -22,12 +22,10 @@ use net_traits::ResourceThreads; use net_traits::image_cache::ImageCache; use profile_traits::mem; use profile_traits::time; -use script_layout_interface::message::Msg; -use script_runtime::ScriptThreadEventCategory; -use script_thread::{MainThreadScriptMsg, ScriptThread, Task}; -use script_traits::ScriptMsg; -use script_traits::ScriptToConstellationChan; -use script_traits::TimerSchedulerMsg; +use script_thread::MainThreadScriptMsg; +use script_traits::{Painter, ScriptMsg}; +use script_traits::{ScriptToConstellationChan, TimerSchedulerMsg}; +use servo_atoms::Atom; use servo_url::ImmutableOrigin; use servo_url::MutableOrigin; use servo_url::ServoUrl; @@ -93,31 +91,23 @@ impl WorkletGlobalScope { self.globalscope.evaluate_js_on_global_with_result(&*script, rval.handle_mut()) } - /// Run a task in the main script thread. - pub fn run_in_script_thread<T>(&self, task: T) - where - T: 'static + Send + Task, - { + /// Register a paint worklet to the script thread. + pub fn register_paint_worklet( + &self, + name: Atom, + properties: Vec<Atom>, + painter: Box<Painter>, + ) { self.to_script_thread_sender - .send(MainThreadScriptMsg::MainThreadTask( - ScriptThreadEventCategory::WorkletEvent, - box task, - )) + .send(MainThreadScriptMsg::RegisterPaintWorklet { + pipeline_id: self.globalscope.pipeline_id(), + name, + properties, + painter, + }) .expect("Worklet thread outlived script thread."); } - /// Send a message to layout. - pub fn send_to_layout(&self, msg: Msg) { - struct SendToLayoutTask(PipelineId, Msg); - impl Task for SendToLayoutTask { - fn run_with_script_thread(self: Box<Self>, script_thread: &ScriptThread) { - script_thread.send_to_layout(self.0, self.1); - } - } - let pipeline_id = self.globalscope.pipeline_id(); - self.run_in_script_thread(SendToLayoutTask(pipeline_id, msg)); - } - /// The base URL of this global. pub fn base_url(&self) -> ServoUrl { self.base_url.clone() diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e6ace85b51a..02d6158c887 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -87,16 +87,19 @@ use profile_traits::time::{self, ProfilerCategory, profile}; use script_layout_interface::message::{self, Msg, NewLayoutThreadInfo, ReflowQueryType}; use script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory}; use script_runtime::{ScriptPort, StackRootTLS, get_reports, new_rt_and_cx}; -use script_traits::{CompositorEvent, ConstellationControlMsg, PaintMetricType}; -use script_traits::{DocumentActivity, DiscardBrowsingContext, EventResult}; -use script_traits::{InitialScriptState, JsEvalResult, LayoutMsg, LoadData, MouseButton, MouseEventType}; -use script_traits::{MozBrowserEvent, NewLayoutInfo, ScriptToConstellationChan, ScriptMsg, UpdatePipelineIdReason}; -use script_traits::{ScriptThreadFactory, TimerEvent, TimerSchedulerMsg, TimerSource}; -use script_traits::{TouchEventType, TouchId, UntrustedNodeAddress, WindowSizeData, WindowSizeType}; +use script_traits::{CompositorEvent, ConstellationControlMsg}; +use script_traits::{DiscardBrowsingContext, DocumentActivity, EventResult}; +use script_traits::{InitialScriptState, JsEvalResult, LayoutMsg, LoadData}; +use script_traits::{MouseButton, MouseEventType, MozBrowserEvent, NewLayoutInfo}; +use script_traits::{PaintMetricType, Painter, ScriptMsg, ScriptThreadFactory}; +use script_traits::{ScriptToConstellationChan, TimerEvent, TimerSchedulerMsg}; +use script_traits::{TimerSource, TouchEventType, TouchId, UntrustedNodeAddress}; +use script_traits::{UpdatePipelineIdReason, WindowSizeData, WindowSizeType}; use script_traits::CompositorEvent::{KeyEvent, MouseButtonEvent, MouseMoveEvent, ResizeEvent}; use script_traits::CompositorEvent::{TouchEvent, TouchpadPressureEvent}; use script_traits::webdriver_msg::WebDriverScriptCommand; use serviceworkerjob::{Job, JobQueue, AsyncJobHandler}; +use servo_atoms::Atom; use servo_config::opts; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use std::cell::Cell; @@ -294,6 +297,13 @@ pub enum MainThreadScriptMsg { /// Notifies the script thread that a new worklet has been loaded, and thus the page should be /// reflowed. WorkletLoaded(PipelineId), + /// Notifies the script thread that a new paint worklet has been registered. + RegisterPaintWorklet { + pipeline_id: PipelineId, + name: Atom, + properties: Vec<Atom>, + painter: Box<Painter> + }, /// Runs a Task in the main thread. MainThreadTask(ScriptThreadEventCategory, Box<Task + Send>), } @@ -780,13 +790,21 @@ impl ScriptThread { }) } - pub fn send_to_layout(&self, pipeline_id: PipelineId, msg: Msg) { + fn handle_register_paint_worklet( + &self, + pipeline_id: PipelineId, + name: Atom, + properties: Vec<Atom>, + painter: Box<Painter>, + ) { let window = self.documents.borrow().find_window(pipeline_id); let window = match window { Some(window) => window, - None => return warn!("Message sent to layout after pipeline {} closed.", pipeline_id), + None => return warn!("Paint worklet registered after pipeline {} closed.", pipeline_id), }; - let _ = window.layout_chan().send(msg); + let _ = window.layout_chan().send( + Msg::RegisterPaint(name, properties, painter), + ); } pub fn push_new_element_queue() { @@ -1176,6 +1194,9 @@ impl ScriptThread { match *inner_msg { MainThreadScriptMsg::Common(CommonScriptMsg::Task(category, _)) | MainThreadScriptMsg::MainThreadTask(category, _) => category, + MainThreadScriptMsg::RegisterPaintWorklet { .. } => { + ScriptThreadEventCategory::WorkletEvent + }, _ => ScriptThreadEventCategory::ScriptEvent, } }, @@ -1314,6 +1335,19 @@ impl ScriptThread { MainThreadScriptMsg::WorkletLoaded(pipeline_id) => { self.handle_worklet_loaded(pipeline_id) }, + MainThreadScriptMsg::RegisterPaintWorklet { + pipeline_id, + name, + properties, + painter, + } => { + self.handle_register_paint_worklet( + pipeline_id, + name, + properties, + painter, + ) + }, MainThreadScriptMsg::MainThreadTask(_, task) => { task.run_with_script_thread(self) }, diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index dbc65343a76..8b2c98b1eb6 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -860,6 +860,12 @@ pub trait Painter: SpeculativePainter { -> DrawAPaintImageResult; } +impl fmt::Debug for Painter { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fmt.debug_tuple("Painter").field(&format_args!("..")).finish() + } +} + /// The result of executing paint code: the image together with any image URLs that need to be loaded. /// TODO: this should return a WR display list. https://github.com/servo/servo/issues/17497 #[derive(Clone, Debug, Deserialize, HeapSizeOf, Serialize)] |