aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-10-11 08:45:44 -0500
committerGitHub <noreply@github.com>2017-10-11 08:45:44 -0500
commit528d0fb40939311625dd977b52e879758d6f6aab (patch)
tree941a568a8fd3da822039ba33202efb4db0acaaf5 /components/script/dom
parent2f3bc0de499a9d301459dbb27978051a9a7d5f4a (diff)
parent71b015173f1f1d65dd92a81ad1fc2dc2aaec8c37 (diff)
downloadservo-528d0fb40939311625dd977b52e879758d6f6aab.tar.gz
servo-528d0fb40939311625dd977b52e879758d6f6aab.zip
Auto merge of #18825 - servo:urls, r=emilio
Fix a bunch of URL-reflecting IDL attributes <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18825) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/element.rs33
-rw-r--r--components/script/dom/htmlbaseelement.rs32
-rw-r--r--components/script/dom/htmlbodyelement.rs10
-rwxr-xr-xcomponents/script/dom/htmlbuttonelement.rs2
-rwxr-xr-xcomponents/script/dom/htmlformelement.rs2
-rw-r--r--components/script/dom/htmliframeelement.rs9
-rw-r--r--components/script/dom/htmlimageelement.rs4
-rwxr-xr-xcomponents/script/dom/htmlinputelement.rs3
-rw-r--r--components/script/dom/htmllinkelement.rs3
-rw-r--r--components/script/dom/htmlmediaelement.rs11
-rw-r--r--components/script/dom/htmlscriptelement.rs11
-rw-r--r--components/script/dom/macros.rs43
12 files changed, 90 insertions, 73 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 {
diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs
index ada9539833a..c1c3c07aaf0 100644
--- a/components/script/dom/htmlbaseelement.rs
+++ b/components/script/dom/htmlbaseelement.rs
@@ -16,7 +16,6 @@ use dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix};
use servo_url::ServoUrl;
-use style::attr::AttrValue;
#[dom_struct]
pub struct HTMLBaseElement {
@@ -67,28 +66,31 @@ impl HTMLBaseElement {
impl HTMLBaseElementMethods for HTMLBaseElement {
// https://html.spec.whatwg.org/multipage/#dom-base-href
fn Href(&self) -> DOMString {
- let document = document_from_node(self);
-
// Step 1.
- if !self.upcast::<Element>().has_attribute(&local_name!("href")) {
- return DOMString::from(document.base_url().as_str());
- }
+ let document = document_from_node(self);
// Step 2.
- let fallback_base_url = document.fallback_base_url();
+ let attr = self.upcast::<Element>().get_attribute(&ns!(), &local_name!("href"));
+ let value = attr.as_ref().map(|attr| attr.value());
+ let url = value.as_ref().map_or("", |value| &**value);
// Step 3.
- let url = self.upcast::<Element>().get_url_attribute(&local_name!("href"));
-
- // Step 4.
- let url_record = fallback_base_url.join(&*url);
-
- // Step 5, 6.
- DOMString::from(url_record.as_ref().map(|url| url.as_str()).unwrap_or(""))
+ let url_record = document.fallback_base_url().join(url);
+
+ match url_record {
+ Err(_) => {
+ // Step 4.
+ url.into()
+ }
+ Ok(url_record) => {
+ // Step 5.
+ url_record.into_string().into()
+ },
+ }
}
// https://html.spec.whatwg.org/multipage/#dom-base-href
- make_url_setter!(SetHref, "href");
+ make_setter!(SetHref, "href");
}
impl VirtualMethods for HTMLBaseElement {
diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs
index 53fb0637b0d..580dc0a8808 100644
--- a/components/script/dom/htmlbodyelement.rs
+++ b/components/script/dom/htmlbodyelement.rs
@@ -4,6 +4,7 @@
use cssparser::RGBA;
use dom::attr::Attr;
+use dom::bindings::codegen::Bindings::AttrBinding::AttrBinding::AttrMethods;
use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods};
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::inheritance::Castable;
@@ -73,7 +74,12 @@ impl HTMLBodyElementMethods for HTMLBodyElement {
make_legacy_color_setter!(SetText, "text");
// https://html.spec.whatwg.org/multipage/#dom-body-background
- make_getter!(Background, "background");
+ fn Background(&self) -> DOMString {
+ self.upcast::<Element>()
+ .get_attribute(&ns!(), &local_name!("background"))
+ .map(|attr| attr.Value())
+ .unwrap_or_default()
+ }
// https://html.spec.whatwg.org/multipage/#dom-body-background
make_url_setter!(SetBackground, "background");
@@ -154,7 +160,7 @@ impl VirtualMethods for HTMLBodyElement {
local_name!("bgcolor") |
local_name!("text") => AttrValue::from_legacy_color(value.into()),
local_name!("background") => {
- AttrValue::from_url(document_from_node(self).url(), value.into())
+ AttrValue::from_url(document_from_node(self).base_url(), value.into())
},
_ => self.super_type().unwrap().parse_plain_attribute(name, value),
}
diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs
index aea8bf5c585..d72fb752194 100755
--- a/components/script/dom/htmlbuttonelement.rs
+++ b/components/script/dom/htmlbuttonelement.rs
@@ -93,7 +93,7 @@ impl HTMLButtonElementMethods for HTMLButtonElement {
make_setter!(SetType, "type");
// https://html.spec.whatwg.org/multipage/#dom-fs-formaction
- make_url_or_base_getter!(FormAction, "formaction");
+ make_form_action_getter!(FormAction, "formaction");
// https://html.spec.whatwg.org/multipage/#dom-fs-formaction
make_setter!(SetFormAction, "formaction");
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index a61b7bf3e51..b58194bed62 100755
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -100,7 +100,7 @@ impl HTMLFormElementMethods for HTMLFormElement {
make_setter!(SetAcceptCharset, "accept-charset");
// https://html.spec.whatwg.org/multipage/#dom-fs-action
- make_string_or_document_url_getter!(Action, "action");
+ make_form_action_getter!(Action, "action");
// https://html.spec.whatwg.org/multipage/#dom-fs-action
make_setter!(SetAction, "action");
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index 245d61a8d63..2346358aabd 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -568,14 +568,10 @@ pub fn Navigate(iframe: &HTMLIFrameElement, direction: TraversalDirection) -> Er
impl HTMLIFrameElementMethods for HTMLIFrameElement {
// https://html.spec.whatwg.org/multipage/#dom-iframe-src
- fn Src(&self) -> DOMString {
- self.upcast::<Element>().get_string_attribute(&local_name!("src"))
- }
+ make_url_getter!(Src, "src");
// https://html.spec.whatwg.org/multipage/#dom-iframe-src
- fn SetSrc(&self, src: DOMString) {
- self.upcast::<Element>().set_url_attribute(&local_name!("src"), src)
- }
+ make_url_setter!(SetSrc, "src");
// https://html.spec.whatwg.org/multipage/#dom-iframe-sandbox
fn Sandbox(&self) -> DomRoot<DOMTokenList> {
@@ -765,6 +761,7 @@ impl VirtualMethods for HTMLIFrameElement {
fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
match name {
+ &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
&local_name!("sandbox") => AttrValue::from_serialized_tokenlist(value.into()),
&local_name!("width") => AttrValue::from_dimension(value.into()),
&local_name!("height") => AttrValue::from_dimension(value.into()),
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index 027221a88f0..a9b2f01e283 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -824,8 +824,9 @@ impl HTMLImageElementMethods for HTMLImageElement {
// https://html.spec.whatwg.org/multipage/#dom-img-src
make_url_getter!(Src, "src");
+
// https://html.spec.whatwg.org/multipage/#dom-img-src
- make_setter!(SetSrc, "src");
+ make_url_setter!(SetSrc, "src");
// https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin
fn GetCrossOrigin(&self) -> Option<DOMString> {
@@ -980,6 +981,7 @@ impl VirtualMethods for HTMLImageElement {
fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
match name {
+ &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
&local_name!("name") => AttrValue::from_atomic(value.into()),
&local_name!("width") | &local_name!("height") => AttrValue::from_dimension(value.into()),
&local_name!("hspace") | &local_name!("vspace") => AttrValue::from_u32(value.into(), 0),
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index ce76eb8ced5..7260ec7bc50 100755
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -452,7 +452,7 @@ impl HTMLInputElementMethods for HTMLInputElement {
make_setter!(SetPlaceholder, "placeholder");
// https://html.spec.whatwg.org/multipage/#dom-input-formaction
- make_url_or_base_getter!(FormAction, "formaction");
+ make_form_action_getter!(FormAction, "formaction");
// https://html.spec.whatwg.org/multipage/#dom-input-formaction
make_setter!(SetFormAction, "formaction");
@@ -1056,6 +1056,7 @@ impl VirtualMethods for HTMLInputElement {
fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
match name {
+ &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
&local_name!("accept") => AttrValue::from_comma_separated_tokenlist(value.into()),
&local_name!("name") => AttrValue::from_atomic(value.into()),
&local_name!("size") => AttrValue::from_limited_u32(value.into(), DEFAULT_INPUT_SIZE),
diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs
index 320b425331b..9bf1ba73991 100644
--- a/components/script/dom/htmllinkelement.rs
+++ b/components/script/dom/htmllinkelement.rs
@@ -208,6 +208,7 @@ impl VirtualMethods for HTMLLinkElement {
fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
match name {
+ &local_name!("href") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
&local_name!("rel") => AttrValue::from_serialized_tokenlist(value.into()),
_ => self.super_type().unwrap().parse_plain_attribute(name, value),
}
@@ -373,7 +374,7 @@ impl HTMLLinkElementMethods for HTMLLinkElement {
make_url_getter!(Href, "href");
// https://html.spec.whatwg.org/multipage/#dom-link-href
- make_setter!(SetHref, "href");
+ make_url_setter!(SetHref, "href");
// https://html.spec.whatwg.org/multipage/#dom-link-rel
make_getter!(Rel, "rel");
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 739025544e7..965dd83cee4 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -46,6 +46,7 @@ use std::collections::VecDeque;
use std::mem;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
+use style::attr::AttrValue;
use task_source::TaskSource;
use time::{self, Timespec, Duration};
@@ -837,8 +838,9 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
// https://html.spec.whatwg.org/multipage/#dom-media-src
make_url_getter!(Src, "src");
+
// https://html.spec.whatwg.org/multipage/#dom-media-src
- make_setter!(SetSrc, "src");
+ make_url_setter!(SetSrc, "src");
// https://html.spec.whatwg.org/multipage/#dom-media-srcobject
fn GetSrcObject(&self) -> Option<DomRoot<Blob>> {
@@ -913,6 +915,13 @@ impl VirtualMethods for HTMLMediaElement {
Some(self.upcast::<HTMLElement>() as &VirtualMethods)
}
+ fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
+ match name {
+ &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
+ _ => self.super_type().unwrap().parse_plain_attribute(name, value),
+ }
+ }
+
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
self.super_type().unwrap().attribute_mutated(attr, mutation);
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index 7cdebdbcba4..5ad655ce659 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -42,6 +42,7 @@ use std::io::{Read, Write};
use std::path::PathBuf;
use std::process::{Command, Stdio};
use std::sync::{Arc, Mutex};
+use style::attr::AttrValue;
use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec};
use uuid::Uuid;
@@ -653,6 +654,13 @@ impl VirtualMethods for HTMLScriptElement {
Some(self.upcast::<HTMLElement>() as &VirtualMethods)
}
+ fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
+ match name {
+ &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
+ _ => self.super_type().unwrap().parse_plain_attribute(name, value),
+ }
+ }
+
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
self.super_type().unwrap().attribute_mutated(attr, mutation);
match *attr.local_name() {
@@ -702,8 +710,9 @@ impl VirtualMethods for HTMLScriptElement {
impl HTMLScriptElementMethods for HTMLScriptElement {
// https://html.spec.whatwg.org/multipage/#dom-script-src
make_url_getter!(Src, "src");
+
// https://html.spec.whatwg.org/multipage/#dom-script-src
- make_setter!(SetSrc, "src");
+ make_url_setter!(SetSrc, "src");
// https://html.spec.whatwg.org/multipage/#dom-script-type
make_getter!(Type, "type");
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index 9029a2b694a..89d545d80f2 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -106,38 +106,22 @@ macro_rules! make_url_getter(
);
#[macro_export]
-macro_rules! make_url_or_base_getter(
+macro_rules! make_form_action_getter(
( $attr:ident, $htmlname:tt ) => (
fn $attr(&self) -> DOMString {
use dom::bindings::inheritance::Castable;
use dom::element::Element;
let element = self.upcast::<Element>();
- let url = element.get_url_attribute(&local_name!($htmlname));
- if url.is_empty() {
- let window = window_from_node(self);
- DOMString::from(window.get_url().into_string())
- } else {
- url
- }
- }
- );
-);
-
-#[macro_export]
-macro_rules! make_string_or_document_url_getter(
- ( $attr:ident, $htmlname:tt ) => (
- fn $attr(&self) -> DOMString {
- use dom::bindings::inheritance::Castable;
- use dom::element::Element;
- use dom::node::document_from_node;
- let element = self.upcast::<Element>();
- let val = element.get_string_attribute(&local_name!($htmlname));
-
- if val.is_empty() {
- let doc = document_from_node(self);
- DOMString::from(doc.url().into_string())
- } else {
- val
+ let doc = ::dom::node::document_from_node(self);
+ let attr = element.get_attribute(&ns!(), &local_name!($htmlname));
+ let value = attr.as_ref().map(|attr| attr.value());
+ let value = match value {
+ Some(ref value) if !value.is_empty() => &***value,
+ _ => return doc.url().into_string().into(),
+ };
+ match doc.base_url().join(value) {
+ Ok(parsed) => parsed.into_string().into(),
+ Err(_) => value.to_owned().into(),
}
}
);
@@ -194,11 +178,8 @@ macro_rules! make_url_setter(
fn $attr(&self, value: DOMString) {
use dom::bindings::inheritance::Castable;
use dom::element::Element;
- use dom::node::document_from_node;
- let value = AttrValue::from_url(document_from_node(self).url(),
- value.into());
let element = self.upcast::<Element>();
- element.set_attribute(&local_name!($htmlname), value);
+ element.set_url_attribute(&local_name!($htmlname), value);
}
);
);