aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2017-10-10 16:14:40 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2017-10-11 13:56:07 +0200
commit605c679fee29302321878a74b88aa7165519b516 (patch)
treec52ffde5e21c61b3a5cbdc5aa308247741bb708d /components/script/dom/element.rs
parent826352ab4cae13f5154d13ab53885d80a8057337 (diff)
downloadservo-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.rs33
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 {