diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/script/dom/beforeunloadevent.rs | 67 | ||||
-rw-r--r-- | components/script/dom/document.rs | 3 | ||||
-rw-r--r-- | components/script/dom/eventtarget.rs | 44 | ||||
-rw-r--r-- | components/script/dom/htmlbodyelement.rs | 26 | ||||
-rw-r--r-- | components/script/dom/htmlelement.rs | 39 | ||||
-rw-r--r-- | components/script/dom/htmlframesetelement.rs | 10 | ||||
-rw-r--r-- | components/script/dom/macros.rs | 128 | ||||
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/BeforeUnloadEvent.webidl | 11 | ||||
-rw-r--r-- | components/script/dom/webidls/Document.webidl | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/EventHandler.webidl | 59 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLElement.webidl | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLFrameSetElement.webidl | 3 | ||||
-rw-r--r-- | components/script/dom/window.rs | 11 |
14 files changed, 371 insertions, 33 deletions
diff --git a/components/script/dom/beforeunloadevent.rs b/components/script/dom/beforeunloadevent.rs new file mode 100644 index 00000000000..9257cbcafcb --- /dev/null +++ b/components/script/dom/beforeunloadevent.rs @@ -0,0 +1,67 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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::bindings::cell::DOMRefCell; +use dom::bindings::codegen::Bindings::BeforeUnloadEventBinding; +use dom::bindings::codegen::Bindings::BeforeUnloadEventBinding::BeforeUnloadEventMethods; +use dom::bindings::codegen::Bindings::EventBinding::EventMethods; +use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; +use dom::bindings::js::Root; +use dom::bindings::reflector::reflect_dom_object; +use dom::event::{Event, EventBubbles, EventCancelable}; +use string_cache::Atom; +use util::str::DOMString; + +// https://html.spec.whatwg.org/multipage/#beforeunloadevent +#[dom_struct] +pub struct BeforeUnloadEvent { + event: Event, + return_value: DOMRefCell<DOMString>, +} + +impl BeforeUnloadEvent { + fn new_inherited() -> BeforeUnloadEvent { + BeforeUnloadEvent { + event: Event::new_inherited(), + return_value: DOMRefCell::new(DOMString::new()), + } + } + + pub fn new_uninitialized(global: GlobalRef) -> Root<BeforeUnloadEvent> { + reflect_dom_object(box BeforeUnloadEvent::new_inherited(), + global, + BeforeUnloadEventBinding::Wrap) + } + + pub fn new(global: GlobalRef, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable) -> Root<BeforeUnloadEvent> { + let ev = BeforeUnloadEvent::new_uninitialized(global); + { + let event = ev.upcast::<Event>(); + event.init_event(type_, bool::from(bubbles), + bool::from(cancelable)); + } + ev + } +} + +impl BeforeUnloadEventMethods for BeforeUnloadEvent { + // https://html.spec.whatwg.org/multipage/#dom-beforeunloadevent-returnvalue + fn ReturnValue(&self) -> DOMString { + self.return_value.borrow().clone() + } + + // https://html.spec.whatwg.org/multipage/#dom-beforeunloadevent-returnvalue + fn SetReturnValue(&self, value: DOMString) { + *self.return_value.borrow_mut() = value; + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.event.IsTrusted() + } +} diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index ddf23297282..9be03ab4c84 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -2795,6 +2795,9 @@ impl DocumentMethods for Document { // Step 5 elements } + + // https://html.spec.whatwg.org/multipage/#documentandelementeventhandlers + document_and_element_event_handlers!(); } fn update_with_current_time_ms(marker: &Cell<u64>) { diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 3b20120628d..c8eecc8e65d 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -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())) diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index 2fd18a00c08..536e3759fb3 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -4,7 +4,7 @@ use cssparser::RGBA; use dom::attr::{Attr, AttrValue}; -use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; +use dom::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, OnBeforeUnloadEventHandlerNonNull}; use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods}; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::inheritance::Castable; @@ -16,7 +16,6 @@ use dom::htmlelement::HTMLElement; use dom::node::{Node, document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use script_traits::ScriptMsg as ConstellationMsg; -use std::rc::Rc; use string_cache::Atom; use time; use url::Url; @@ -70,31 +69,14 @@ impl HTMLBodyElementMethods for HTMLBodyElement { // https://html.spec.whatwg.org/multipage/#dom-body-text make_legacy_color_setter!(SetText, "text"); - // https://html.spec.whatwg.org/multipage/#the-body-element - fn GetOnunload(&self) -> Option<Rc<EventHandlerNonNull>> { - window_from_node(self).GetOnunload() - } - - // https://html.spec.whatwg.org/multipage/#the-body-element - fn SetOnunload(&self, listener: Option<Rc<EventHandlerNonNull>>) { - window_from_node(self).SetOnunload(listener) - } - - // https://html.spec.whatwg.org/multipage/#the-body-element - fn GetOnstorage(&self) -> Option<Rc<EventHandlerNonNull>> { - window_from_node(self).GetOnstorage() - } - - // https://html.spec.whatwg.org/multipage/#the-body-element - fn SetOnstorage(&self, listener: Option<Rc<EventHandlerNonNull>>) { - window_from_node(self).SetOnstorage(listener) - } - // https://html.spec.whatwg.org/multipage/#dom-body-background make_getter!(Background, "background"); // https://html.spec.whatwg.org/multipage/#dom-body-background make_url_setter!(SetBackground, "background"); + + // https://html.spec.whatwg.org/multipage/#windoweventhandlers + window_event_handlers!(ForwardToWindow); } pub trait HTMLBodyElementLayoutHelpers { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 3ad8f977869..7e310db8903 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -137,6 +137,9 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#globaleventhandlers global_event_handlers!(NoOnload); + // https://html.spec.whatwg.org/multipage/#documentandelementeventhandlers + document_and_element_event_handlers!(); + // https://html.spec.whatwg.org/multipage/#dom-dataset fn Dataset(&self) -> Root<DOMStringMap> { self.dataset.or_init(|| DOMStringMap::new(self)) @@ -196,6 +199,42 @@ impl HTMLElementMethods for HTMLElement { } } + // https://html.spec.whatwg.org/multipage/#handler-onfocus + fn GetOnfocus(&self) -> Option<Rc<EventHandlerNonNull>> { + if self.is_body_or_frameset() { + window_from_node(self).GetOnfocus() + } else { + self.upcast::<EventTarget>().get_event_handler_common("focus") + } + } + + // https://html.spec.whatwg.org/multipage/#handler-onfocus + fn SetOnfocus(&self, listener: Option<Rc<EventHandlerNonNull>>) { + if self.is_body_or_frameset() { + window_from_node(self).SetOnfocus(listener) + } else { + self.upcast::<EventTarget>().set_event_handler_common("focus", listener) + } + } + + // https://html.spec.whatwg.org/multipage/#handler-onscroll + fn GetOnscroll(&self) -> Option<Rc<EventHandlerNonNull>> { + if self.is_body_or_frameset() { + window_from_node(self).GetOnscroll() + } else { + self.upcast::<EventTarget>().get_event_handler_common("scroll") + } + } + + // https://html.spec.whatwg.org/multipage/#handler-onscroll + fn SetOnscroll(&self, listener: Option<Rc<EventHandlerNonNull>>) { + if self.is_body_or_frameset() { + window_from_node(self).SetOnscroll(listener) + } else { + self.upcast::<EventTarget>().set_event_handler_common("scroll", listener) + } + } + // https://html.spec.whatwg.org/multipage/#dom-click fn Click(&self) { if !self.upcast::<Element>().disabled_state() { diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index 92170a0baf4..df73bc893e9 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -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::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, OnBeforeUnloadEventHandlerNonNull}; use dom::bindings::codegen::Bindings::HTMLFrameSetElementBinding; +use dom::bindings::codegen::Bindings::HTMLFrameSetElementBinding::HTMLFrameSetElementMethods; +use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; -use dom::node::Node; +use dom::node::{Node, window_from_node}; use string_cache::Atom; use util::str::DOMString; @@ -33,3 +36,8 @@ impl HTMLFrameSetElement { Node::reflect_node(box element, document, HTMLFrameSetElementBinding::Wrap) } } + +impl HTMLFrameSetElementMethods for HTMLFrameSetElement { + // https://html.spec.whatwg.org/multipage/#windoweventhandlers + window_event_handlers!(ForwardToWindow); +} diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index cf93b72f985..78238dc09fd 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -321,6 +321,18 @@ macro_rules! define_event_handler( ) ); +macro_rules! define_window_owned_event_handler( + ($handler: ident, $event_type: ident, $getter: ident, $setter: ident) => ( + fn $getter(&self) -> Option<::std::rc::Rc<$handler>> { + window_from_node(self).$getter() + } + + fn $setter(&self, listener: Option<::std::rc::Rc<$handler>>) { + window_from_node(self).$setter(listener) + } + ) +); + macro_rules! event_handler( ($event_type: ident, $getter: ident, $setter: ident) => ( define_event_handler!(EventHandlerNonNull, $event_type, $getter, $setter, @@ -335,42 +347,158 @@ macro_rules! error_event_handler( ) ); +macro_rules! beforeunload_event_handler( + ($event_type: ident, $getter: ident, $setter: ident) => ( + define_event_handler!(OnBeforeUnloadEventHandlerNonNull, $event_type, + $getter, $setter, set_beforeunload_event_handler); + ) +); + +macro_rules! window_owned_event_handler( + ($event_type: ident, $getter: ident, $setter: ident) => ( + define_window_owned_event_handler!(EventHandlerNonNull, + $event_type, $getter, $setter); + ) +); + +macro_rules! window_owned_beforeunload_event_handler( + ($event_type: ident, $getter: ident, $setter: ident) => ( + define_window_owned_event_handler!(OnBeforeUnloadEventHandlerNonNull, + $event_type, $getter, $setter); + ) +); + // https://html.spec.whatwg.org/multipage/#globaleventhandlers // see webidls/EventHandler.webidl // As more methods get added, just update them here. macro_rules! global_event_handlers( () => ( event_handler!(blur, GetOnblur, SetOnblur); + event_handler!(focus, GetOnfocus, SetOnfocus); event_handler!(load, GetOnload, SetOnload); event_handler!(resize, GetOnresize, SetOnresize); + event_handler!(scroll, GetOnscroll, SetOnscroll); global_event_handlers!(NoOnload); ); (NoOnload) => ( event_handler!(abort, GetOnabort, SetOnabort); + event_handler!(cancel, GetOncancel, SetOncancel); event_handler!(canplay, GetOncanplay, SetOncanplay); event_handler!(canplaythrough, GetOncanplaythrough, SetOncanplaythrough); event_handler!(change, GetOnchange, SetOnchange); event_handler!(click, GetOnclick, SetOnclick); + event_handler!(close, GetOnclose, SetOnclose); + event_handler!(contextmenu, GetOncontextmenu, SetOncontextmenu); + event_handler!(cuechange, GetOncuechange, SetOncuechange); event_handler!(dblclick, GetOndblclick, SetOndblclick); + event_handler!(drag, GetOndrag, SetOndrag); + event_handler!(dragend, GetOndragend, SetOndragend); + event_handler!(dragenter, GetOndragenter, SetOndragenter); + event_handler!(dragexit, GetOndragexit, SetOndragexit); + event_handler!(dragleave, GetOndragleave, SetOndragleave); + event_handler!(dragover, GetOndragover, SetOndragover); + event_handler!(dragstart, GetOndragstart, SetOndragstart); + event_handler!(drop, GetOndrop, SetOndrop); + event_handler!(durationchange, GetOndurationchange, SetOndurationchange); event_handler!(emptied, GetOnemptied, SetOnemptied); + event_handler!(ended, GetOnended, SetOnended); error_event_handler!(error, GetOnerror, SetOnerror); event_handler!(input, GetOninput, SetOninput); + event_handler!(invalid, GetOninvalid, SetOninvalid); event_handler!(keydown, GetOnkeydown, SetOnkeydown); event_handler!(keypress, GetOnkeypress, SetOnkeypress); event_handler!(keyup, GetOnkeyup, SetOnkeyup); event_handler!(loadeddata, GetOnloadeddata, SetOnloadeddata); event_handler!(loadedmetata, GetOnloadedmetadata, SetOnloadedmetadata); + event_handler!(loadstart, GetOnloadstart, SetOnloadstart); + event_handler!(mousedown, GetOnmousedown, SetOnmousedown); + event_handler!(mouseenter, GetOnmouseenter, SetOnmouseenter); + event_handler!(mouseleave, GetOnmouseleave, SetOnmouseleave); + event_handler!(mousemove, GetOnmousemove, SetOnmousemove); + event_handler!(mouseout, GetOnmouseout, SetOnmouseout); event_handler!(mouseover, GetOnmouseover, SetOnmouseover); + event_handler!(mouseup, GetOnmouseup, SetOnmouseup); + event_handler!(wheel, GetOnwheel, SetOnwheel); event_handler!(pause, GetOnpause, SetOnpause); event_handler!(play, GetOnplay, SetOnplay); event_handler!(playing, GetOnplaying, SetOnplaying); event_handler!(progress, GetOnprogress, SetOnprogress); + event_handler!(ratechange, GetOnratechange, SetOnratechange); event_handler!(reset, GetOnreset, SetOnreset); + event_handler!(seeked, GetOnseeked, SetOnseeked); + event_handler!(seeking, GetOnseeking, SetOnseeking); + event_handler!(select, GetOnselect, SetOnselect); + event_handler!(show, GetOnshow, SetOnshow); + event_handler!(stalled, GetOnstalled, SetOnstalled); event_handler!(submit, GetOnsubmit, SetOnsubmit); event_handler!(suspend, GetOnsuspend, SetOnsuspend); event_handler!(timeupdate, GetOntimeupdate, SetOntimeupdate); event_handler!(toggle, GetOntoggle, SetOntoggle); + event_handler!(volumechange, GetOnvolumechange, SetOnvolumechange); event_handler!(waiting, GetOnwaiting, SetOnwaiting); ) ); + +// https://html.spec.whatwg.org/multipage/#windoweventhandlers +// see webidls/EventHandler.webidl +// As more methods get added, just update them here. +macro_rules! window_event_handlers( + () => ( + event_handler!(afterprint, GetOnafterprint, SetOnafterprint); + event_handler!(beforeprint, GetOnbeforeprint, SetOnbeforeprint); + beforeunload_event_handler!(beforeunload, GetOnbeforeunload, + SetOnbeforeunload); + event_handler!(hashchange, GetOnhashchange, SetOnhashchange); + event_handler!(languagechange, GetOnlanguagechange, + SetOnlanguagechange); + event_handler!(message, GetOnmessage, SetOnmessage); + event_handler!(offline, GetOnoffline, SetOnoffline); + event_handler!(online, GetOnonline, SetOnonline); + event_handler!(pagehide, GetOnpagehide, SetOnpagehide); + event_handler!(pageshow, GetOnpageshow, SetOnpageshow); + event_handler!(popstate, GetOnpopstate, SetOnpopstate); + event_handler!(rejectionhandled, GetOnrejectionhandled, + SetOnrejectionhandled); + event_handler!(storage, GetOnstorage, SetOnstorage); + event_handler!(unhandledrejection, GetOnunhandledrejection, + SetOnunhandledrejection); + event_handler!(unload, GetOnunload, SetOnunload); + ); + (ForwardToWindow) => ( + window_owned_event_handler!(afterprint, GetOnafterprint, + SetOnafterprint); + window_owned_event_handler!(beforeprint, GetOnbeforeprint, + SetOnbeforeprint); + window_owned_beforeunload_event_handler!(beforeunload, + GetOnbeforeunload, + SetOnbeforeunload); + window_owned_event_handler!(hashchange, GetOnhashchange, + SetOnhashchange); + window_owned_event_handler!(languagechange, GetOnlanguagechange, + SetOnlanguagechange); + window_owned_event_handler!(message, GetOnmessage, SetOnmessage); + window_owned_event_handler!(offline, GetOnoffline, SetOnoffline); + window_owned_event_handler!(online, GetOnonline, SetOnonline); + window_owned_event_handler!(pagehide, GetOnpagehide, SetOnpagehide); + window_owned_event_handler!(pageshow, GetOnpageshow, SetOnpageshow); + window_owned_event_handler!(popstate, GetOnpopstate, SetOnpopstate); + window_owned_event_handler!(rejectionhandled, GetOnrejectionhandled, + SetOnrejectionhandled); + window_owned_event_handler!(storage, GetOnstorage, SetOnstorage); + window_owned_event_handler!(unhandledrejection, GetOnunhandledrejection, + SetOnunhandledrejection); + window_owned_event_handler!(unload, GetOnunload, SetOnunload); + ); +); + +// https://html.spec.whatwg.org/multipage/#documentandelementeventhandlers +// see webidls/EventHandler.webidl +// As more methods get added, just update them here. +macro_rules! document_and_element_event_handlers( + () => ( + event_handler!(cut, GetOncut, SetOncut); + event_handler!(copy, GetOncopy, SetOncopy); + event_handler!(paste, GetOnpaste, SetOnpaste); + ) +); diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index cfa41a1ae19..8d13c104aa1 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -211,6 +211,7 @@ pub mod types { pub mod activation; pub mod attr; +pub mod beforeunloadevent; mod create; #[allow(unsafe_code)] #[deny(missing_docs, non_snake_case)] diff --git a/components/script/dom/webidls/BeforeUnloadEvent.webidl b/components/script/dom/webidls/BeforeUnloadEvent.webidl new file mode 100644 index 00000000000..5e4a099725a --- /dev/null +++ b/components/script/dom/webidls/BeforeUnloadEvent.webidl @@ -0,0 +1,11 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ +/* + * For more information on this interface please see + * https://html.spec.whatwg.org/multipage/#beforeunloadevent + */ + +interface BeforeUnloadEvent : Event { + attribute DOMString returnValue; +}; diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index b211fe7be58..b73d563bac7 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -138,6 +138,7 @@ partial /*sealed*/ interface Document { // also has obsolete members }; Document implements GlobalEventHandlers; +Document implements DocumentAndElementEventHandlers; // https://html.spec.whatwg.org/multipage/#Document-partial partial interface Document { diff --git a/components/script/dom/webidls/EventHandler.webidl b/components/script/dom/webidls/EventHandler.webidl index fa42b757cab..957fc0bd4dd 100644 --- a/components/script/dom/webidls/EventHandler.webidl +++ b/components/script/dom/webidls/EventHandler.webidl @@ -20,42 +20,99 @@ callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional optional any error); typedef OnErrorEventHandlerNonNull? OnErrorEventHandler; +[TreatNonObjectAsNull] +callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event); +typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler; + // https://html.spec.whatwg.org/multipage/#globaleventhandlers [NoInterfaceObject] interface GlobalEventHandlers { attribute EventHandler onabort; attribute EventHandler onblur; + attribute EventHandler oncancel; attribute EventHandler oncanplay; attribute EventHandler oncanplaythrough; attribute EventHandler onchange; attribute EventHandler onclick; + attribute EventHandler onclose; + attribute EventHandler oncontextmenu; + attribute EventHandler oncuechange; attribute EventHandler ondblclick; + attribute EventHandler ondrag; + attribute EventHandler ondragend; + attribute EventHandler ondragenter; + attribute EventHandler ondragexit; + attribute EventHandler ondragleave; + attribute EventHandler ondragover; + attribute EventHandler ondragstart; + attribute EventHandler ondrop; + attribute EventHandler ondurationchange; attribute EventHandler onemptied; + attribute EventHandler onended; attribute OnErrorEventHandler onerror; + attribute EventHandler onfocus; attribute EventHandler oninput; + attribute EventHandler oninvalid; attribute EventHandler onkeydown; attribute EventHandler onkeypress; attribute EventHandler onkeyup; attribute EventHandler onload; attribute EventHandler onloadeddata; attribute EventHandler onloadedmetadata; + attribute EventHandler onloadstart; + attribute EventHandler onmousedown; + [LenientThis] attribute EventHandler onmouseenter; + [LenientThis] attribute EventHandler onmouseleave; + attribute EventHandler onmousemove; + attribute EventHandler onmouseout; attribute EventHandler onmouseover; + attribute EventHandler onmouseup; + attribute EventHandler onwheel; attribute EventHandler onpause; attribute EventHandler onplay; attribute EventHandler onplaying; attribute EventHandler onprogress; + attribute EventHandler onratechange; attribute EventHandler onreset; attribute EventHandler onresize; + attribute EventHandler onscroll; + attribute EventHandler onseeked; + attribute EventHandler onseeking; + attribute EventHandler onselect; + attribute EventHandler onshow; + attribute EventHandler onstalled; attribute EventHandler onsubmit; attribute EventHandler onsuspend; attribute EventHandler ontimeupdate; attribute EventHandler ontoggle; + attribute EventHandler onvolumechange; attribute EventHandler onwaiting; }; // https://html.spec.whatwg.org/multipage/#windoweventhandlers [NoInterfaceObject] interface WindowEventHandlers { - attribute EventHandler onunload; + attribute EventHandler onafterprint; + attribute EventHandler onbeforeprint; + attribute OnBeforeUnloadEventHandler onbeforeunload; + attribute EventHandler onhashchange; + attribute EventHandler onlanguagechange; + attribute EventHandler onmessage; + attribute EventHandler onoffline; + attribute EventHandler ononline; + attribute EventHandler onpagehide; + attribute EventHandler onpageshow; + attribute EventHandler onpopstate; + attribute EventHandler onrejectionhandled; attribute EventHandler onstorage; + attribute EventHandler onunhandledrejection; + attribute EventHandler onunload; +}; + +// https://html.spec.whatwg.org/multipage/#documentandelementeventhandlers +[NoInterfaceObject] +interface DocumentAndElementEventHandlers { + attribute EventHandler oncopy; + attribute EventHandler oncut; + attribute EventHandler onpaste; }; diff --git a/components/script/dom/webidls/HTMLElement.webidl b/components/script/dom/webidls/HTMLElement.webidl index 9778985dd40..19222109d63 100644 --- a/components/script/dom/webidls/HTMLElement.webidl +++ b/components/script/dom/webidls/HTMLElement.webidl @@ -54,5 +54,6 @@ partial interface HTMLElement { }; HTMLElement implements GlobalEventHandlers; +HTMLElement implements DocumentAndElementEventHandlers; HTMLElement implements ElementContentEditable; HTMLElement implements ElementCSSInlineStyle; diff --git a/components/script/dom/webidls/HTMLFrameSetElement.webidl b/components/script/dom/webidls/HTMLFrameSetElement.webidl index f35de93e545..5addd41d253 100644 --- a/components/script/dom/webidls/HTMLFrameSetElement.webidl +++ b/components/script/dom/webidls/HTMLFrameSetElement.webidl @@ -7,4 +7,5 @@ interface HTMLFrameSetElement : HTMLElement { // attribute DOMString cols; // attribute DOMString rows; }; -//HTMLFrameSetElement implements WindowEventHandlers; + +HTMLFrameSetElement implements WindowEventHandlers; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index c9111ad15e5..829ff6313cd 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -7,7 +7,9 @@ use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarker use dom::bindings::callback::ExceptionHandling; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState}; -use dom::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, OnErrorEventHandlerNonNull}; +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::FunctionBinding::Function; use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions}; use dom::bindings::codegen::Bindings::WindowBinding::{self, FrameRequestCallback, WindowMethods}; @@ -585,11 +587,8 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#globaleventhandlers global_event_handlers!(); - // https://html.spec.whatwg.org/multipage/#handler-window-onunload - event_handler!(unload, GetOnunload, SetOnunload); - - // https://html.spec.whatwg.org/multipage/#handler-window-onstorage - event_handler!(storage, GetOnstorage, SetOnstorage); + // https://html.spec.whatwg.org/multipage/#windoweventhandlers + window_event_handlers!(); // https://developer.mozilla.org/en-US/docs/Web/API/Window/screen fn Screen(&self) -> Root<Screen> { |