diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-05-06 14:22:45 -0500 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-05-06 14:22:45 -0500 |
commit | 19744984da58feeeab64a98839ec2936fb8fb5a0 (patch) | |
tree | d7951916e1f895dea638758445f54cffa136b4bf /components/script/dom/macros.rs | |
parent | ccf1e6b9a701cf4ff010fa1f1b4ba9d656d962af (diff) | |
parent | fedad2af1f7c8b36f4ed76e79ebde5516721b11f (diff) | |
download | servo-19744984da58feeeab64a98839ec2936fb8fb5a0.tar.gz servo-19744984da58feeeab64a98839ec2936fb8fb5a0.zip |
Auto merge of #5923 - nox:limited-unsigned-long, r=jdm
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5923)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/macros.rs')
-rw-r--r-- | components/script/dom/macros.rs | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index b3dda8730e0..d66190ffada 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -39,7 +39,7 @@ macro_rules! make_bool_getter( #[macro_export] macro_rules! make_uint_getter( - ( $attr:ident, $htmlname:expr ) => ( + ($attr:ident, $htmlname:expr, $default:expr) => ( fn $attr(self) -> u32 { use dom::element::{Element, AttributeHandlers}; use dom::bindings::codegen::InheritTypes::ElementCast; @@ -47,9 +47,12 @@ macro_rules! make_uint_getter( use std::ascii::AsciiExt; let element: JSRef<Element> = ElementCast::from_ref(self); // FIXME(pcwalton): Do this at compile time, not runtime. - element.get_uint_attribute(&Atom::from_slice($htmlname)) + element.get_uint_attribute(&Atom::from_slice($htmlname), $default) } ); + ($attr:ident, $htmlname:expr) => { + make_uint_getter!($attr, $htmlname, 0); + }; ($attr:ident) => { make_uint_getter!($attr, to_lower!(stringify!($attr))); } @@ -152,15 +155,51 @@ macro_rules! make_bool_setter( #[macro_export] macro_rules! make_uint_setter( - ( $attr:ident, $htmlname:expr ) => ( + ($attr:ident, $htmlname:expr, $default:expr) => ( fn $attr(self, value: u32) { use dom::element::{Element, AttributeHandlers}; use dom::bindings::codegen::InheritTypes::ElementCast; + let value = if value > 2147483647 { + $default + } else { + value + }; let element: JSRef<Element> = ElementCast::from_ref(self); // FIXME(pcwalton): Do this at compile time, not at runtime. element.set_uint_attribute(&Atom::from_slice($htmlname), value) } ); + ($attr:ident, $htmlname:expr) => { + make_uint_setter!($attr, $htmlname, 0); + }; +); + +#[macro_export] +macro_rules! make_limited_uint_setter( + ($attr:ident, $htmlname:expr, $default:expr) => ( + fn $attr(self, value: u32) -> $crate::dom::bindings::error::ErrorResult { + use dom::element::AttributeHandlers; + use dom::bindings::codegen::InheritTypes::ElementCast; + use string_cache::Atom; + let value = if value == 0 { + return Err($crate::dom::bindings::error::Error::IndexSize); + } else if value > 2147483647 { + $default + } else { + value + }; + let element = ElementCast::from_ref(self); + // FIXME(pcwalton): Do this at compile time, not runtime. + element.set_uint_attribute(&Atom::from_slice($htmlname), value); + Ok(()) + } + ); + ($attr:ident, $htmlname:expr) => { + make_limited_uint_setter!($attr, $htmlname, 1); + }; + ($attr:ident) => { + make_limited_uint_setter!($attr, to_lower!(stringify!($attr))); + }; ); /// For use on non-jsmanaged types |