mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
use return value of invoking event handlers to cancel the event
This commit is contained in:
parent
aaad24c531
commit
b60d668908
9 changed files with 141 additions and 58 deletions
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -180,6 +180,24 @@ impl HTMLElementMethods for HTMLElement {
|
|||
}
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#handler-onblur
|
||||
fn GetOnblur(&self) -> Option<Rc<EventHandlerNonNull>> {
|
||||
if self.is_body_or_frameset() {
|
||||
window_from_node(self).GetOnblur()
|
||||
} else {
|
||||
self.upcast::<EventTarget>().get_event_handler_common("blur")
|
||||
}
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#handler-onblur
|
||||
fn SetOnblur(&self, listener: Option<Rc<EventHandlerNonNull>>) {
|
||||
if self.is_body_or_frameset() {
|
||||
window_from_node(self).SetOnblur(listener)
|
||||
} else {
|
||||
self.upcast::<EventTarget>().set_event_handler_common("blur", listener)
|
||||
}
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-click
|
||||
fn Click(&self) {
|
||||
if let Some(i) = self.downcast::<HTMLInputElement>() {
|
||||
|
|
|
@ -332,19 +332,22 @@ macro_rules! error_event_handler(
|
|||
// As more methods get added, just update them here.
|
||||
macro_rules! global_event_handlers(
|
||||
() => (
|
||||
event_handler!(blur, GetOnblur, SetOnblur);
|
||||
event_handler!(load, GetOnload, SetOnload);
|
||||
event_handler!(resize, GetOnresize, SetOnresize);
|
||||
global_event_handlers!(NoOnload);
|
||||
|
||||
);
|
||||
(NoOnload) => (
|
||||
event_handler!(change, GetOnchange, SetOnchange);
|
||||
event_handler!(click, GetOnclick, SetOnclick);
|
||||
event_handler!(dblclick, GetOndblclick, SetOndblclick);
|
||||
error_event_handler!(error, GetOnerror, SetOnerror);
|
||||
event_handler!(input, GetOninput, SetOninput);
|
||||
event_handler!(keydown, GetOnkeydown, SetOnkeydown);
|
||||
event_handler!(keypress, GetOnkeypress, SetOnkeypress);
|
||||
event_handler!(keyup, GetOnkeyup, SetOnkeyup);
|
||||
event_handler!(input, GetOninput, SetOninput);
|
||||
event_handler!(change, GetOnchange, SetOnchange);
|
||||
event_handler!(mouseover, GetOnmouseover, SetOnmouseover);
|
||||
event_handler!(reset, GetOnreset, SetOnreset);
|
||||
event_handler!(submit, GetOnsubmit, SetOnsubmit);
|
||||
event_handler!(toggle, GetOntoggle, SetOntoggle);
|
||||
|
|
|
@ -23,18 +23,22 @@ typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
|
|||
|
||||
[NoInterfaceObject]
|
||||
interface GlobalEventHandlers {
|
||||
attribute EventHandler onblur;
|
||||
attribute EventHandler onchange;
|
||||
attribute EventHandler onclick;
|
||||
attribute EventHandler ondblclick;
|
||||
attribute OnErrorEventHandler onerror;
|
||||
attribute EventHandler onload;
|
||||
attribute EventHandler oninput;
|
||||
attribute EventHandler onkeydown;
|
||||
attribute EventHandler onkeypress;
|
||||
attribute EventHandler onkeyup;
|
||||
attribute EventHandler onchange;
|
||||
attribute EventHandler onload;
|
||||
attribute EventHandler onmouseover;
|
||||
attribute EventHandler onreset;
|
||||
attribute EventHandler onresize;
|
||||
attribute EventHandler onsubmit;
|
||||
attribute EventHandler ontoggle;
|
||||
attribute EventHandler onresize;
|
||||
|
||||
};
|
||||
|
||||
[NoInterfaceObject]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue