Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement setters in URLUtils #7228

Merged
merged 1 commit into from Aug 30, 2015
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -4,6 +4,7 @@

use dom::bindings::codegen::Bindings::LocationBinding;
use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
use dom::bindings::error::ErrorResult;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, Root};
use dom::bindings::str::USVString;
@@ -33,6 +34,18 @@ impl Location {
GlobalRef::Window(window),
LocationBinding::Wrap)
}

fn get_url(&self) -> Url {
self.window.root().get_url()
}

fn set_url_component(&self, value: USVString,
setter: fn(&mut Url, USVString)) {
let window = self.window.root();
let mut url = window.get_url();
setter(&mut url, value);
window.load_url(url);
}
}

impl LocationMethods for Location {
@@ -52,41 +65,85 @@ impl LocationMethods for Location {
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-hash
fn SetHash(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetHash);
}

// https://url.spec.whatwg.org/#dom-urlutils-host
fn Host(&self) -> USVString {
UrlHelper::Host(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-host
fn SetHost(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetHost);
}

// https://url.spec.whatwg.org/#dom-urlutils-hostname
fn Hostname(&self) -> USVString {
UrlHelper::Hostname(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-hostname
fn SetHostname(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetHostname);
}

// https://url.spec.whatwg.org/#dom-urlutils-href
fn Href(&self) -> USVString {
UrlHelper::Href(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-href
fn SetHref(&self, value: USVString) -> ErrorResult {
let window = self.window.root();
if let Ok(url) = UrlParser::new().base_url(&window.get_url()).parse(&value.0) {
window.load_url(url);
};
Ok(())
}

// https://url.spec.whatwg.org/#dom-urlutils-password
fn Password(&self) -> USVString {
UrlHelper::Password(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-password
fn SetPassword(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetPassword);
}

// https://url.spec.whatwg.org/#dom-urlutils-pathname
fn Pathname(&self) -> USVString {
UrlHelper::Pathname(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-pathname
fn SetPathname(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetPathname);
}

// https://url.spec.whatwg.org/#dom-urlutils-port
fn Port(&self) -> USVString {
UrlHelper::Port(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-port
fn SetPort(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetPort);
}

// https://url.spec.whatwg.org/#dom-urlutils-protocol
fn Protocol(&self) -> USVString {
UrlHelper::Protocol(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-protocol
fn SetProtocol(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetProtocol);
}

// https://url.spec.whatwg.org/#URLUtils-stringification-behavior
fn Stringifier(&self) -> DOMString {
self.Href().0
@@ -97,16 +154,18 @@ impl LocationMethods for Location {
UrlHelper::Search(&self.get_url())
}

// https://url.spec.whatwg.org/#dom-urlutils-search
fn SetSearch(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetSearch);
}

// https://url.spec.whatwg.org/#dom-urlutils-username
fn Username(&self) -> USVString {
UrlHelper::Username(&self.get_url())
}
}


impl Location {
fn get_url(&self) -> Url {
let window = self.window.root();
window.r().get_url()
// https://url.spec.whatwg.org/#dom-urlutils-username
fn SetUsername(&self, value: USVString) {
self.set_url_component(value, UrlHelper::SetUsername);
}
}
@@ -3,37 +3,42 @@
* 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]
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,15 +64,15 @@ 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.
return Err(Error::Type(format!("could not parse URL: {}", error)));
}
};
// 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)
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.