aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/location.rs36
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/url.rs150
-rw-r--r--components/script/dom/urlhelper.rs71
-rw-r--r--components/script/dom/webidls/URL.webidl12
-rw-r--r--components/script/dom/webidls/URLUtils.webidl6
-rw-r--r--components/script/dom/webidls/URLUtilsReadOnly.webidl14
-rw-r--r--components/script/dom/workerlocation.rs38
8 files changed, 304 insertions, 24 deletions
diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs
index 3bde73d6f73..1d9f291c057 100644
--- a/components/script/dom/location.rs
+++ b/components/script/dom/location.rs
@@ -42,16 +42,46 @@ impl<'a> LocationMethods for &'a Location {
self.window.root().r().load_url(url);
}
+ // https://url.spec.whatwg.org/#dom-urlutils-hash
+ fn Hash(self) -> USVString {
+ UrlHelper::Hash(&self.get_url())
+ }
+
// https://url.spec.whatwg.org/#dom-urlutils-href
fn Href(self) -> USVString {
UrlHelper::Href(&self.get_url())
}
+ // https://url.spec.whatwg.org/#dom-urlutils-host
+ fn Host(self) -> USVString {
+ UrlHelper::Host(&self.get_url())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-hostname
+ fn Hostname(self) -> USVString {
+ UrlHelper::Hostname(&self.get_url())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-password
+ fn Password(self) -> USVString {
+ UrlHelper::Password(&self.get_url())
+ }
+
// https://url.spec.whatwg.org/#dom-urlutils-pathname
fn Pathname(self) -> USVString {
UrlHelper::Pathname(&self.get_url())
}
+ // https://url.spec.whatwg.org/#dom-urlutils-port
+ fn Port(self) -> USVString {
+ UrlHelper::Port(&self.get_url())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-protocol
+ fn Protocol(self) -> USVString {
+ UrlHelper::Protocol(&self.get_url())
+ }
+
// https://url.spec.whatwg.org/#URLUtils-stringification-behavior
fn Stringifier(self) -> DOMString {
self.Href().0
@@ -62,9 +92,9 @@ impl<'a> LocationMethods for &'a Location {
UrlHelper::Search(&self.get_url())
}
- // https://url.spec.whatwg.org/#dom-urlutils-hash
- fn Hash(self) -> USVString {
- UrlHelper::Hash(&self.get_url())
+ // https://url.spec.whatwg.org/#dom-urlutils-username
+ fn Username(self) -> USVString {
+ UrlHelper::Username(&self.get_url())
}
}
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 8aef70f6368..466aced53d7 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -308,6 +308,7 @@ pub mod textdecoder;
pub mod textencoder;
pub mod treewalker;
pub mod uievent;
+pub mod url;
pub mod urlhelper;
pub mod urlsearchparams;
pub mod userscripts;
diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs
new file mode 100644
index 00000000000..8b94b88b26b
--- /dev/null
+++ b/components/script/dom/url.rs
@@ -0,0 +1,150 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::codegen::Bindings::URLBinding::{self, URLMethods};
+use dom::bindings::error::{Error, Fallible};
+use dom::bindings::global::GlobalRef;
+use dom::bindings::js::Root;
+use dom::bindings::utils::{Reflector, reflect_dom_object};
+use dom::bindings::str::USVString;
+use dom::urlhelper::UrlHelper;
+
+use url::{Host, Url, UrlParser};
+use util::str::DOMString;
+
+use std::borrow::ToOwned;
+
+// https://url.spec.whatwg.org/#url
+#[dom_struct]
+pub struct URL {
+ reflector_: Reflector,
+
+ // https://url.spec.whatwg.org/#concept-urlutils-url
+ url: Url,
+}
+
+impl URL {
+ fn new_inherited(url: Url) -> URL {
+ URL {
+ reflector_: Reflector::new(),
+ url: url,
+ }
+ }
+
+ pub fn new(global: GlobalRef, url: Url) -> Root<URL> {
+ reflect_dom_object(box URL::new_inherited(url),
+ global, URLBinding::Wrap)
+ }
+}
+
+impl URL {
+ // https://url.spec.whatwg.org/#constructors
+ pub fn Constructor(global: GlobalRef, url: USVString,
+ base: Option<USVString>)
+ -> Fallible<Root<URL>> {
+ let parsed_base = match base {
+ None => {
+ // Step 1.
+ None
+ },
+ Some(base) =>
+ // Step 2.1.
+ match Url::parse(&base.0) {
+ Ok(base) => Some(base),
+ Err(error) => {
+ // Step 2.2.
+ return Err(Error::Type(format!("could not parse base: {}", error)));
+ }
+ }
+ };
+ // Step 3.
+ let parsed_url = match parser_with_base(parsed_base.as_ref()).parse(&url.0) {
+ Ok(url) => url,
+ Err(error) => {
+ // Step 4.
+ return Err(Error::Type(format!("could not parse URL: {}", error)));
+ }
+ };
+ // Steps 5-8.
+ Ok(URL::new(global, parsed_url))
+ }
+
+ // https://url.spec.whatwg.org/#dom-url-domaintoasciidomain
+ pub fn DomainToASCII(_: GlobalRef, origin: USVString) -> USVString {
+ // Step 1.
+ let ascii_domain = Host::parse(&origin.0);
+ if let Ok(Host::Domain(string)) = ascii_domain {
+ // Step 3.
+ USVString(string.to_owned())
+ } else {
+ // Step 2.
+ USVString("".to_owned())
+ }
+ }
+}
+
+impl<'a> URLMethods for &'a URL {
+ // https://url.spec.whatwg.org/#dom-urlutils-hash
+ fn Hash(self) -> USVString {
+ UrlHelper::Hash(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-host
+ fn Host(self) -> USVString {
+ UrlHelper::Host(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-hostname
+ fn Hostname(self) -> USVString {
+ UrlHelper::Hostname(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-href
+ fn Href(self) -> USVString {
+ UrlHelper::Href(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-password
+ fn Password(self) -> USVString {
+ UrlHelper::Password(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-pathname
+ fn Pathname(self) -> USVString {
+ UrlHelper::Pathname(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-port
+ fn Port(self) -> USVString {
+ UrlHelper::Port(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-protocol
+ fn Protocol(self) -> USVString {
+ UrlHelper::Protocol(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-search
+ fn Search(self) -> USVString {
+ UrlHelper::Search(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#URLUtils-stringification-behavior
+ fn Stringifier(self) -> DOMString {
+ self.Href().0
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-username
+ fn Username(self) -> USVString {
+ UrlHelper::Username(&self.url)
+ }
+}
+
+fn parser_with_base<'a>(base: Option<&'a Url>) -> UrlParser<'a> {
+ let mut parser = UrlParser::new();
+ if let Some(base) = base {
+ parser.base_url(base);
+ }
+ parser
+}
diff --git a/components/script/dom/urlhelper.rs b/components/script/dom/urlhelper.rs
index d1930734f5c..4b2f2010fbf 100644
--- a/components/script/dom/urlhelper.rs
+++ b/components/script/dom/urlhelper.rs
@@ -7,24 +7,11 @@ use dom::bindings::str::USVString;
use url::{Url, SchemeData};
use std::borrow::ToOwned;
+use std::fmt::Write;
pub struct UrlHelper;
impl UrlHelper {
- // https://url.spec.whatwg.org/#dom-urlutils-href
- pub fn Href(url: &Url) -> USVString {
- USVString(url.serialize())
- }
-
- // https://url.spec.whatwg.org/#dom-urlutils-search
- pub fn Search(url: &Url) -> USVString {
- USVString(match url.query {
- None => "".to_owned(),
- Some(ref query) if query.is_empty() => "".to_owned(),
- Some(ref query) => format!("?{}", query)
- })
- }
-
// https://url.spec.whatwg.org/#dom-urlutils-hash
pub fn Hash(url: &Url) -> USVString {
USVString(match url.fragment {
@@ -34,6 +21,35 @@ impl UrlHelper {
})
}
+ // https://url.spec.whatwg.org/#dom-urlutils-host
+ pub fn Host(url: &Url) -> USVString {
+ USVString(match url.scheme_data {
+ SchemeData::NonRelative(..) => "".to_owned(),
+ SchemeData::Relative(ref scheme_data) => {
+ let mut host = scheme_data.host.serialize();
+ if let Some(port) = scheme_data.port {
+ write!(host, ":{}", port).unwrap();
+ }
+ host
+ },
+ })
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-hostname
+ pub fn Hostname(url: &Url) -> USVString {
+ USVString(url.serialize_host().unwrap_or_else(|| "".to_owned()))
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-href
+ pub fn Href(url: &Url) -> USVString {
+ USVString(url.serialize())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-password
+ pub fn Password(url: &Url) -> USVString {
+ USVString(url.password().unwrap_or("").to_owned())
+ }
+
// https://url.spec.whatwg.org/#dom-urlutils-pathname
pub fn Pathname(url: &Url) -> USVString {
// FIXME: Url null check is skipped for now
@@ -43,6 +59,19 @@ impl UrlHelper {
})
}
+ // https://url.spec.whatwg.org/#dom-urlutils-port
+ pub fn Port(url: &Url) -> USVString {
+ USVString(match url.port() {
+ None => "".to_owned(),
+ Some(port) => port.to_string(),
+ })
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-protocol
+ pub fn Protocol(url: &Url) -> USVString {
+ USVString(format!("{}:", url.scheme.clone()))
+ }
+
// https://html.spec.whatwg.org/multipage/#same-origin
pub fn SameOrigin(urlA: &Url, urlB: &Url) -> bool {
if urlA.host() != urlB.host() {
@@ -56,4 +85,18 @@ impl UrlHelper {
}
return true
}
+
+ // https://url.spec.whatwg.org/#dom-urlutils-search
+ pub fn Search(url: &Url) -> USVString {
+ USVString(match url.query {
+ None => "".to_owned(),
+ Some(ref query) if query.is_empty() => "".to_owned(),
+ Some(ref query) => format!("?{}", query)
+ })
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-username
+ pub fn Username(url: &Url) -> USVString {
+ USVString(url.username().unwrap_or("").to_owned())
+ }
}
diff --git a/components/script/dom/webidls/URL.webidl b/components/script/dom/webidls/URL.webidl
new file mode 100644
index 00000000000..b0d92b565be
--- /dev/null
+++ b/components/script/dom/webidls/URL.webidl
@@ -0,0 +1,12 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// https://url.spec.whatwg.org/#url
+[Constructor(USVString url, optional USVString base)/*,
+ Exposed=(Window,Worker)*/]
+interface URL {
+ static USVString domainToASCII(USVString domain);
+ // static USVString domainToUnicode(USVString domain);
+};
+URL implements URLUtils;
diff --git a/components/script/dom/webidls/URLUtils.webidl b/components/script/dom/webidls/URLUtils.webidl
index be3174afb62..86e5140311b 100644
--- a/components/script/dom/webidls/URLUtils.webidl
+++ b/components/script/dom/webidls/URLUtils.webidl
@@ -10,11 +10,17 @@ interface URLUtils {
readonly attribute USVString href;
//readonly attribute USVString origin;
// attribute USVString protocol;
+ readonly attribute USVString protocol;
// attribute USVString username;
+ readonly attribute USVString username;
// attribute USVString password;
+ readonly attribute USVString password;
// attribute USVString host;
+ readonly attribute USVString host;
// attribute USVString hostname;
+ readonly attribute USVString hostname;
// attribute USVString port;
+ readonly attribute USVString port;
// attribute USVString pathname;
readonly attribute USVString pathname;
// attribute USVString search;
diff --git a/components/script/dom/webidls/URLUtilsReadOnly.webidl b/components/script/dom/webidls/URLUtilsReadOnly.webidl
index 0e07a221cd6..851db50c3fd 100644
--- a/components/script/dom/webidls/URLUtilsReadOnly.webidl
+++ b/components/script/dom/webidls/URLUtilsReadOnly.webidl
@@ -11,11 +11,15 @@ interface URLUtilsReadOnly {
readonly attribute USVString href;
//readonly attribute USVString origin;
- //readonly attribute USVString protocol;
- //readonly attribute USVString host;
- //readonly attribute USVString hostname;
- //readonly attribute USVString port;
- //readonly attribute USVString pathname;
+ readonly attribute USVString protocol;
+ readonly attribute USVString host;
+ readonly attribute USVString hostname;
+ readonly attribute USVString port;
+ readonly attribute USVString pathname;
readonly attribute USVString search;
readonly attribute USVString hash;
+
+ // This is only doing as well as gecko right now, bug 824857 is on file for
+ // adding attribute stringifier support.
+ stringifier;
};
diff --git a/components/script/dom/workerlocation.rs b/components/script/dom/workerlocation.rs
index ec56ad79015..b125b778822 100644
--- a/components/script/dom/workerlocation.rs
+++ b/components/script/dom/workerlocation.rs
@@ -12,6 +12,7 @@ use dom::urlhelper::UrlHelper;
use dom::workerglobalscope::WorkerGlobalScope;
use url::Url;
+use util::str::DOMString;
// https://html.spec.whatwg.org/multipage/#worker-locations
#[dom_struct]
@@ -36,16 +37,49 @@ impl WorkerLocation {
}
impl<'a> WorkerLocationMethods for &'a WorkerLocation {
+ // https://url.spec.whatwg.org/#dom-urlutils-hash
+ fn Hash(self) -> USVString {
+ UrlHelper::Hash(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-host
+ fn Host(self) -> USVString {
+ UrlHelper::Host(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-hostname
+ fn Hostname(self) -> USVString {
+ UrlHelper::Hostname(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-href
fn Href(self) -> USVString {
UrlHelper::Href(&self.url)
}
+ // https://url.spec.whatwg.org/#dom-urlutils-pathname
+ fn Pathname(self) -> USVString {
+ UrlHelper::Pathname(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-port
+ fn Port(self) -> USVString {
+ UrlHelper::Port(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-protocol
+ fn Protocol(self) -> USVString {
+ UrlHelper::Protocol(&self.url)
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-search
fn Search(self) -> USVString {
UrlHelper::Search(&self.url)
}
- fn Hash(self) -> USVString {
- UrlHelper::Hash(&self.url)
+ // https://url.spec.whatwg.org/#URLUtils-stringification-behavior
+ fn Stringifier(self) -> DOMString {
+ self.Href().0
}
}