aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/blob.rs41
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs2
-rw-r--r--components/script/dom/document.rs10
-rw-r--r--components/script/dom/element.rs2
-rw-r--r--components/script/dom/eventsource.rs2
-rw-r--r--components/script/dom/eventtarget.rs2
-rw-r--r--components/script/dom/htmlanchorelement.rs31
-rw-r--r--components/script/dom/htmlbaseelement.rs4
-rw-r--r--components/script/dom/htmlformelement.rs14
-rw-r--r--components/script/dom/htmlimageelement.rs2
-rw-r--r--components/script/dom/htmlscriptelement.rs2
-rw-r--r--components/script/dom/macros.rs2
-rw-r--r--components/script/dom/servohtmlparser.rs5
-rw-r--r--components/script/dom/storage.rs6
-rw-r--r--components/script/dom/url.rs30
-rw-r--r--components/script/dom/urlhelper.rs179
-rw-r--r--components/script/dom/urlsearchparams.rs52
-rw-r--r--components/script/dom/webglrenderingcontext.rs90
-rw-r--r--components/script/dom/webidls/Blob.webidl3
-rw-r--r--components/script/dom/webidls/WebGLRenderingContext.webidl12
-rw-r--r--components/script/dom/websocket.rs4
-rw-r--r--components/script/dom/workerglobalscope.rs4
-rw-r--r--components/script/dom/xmlhttprequest.rs38
23 files changed, 235 insertions, 302 deletions
diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs
index de7a7b8c35a..49fc47e8a68 100644
--- a/components/script/dom/blob.rs
+++ b/components/script/dom/blob.rs
@@ -117,29 +117,28 @@ impl Blob {
}
// https://w3c.github.io/FileAPI/#constructorBlob
- pub fn Constructor(global: GlobalRef) -> Fallible<Root<Blob>> {
- Ok(Blob::new(global, Vec::new(), ""))
- }
-
- // https://w3c.github.io/FileAPI/#constructorBlob
- pub fn Constructor_(global: GlobalRef,
- blobParts: Vec<BlobOrString>,
- blobPropertyBag: &BlobBinding::BlobPropertyBag)
- -> Fallible<Root<Blob>> {
+ pub fn Constructor(global: GlobalRef,
+ blobParts: Option<Vec<BlobOrString>>,
+ blobPropertyBag: &BlobBinding::BlobPropertyBag)
+ -> Fallible<Root<Blob>> {
// TODO: accept other blobParts types - ArrayBuffer or ArrayBufferView
- let bytes: Vec<u8> = blobParts.iter()
- .flat_map(|bPart| {
- match bPart {
- &BlobOrString::String(ref s) => {
- UTF_8.encode(s, EncoderTrap::Replace).unwrap()
- },
- &BlobOrString::Blob(ref b) => {
- b.get_data().get_bytes().to_vec()
- },
- }
- })
- .collect();
+ let bytes: Vec<u8> = match blobParts {
+ None => Vec::new(),
+ Some(blobs) => {
+ blobs.iter().flat_map(|bPart| {
+ match bPart {
+ &BlobOrString::String(ref s) => {
+ UTF_8.encode(s, EncoderTrap::Replace).unwrap()
+ },
+ &BlobOrString::Blob(ref b) => {
+ b.get_data().get_bytes().to_vec()
+ },
+ }
+ })
+ .collect()
+ }
+ };
let typeString = if is_ascii_printable(&blobPropertyBag.type_) {
&*blobPropertyBag.type_
} else {
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index 56426f883db..bd8d1bdfd2d 100644
--- a/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/components/script/dom/dedicatedworkerglobalscope.rs
@@ -218,7 +218,7 @@ impl DedicatedWorkerGlobalScope {
parent_sender: Box<ScriptChan + Send>,
own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>,
receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>) {
- let serialized_worker_url = worker_url.serialize();
+ let serialized_worker_url = worker_url.to_string();
spawn_named(format!("WebWorker for {}", serialized_worker_url), move || {
thread_state::initialize(SCRIPT | IN_WORKER);
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 2eb9bd8806c..02d640f1715 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -515,7 +515,7 @@ impl Document {
self.GetDocumentElement()
} else {
// Step 3 & 4
- String::from_utf8(percent_decode(fragid.as_bytes())).ok()
+ percent_decode(fragid.as_bytes()).decode_utf8().ok()
// Step 5
.and_then(|decoded_fragid| self.get_element_by_id(&Atom::from(decoded_fragid)))
// Step 6
@@ -1585,7 +1585,7 @@ impl LayoutDocumentHelpers for LayoutJS<Document> {
/// https://url.spec.whatwg.org/#network-scheme
fn url_has_network_scheme(url: &Url) -> bool {
- match &*url.scheme {
+ match url.scheme() {
"ftp" | "http" | "https" => true,
_ => false,
}
@@ -1844,7 +1844,7 @@ impl DocumentMethods for Document {
// https://dom.spec.whatwg.org/#dom-document-url
fn URL(&self) -> DOMString {
- DOMString::from(self.url().serialize())
+ DOMString::from(self.url().as_str())
}
// https://html.spec.whatwg.org/multipage/#dom-document-activeelement
@@ -1886,7 +1886,7 @@ impl DocumentMethods for Document {
if let Some(host) = self.origin.host() {
// Step 4.
- DOMString::from(host.serialize())
+ DOMString::from(host.to_string())
} else {
// Step 3.
DOMString::new()
@@ -2154,7 +2154,7 @@ impl DocumentMethods for Document {
Ok(Root::upcast(MouseEvent::new_uninitialized(&self.window))),
"customevent" =>
Ok(Root::upcast(CustomEvent::new_uninitialized(GlobalRef::Window(&self.window)))),
- "htmlevents" | "events" | "event" =>
+ "htmlevents" | "events" | "event" | "svgevents" =>
Ok(Event::new_uninitialized(GlobalRef::Window(&self.window))),
"keyboardevent" =>
Ok(Root::upcast(KeyboardEvent::new_uninitialized(&self.window))),
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index e363baefbbc..d5151dc7dfd 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -1113,7 +1113,7 @@ impl Element {
// https://html.spec.whatwg.org/multipage/#reflect
// XXXManishearth this doesn't handle `javascript:` urls properly
match base.join(&url) {
- Ok(parsed) => DOMString::from(parsed.serialize()),
+ Ok(parsed) => DOMString::from(parsed.into_string()),
Err(_) => DOMString::from(""),
}
}
diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs
index e340e888377..40103e30f76 100644
--- a/components/script/dom/eventsource.rs
+++ b/components/script/dom/eventsource.rs
@@ -82,7 +82,7 @@ impl EventSourceMethods for EventSource {
// https://html.spec.whatwg.org/multipage/#dom-eventsource-url
fn Url(&self) -> DOMString {
- DOMString::from(self.url.serialize())
+ DOMString::from(self.url.as_str())
}
// https://html.spec.whatwg.org/multipage/#dom-eventsource-withcredentials
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs
index 409fdbd436d..0b8325cf30d 100644
--- a/components/script/dom/eventtarget.rs
+++ b/components/script/dom/eventtarget.rs
@@ -397,7 +397,7 @@ impl EventTarget {
// Step 1.6
let window = document.window();
- let url_serialized = CString::new(handler.url.serialize()).unwrap();
+ let url_serialized = CString::new(handler.url.to_string()).unwrap();
let name = CString::new(&**ty).unwrap();
static mut ARG_NAMES: [*const c_char; 1] = [b"event\0" as *const u8 as *const c_char];
diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs
index c66617bfb3a..43ff211dfce 100644
--- a/components/script/dom/htmlanchorelement.rs
+++ b/components/script/dom/htmlanchorelement.rs
@@ -28,7 +28,7 @@ use dom::virtualmethods::VirtualMethods;
use num_traits::ToPrimitive;
use std::default::Default;
use string_cache::Atom;
-use url::{Url, UrlParser};
+use url::Url;
use util::str::DOMString;
#[dom_struct]
@@ -63,9 +63,7 @@ impl HTMLAnchorElement {
let attribute = self.upcast::<Element>().get_attribute(&ns!(), &atom!("href"));
*self.url.borrow_mut() = attribute.and_then(|attribute| {
let document = document_from_node(self);
- let mut parser = UrlParser::new();
- parser.base_url(document.url());
- parser.parse(&attribute.value()).ok()
+ document.url().join(&attribute.value()).ok()
});
}
@@ -74,8 +72,7 @@ impl HTMLAnchorElement {
// Step 1.
match *self.url.borrow() {
None => return,
- Some(ref url) if url.scheme == "blob" &&
- url.non_relative_scheme_data().is_some() => return,
+ Some(ref url) if url.scheme() == "blob" && url.cannot_be_a_base() => return,
_ => (),
}
@@ -86,7 +83,7 @@ impl HTMLAnchorElement {
// https://html.spec.whatwg.org/multipage/#update-href
fn update_href(&self) {
self.upcast::<Element>().set_string_attribute(&atom!("href"),
- self.url.borrow().as_ref().unwrap().serialize().into());
+ self.url.borrow().as_ref().unwrap().as_str().into());
}
}
@@ -167,7 +164,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
- if url.scheme == "javascript" { return; }
+ if url.scheme() == "javascript" { return; }
// Steps 4-5.
UrlHelper::SetHash(url, value);
// Step 6.
@@ -201,7 +198,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
- if url.non_relative_scheme_data().is_some() {
+ if url.cannot_be_a_base() {
return;
}
// Step 4.
@@ -233,7 +230,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
- if url.non_relative_scheme_data().is_some() {
+ if url.cannot_be_a_base() {
return;
}
// Step 4.
@@ -258,7 +255,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
},
// Step 5.
- Some(ref url) => url.serialize(),
+ Some(ref url) => url.as_str().to_owned(),
})
}
@@ -289,7 +286,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
- if url.host().is_none() || url.non_relative_scheme_data().is_some() {
+ if url.host().is_none() || url.cannot_be_a_base() {
return;
}
// Step 4.
@@ -319,7 +316,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
- if url.non_relative_scheme_data().is_some() { return; }
+ if url.cannot_be_a_base() { return; }
// Step 5.
UrlHelper::SetPathname(url, value);
// Step 6.
@@ -348,8 +345,8 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
if url.host().is_none() ||
- url.non_relative_scheme_data().is_some() ||
- url.scheme == "file" {
+ url.cannot_be_a_base() ||
+ url.scheme() == "file" {
return;
}
// Step 4.
@@ -435,7 +432,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
// Step 3.
if let Some(url) = self.url.borrow_mut().as_mut() {
- if url.host().is_none() || url.non_relative_scheme_data().is_some() {
+ if url.host().is_none() || url.cannot_be_a_base() {
return;
}
@@ -535,7 +532,7 @@ fn follow_hyperlink(subject: &Element, hyperlink_suffix: Option<String>) {
};
// Step 7.
- debug!("following hyperlink to {}", url.serialize());
+ debug!("following hyperlink to {}", url);
let window = document.window();
window.load_url(url);
}
diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs
index 241c209c7a8..7656520e283 100644
--- a/components/script/dom/htmlbaseelement.rs
+++ b/components/script/dom/htmlbaseelement.rs
@@ -68,7 +68,7 @@ impl HTMLBaseElementMethods for HTMLBaseElement {
// Step 1.
if !self.upcast::<Element>().has_attribute(&atom!("href")) {
- return DOMString::from(document.base_url().serialize());
+ return DOMString::from(document.base_url().as_str());
}
// Step 2.
@@ -81,7 +81,7 @@ impl HTMLBaseElementMethods for HTMLBaseElement {
let url_record = fallback_base_url.join(&*url);
// Step 5, 6.
- DOMString::from(url_record.ok().map_or("".to_owned(), |record| record.serialize()))
+ DOMString::from(url_record.as_ref().map(|url| url.as_str()).unwrap_or(""))
}
// https://html.spec.whatwg.org/multipage/#dom-base-href
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index a844cc3c1cb..0eb22c978ec 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -44,7 +44,7 @@ use std::cell::Cell;
use std::sync::mpsc::Sender;
use string_cache::Atom;
use task_source::dom_manipulation::DOMManipulationTask;
-use url::form_urlencoded::serialize;
+use url::form_urlencoded;
use util::str::DOMString;
#[derive(JSTraceable, PartialEq, Clone, Copy, HeapSizeOf)]
@@ -269,7 +269,7 @@ impl HTMLFormElement {
let mut action = submitter.action();
// Step 8
if action.is_empty() {
- action = DOMString::from(base.serialize());
+ action = DOMString::from(base.as_str());
}
// Step 9-11
let action_components = match base.join(&action) {
@@ -277,8 +277,7 @@ impl HTMLFormElement {
Err(_) => return
};
// Step 12-15
- let _action = action_components.serialize();
- let scheme = action_components.scheme.clone();
+ let scheme = action_components.scheme().to_owned();
let enctype = submitter.enctype();
let method = submitter.method();
let _target = submitter.target();
@@ -290,7 +289,9 @@ impl HTMLFormElement {
FormEncType::UrlEncoded => {
let mime: mime::Mime = "application/x-www-form-urlencoded".parse().unwrap();
load_data.headers.set(ContentType(mime));
- serialize(form_data.iter().map(|d| (&*d.name, &*d.value)))
+ form_urlencoded::Serializer::new(String::new())
+ .extend_pairs(form_data.into_iter().map(|field| (field.name, field.value)))
+ .finish()
}
_ => "".to_owned() // TODO: Add serializers for the other encoding types
};
@@ -302,7 +303,8 @@ impl HTMLFormElement {
(_, FormMethod::FormDialog) => return, // Unimplemented
// https://html.spec.whatwg.org/multipage/#submit-mutate-action
("http", FormMethod::FormGet) | ("https", FormMethod::FormGet) => {
- load_data.url.query = Some(parsed_data);
+ // FIXME(SimonSapin): use url.query_pairs_mut() here.
+ load_data.url.set_query(Some(&*parsed_data));
self.plan_to_navigate(load_data, &win);
}
// https://html.spec.whatwg.org/multipage/#submit-body
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index c0a9e960385..a02546afddc 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -316,7 +316,7 @@ impl HTMLImageElementMethods for HTMLImageElement {
fn CurrentSrc(&self) -> DOMString {
let ref url = self.current_request.borrow().url;
match *url {
- Some(ref url) => DOMString::from(url.serialize()),
+ Some(ref url) => DOMString::from(url.as_str()),
None => DOMString::from(""),
}
}
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index af9339571fb..76402db7a70 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -448,7 +448,7 @@ impl HTMLScriptElement {
let window = window_from_node(self);
let mut rval = RootedValue::new(window.get_cx(), UndefinedValue());
window.evaluate_script_on_global_with_result(&*source,
- &*url.serialize(),
+ url.as_str(),
rval.handle_mut());
// Step 2.b.7.
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index d3c157cf134..fa3fd87e004 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -99,7 +99,7 @@ macro_rules! make_url_or_base_getter(
let url = element.get_url_attribute(&atom!($htmlname));
if url.is_empty() {
let window = window_from_node(self);
- DOMString::from(window.get_url().serialize())
+ DOMString::from(window.get_url().into_string())
} else {
url
}
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs
index d1d179aa2a7..25fbff24d28 100644
--- a/components/script/dom/servohtmlparser.rs
+++ b/components/script/dom/servohtmlparser.rs
@@ -274,8 +274,7 @@ impl AsyncResponseListener for ParserContext {
match content_type {
Some(ContentType(Mime(TopLevel::Image, _, _))) => {
self.is_synthesized_document = true;
- let page = format!("<html><body><img src='{}' /></body></html>",
- self.url.serialize());
+ let page = format!("<html><body><img src='{}' /></body></html>", self.url);
parser.pending_input().borrow_mut().push(page);
parser.parse_sync();
},
@@ -336,7 +335,7 @@ impl AsyncResponseListener for ParserContext {
parser.r().document().finish_load(LoadType::PageSource(self.url.clone()));
if let Err(err) = status {
- debug!("Failed to load page URL {}, error: {:?}", self.url.serialize(), err);
+ debug!("Failed to load page URL {}, error: {:?}", self.url, err);
// TODO(Savago): we should send a notification to callers #5463.
}
diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs
index dae8d73e7a3..76e7c6a29f6 100644
--- a/components/script/dom/storage.rs
+++ b/components/script/dom/storage.rs
@@ -129,7 +129,11 @@ impl StorageMethods for Storage {
let (sender, receiver) = ipc::channel().unwrap();
self.get_storage_thread().send(StorageThreadMsg::Keys(sender, self.get_url(), self.storage_type)).unwrap();
- receiver.recv().unwrap().iter().cloned().map(DOMString::from).collect() // FIXME: inefficient?
+ receiver.recv()
+ .unwrap()
+ .into_iter()
+ .map(DOMString::from)
+ .collect()
}
// check-tidy: no specs after this line
diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs
index 6438e258543..f2ba7082e0f 100644
--- a/components/script/dom/url.rs
+++ b/components/script/dom/url.rs
@@ -13,7 +13,7 @@ use dom::urlhelper::UrlHelper;
use dom::urlsearchparams::URLSearchParams;
use std::borrow::ToOwned;
use std::default::Default;
-use url::{Host, Url, UrlParser};
+use url::{Host, Url};
use util::str::DOMString;
// https://url.spec.whatwg.org/#url
@@ -42,8 +42,13 @@ impl URL {
global, URLBinding::Wrap)
}
- pub fn set_query(&self, query: String) {
- self.url.borrow_mut().query = Some(query);
+ pub fn query_pairs(&self) -> Vec<(String, String)> {
+ self.url.borrow().query_pairs().into_owned().collect()
+ }
+
+ pub fn set_query_pairs(&self, pairs: &[(String, String)]) {
+ let mut url = self.url.borrow_mut();
+ url.query_pairs_mut().clear().extend_pairs(pairs);
}
}
@@ -68,17 +73,11 @@ impl URL {
}
};
// Step 3.
- let parsed_url = {
- let mut parser = UrlParser::new();
- if let Some(parsed_base) = parsed_base.as_ref() {
- parser.base_url(parsed_base);
- }
- match parser.parse(&url.0) {
- Ok(url) => url,
- Err(error) => {
- // Step 4.
- return Err(Error::Type(format!("could not parse URL: {}", error)));
- }
+ let parsed_url = match Url::options().base_url(parsed_base.as_ref()).parse(&url.0) {
+ Ok(url) => url,
+ Err(error) => {
+ // Step 4.
+ return Err(Error::Type(format!("could not parse URL: {}", error)));
}
};
// Step 5: Skip (see step 8 below).
@@ -145,6 +144,7 @@ impl URLMethods for URL {
match Url::parse(&value.0) {
Ok(url) => {
*self.url.borrow_mut() = url;
+ self.search_params.set(None); // To be re-initialized in the SearchParams getter.
Ok(())
},
Err(error) => {
@@ -207,7 +207,7 @@ impl URLMethods for URL {
fn SetSearch(&self, value: USVString) {
UrlHelper::SetSearch(&mut self.url.borrow_mut(), value);
if let Some(search_params) = self.search_params.get() {
- search_params.set_list(self.url.borrow().query_pairs().unwrap_or_else(|| vec![]));
+ search_params.set_list(self.url.borrow().query_pairs().into_owned().collect());
}
}
diff --git a/components/script/dom/urlhelper.rs b/components/script/dom/urlhelper.rs
index ab0a0c5f8c0..68e4219f996 100644
--- a/components/script/dom/urlhelper.rs
+++ b/components/script/dom/urlhelper.rs
@@ -4,166 +4,31 @@
use dom::bindings::str::USVString;
use std::borrow::ToOwned;
-use std::fmt::Write;
-use url::urlutils::{UrlUtils, UrlUtilsWrapper};
-use url::{Origin, SchemeData, Url, UrlParser};
+use url::{Url, quirks};
#[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) {
- url.fragment = Some(String::new());
- 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 Origin(url: &Url) -> USVString {
- USVString(match url.origin() {
- Origin::UID(_) => {
- // https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin
- // If the origin in question is not a scheme/host/port tuple,
- // then return the literal string "null" and abort these steps.
- "null".to_owned()
- },
- Origin::Tuple(protocol, host, _) => {
- let mut origin =
- format!(
- "{protocol}://{host}",
- protocol = protocol,
- host = host
- );
- if let Some(port) =
- // https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin
- // only append the port # to the serialized origin if the port is different from
- // the default port for the protocol. If url.scheme_data.port is None, that
- // indicates that the port is a default port
- url.relative_scheme_data().and_then(|scheme| scheme.port) {
- write!(origin, ":{}", port).unwrap();
- };
- origin
- }
- })
- }
-
- 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) {
- if let Some(path) = url.path_mut() {
- path.clear();
- }
- 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) {
- url.query = Some(String::new());
- 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);
- }
+ pub fn SameOrigin(urlA: &Url, urlB: &Url) -> bool { urlA.origin() == urlB.origin() }
+ pub fn Origin(url: &Url) -> USVString { USVString(quirks::origin(url)) }
+ pub fn Href(url: &Url) -> USVString { USVString(quirks::href(url).to_owned()) }
+ pub fn Hash(url: &Url) -> USVString { USVString(quirks::hash(url).to_owned()) }
+ pub fn Host(url: &Url) -> USVString { USVString(quirks::host(url).to_owned()) }
+ pub fn Port(url: &Url) -> USVString { USVString(quirks::port(url).to_owned()) }
+ pub fn Search(url: &Url) -> USVString { USVString(quirks::search(url).to_owned()) }
+ pub fn Hostname(url: &Url) -> USVString { USVString(quirks::hostname(url).to_owned()) }
+ pub fn Password(url: &Url) -> USVString { USVString(quirks::password(url).to_owned()) }
+ pub fn Pathname(url: &Url) -> USVString { USVString(quirks::pathname(url).to_owned()) }
+ pub fn Protocol(url: &Url) -> USVString { USVString(quirks::protocol(url).to_owned()) }
+ pub fn Username(url: &Url) -> USVString { USVString(quirks::username(url).to_owned()) }
+ pub fn SetHash(url: &mut Url, value: USVString) { quirks::set_hash(url, &value.0) }
+ pub fn SetHost(url: &mut Url, value: USVString) { let _ = quirks::set_host(url, &value.0); }
+ pub fn SetPort(url: &mut Url, value: USVString) { let _ = quirks::set_port(url, &value.0); }
+ pub fn SetSearch(url: &mut Url, value: USVString) { quirks::set_search(url, &value.0) }
+ pub fn SetPathname(url: &mut Url, value: USVString) { quirks::set_pathname(url, &value.0) }
+ pub fn SetHostname(url: &mut Url, value: USVString) { let _ = quirks::set_hostname(url, &value.0); }
+ pub fn SetPassword(url: &mut Url, value: USVString) { let _ = quirks::set_password(url, &value.0); }
+ pub fn SetProtocol(url: &mut Url, value: USVString) { let _ = quirks::set_protocol(url, &value.0); }
+ pub fn SetUsername(url: &mut Url, value: USVString) { let _ = quirks::set_username(url, &value.0); }
}
diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs
index bb7b1cb910c..800cd10db88 100644
--- a/components/script/dom/urlsearchparams.rs
+++ b/components/script/dom/urlsearchparams.rs
@@ -14,7 +14,7 @@ use dom::bindings::str::USVString;
use dom::bindings::weakref::MutableWeakRef;
use dom::url::URL;
use encoding::types::EncodingRef;
-use url::form_urlencoded::{parse, serialize_with_encoding};
+use url::form_urlencoded;
use util::str::DOMString;
// https://url.spec.whatwg.org/#interface-urlsearchparams
@@ -31,7 +31,7 @@ impl URLSearchParams {
fn new_inherited(url: Option<&URL>) -> URLSearchParams {
URLSearchParams {
reflector_: Reflector::new(),
- list: DOMRefCell::new(vec![]),
+ list: DOMRefCell::new(url.map_or(Vec::new(), |url| url.query_pairs())),
url: MutableWeakRef::new(url),
}
}
@@ -49,7 +49,8 @@ impl URLSearchParams {
match init {
Some(USVStringOrURLSearchParams::USVString(init)) => {
// Step 2.
- *query.list.borrow_mut() = parse(init.0.as_bytes());
+ *query.list.borrow_mut() = form_urlencoded::parse(init.0.as_bytes())
+ .into_owned().collect();
},
Some(USVStringOrURLSearchParams::URLSearchParams(init)) => {
// Step 3.
@@ -110,26 +111,28 @@ impl URLSearchParamsMethods for URLSearchParams {
// https://url.spec.whatwg.org/#dom-urlsearchparams-set
fn Set(&self, name: USVString, value: USVString) {
- // Step 1.
- let mut list = self.list.borrow_mut();
- let mut index = None;
- let mut i = 0;
- list.retain(|&(ref k, _)| {
- if index.is_none() {
- if k == &name.0 {
- index = Some(i);
+ {
+ // Step 1.
+ let mut list = self.list.borrow_mut();
+ let mut index = None;
+ let mut i = 0;
+ list.retain(|&(ref k, _)| {
+ if index.is_none() {
+ if k == &name.0 {
+ index = Some(i);
+ } else {
+ i += 1;
+ }
+ true
} else {
- i += 1;
+ k != &name.0
}
- true
- } else {
- k != &name.0
- }
- });
- match index {
- Some(index) => list[index].1 = value.0,
- None => list.push((name.0, value.0)), // Step 2.
- };
+ });
+ match index {
+ Some(index) => list[index].1 = value.0,
+ None => list.push((name.0, value.0)), // Step 2.
+ };
+ } // Un-borrow self.list
// Step 3.
self.update_steps();
}
@@ -145,7 +148,10 @@ impl URLSearchParams {
// https://url.spec.whatwg.org/#concept-urlencoded-serializer
pub fn serialize(&self, encoding: Option<EncodingRef>) -> String {
let list = self.list.borrow();
- serialize_with_encoding(list.iter(), encoding)
+ form_urlencoded::Serializer::new(String::new())
+ .encoding_override(encoding)
+ .extend_pairs(&*list)
+ .finish()
}
}
@@ -154,7 +160,7 @@ impl URLSearchParams {
// https://url.spec.whatwg.org/#concept-urlsearchparams-update
fn update_steps(&self) {
if let Some(url) = self.url.root() {
- url.set_query(self.serialize(None));
+ url.set_query_pairs(&self.list.borrow())
}
}
}
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index bd2f8191720..7e48ba60d34 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -180,13 +180,21 @@ impl WebGLRenderingContext {
.unwrap();
}
+ fn validate_stencil_actions(&self, action: u32) -> bool {
+ match action {
+ 0 | constants::KEEP | constants::REPLACE | constants::INCR | constants::DECR |
+ constants::INVERT | constants::INCR_WRAP | constants::DECR_WRAP => true,
+ _ => false,
+ }
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml
// https://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf#nameddest=section-2.10.4
fn validate_uniform_parameters<T>(&self,
- uniform: Option<&WebGLUniformLocation>,
- uniform_type: UniformSetterType,
- data: Option<&[T]>) -> bool {
+ uniform: Option<&WebGLUniformLocation>,
+ uniform_type: UniformSetterType,
+ data: Option<&[T]>) -> bool {
let uniform = match uniform {
Some(uniform) => uniform,
None => return false,
@@ -1219,6 +1227,82 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
.unwrap()
}
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilFunc(&self, func: u32, ref_: i32, mask: u32) {
+ match func {
+ constants::NEVER | constants::LESS | constants::EQUAL | constants::LEQUAL |
+ constants::GREATER | constants::NOTEQUAL | constants::GEQUAL | constants::ALWAYS =>
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilFunc(func, ref_, mask)))
+ .unwrap(),
+ _ => self.webgl_error(InvalidEnum),
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilFuncSeparate(&self, face: u32, func: u32, ref_: i32, mask: u32) {
+ match face {
+ constants::FRONT | constants::BACK | constants::FRONT_AND_BACK => (),
+ _ => return self.webgl_error(InvalidEnum),
+ }
+
+ match func {
+ constants::NEVER | constants::LESS | constants::EQUAL | constants::LEQUAL |
+ constants::GREATER | constants::NOTEQUAL | constants::GEQUAL | constants::ALWAYS =>
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilFuncSeparate(face, func, ref_, mask)))
+ .unwrap(),
+ _ => self.webgl_error(InvalidEnum),
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilMask(&self, mask: u32) {
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilMask(mask)))
+ .unwrap()
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilMaskSeparate(&self, face: u32, mask: u32) {
+ match face {
+ constants::FRONT | constants::BACK | constants::FRONT_AND_BACK =>
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilMaskSeparate(face, mask)))
+ .unwrap(),
+ _ => return self.webgl_error(InvalidEnum),
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilOp(&self, fail: u32, zfail: u32, zpass: u32) {
+ if self.validate_stencil_actions(fail) && self.validate_stencil_actions(zfail) &&
+ self.validate_stencil_actions(zpass) {
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilOp(fail, zfail, zpass)))
+ .unwrap()
+ } else {
+ self.webgl_error(InvalidEnum)
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilOpSeparate(&self, face: u32, fail: u32, zfail: u32, zpass: u32) {
+ match face {
+ constants::FRONT | constants::BACK | constants::FRONT_AND_BACK => (),
+ _ => return self.webgl_error(InvalidEnum),
+ }
+
+ if self.validate_stencil_actions(fail) && self.validate_stencil_actions(zfail) &&
+ self.validate_stencil_actions(zpass) {
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilOpSeparate(face, fail, zfail, zpass)))
+ .unwrap()
+ } else {
+ self.webgl_error(InvalidEnum)
+ }
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn LinkProgram(&self, program: Option<&WebGLProgram>) {
if let Some(program) = program {
diff --git a/components/script/dom/webidls/Blob.webidl b/components/script/dom/webidls/Blob.webidl
index c09436ba63d..f0e3413d086 100644
--- a/components/script/dom/webidls/Blob.webidl
+++ b/components/script/dom/webidls/Blob.webidl
@@ -3,8 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// http://dev.w3.org/2006/webapi/FileAPI/#dfn-Blob
-[Constructor,
- Constructor(sequence<(/*ArrayBuffer or ArrayBufferView or */Blob or DOMString)> blobParts,
+[Constructor(optional sequence<(/*ArrayBuffer or ArrayBufferView or */Blob or DOMString)> blobParts,
optional BlobPropertyBag options),
Exposed=Window/*,Worker*/]
interface Blob {
diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl
index 97cd853417f..4b29660b190 100644
--- a/components/script/dom/webidls/WebGLRenderingContext.webidl
+++ b/components/script/dom/webidls/WebGLRenderingContext.webidl
@@ -622,12 +622,12 @@ interface WebGLRenderingContextBase
void shaderSource(WebGLShader? shader, DOMString source);
- //void stencilFunc(GLenum func, GLint ref, GLuint mask);
- //void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- //void stencilMask(GLuint mask);
- //void stencilMaskSeparate(GLenum face, GLuint mask);
- //void stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- //void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+ void stencilFunc(GLenum func, GLint ref, GLuint mask);
+ void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void stencilMask(GLuint mask);
+ void stencilMaskSeparate(GLenum face, GLuint mask);
+ void stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
//void texImage2D(GLenum target, GLint level, GLenum internalformat,
// GLsizei width, GLsizei height, GLint border, GLenum format,
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs
index e92c7abbcab..08d24e2fbe2 100644
--- a/components/script/dom/websocket.rs
+++ b/components/script/dom/websocket.rs
@@ -210,7 +210,7 @@ impl WebSocket {
// Step 2: Disallow https -> ws connections.
// Step 3: Potentially block access to some ports.
- let port: u16 = resource_url.port_or_default().unwrap();
+ let port: u16 = resource_url.port_or_known_default().unwrap();
if BLOCKED_PORTS_LIST.iter().any(|&p| p == port) {
return Err(Error::Security);
@@ -356,7 +356,7 @@ impl WebSocketMethods for WebSocket {
// https://html.spec.whatwg.org/multipage/#dom-websocket-url
fn Url(&self) -> DOMString {
- DOMString::from(self.url.serialize())
+ DOMString::from(self.url.as_str())
}
// https://html.spec.whatwg.org/multipage/#dom-websocket-readystate
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index a0a73c0d993..dc097cd602c 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -225,7 +225,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
};
match self.runtime.evaluate_script(
- self.reflector().get_jsobject(), source, url.serialize(), 1) {
+ self.reflector().get_jsobject(), source, url.to_string(), 1) {
Ok(_) => (),
Err(_) => {
println!("evaluate_script failed");
@@ -317,7 +317,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
impl WorkerGlobalScope {
pub fn execute_script(&self, source: DOMString) {
match self.runtime.evaluate_script(
- self.reflector().get_jsobject(), String::from(source), self.worker_url.serialize(), 1) {
+ self.reflector().get_jsobject(), String::from(source), self.worker_url.to_string(), 1) {
Ok(_) => (),
Err(_) => {
if self.is_closing() {
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index a381cae57b0..45d377c3fda 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -60,8 +60,7 @@ use std::sync::{Arc, Mutex};
use string_cache::Atom;
use time;
use timers::{OneshotTimerCallback, OneshotTimerHandle};
-use url::Url;
-use url::percent_encoding::{utf8_percent_encode, USERNAME_ENCODE_SET, PASSWORD_ENCODE_SET};
+use url::{Url, Position};
use util::prefs;
use util::str::DOMString;
@@ -360,15 +359,10 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
// Step 9
if parsed_url.host().is_some() {
- if let Some(scheme_data) = parsed_url.relative_scheme_data_mut() {
- if let Some(user_str) = username {
- scheme_data.username = utf8_percent_encode(&user_str.0, USERNAME_ENCODE_SET);
-
- // ensure that the password is mutated when a username is provided
- scheme_data.password = password.map(|pass_str| {
- utf8_percent_encode(&pass_str.0, PASSWORD_ENCODE_SET)
- });
- }
+ if let Some(user_str) = username {
+ parsed_url.set_username(&user_str.0).unwrap();
+ let password = password.as_ref().map(|pass_str| &*pass_str.0);
+ parsed_url.set_password(password).unwrap();
}
}
@@ -628,24 +622,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
true);
match cors_request {
Ok(None) => {
- let mut buf = String::new();
- buf.push_str(&referer_url.scheme);
- buf.push_str("://");
-
- if let Some(ref h) = referer_url.serialize_host() {
- buf.push_str(h);
- }
-
- if let Some(ref p) = referer_url.port().as_ref() {
- buf.push_str(":");
- buf.push_str(&p.to_string());
- }
-
- if let Some(ref h) = referer_url.serialize_path() {
- buf.push_str(h);
- }
-
- self.request_headers.borrow_mut().set_raw("Referer".to_owned(), vec![buf.into_bytes()]);
+ let bytes = referer_url[..Position::AfterPath].as_bytes().to_vec();
+ self.request_headers.borrow_mut().set_raw("Referer".to_owned(), vec![bytes]);
},
Ok(Some(ref req)) => self.insert_trusted_header("origin".to_owned(),
req.origin.to_string()),
@@ -909,7 +887,7 @@ impl XMLHttpRequest {
debug!("Bypassing cross origin check");
}
- *self.response_url.borrow_mut() = metadata.final_url.serialize_no_fragment();
+ *self.response_url.borrow_mut() = metadata.final_url[..Position::AfterQuery].to_owned();
// XXXManishearth Clear cache entries in case of a network error
self.process_partial_response(XHRProgress::HeadersReceived(gen_id, metadata.headers, metadata.status));