diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-09-26 12:09:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-26 12:09:48 -0500 |
commit | 9b7708063aec5dbabc96cd93e16028e0ee6e14cd (patch) | |
tree | 686ae598128ea3e7cebde6d2b6243b08a42c8cda /components/script | |
parent | 6a0c70a22269cbec6b72cfa8db499838bb00a0c3 (diff) | |
parent | 6c8bfdb77467314d9b9cc77e16c7d938794a445f (diff) | |
download | servo-9b7708063aec5dbabc96cd93e16028e0ee6e14cd.tar.gz servo-9b7708063aec5dbabc96cd93e16028e0ee6e14cd.zip |
Auto merge of #13397 - aochagavia:dispatch-event, r=Ms2ger
Return an enum instead of a boolean from dispatch_event
Fixes #13196
---
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #13196.
- [X] These changes do not require tests because the functionality hasn't changed
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13397)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 8 | ||||
-rw-r--r-- | components/script/dom/document.rs | 7 | ||||
-rw-r--r-- | components/script/dom/event.rs | 10 | ||||
-rw-r--r-- | components/script/dom/eventdispatcher.rs | 14 | ||||
-rw-r--r-- | components/script/dom/eventtarget.rs | 11 | ||||
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 5 |
7 files changed, 45 insertions, 17 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 589489debce..c425c38b86b 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -19,6 +19,7 @@ use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::eventdispatcher::EventStatus; use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; use dom::worker::{TrustedWorkerAddress, WorkerErrorHandler, WorkerMessageHandler}; @@ -370,8 +371,10 @@ impl DedicatedWorkerGlobalScope { value); // Step 13. - let handled = !event.upcast::<Event>().fire(self.upcast::<EventTarget>()); - if !handled { + let event_status = event.upcast::<Event>().fire(self.upcast::<EventTarget>()); + + // Step 15 + if event_status == EventStatus::NotCanceled { let worker = self.worker.borrow().as_ref().unwrap().clone(); // TODO: Should use the DOM manipulation task source. self.parent_sender @@ -380,6 +383,7 @@ impl DedicatedWorkerGlobalScope { .unwrap(); } + // Step 14 self.in_error_reporting_mode.set(false); } } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 2cca84a625a..1b91e743a78 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -41,6 +41,7 @@ use dom::domimplementation::DOMImplementation; use dom::element::{Element, ElementCreator}; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::eventdispatcher::EventStatus; use dom::eventtarget::EventTarget; use dom::focusevent::FocusEvent; use dom::forcetouchevent::ForceTouchEvent; @@ -1119,7 +1120,11 @@ impl Document { window.reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::MouseEvent); - result + + match result { + EventStatus::Canceled => false, + EventStatus::NotCanceled => true + } } /// The entry point for all key processing for web content diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 07330a776ae..a6dfe7c9ac4 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -11,6 +11,7 @@ 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::eventdispatcher::EventStatus; use dom::eventtarget::EventTarget; use script_thread::Runnable; use std::cell::Cell; @@ -153,6 +154,13 @@ impl Event { self.cancelable.set(cancelable); } + pub fn status(&self) -> EventStatus { + match self.DefaultPrevented() { + true => EventStatus::Canceled, + false => EventStatus::NotCanceled + } + } + #[inline] pub fn set_current_target(&self, val: &EventTarget) { self.current_target.set(Some(val)); @@ -303,7 +311,7 @@ impl Event { } // https://html.spec.whatwg.org/multipage/#fire-a-simple-event - pub fn fire(&self, target: &EventTarget) -> bool { + pub fn fire(&self, target: &EventTarget) -> EventStatus { self.set_trusted(true); target.dispatch_event(self) } diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index e9525f17604..28ea0b42b31 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -103,10 +103,16 @@ fn dispatch_to_listeners(event: &Event, target: &EventTarget, event_path: &[&Eve } } +#[derive(PartialEq)] +pub enum EventStatus { + Canceled, + NotCanceled +} + // https://dom.spec.whatwg.org/#concept-event-dispatch pub fn dispatch_event(target: &EventTarget, target_override: Option<&EventTarget>, - event: &Event) -> bool { + event: &Event) -> EventStatus { assert!(!event.dispatching()); assert!(event.initialized()); assert_eq!(event.phase(), EventPhase::None); @@ -126,7 +132,7 @@ pub fn dispatch_event(target: &EventTarget, event.clear_dispatching_flags(); // Step 14. - return !event.DefaultPrevented(); + return event.status(); } // Step 3. The "invoke" algorithm is only used on `target` separately, @@ -165,8 +171,8 @@ pub fn dispatch_event(target: &EventTarget, // Step 10-12. event.clear_dispatching_flags(); - // Step 13. - !event.DefaultPrevented() + // Step 14. + event.status() } // https://dom.spec.whatwg.org/#concept-event-listener-invoke diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index c941eb8e20e..1d3efd59b19 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -23,7 +23,7 @@ use dom::bindings::str::DOMString; use dom::element::Element; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable}; -use dom::eventdispatcher::dispatch_event; +use dom::eventdispatcher::{EventStatus, dispatch_event}; use dom::node::document_from_node; use dom::virtualmethods::VirtualMethods; use dom::window::Window; @@ -300,11 +300,11 @@ impl EventTarget { pub fn dispatch_event_with_target(&self, target: &EventTarget, - event: &Event) -> bool { + event: &Event) -> EventStatus { dispatch_event(self, Some(target), event) } - pub fn dispatch_event(&self, event: &Event) -> bool { + pub fn dispatch_event(&self, event: &Event) -> EventStatus { dispatch_event(self, None, event) } @@ -560,7 +560,10 @@ impl EventTargetMethods for EventTarget { return Err(Error::InvalidState); } event.set_trusted(false); - Ok(self.dispatch_event(event)) + Ok(match self.dispatch_event(event) { + EventStatus::Canceled => false, + EventStatus::NotCanceled => true + }) } } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 566b69967d4..4b16908968f 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -20,6 +20,7 @@ use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element, ElementCreator}; use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::eventdispatcher::EventStatus; use dom::htmlelement::HTMLElement; use dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; use dom::node::{document_from_node, window_from_node}; @@ -488,7 +489,7 @@ impl HTMLScriptElement { } // TODO(#12446): beforescriptexecute. - if !self.dispatch_before_script_execute_event() { + if self.dispatch_before_script_execute_event() == EventStatus::Canceled { return; } @@ -535,7 +536,7 @@ impl HTMLScriptElement { window.dom_manipulation_task_source().queue_simple_event(self.upcast(), atom!("error"), window.r()); } - pub fn dispatch_before_script_execute_event(&self) -> bool { + pub fn dispatch_before_script_execute_event(&self) -> EventStatus { self.dispatch_event(atom!("beforescriptexecute"), EventBubbles::Bubbles, EventCancelable::Cancelable) @@ -606,7 +607,7 @@ impl HTMLScriptElement { fn dispatch_event(&self, type_: Atom, bubbles: EventBubbles, - cancelable: EventCancelable) -> bool { + cancelable: EventCancelable) -> EventStatus { let window = window_from_node(self); let window = window.r(); let event = Event::new(GlobalRef::Window(window), type_, bubbles, cancelable); diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 1df110a12e5..1821b2d2dee 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -19,6 +19,7 @@ use dom::bindings::structuredclone::StructuredCloneData; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::eventdispatcher::EventStatus; use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; use dom::workerglobalscope::prepare_workerscope_init; @@ -153,8 +154,8 @@ impl Worker { error_info.column, unsafe { NullHandleValue }); - let handled = !event.upcast::<Event>().fire(self.upcast::<EventTarget>()); - if handled { + let event_status = event.upcast::<Event>().fire(self.upcast::<EventTarget>()); + if event_status == EventStatus::Canceled { return; } |