Skip to content

Commit

Permalink
use return value of invoking event handlers to cancel the event
Browse files Browse the repository at this point in the history
  • Loading branch information
jxs committed Nov 30, 2015
1 parent 831979d commit 229a083
Showing 1 changed file with 30 additions and 9 deletions.
39 changes: 30 additions & 9 deletions components/script/dom/eventtarget.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -122,17 +123,20 @@ impl EventListenerType {
EventListenerType::Inline(ref handler) => {
match *handler {
CommonEventHandler::ErrorEventHandler(ref handler) => {
if let Some(event) = event.downcast::<ErrorEvent>() {
if let Some(error_event) = event.downcast::<ErrorEvent>() {
let global = global_root_from_reflector(object);
let cx = global.r().get_cx();
let error = RootedValue::new(cx, event.Error(cx));
let _ = handler.Call_(object,
EventOrString::eString(event.Message()),
Some(event.Filename()),
Some(event.Lineno()),
Some(event.Colno()),
let error = RootedValue::new(cx, error_event.Error(cx));
let return_value = handler.Call_(object,
EventOrString::eString(error_event.Message()),
Some(error_event.Filename()),
Some(error_event.Lineno()),
Some(error_event.Colno()),
Some(error.handle()),
exception_handle);
if return_value.ok() == Some(true) {
event.PreventDefault();
}
return;
}

Expand All @@ -141,10 +145,27 @@ impl EventListenerType {
}

CommonEventHandler::EventHandler(ref handler) => {
let _ = handler.Call_(object, event, exception_handle);
let return_value = handler.Call_(object, event, exception_handle);
match event.type_() {
atom!("mouseover") => {
if return_value.is_ok() && return_value.unwrap().to_boolean() == true {
event.PreventDefault();
}
},
atom!("beforeunload") => {
if return_value.is_ok() && return_value.unwrap().is_null() {
event.PreventDefault();
}
},
_ => {
if return_value.is_ok() && return_value.unwrap().to_boolean() == false {
event.PreventDefault();
}
}
}
}
}
},
}
}

// TODO(#8490): step 4 (cancel event based on return value)
Expand Down

0 comments on commit 229a083

Please sign in to comment.