aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/eventtarget.rs
diff options
context:
space:
mode:
authorJoão Oliveira <hello@jxs.pt>2015-12-17 16:33:46 +0000
committerJosh Matthews <josh@joshmatthews.net>2016-02-26 10:17:57 -0500
commitb60d6689088ffca2a79467bbc0191961d6549cb7 (patch)
tree04a7904680475052848f6568171d5a6ea533471f /components/script/dom/eventtarget.rs
parentaaad24c5312367921c0d2eab117c3fa587018114 (diff)
downloadservo-b60d6689088ffca2a79467bbc0191961d6549cb7.tar.gz
servo-b60d6689088ffca2a79467bbc0191961d6549cb7.zip
use return value of invoking event handlers to cancel the event
Diffstat (limited to 'components/script/dom/eventtarget.rs')
-rw-r--r--components/script/dom/eventtarget.rs47
1 files changed, 34 insertions, 13 deletions
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs
index 36aae8800da..aa49d9a110f 100644
--- a/components/script/dom/eventtarget.rs
+++ b/components/script/dom/eventtarget.rs
@@ -5,6 +5,7 @@
use dom::bindings::callback::{CallbackContainer, ExceptionHandling, CallbackFunction};
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::ErrorEventBinding::ErrorEventMethods;
+use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
@@ -188,13 +189,20 @@ impl CompiledEventListener {
let global = object.global();
let cx = global.r().get_cx();
let error = RootedValue::new(cx, event.Error(cx));
- let _ = handler.Call_(object,
- EventOrString::String(event.Message()),
- Some(event.Filename()),
- Some(event.Lineno()),
- Some(event.Colno()),
- Some(error.handle()),
- exception_handle);
+ let return_value = handler.Call_(object,
+ EventOrString::String(event.Message()),
+ Some(event.Filename()),
+ Some(event.Lineno()),
+ Some(event.Colno()),
+ Some(error.handle()),
+ exception_handle);
+ // Step 4
+ if let Ok(return_value) = return_value {
+ let return_value = RootedValue::new(cx, return_value);
+ if return_value.handle().is_boolean() && return_value.handle().to_boolean() == true {
+ event.upcast::<Event>().PreventDefault();
+ }
+ }
return;
}
@@ -203,13 +211,26 @@ impl CompiledEventListener {
}
CommonEventHandler::EventHandler(ref handler) => {
- let _ = handler.Call_(object, event, exception_handle);
+ if let Ok(value) = handler.Call_(object, event, exception_handle) {
+ let global = object.global();
+ let cx = global.r().get_cx();
+ let value = RootedValue::new(cx, value);
+ let value = value.handle();
+
+ //Step 4
+ let should_cancel = match event.type_() {
+ atom!("mouseover") => value.is_boolean() && value.to_boolean() == true,
+ atom!("beforeunload") => value.is_null(),
+ _ => value.is_boolean() && value.to_boolean() == false
+ };
+ if should_cancel {
+ event.PreventDefault();
+ }
+ }
}
}
- },
+ }
}
-
- // TODO(#8490): step 4 (cancel event based on return value)
}
}
@@ -294,8 +315,8 @@ impl EventTarget {
}
pub fn dispatch_event_with_target(&self,
- target: &EventTarget,
- event: &Event) -> bool {
+ target: &EventTarget,
+ event: &Event) -> bool {
dispatch_event(self, Some(target), event)
}