aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/url.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/url.rs')
-rw-r--r--components/script/dom/url.rs105
1 files changed, 84 insertions, 21 deletions
diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs
index ec44fe2fdf9..f34428d4bbb 100644
--- a/components/script/dom/url.rs
+++ b/components/script/dom/url.rs
@@ -3,17 +3,18 @@
* 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::error::{Error, ErrorResult, Fallible};
use dom::bindings::global::GlobalRef;
use dom::bindings::js::Root;
use dom::bindings::str::USVString;
use dom::bindings::utils::{Reflector, reflect_dom_object};
use dom::urlhelper::UrlHelper;
-use url::{Host, Url, UrlParser};
+use url::{Host, ParseResult, Url, UrlParser};
use util::str::DOMString;
use std::borrow::ToOwned;
+use std::cell::RefCell;
// https://url.spec.whatwg.org/#url
#[dom_struct]
@@ -21,19 +22,23 @@ pub struct URL {
reflector_: Reflector,
// https://url.spec.whatwg.org/#concept-urlutils-url
- url: Url,
+ url: RefCell<Url>,
+
+ // https://url.spec.whatwg.org/#concept-urlutils-get-the-base
+ base: Option<Url>,
}
impl URL {
- fn new_inherited(url: Url) -> URL {
+ fn new_inherited(url: Url, base: Option<Url>) -> URL {
URL {
reflector_: Reflector::new(),
- url: url,
+ url: RefCell::new(url),
+ base: base,
}
}
- pub fn new(global: GlobalRef, url: Url) -> Root<URL> {
- reflect_dom_object(box URL::new_inherited(url),
+ pub fn new(global: GlobalRef, url: Url, base: Option<Url>) -> Root<URL> {
+ reflect_dom_object(box URL::new_inherited(url, base),
global, URLBinding::Wrap)
}
}
@@ -59,7 +64,7 @@ impl URL {
}
};
// Step 3.
- let parsed_url = match parser_with_base(parsed_base.as_ref()).parse(&url.0) {
+ let parsed_url = match parse_with_base(url, parsed_base.as_ref()) {
Ok(url) => url,
Err(error) => {
// Step 4.
@@ -67,7 +72,7 @@ impl URL {
}
};
// Steps 5-8.
- Ok(URL::new(global, parsed_url))
+ Ok(URL::new(global, parsed_url, parsed_base))
}
// https://url.spec.whatwg.org/#dom-url-domaintoasciidomain
@@ -87,47 +92,100 @@ impl URL {
impl URLMethods for URL {
// https://url.spec.whatwg.org/#dom-urlutils-hash
fn Hash(&self) -> USVString {
- UrlHelper::Hash(&self.url)
+ UrlHelper::Hash(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-hash
+ fn SetHash(&self, value: USVString) {
+ UrlHelper::SetHash(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-host
fn Host(&self) -> USVString {
- UrlHelper::Host(&self.url)
+ UrlHelper::Host(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-host
+ fn SetHost(&self, value: USVString) {
+ UrlHelper::SetHost(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-hostname
fn Hostname(&self) -> USVString {
- UrlHelper::Hostname(&self.url)
+ UrlHelper::Hostname(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-hostname
+ fn SetHostname(&self, value: USVString) {
+ UrlHelper::SetHostname(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-href
fn Href(&self) -> USVString {
- UrlHelper::Href(&self.url)
+ UrlHelper::Href(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-href
+ fn SetHref(&self, value: USVString) -> ErrorResult {
+ match parse_with_base(value, self.base.as_ref()) {
+ Ok(url) => {
+ *self.url.borrow_mut() = url;
+ Ok(())
+ },
+ Err(error) => {
+ Err(Error::Type(format!("could not parse URL: {}", error)))
+ },
+ }
}
// https://url.spec.whatwg.org/#dom-urlutils-password
fn Password(&self) -> USVString {
- UrlHelper::Password(&self.url)
+ UrlHelper::Password(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-password
+ fn SetPassword(&self, value: USVString) {
+ UrlHelper::SetPassword(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-pathname
fn Pathname(&self) -> USVString {
- UrlHelper::Pathname(&self.url)
+ UrlHelper::Pathname(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-pathname
+ fn SetPathname(&self, value: USVString) {
+ UrlHelper::SetPathname(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-port
fn Port(&self) -> USVString {
- UrlHelper::Port(&self.url)
+ UrlHelper::Port(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-port
+ fn SetPort(&self, value: USVString) {
+ UrlHelper::SetPort(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-protocol
fn Protocol(&self) -> USVString {
- UrlHelper::Protocol(&self.url)
+ UrlHelper::Protocol(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-protocol
+ fn SetProtocol(&self, value: USVString) {
+ UrlHelper::SetProtocol(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#dom-urlutils-search
fn Search(&self) -> USVString {
- UrlHelper::Search(&self.url)
+ UrlHelper::Search(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-search
+ fn SetSearch(&self, value: USVString) {
+ UrlHelper::SetSearch(&mut self.url.borrow_mut(), value);
}
// https://url.spec.whatwg.org/#URLUtils-stringification-behavior
@@ -137,14 +195,19 @@ impl URLMethods for URL {
// https://url.spec.whatwg.org/#dom-urlutils-username
fn Username(&self) -> USVString {
- UrlHelper::Username(&self.url)
+ UrlHelper::Username(&self.url.borrow())
+ }
+
+ // https://url.spec.whatwg.org/#dom-urlutils-username
+ fn SetUsername(&self, value: USVString) {
+ UrlHelper::SetUsername(&mut self.url.borrow_mut(), value);
}
}
-fn parser_with_base(base: Option<&Url>) -> UrlParser {
+fn parse_with_base(input: USVString, base: Option<&Url>) -> ParseResult<Url> {
let mut parser = UrlParser::new();
if let Some(base) = base {
parser.base_url(base);
}
- parser
+ parser.parse(&input.0)
}