diff options
Diffstat (limited to 'components/script/dom/macros.rs')
-rw-r--r-- | components/script/dom/macros.rs | 304 |
1 files changed, 210 insertions, 94 deletions
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index 14c05bd3cee..5a32b36996b 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -1,13 +1,13 @@ /* 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/. */ + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #[macro_export] macro_rules! make_getter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self) -> DOMString { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.get_string_attribute(&local_name!($htmlname)) } @@ -18,8 +18,8 @@ macro_rules! make_getter( macro_rules! make_bool_getter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self) -> bool { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.has_attribute(&local_name!($htmlname)) } @@ -30,8 +30,8 @@ macro_rules! make_bool_getter( macro_rules! make_limited_int_setter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self, value: i32) -> $crate::dom::bindings::error::ErrorResult { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let value = if value < 0 { return Err($crate::dom::bindings::error::Error::IndexSize); @@ -50,8 +50,8 @@ macro_rules! make_limited_int_setter( macro_rules! make_int_setter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self, value: i32) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.set_int_attribute(&local_name!($htmlname), value) @@ -66,8 +66,8 @@ macro_rules! make_int_setter( macro_rules! make_int_getter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self) -> i32 { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.get_int_attribute(&local_name!($htmlname), $default) } @@ -82,8 +82,8 @@ macro_rules! make_int_getter( macro_rules! make_uint_getter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self) -> u32 { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.get_uint_attribute(&local_name!($htmlname), $default) } @@ -96,9 +96,9 @@ macro_rules! make_uint_getter( #[macro_export] macro_rules! make_url_getter( ( $attr:ident, $htmlname:tt ) => ( - fn $attr(&self) -> DOMString { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + fn $attr(&self) -> USVString { + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.get_url_attribute(&local_name!($htmlname)) } @@ -106,50 +106,61 @@ macro_rules! make_url_getter( ); #[macro_export] -macro_rules! make_url_or_base_getter( +macro_rules! make_url_setter( ( $attr:ident, $htmlname:tt ) => ( - fn $attr(&self) -> DOMString { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + fn $attr(&self, value: USVString) { + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); - let url = element.get_url_attribute(&local_name!($htmlname)); - if url.is_empty() { - let window = window_from_node(self); - DOMString::from(window.get_url().into_string()) - } else { - url - } + element.set_url_attribute(&local_name!($htmlname), + value); } ); ); #[macro_export] -macro_rules! make_string_or_document_url_getter( +macro_rules! make_form_action_getter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self) -> DOMString { - use dom::bindings::inheritance::Castable; - use dom::element::Element; - use dom::node::document_from_node; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); - let val = element.get_string_attribute(&local_name!($htmlname)); - - if val.is_empty() { - let doc = document_from_node(self); - DOMString::from(doc.url().into_string()) - } else { - val + let doc = crate::dom::node::document_from_node(self); + let attr = element.get_attribute(&ns!(), &local_name!($htmlname)); + let value = attr.as_ref().map(|attr| attr.value()); + let value = match value { + Some(ref value) if !value.is_empty() => &***value, + _ => return doc.url().into_string().into(), + }; + match doc.base_url().join(value) { + Ok(parsed) => parsed.into_string().into(), + Err(_) => value.to_owned().into(), } } ); ); #[macro_export] +macro_rules! make_labels_getter( + ( $attr:ident, $memo:ident ) => ( + fn $attr(&self) -> DomRoot<NodeList> { + use crate::dom::htmlelement::HTMLElement; + use crate::dom::nodelist::NodeList; + self.$memo.or_init(|| NodeList::new_labels_list( + self.upcast::<Node>().owner_doc().window(), + self.upcast::<HTMLElement>() + ) + ) + } + ); +); + +#[macro_export] macro_rules! make_enumerated_getter( ( $attr:ident, $htmlname:tt, $default:expr, $($choices: pat)|+) => ( fn $attr(&self) -> DOMString { - use dom::bindings::inheritance::Castable; - use dom::element::Element; - use std::ascii::AsciiExt; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); let mut val = element.get_string_attribute(&local_name!($htmlname)); val.make_ascii_lowercase(); @@ -168,8 +179,8 @@ macro_rules! make_enumerated_getter( macro_rules! make_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.set_string_attribute(&local_name!($htmlname), value) } @@ -180,8 +191,8 @@ macro_rules! make_setter( macro_rules! make_bool_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: bool) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.set_bool_attribute(&local_name!($htmlname), value) } @@ -189,27 +200,12 @@ macro_rules! make_bool_setter( ); #[macro_export] -macro_rules! make_url_setter( - ( $attr:ident, $htmlname:tt ) => ( - fn $attr(&self, value: DOMString) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; - use dom::node::document_from_node; - let value = AttrValue::from_url(document_from_node(self).url(), - value.into()); - let element = self.upcast::<Element>(); - element.set_attribute(&local_name!($htmlname), value); - } - ); -); - -#[macro_export] macro_rules! make_uint_setter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self, value: u32) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; - use dom::values::UNSIGNED_LONG_MAX; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; + use crate::dom::values::UNSIGNED_LONG_MAX; let value = if value > UNSIGNED_LONG_MAX { $default } else { @@ -228,9 +224,9 @@ macro_rules! make_uint_setter( macro_rules! make_limited_uint_setter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self, value: u32) -> $crate::dom::bindings::error::ErrorResult { - use dom::bindings::inheritance::Castable; - use dom::element::Element; - use dom::values::UNSIGNED_LONG_MAX; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; + use crate::dom::values::UNSIGNED_LONG_MAX; let value = if value == 0 { return Err($crate::dom::bindings::error::Error::IndexSize); } else if value > UNSIGNED_LONG_MAX { @@ -252,8 +248,8 @@ macro_rules! make_limited_uint_setter( macro_rules! make_atomic_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); element.set_atomic_attribute(&local_name!($htmlname), value) } @@ -264,8 +260,8 @@ macro_rules! make_atomic_setter( macro_rules! make_legacy_color_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; use style::attr::AttrValue; let element = self.upcast::<Element>(); let value = AttrValue::from_legacy_color(value.into()); @@ -278,8 +274,8 @@ macro_rules! make_legacy_color_setter( macro_rules! make_dimension_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); let value = AttrValue::from_dimension(value.into()); element.set_attribute(&local_name!($htmlname), value) @@ -291,8 +287,8 @@ macro_rules! make_dimension_setter( macro_rules! make_nonzero_dimension_setter( ( $attr:ident, $htmlname:tt ) => ( fn $attr(&self, value: DOMString) { - use dom::bindings::inheritance::Castable; - use dom::element::Element; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::element::Element; let element = self.upcast::<Element>(); let value = AttrValue::from_nonzero_dimension(value.into()); element.set_attribute(&local_name!($htmlname), value) @@ -303,7 +299,7 @@ macro_rules! make_nonzero_dimension_setter( /// For use on non-jsmanaged types /// Use #[derive(JSTraceable)] on JS managed types macro_rules! unsafe_no_jsmanaged_fields( - ($($ty:ident),+) => ( + ($($ty:ty),+) => ( $( #[allow(unsafe_code)] unsafe impl $crate::dom::bindings::trace::JSTraceable for $ty { @@ -334,17 +330,17 @@ macro_rules! jsmanaged_array( /// These are used to generate a event handler which has no special case. macro_rules! define_event_handler( - ($handler: ident, $event_type: ident, $getter: ident, $setter: ident, $setter_fn: ident) => ( + ($handler: ty, $event_type: ident, $getter: ident, $setter: ident, $setter_fn: ident) => ( fn $getter(&self) -> Option<::std::rc::Rc<$handler>> { - use dom::bindings::inheritance::Castable; - use dom::eventtarget::EventTarget; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::eventtarget::EventTarget; let eventtarget = self.upcast::<EventTarget>(); eventtarget.get_event_handler_common(stringify!($event_type)) } fn $setter(&self, listener: Option<::std::rc::Rc<$handler>>) { - use dom::bindings::inheritance::Castable; - use dom::eventtarget::EventTarget; + use crate::dom::bindings::inheritance::Castable; + use crate::dom::eventtarget::EventTarget; let eventtarget = self.upcast::<EventTarget>(); eventtarget.$setter_fn(stringify!($event_type), listener) } @@ -352,7 +348,7 @@ macro_rules! define_event_handler( ); macro_rules! define_window_owned_event_handler( - ($handler: ident, $event_type: ident, $getter: ident, $setter: ident) => ( + ($handler: ty, $event_type: ident, $getter: ident, $setter: ident) => ( fn $getter(&self) -> Option<::std::rc::Rc<$handler>> { let document = document_from_node(self); if document.has_browsing_context() { @@ -373,36 +369,59 @@ macro_rules! define_window_owned_event_handler( macro_rules! event_handler( ($event_type: ident, $getter: ident, $setter: ident) => ( - define_event_handler!(EventHandlerNonNull, $event_type, $getter, $setter, - set_event_handler_common); + define_event_handler!( + crate::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull, + $event_type, + $getter, + $setter, + set_event_handler_common + ); ) ); macro_rules! error_event_handler( ($event_type: ident, $getter: ident, $setter: ident) => ( - define_event_handler!(OnErrorEventHandlerNonNull, $event_type, $getter, $setter, - set_error_event_handler); + define_event_handler!( + crate::dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull, + $event_type, + $getter, + $setter, + set_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); + define_event_handler!( + crate::dom::bindings::codegen::Bindings::EventHandlerBinding::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); + define_window_owned_event_handler!( + crate::dom::bindings::codegen::Bindings::EventHandlerBinding::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); + define_window_owned_event_handler!( + crate::dom::bindings::codegen::Bindings::EventHandlerBinding::OnBeforeUnloadEventHandlerNonNull, + $event_type, + $getter, + $setter + ); ) ); @@ -411,7 +430,9 @@ macro_rules! window_owned_beforeunload_event_handler( // As more methods get added, just update them here. macro_rules! global_event_handlers( () => ( + // These are special when on body/frameset elements event_handler!(blur, GetOnblur, SetOnblur); + error_event_handler!(error, GetOnerror, SetOnerror); event_handler!(focus, GetOnfocus, SetOnfocus); event_handler!(load, GetOnload, SetOnload); event_handler!(resize, GetOnresize, SetOnresize); @@ -421,6 +442,8 @@ macro_rules! global_event_handlers( ); (NoOnload) => ( event_handler!(abort, GetOnabort, SetOnabort); + event_handler!(animationend, GetOnanimationend, SetOnanimationend); + event_handler!(animationiteration, GetOnanimationiteration, SetOnanimationiteration); event_handler!(cancel, GetOncancel, SetOncancel); event_handler!(canplay, GetOncanplay, SetOncanplay); event_handler!(canplaythrough, GetOncanplaythrough, SetOncanplaythrough); @@ -441,14 +464,14 @@ macro_rules! global_event_handlers( event_handler!(durationchange, GetOndurationchange, SetOndurationchange); event_handler!(emptied, GetOnemptied, SetOnemptied); event_handler!(ended, GetOnended, SetOnended); - error_event_handler!(error, GetOnerror, SetOnerror); + event_handler!(formdata, GetOnformdata, SetOnformdata); 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!(loadedmetadata, GetOnloadedmetadata, SetOnloadedmetadata); event_handler!(loadstart, GetOnloadstart, SetOnloadstart); event_handler!(mousedown, GetOnmousedown, SetOnmousedown); event_handler!(mouseenter, GetOnmouseenter, SetOnmouseenter); @@ -467,13 +490,17 @@ macro_rules! global_event_handlers( event_handler!(seeked, GetOnseeked, SetOnseeked); event_handler!(seeking, GetOnseeking, SetOnseeking); event_handler!(select, GetOnselect, SetOnselect); + event_handler!(selectionchange, GetOnselectionchange, SetOnselectionchange); + event_handler!(selectstart, GetOnselectstart, SetOnselectstart); 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!(transitioncancel, GetOntransitioncancel, SetOntransitioncancel); event_handler!(transitionend, GetOntransitionend, SetOntransitionend); + event_handler!(transitionrun, GetOntransitionrun, SetOntransitionrun); event_handler!(volumechange, GetOnvolumechange, SetOnvolumechange); event_handler!(waiting, GetOnwaiting, SetOnwaiting); ) @@ -492,6 +519,7 @@ macro_rules! window_event_handlers( event_handler!(languagechange, GetOnlanguagechange, SetOnlanguagechange); event_handler!(message, GetOnmessage, SetOnmessage); + event_handler!(messageerror, GetOnmessageerror, SetOnmessageerror); event_handler!(offline, GetOnoffline, SetOnoffline); event_handler!(online, GetOnonline, SetOnonline); event_handler!(pagehide, GetOnpagehide, SetOnpagehide); @@ -517,6 +545,7 @@ macro_rules! window_event_handlers( window_owned_event_handler!(languagechange, GetOnlanguagechange, SetOnlanguagechange); window_owned_event_handler!(message, GetOnmessage, SetOnmessage); + window_owned_event_handler!(messageerror, GetOnmessageerror, SetOnmessageerror); window_owned_event_handler!(offline, GetOnoffline, SetOnoffline); window_owned_event_handler!(online, GetOnonline, SetOnonline); window_owned_event_handler!(pagehide, GetOnpagehide, SetOnpagehide); @@ -555,5 +584,92 @@ macro_rules! rooted_vec { (let mut $name:ident <- $iter:expr) => { let mut root = $crate::dom::bindings::trace::RootableVec::new_unrooted(); let mut $name = $crate::dom::bindings::trace::RootedVec::from_iter(&mut root, $iter); - } + }; +} + +/// DOM struct implementation for simple interfaces inheriting from PerformanceEntry. +macro_rules! impl_performance_entry_struct( + ($binding:ident, $struct:ident, $type:expr) => ( + use crate::dom::bindings::reflector::reflect_dom_object; + use crate::dom::bindings::root::DomRoot; + use crate::dom::bindings::str::DOMString; + use crate::dom::globalscope::GlobalScope; + use crate::dom::performanceentry::PerformanceEntry; + use dom_struct::dom_struct; + + #[dom_struct] + pub struct $struct { + entry: PerformanceEntry, + } + + impl $struct { + fn new_inherited(name: DOMString, start_time: f64, duration: f64) + -> $struct { + $struct { + entry: PerformanceEntry::new_inherited(name, + DOMString::from($type), + start_time, + duration) + } + } + + #[allow(unrooted_must_root)] + pub fn new(global: &GlobalScope, + name: DOMString, + start_time: f64, + duration: f64) -> DomRoot<$struct> { + let entry = $struct::new_inherited(name, start_time, duration); + reflect_dom_object(Box::new(entry), global) + } + } + ); +); + +macro_rules! handle_potential_webgl_error { + ($context:expr, $call:expr, $return_on_error:expr) => { + match $call { + Ok(ret) => ret, + Err(error) => { + $context.webgl_error(error); + $return_on_error + }, + } + }; + ($context:expr, $call:expr) => { + handle_potential_webgl_error!($context, $call, ()); + }; +} + +macro_rules! impl_rare_data ( + ($type:ty) => ( + fn rare_data(&self) -> Ref<Option<Box<$type>>> { + self.rare_data.borrow() + } + + #[allow(dead_code)] + fn rare_data_mut(&self) -> RefMut<Option<Box<$type>>> { + self.rare_data.borrow_mut() + } + + fn ensure_rare_data(&self) -> RefMut<Box<$type>> { + let mut rare_data = self.rare_data.borrow_mut(); + if rare_data.is_none() { + *rare_data = Some(Default::default()); + } + RefMut::map(rare_data, |rare_data| { + rare_data.as_mut().unwrap() + }) + } + ); +); + +#[macro_export] +macro_rules! optional_root_object_to_js_or_null { + ($cx: expr, $binding:expr) => {{ + rooted!(in($cx) let mut rval = NullValue()); + if let Some(object) = $binding { + object.to_jsval($cx, rval.handle_mut()); + } + rval.get() + }}; } |