diff options
Diffstat (limited to 'components/script/task_source')
-rw-r--r-- | components/script/task_source/dom_manipulation.rs | 63 | ||||
-rw-r--r-- | components/script/task_source/file_reading.rs | 21 | ||||
-rw-r--r-- | components/script/task_source/history_traversal.rs | 21 | ||||
-rw-r--r-- | components/script/task_source/mod.rs | 16 | ||||
-rw-r--r-- | components/script/task_source/networking.rs | 21 | ||||
-rw-r--r-- | components/script/task_source/user_interaction.rs | 21 |
6 files changed, 163 insertions, 0 deletions
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<MainThreadScriptMsg>); + +impl TaskSource<DOMManipulationTask> for DOMManipulationTaskSource { + fn queue(&self, msg: DOMManipulationTask) -> Result<(), ()> { + let DOMManipulationTaskSource(ref chan) = *self; + chan.send(MainThreadScriptMsg::DOMManipulation(msg)).map_err(|_| ()) + } + + fn clone(&self) -> Box<TaskSource<DOMManipulationTask> + 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<Runnable + Send>), + // https://dom.spec.whatwg.org/#concept-event-fire + FireEvent(Atom, Trusted<EventTarget>, EventBubbles, EventCancelable), + // https://html.spec.whatwg.org/multipage/#fire-a-simple-event + FireSimpleEvent(Atom, Trusted<EventTarget>), + // https://html.spec.whatwg.org/multipage/#details-notification-task-steps + FireToggleEvent(Box<Runnable + Send>), + // https://html.spec.whatwg.org/multipage/#planned-navigation + PlannedNavigation(Box<Runnable + Send>), + // https://html.spec.whatwg.org/multipage/#send-a-storage-notification + SendStorageNotification(Box<MainThreadRunnable + Send>) +} + +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<MainThreadScriptMsg>); + +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<ScriptChan + Send> { + 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<MainThreadScriptMsg>); + +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<ScriptChan + Send> { + 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<T> { + fn queue(&self, msg: T) -> Result<(), ()>; + fn clone(&self) -> Box<TaskSource<T> + 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<MainThreadScriptMsg>); + +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<ScriptChan + Send> { + 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<MainThreadScriptMsg>); + +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<ScriptChan + Send> { + let UserInteractionTaskSource(ref chan) = *self; + box UserInteractionTaskSource((*chan).clone()) + } +} |