aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/macros.rs')
-rw-r--r--components/script/dom/macros.rs304
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()
+ }};
}