diff options
Diffstat (limited to 'components/script/dom/urlhelper.rs')
-rw-r--r-- | components/script/dom/urlhelper.rs | 71 |
1 files changed, 57 insertions, 14 deletions
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()) + } } |