aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/macros.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-05-06 14:22:45 -0500
committerbors-servo <metajack+bors@gmail.com>2015-05-06 14:22:45 -0500
commit19744984da58feeeab64a98839ec2936fb8fb5a0 (patch)
treed7951916e1f895dea638758445f54cffa136b4bf /components/script/dom/macros.rs
parentccf1e6b9a701cf4ff010fa1f1b4ba9d656d962af (diff)
parentfedad2af1f7c8b36f4ed76e79ebde5516721b11f (diff)
downloadservo-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.rs45
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