From afc0ccb48d03cfacec06b9c6d6be3626b46ff793 Mon Sep 17 00:00:00 2001 From: Connor Brewster Date: Mon, 11 Jul 2016 22:21:45 -0600 Subject: [PATCH] Add event runnables Make tasks a wrapper over runnables --- components/script/dom/event.rs | 38 +++++++++++++++- components/script/dom/htmldetailselement.rs | 2 +- components/script/dom/htmlformelement.rs | 2 +- components/script/dom/htmlimageelement.rs | 2 +- components/script/dom/htmlmediaelement.rs | 8 ++-- components/script/dom/storage.rs | 2 +- components/script/script_thread.rs | 4 +- .../script/task_source/dom_manipulation.rs | 45 +++++++------------ .../script/task_source/user_interaction.rs | 37 +++++++-------- 9 files changed, 79 insertions(+), 61 deletions(-) diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 9174fa2cb3d5..da7664e0e19d 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -8,9 +8,11 @@ use dom::bindings::codegen::Bindings::EventBinding::{EventConstants, EventMethod use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, MutNullableHeap, Root}; +use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::DOMString; use dom::eventtarget::EventTarget; +use script_thread::Runnable; use std::cell::Cell; use std::default::Default; use string_cache::Atom; @@ -26,7 +28,7 @@ pub enum EventPhase { Bubbling = EventConstants::BUBBLING_PHASE, } -#[derive(PartialEq, HeapSizeOf)] +#[derive(PartialEq, HeapSizeOf, Copy, Clone)] pub enum EventBubbles { Bubbles, DoesNotBubble @@ -50,7 +52,7 @@ impl From for EventBubbles { } } -#[derive(PartialEq, HeapSizeOf)] +#[derive(PartialEq, HeapSizeOf, Copy, Clone)] pub enum EventCancelable { Cancelable, NotCancelable @@ -297,3 +299,35 @@ impl Event { target.dispatch_event(self) } } + +// https://dom.spec.whatwg.org/#concept-event-fire +pub struct EventRunnable { + pub target: Trusted, + pub name: Atom, + pub bubbles: EventBubbles, + pub cancelable: EventCancelable, +} + +impl Runnable for EventRunnable { + fn name(&self) -> &'static str { "EventRunnable" } + + fn handler(self: Box) { + let target = self.target.root(); + target.fire_event(&*self.name, self.bubbles, self.cancelable); + } +} + +// https://html.spec.whatwg.org/multipage/#fire-a-simple-event +pub struct SimpleEventRunnable { + pub target: Trusted, + pub name: Atom, +} + +impl Runnable for SimpleEventRunnable { + fn name(&self) -> &'static str { "SimpleEventRunnable" } + + fn handler(self: Box) { + let target = self.target.root(); + target.fire_simple_event(&*self.name); + } +} diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs index f8fc6545f8da..4b9d5146b954 100644 --- a/components/script/dom/htmldetailselement.rs +++ b/components/script/dom/htmldetailselement.rs @@ -79,7 +79,7 @@ impl VirtualMethods for HTMLDetailsElement { element: details, toggle_number: counter }; - let _ = task_source.queue(DOMManipulationTask::Runnable(runnable)); + let _ = task_source.queue(DOMManipulationTask(runnable)); } } } diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 18c30a9d86c0..4cd367d5032c 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -484,7 +484,7 @@ impl HTMLFormElement { }; // Step 3 - window.dom_manipulation_task_source().queue(DOMManipulationTask::Runnable(nav)).unwrap(); + window.dom_manipulation_task_source().queue(DOMManipulationTask(nav)).unwrap(); } /// Interactively validate the constraints of form elements diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 8c28b1e8c8d8..110138134c5b 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -185,7 +185,7 @@ impl HTMLImageElement { src: src.into(), }); let task = window.dom_manipulation_task_source(); - let _ = task.queue(DOMManipulationTask::Runnable(runnable)); + let _ = task.queue(DOMManipulationTask(runnable)); } } } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index b38f796e57c5..3c9a46653039 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -242,7 +242,7 @@ impl HTMLMediaElement { elem: Trusted::new(self), }; let win = window_from_node(self); - let _ = win.dom_manipulation_task_source().queue(DOMManipulationTask::Runnable(box task)); + let _ = win.dom_manipulation_task_source().queue(DOMManipulationTask(box task)); } // https://html.spec.whatwg.org/multipage/#internal-pause-steps step 2.2 @@ -266,13 +266,13 @@ impl HTMLMediaElement { elem: Trusted::new(self), }; let win = window_from_node(self); - let _ = win.dom_manipulation_task_source().queue(DOMManipulationTask::Runnable(box task)); + let _ = win.dom_manipulation_task_source().queue(DOMManipulationTask(box task)); } fn queue_fire_simple_event(&self, type_: &'static str) { let win = window_from_node(self); let task = FireSimpleEventTask::new(self, type_); - let _ = win.dom_manipulation_task_source().queue(DOMManipulationTask::Runnable(box task)); + let _ = win.dom_manipulation_task_source().queue(DOMManipulationTask(box task)); } fn fire_simple_event(&self, type_: &str) { @@ -499,7 +499,7 @@ impl HTMLMediaElement { fn queue_dedicated_media_source_failure_steps(&self) { let _ = window_from_node(self).dom_manipulation_task_source().queue( - DOMManipulationTask::Runnable(box DedicatedMediaSourceFailureTask::new(self))); + DOMManipulationTask(box DedicatedMediaSourceFailureTask::new(self))); } // https://html.spec.whatwg.org/multipage/#dedicated-media-source-failure-steps diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index d927c5ba2130..d44f96840274 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -161,7 +161,7 @@ impl Storage { let global_ref = global_root.r(); let task_source = global_ref.as_window().dom_manipulation_task_source(); let trusted_storage = Trusted::new(self); - task_source.queue(DOMManipulationTask::Runnable( + task_source.queue(DOMManipulationTask( box StorageEventRunnable::new(trusted_storage, key, old_value, new_value))).unwrap(); } } diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e116ace1be41..db58cb495865 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -982,7 +982,7 @@ impl ScriptThread { MainThreadScriptMsg::DOMManipulation(task) => task.handle_task(self), MainThreadScriptMsg::UserInteraction(task) => - task.handle_task(), + task.handle_task(self), } } @@ -1221,7 +1221,7 @@ impl ScriptThread { // https://html.spec.whatwg.org/multipage/#the-end step 7 let handler = box DocumentProgressHandler::new(Trusted::new(doc)); - self.dom_manipulation_task_source.queue(DOMManipulationTask::Runnable(handler)).unwrap(); + self.dom_manipulation_task_source.queue(DOMManipulationTask(handler)).unwrap(); self.constellation_chan.send(ConstellationMsg::LoadComplete(pipeline)).unwrap(); } diff --git a/components/script/task_source/dom_manipulation.rs b/components/script/task_source/dom_manipulation.rs index a1c06f2c09ee..3cb08055446f 100644 --- a/components/script/task_source/dom_manipulation.rs +++ b/components/script/task_source/dom_manipulation.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::refcounted::Trusted; -use dom::event::{EventBubbles, EventCancelable}; +use dom::event::{EventBubbles, EventCancelable, EventRunnable, SimpleEventRunnable}; use dom::eventtarget::EventTarget; use script_thread::{MainThreadScriptMsg, Runnable, ScriptThread}; use std::result::Result; @@ -27,44 +27,31 @@ impl DOMManipulationTaskSource { bubbles: EventBubbles, cancelable: EventCancelable) { let target = Trusted::new(target); - let _ = self.0.send(MainThreadScriptMsg::DOMManipulation(DOMManipulationTask::FireEvent( - target, name, bubbles, cancelable))); + let runnable = box EventRunnable { + target: target, + name: name, + bubbles: bubbles, + cancelable: cancelable, + }; + let _ = self.queue(DOMManipulationTask(runnable)); } pub fn queue_simple_event(&self, target: &EventTarget, name: Atom) { let target = Trusted::new(target); - let _ = self.0.send(MainThreadScriptMsg::DOMManipulation(DOMManipulationTask::FireSimpleEvent( - target, name))); + let runnable = box SimpleEventRunnable { + target: target, + name: name, + }; + let _ = self.queue(DOMManipulationTask(runnable)); } } -pub enum DOMManipulationTask { - // https://dom.spec.whatwg.org/#concept-event-fire - FireEvent(Trusted, Atom, EventBubbles, EventCancelable), - // https://html.spec.whatwg.org/multipage/#fire-a-simple-event - FireSimpleEvent(Trusted, Atom), - - Runnable(Box), -} +pub struct DOMManipulationTask(pub Box); impl DOMManipulationTask { pub fn handle_task(self, script_thread: &ScriptThread) { - use self::DOMManipulationTask::*; - - match self { - FireEvent(element, name, bubbles, cancelable) => { - let target = element.root(); - target.fire_event(&*name, bubbles, cancelable); - } - FireSimpleEvent(element, name) => { - let target = element.root(); - target.fire_simple_event(&*name); - } - Runnable(runnable) => { - if !runnable.is_cancelled() { - runnable.main_thread_handler(script_thread); - } - } + if !self.0.is_cancelled() { + self.0.main_thread_handler(script_thread); } } } diff --git a/components/script/task_source/user_interaction.rs b/components/script/task_source/user_interaction.rs index 24dd59af2228..afdb7a34d290 100644 --- a/components/script/task_source/user_interaction.rs +++ b/components/script/task_source/user_interaction.rs @@ -3,9 +3,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::refcounted::Trusted; -use dom::event::{EventBubbles, EventCancelable}; +use dom::event::{EventBubbles, EventCancelable, EventRunnable}; use dom::eventtarget::EventTarget; -use script_thread::MainThreadScriptMsg; +use script_thread::{MainThreadScriptMsg, Runnable, ScriptThread}; use std::result::Result; use std::sync::mpsc::Sender; use string_cache::Atom; @@ -22,30 +22,27 @@ impl TaskSource for UserInteractionTaskSource { impl UserInteractionTaskSource { pub fn queue_event(&self, - target: &EventTarget, - name: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable) { + target: &EventTarget, + name: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable) { let target = Trusted::new(target); - let _ = self.0.send(MainThreadScriptMsg::UserInteraction(UserInteractionTask::FireEvent( - target, name, bubbles, cancelable))); + let runnable = box EventRunnable { + target: target, + name: name, + bubbles: bubbles, + cancelable: cancelable, + }; + let _ = self.queue(UserInteractionTask(runnable)); } } -pub enum UserInteractionTask { - // https://dom.spec.whatwg.org/#concept-event-fire - FireEvent(Trusted, Atom, EventBubbles, EventCancelable), -} +pub struct UserInteractionTask(pub Box); impl UserInteractionTask { - pub fn handle_task(self) { - use self::UserInteractionTask::*; - - match self { - FireEvent(element, name, bubbles, cancelable) => { - let target = element.root(); - target.fire_event(&*name, bubbles, cancelable); - } + pub fn handle_task(self, script_thread: &ScriptThread) { + if !self.0.is_cancelled() { + self.0.main_thread_handler(script_thread); } } }