From 3f2cbf002520289f706e7a7c6448a39ca7fa4bef Mon Sep 17 00:00:00 2001 From: Keith Yeung Date: Wed, 6 Jan 2016 11:44:54 -0500 Subject: Add task_source directory Use DOMManipulationTaskSource whenever possible --- components/script/task_source/dom_manipulation.rs | 63 ++++++++++++++++++++++ components/script/task_source/file_reading.rs | 21 ++++++++ components/script/task_source/history_traversal.rs | 21 ++++++++ components/script/task_source/mod.rs | 16 ++++++ components/script/task_source/networking.rs | 21 ++++++++ components/script/task_source/user_interaction.rs | 21 ++++++++ 6 files changed, 163 insertions(+) create mode 100644 components/script/task_source/dom_manipulation.rs create mode 100644 components/script/task_source/file_reading.rs create mode 100644 components/script/task_source/history_traversal.rs create mode 100644 components/script/task_source/mod.rs create mode 100644 components/script/task_source/networking.rs create mode 100644 components/script/task_source/user_interaction.rs (limited to 'components/script/task_source') diff --git a/components/script/task_source/dom_manipulation.rs b/components/script/task_source/dom_manipulation.rs new file mode 100644 index 00000000000..d60ce7de93d --- /dev/null +++ b/components/script/task_source/dom_manipulation.rs @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::refcounted::Trusted; +use dom::event::{EventBubbles, EventCancelable}; +use dom::eventtarget::EventTarget; +use script_thread::{MainThreadRunnable, MainThreadScriptMsg, Runnable, ScriptThread}; +use std::result::Result; +use std::sync::mpsc::Sender; +use string_cache::Atom; +use task_source::TaskSource; + +#[derive(JSTraceable)] +pub struct DOMManipulationTaskSource(pub Sender); + +impl TaskSource for DOMManipulationTaskSource { + fn queue(&self, msg: DOMManipulationTask) -> Result<(), ()> { + let DOMManipulationTaskSource(ref chan) = *self; + chan.send(MainThreadScriptMsg::DOMManipulation(msg)).map_err(|_| ()) + } + + fn clone(&self) -> Box + Send> { + let DOMManipulationTaskSource(ref chan) = *self; + box DOMManipulationTaskSource((*chan).clone()) + } +} + +pub enum DOMManipulationTask { + // https://html.spec.whatwg.org/multipage/#the-end step 7 + DocumentProgress(Box), + // https://dom.spec.whatwg.org/#concept-event-fire + FireEvent(Atom, Trusted, EventBubbles, EventCancelable), + // https://html.spec.whatwg.org/multipage/#fire-a-simple-event + FireSimpleEvent(Atom, Trusted), + // https://html.spec.whatwg.org/multipage/#details-notification-task-steps + FireToggleEvent(Box), + // https://html.spec.whatwg.org/multipage/#planned-navigation + PlannedNavigation(Box), + // https://html.spec.whatwg.org/multipage/#send-a-storage-notification + SendStorageNotification(Box) +} + +impl DOMManipulationTask { + pub fn handle_msg(self, script_thread: &ScriptThread) { + use self::DOMManipulationTask::*; + + match self { + DocumentProgress(runnable) => runnable.handler(), + FireEvent(name, element, bubbles, cancelable) => { + let target = element.root(); + target.fire_event(&*name, bubbles, cancelable); + } + FireSimpleEvent(name, element) => { + let target = element.root(); + target.fire_simple_event(&*name); + } + FireToggleEvent(runnable) => runnable.handler(), + PlannedNavigation(runnable) => runnable.handler(), + SendStorageNotification(runnable) => runnable.handler(script_thread) + } + } +} diff --git a/components/script/task_source/file_reading.rs b/components/script/task_source/file_reading.rs new file mode 100644 index 00000000000..e4afad34b4b --- /dev/null +++ b/components/script/task_source/file_reading.rs @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use script_thread::{CommonScriptMsg, MainThreadScriptMsg, ScriptChan}; +use std::sync::mpsc::Sender; + +#[derive(JSTraceable)] +pub struct FileReadingTaskSource(pub Sender); + +impl ScriptChan for FileReadingTaskSource { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { + let FileReadingTaskSource(ref chan) = *self; + chan.send(MainThreadScriptMsg::Common(msg)).map_err(|_| ()) + } + + fn clone(&self) -> Box { + let FileReadingTaskSource(ref chan) = *self; + box FileReadingTaskSource((*chan).clone()) + } +} diff --git a/components/script/task_source/history_traversal.rs b/components/script/task_source/history_traversal.rs new file mode 100644 index 00000000000..0916c121345 --- /dev/null +++ b/components/script/task_source/history_traversal.rs @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use script_thread::{CommonScriptMsg, MainThreadScriptMsg, ScriptChan}; +use std::sync::mpsc::Sender; + +#[derive(JSTraceable)] +pub struct HistoryTraversalTaskSource(pub Sender); + +impl ScriptChan for HistoryTraversalTaskSource { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { + let HistoryTraversalTaskSource(ref chan) = *self; + chan.send(MainThreadScriptMsg::Common(msg)).map_err(|_| ()) + } + + fn clone(&self) -> Box { + let HistoryTraversalTaskSource(ref chan) = *self; + box HistoryTraversalTaskSource((*chan).clone()) + } +} diff --git a/components/script/task_source/mod.rs b/components/script/task_source/mod.rs new file mode 100644 index 00000000000..74dd7347e9e --- /dev/null +++ b/components/script/task_source/mod.rs @@ -0,0 +1,16 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pub mod dom_manipulation; +pub mod file_reading; +pub mod history_traversal; +pub mod networking; +pub mod user_interaction; + +use std::result::Result; + +pub trait TaskSource { + fn queue(&self, msg: T) -> Result<(), ()>; + fn clone(&self) -> Box + Send>; +} diff --git a/components/script/task_source/networking.rs b/components/script/task_source/networking.rs new file mode 100644 index 00000000000..8ebeecdb965 --- /dev/null +++ b/components/script/task_source/networking.rs @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use script_thread::{CommonScriptMsg, MainThreadScriptMsg, ScriptChan}; +use std::sync::mpsc::Sender; + +#[derive(JSTraceable)] +pub struct NetworkingTaskSource(pub Sender); + +impl ScriptChan for NetworkingTaskSource { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { + let NetworkingTaskSource(ref chan) = *self; + chan.send(MainThreadScriptMsg::Common(msg)).map_err(|_| ()) + } + + fn clone(&self) -> Box { + let NetworkingTaskSource(ref chan) = *self; + box NetworkingTaskSource((*chan).clone()) + } +} diff --git a/components/script/task_source/user_interaction.rs b/components/script/task_source/user_interaction.rs new file mode 100644 index 00000000000..7912eac720d --- /dev/null +++ b/components/script/task_source/user_interaction.rs @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use script_thread::{CommonScriptMsg, MainThreadScriptMsg, ScriptChan}; +use std::sync::mpsc::Sender; + +#[derive(JSTraceable)] +pub struct UserInteractionTaskSource(pub Sender); + +impl ScriptChan for UserInteractionTaskSource { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { + let UserInteractionTaskSource(ref chan) = *self; + chan.send(MainThreadScriptMsg::Common(msg)).map_err(|_| ()) + } + + fn clone(&self) -> Box { + let UserInteractionTaskSource(ref chan) = *self; + box UserInteractionTaskSource((*chan).clone()) + } +} -- cgit v1.2.3