mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
dom: Add missing event handlers
Adding: * global event handlers, * window event handlers, * document and element handlers, * and support for BeforeUnloadEvent. Signed-off-by: Piotr Stankiewicz <bionicrift@gmail.com>
This commit is contained in:
parent
4590fe230f
commit
d1af39c114
21 changed files with 373 additions and 861 deletions
|
@ -2,11 +2,14 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use dom::beforeunloadevent::BeforeUnloadEvent;
|
||||
use dom::bindings::callback::{CallbackContainer, ExceptionHandling, CallbackFunction};
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::BeforeUnloadEventBinding::BeforeUnloadEventMethods;
|
||||
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::OnBeforeUnloadEventHandlerNonNull;
|
||||
use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
|
||||
use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
|
||||
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
|
||||
|
@ -45,6 +48,7 @@ use util::str::DOMString;
|
|||
pub enum CommonEventHandler {
|
||||
EventHandler(Rc<EventHandlerNonNull>),
|
||||
ErrorEventHandler(Rc<OnErrorEventHandlerNonNull>),
|
||||
BeforeUnloadEventHandler(Rc<OnBeforeUnloadEventHandlerNonNull>),
|
||||
}
|
||||
|
||||
impl CommonEventHandler {
|
||||
|
@ -52,6 +56,7 @@ impl CommonEventHandler {
|
|||
match *self {
|
||||
CommonEventHandler::EventHandler(ref handler) => &handler.parent,
|
||||
CommonEventHandler::ErrorEventHandler(ref handler) => &handler.parent,
|
||||
CommonEventHandler::BeforeUnloadEventHandler(ref handler) => &handler.parent,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -173,6 +178,27 @@ impl CompiledEventListener {
|
|||
None, None, None, None, exception_handle);
|
||||
}
|
||||
|
||||
CommonEventHandler::BeforeUnloadEventHandler(ref handler) => {
|
||||
if let Some(event) = event.downcast::<BeforeUnloadEvent>() {
|
||||
let rv = event.ReturnValue();
|
||||
|
||||
if let Ok(value) = handler.Call_(object,
|
||||
event.upcast::<Event>(),
|
||||
exception_handle) {
|
||||
match value {
|
||||
Some(value) => {
|
||||
if rv.is_empty() {
|
||||
event.SetReturnValue(value);
|
||||
}
|
||||
}
|
||||
None => {
|
||||
event.upcast::<Event>().PreventDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CommonEventHandler::EventHandler(ref handler) => {
|
||||
if let Ok(value) = handler.Call_(object, event, exception_handle) {
|
||||
let global = object.global();
|
||||
|
@ -183,7 +209,6 @@ impl CompiledEventListener {
|
|||
//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 {
|
||||
|
@ -412,7 +437,12 @@ impl EventTarget {
|
|||
if is_error {
|
||||
Some(CommonEventHandler::ErrorEventHandler(OnErrorEventHandlerNonNull::new(funobj)))
|
||||
} else {
|
||||
Some(CommonEventHandler::EventHandler(EventHandlerNonNull::new(funobj)))
|
||||
if ty == &atom!("beforeunload") {
|
||||
Some(CommonEventHandler::BeforeUnloadEventHandler(
|
||||
OnBeforeUnloadEventHandlerNonNull::new(funobj)))
|
||||
} else {
|
||||
Some(CommonEventHandler::EventHandler(EventHandlerNonNull::new(funobj)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -436,6 +466,16 @@ impl EventTarget {
|
|||
self.set_inline_event_listener(Atom::from(ty), event_listener);
|
||||
}
|
||||
|
||||
pub fn set_beforeunload_event_handler<T: CallbackContainer>(&self, ty: &str,
|
||||
listener: Option<Rc<T>>) {
|
||||
let event_listener = listener.map(|listener|
|
||||
InlineEventListener::Compiled(
|
||||
CommonEventHandler::BeforeUnloadEventHandler(
|
||||
OnBeforeUnloadEventHandlerNonNull::new(listener.callback())))
|
||||
);
|
||||
self.set_inline_event_listener(Atom::from(ty), event_listener);
|
||||
}
|
||||
|
||||
pub fn get_event_handler_common<T: CallbackContainer>(&self, ty: &str) -> Option<Rc<T>> {
|
||||
let listener = self.get_inline_event_listener(&Atom::from(ty));
|
||||
listener.map(|listener| CallbackContainer::new(listener.parent().callback()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue