diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index c38a5869d61..a3e879326bc 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -56,6 +56,7 @@ use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use task::TaskCanceller; use task_source::TaskSourceName; +use task_source::dom_manipulation::DOMManipulationTaskSource; use task_source::file_reading::FileReadingTaskSource; use task_source::networking::NetworkingTaskSource; use task_source::performance_timeline::PerformanceTimelineTaskSource; @@ -680,6 +681,16 @@ impl GlobalScope { unreachable!(); } + pub fn dom_manipulation_task_source(&self) -> DOMManipulationTaskSource { + if let Some(window) = self.downcast::() { + return window.dom_manipulation_task_source(); + } + if let Some(worker) = self.downcast::() { + return worker.dom_manipulation_task_source(); + } + unreachable!(); + } + /// Channel to send messages to the file reading task source of /// this of this global scope. pub fn file_reading_task_source(&self) -> FileReadingTaskSource { diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index fa2d0a449cf..edcdb329af8 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -43,6 +43,7 @@ use std::rc::Rc; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use task::TaskCanceller; +use task_source::dom_manipulation::DOMManipulationTaskSource; use task_source::file_reading::FileReadingTaskSource; use task_source::networking::NetworkingTaskSource; use task_source::performance_timeline::PerformanceTimelineTaskSource; @@ -419,6 +420,10 @@ impl WorkerGlobalScope { } } + pub fn dom_manipulation_task_source(&self) -> DOMManipulationTaskSource { + DOMManipulationTaskSource(self.script_chan(), self.pipeline_id()) + } + pub fn file_reading_task_source(&self) -> FileReadingTaskSource { FileReadingTaskSource(self.script_chan(), self.pipeline_id()) } diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index 276a913647a..b128e3e54b5 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -217,7 +217,7 @@ pub fn notify_about_rejected_promises(global: &GlobalScope) { let target = Trusted::new(global.upcast::()); // Step 4. - global.as_window().dom_manipulation_task_source().queue( + global.dom_manipulation_task_source().queue( task!(unhandled_rejection_event: move || { let target = target.root(); let cx = target.global().get_cx(); diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 0f756caccca..8795a65cd13 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -501,7 +501,7 @@ pub struct ScriptThread { /// events in the event queue. chan: MainThreadScriptChan, - dom_manipulation_task_sender: Sender, + dom_manipulation_task_sender: Box, media_element_task_sender: Sender, @@ -1020,7 +1020,7 @@ impl ScriptThread { task_queue, chan: MainThreadScriptChan(chan.clone()), - dom_manipulation_task_sender: chan.clone(), + dom_manipulation_task_sender: boxed_script_sender.clone(), media_element_task_sender: chan.clone(), user_interaction_task_sender: chan.clone(), networking_task_sender: boxed_script_sender.clone(), diff --git a/components/script/task_source/dom_manipulation.rs b/components/script/task_source/dom_manipulation.rs index ad01f514e95..376927da742 100644 --- a/components/script/task_source/dom_manipulation.rs +++ b/components/script/task_source/dom_manipulation.rs @@ -8,17 +8,21 @@ use dom::event::{EventBubbles, EventCancelable, EventTask, SimpleEventTask}; use dom::eventtarget::EventTarget; use dom::window::Window; use msg::constellation_msg::PipelineId; -use script_runtime::{CommonScriptMsg, ScriptThreadEventCategory}; -use script_thread::MainThreadScriptMsg; +use script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory}; use servo_atoms::Atom; -use servo_channel::Sender; use std::fmt; use std::result::Result; use task::{TaskCanceller, TaskOnce}; use task_source::{TaskSource, TaskSourceName}; -#[derive(Clone, JSTraceable)] -pub struct DOMManipulationTaskSource(pub Sender, pub PipelineId); +#[derive(JSTraceable)] +pub struct DOMManipulationTaskSource(pub Box, pub PipelineId); + +impl Clone for DOMManipulationTaskSource { + fn clone(&self) -> DOMManipulationTaskSource { + DOMManipulationTaskSource(self.0.clone(), self.1.clone()) + } +} impl fmt::Debug for DOMManipulationTaskSource { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -33,13 +37,14 @@ impl TaskSource for DOMManipulationTaskSource { where T: TaskOnce + 'static, { - let msg = MainThreadScriptMsg::Common(CommonScriptMsg::Task( + let msg_task = CommonScriptMsg::Task( ScriptThreadEventCategory::ScriptEvent, Box::new(canceller.wrap_task(task)), Some(self.1), DOMManipulationTaskSource::NAME, - )); - self.0.send(msg).map_err(|_| ()) + ); + + self.0.send(msg_task).map_err(|_| ()) } }