aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-09-26 12:09:48 -0500
committerGitHub <noreply@github.com>2016-09-26 12:09:48 -0500
commit9b7708063aec5dbabc96cd93e16028e0ee6e14cd (patch)
tree686ae598128ea3e7cebde6d2b6243b08a42c8cda /components/script
parent6a0c70a22269cbec6b72cfa8db499838bb00a0c3 (diff)
parent6c8bfdb77467314d9b9cc77e16c7d938794a445f (diff)
downloadservo-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.rs8
-rw-r--r--components/script/dom/document.rs7
-rw-r--r--components/script/dom/event.rs10
-rw-r--r--components/script/dom/eventdispatcher.rs14
-rw-r--r--components/script/dom/eventtarget.rs11
-rw-r--r--components/script/dom/htmlscriptelement.rs7
-rw-r--r--components/script/dom/worker.rs5
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;
}