mirror of
https://github.com/servo/servo.git
synced 2025-06-08 08:33:26 +00:00
The URL spec recently changed and the variour "mixins" interfaces are gone, this commit updates our code and WPT accordingly. The new expected failures related to HTMLAnchorElement and HTMLAreaElement's attributes are due to their moving to the HTMLHyperLinkElementUtils interface, which is not anymore in a separate <script class=untested> element.
136 lines
4.3 KiB
Rust
136 lines
4.3 KiB
Rust
/* 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::str::USVString;
|
|
use std::borrow::ToOwned;
|
|
use std::fmt::Write;
|
|
use url::urlutils::{UrlUtils, UrlUtilsWrapper};
|
|
use url::{SchemeData, Url, UrlParser};
|
|
|
|
#[derive(HeapSizeOf)]
|
|
pub struct UrlHelper;
|
|
|
|
impl UrlHelper {
|
|
pub fn Hash(url: &Url) -> USVString {
|
|
USVString(match url.fragment {
|
|
None => "".to_owned(),
|
|
Some(ref hash) if hash.is_empty() => "".to_owned(),
|
|
Some(ref hash) => format!("#{}", hash)
|
|
})
|
|
}
|
|
|
|
pub fn SetHash(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_fragment(&value.0);
|
|
}
|
|
|
|
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
|
|
},
|
|
})
|
|
}
|
|
|
|
pub fn SetHost(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_host(&value.0);
|
|
}
|
|
|
|
pub fn Hostname(url: &Url) -> USVString {
|
|
USVString(url.serialize_host().unwrap_or_else(|| "".to_owned()))
|
|
}
|
|
|
|
pub fn SetHostname(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_host_and_port(&value.0);
|
|
}
|
|
|
|
pub fn Href(url: &Url) -> USVString {
|
|
USVString(url.serialize())
|
|
}
|
|
|
|
pub fn Password(url: &Url) -> USVString {
|
|
USVString(url.password().unwrap_or("").to_owned())
|
|
}
|
|
|
|
pub fn SetPassword(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_password(&value.0);
|
|
}
|
|
|
|
pub fn Pathname(url: &Url) -> USVString {
|
|
USVString(match url.scheme_data {
|
|
SchemeData::NonRelative(ref scheme_data) => scheme_data.clone(),
|
|
SchemeData::Relative(..) => url.serialize_path().unwrap()
|
|
})
|
|
}
|
|
|
|
pub fn SetPathname(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_path(&value.0);
|
|
}
|
|
|
|
pub fn Port(url: &Url) -> USVString {
|
|
USVString(match url.port() {
|
|
None => "".to_owned(),
|
|
Some(port) => port.to_string(),
|
|
})
|
|
}
|
|
|
|
pub fn SetPort(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_port(&value.0);
|
|
}
|
|
|
|
pub fn Protocol(url: &Url) -> USVString {
|
|
USVString(format!("{}:", url.scheme.clone()))
|
|
}
|
|
|
|
pub fn SetProtocol(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_scheme(&value.0);
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/#same-origin
|
|
pub fn SameOrigin(urlA: &Url, urlB: &Url) -> bool {
|
|
if urlA.host() != urlB.host() {
|
|
return false
|
|
}
|
|
if urlA.scheme != urlB.scheme {
|
|
return false
|
|
}
|
|
if urlA.port() != urlB.port() {
|
|
return false
|
|
}
|
|
true
|
|
}
|
|
|
|
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)
|
|
})
|
|
}
|
|
|
|
pub fn SetSearch(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_query(&value.0);
|
|
}
|
|
|
|
pub fn Username(url: &Url) -> USVString {
|
|
USVString(url.username().unwrap_or("").to_owned())
|
|
}
|
|
|
|
pub fn SetUsername(url: &mut Url, value: USVString) {
|
|
let mut wrapper = UrlUtilsWrapper { url: url, parser: &UrlParser::new() };
|
|
let _ = wrapper.set_username(&value.0);
|
|
}
|
|
}
|