diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-10-10 16:14:40 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-10-11 13:56:07 +0200 |
commit | 605c679fee29302321878a74b88aa7165519b516 (patch) | |
tree | c52ffde5e21c61b3a5cbdc5aa308247741bb708d /components/script/dom/element.rs | |
parent | 826352ab4cae13f5154d13ab53885d80a8057337 (diff) | |
download | servo-605c679fee29302321878a74b88aa7165519b516.tar.gz servo-605c679fee29302321878a74b88aa7165519b516.zip |
Fix URL attributes
URL attributes should always use AttrValue::Url, and the input should be
resolved against the document's base URL at setting time always.
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 438d01f4d0a..c16eb7f0699 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -1302,21 +1302,30 @@ impl Element { pub fn get_url_attribute(&self, local_name: &LocalName) -> DOMString { assert!(*local_name == local_name.to_ascii_lowercase()); - if !self.has_attribute(local_name) { - return DOMString::new(); - } - let url = self.get_string_attribute(local_name); - let doc = document_from_node(self); - let base = doc.base_url(); - // https://html.spec.whatwg.org/multipage/#reflect - // XXXManishearth this doesn't handle `javascript:` urls properly - match base.join(&url) { - Ok(parsed) => DOMString::from(parsed.into_string()), - Err(_) => DOMString::from(""), + let attr = match self.get_attribute(&ns!(), local_name) { + Some(attr) => attr, + None => return DOMString::new(), + }; + let value = attr.value(); + match *value { + AttrValue::Url(ref value, _) => { + // XXXManishearth this doesn't handle `javascript:` urls properly + let base = document_from_node(self).base_url(); + let value = base.join(value) + .map(|parsed| parsed.into_string()) + .unwrap_or_else(|_| value.clone()); + DOMString::from(value) + }, + _ => panic!("attribute value should be AttrValue::Url(..)"), } } + pub fn set_url_attribute(&self, local_name: &LocalName, value: DOMString) { - self.set_string_attribute(local_name, value); + let value = AttrValue::from_url( + document_from_node(self).base_url(), + value.into(), + ); + self.set_attribute(local_name, value); } pub fn get_string_attribute(&self, local_name: &LocalName) -> DOMString { |