diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2014-10-07 21:25:45 +0530 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2014-10-07 22:22:48 +0530 |
commit | 8cba6c758098b295f7ccddfcb6fd82e6270e8342 (patch) | |
tree | bc112e39a065bf9eaa32945f84d2d4b23b074a51 /components/script/dom/macros.rs | |
parent | e9f654d60a9e5678d0078775dcc1125e2269c1f9 (diff) | |
download | servo-8cba6c758098b295f7ccddfcb6fd82e6270e8342.tar.gz servo-8cba6c758098b295f7ccddfcb6fd82e6270e8342.zip |
Add macro for reflecting URLs
Diffstat (limited to 'components/script/dom/macros.rs')
-rw-r--r-- | components/script/dom/macros.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index 40b150da6c8..22b93a7eb07 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -53,6 +53,34 @@ macro_rules! make_uint_getter( } ) +#[macro_export] +macro_rules! make_url_getter( + ( $attr:ident, $htmlname:expr ) => ( + fn $attr(self) -> DOMString { + use dom::element::{Element, AttributeHandlers}; + use dom::bindings::codegen::InheritTypes::ElementCast; + use dom::document::DocumentHelpers; + use dom::node::document_from_node; + use url::UrlParser; + #[allow(unused_imports)] + use std::ascii::StrAsciiExt; + let elem: JSRef<Element> = ElementCast::from_ref(self); + let action = elem.get_string_attribute($htmlname); + let doc = document_from_node(self).root(); + let base = doc.url(); + // https://html.spec.whatwg.org/multipage/infrastructure.html#reflect + // XXXManishearth this doesn't handle `javascript:` urls properly + match UrlParser::new().base_url(base).parse(action.as_slice()) { + Ok(parsed) => parsed.serialize(), + Err(_) => base.serialize() + } + } + ); + ($attr:ident) => { + make_url_getter!($attr, stringify!($attr).to_ascii_lower().as_slice()) + } +) + // concat_idents! doesn't work for function name positions, so // we have to specify both the content name and the HTML name here #[macro_export] |