aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2016-10-02 01:15:12 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2016-10-06 21:35:43 +0200
commit3302a53d38721fa18bcf0c3886f24f37cfd6bd13 (patch)
tree37cdd5aac3f9f5dd7abe06fbb219b8c277d52108 /components/script
parentcb02d7911a5dd98846ddf4a0c2dd6b2fc9032a07 (diff)
downloadservo-3302a53d38721fa18bcf0c3886f24f37cfd6bd13.tar.gz
servo-3302a53d38721fa18bcf0c3886f24f37cfd6bd13.zip
Introduce GlobalScope::api_base_url
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/global.rs12
-rw-r--r--components/script/dom/globalscope.rs19
-rw-r--r--components/script/dom/serviceworkercontainer.rs5
-rw-r--r--components/script/dom/worker.rs6
-rw-r--r--components/script/dom/xmlhttprequest.rs2
5 files changed, 26 insertions, 18 deletions
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs
index cf108e5e526..fd3cba582f7 100644
--- a/components/script/dom/bindings/global.rs
+++ b/components/script/dom/bindings/global.rs
@@ -7,7 +7,6 @@
//! This module contains smart pointers to global scopes, to simplify writing
//! code that works in workers as well as window scopes.
-use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::conversions::root_from_object;
use dom::bindings::error::{ErrorInfo, report_pending_exception};
use dom::bindings::inheritance::Castable;
@@ -100,17 +99,6 @@ impl<'a> GlobalRef<'a> {
}
}
- /// Get the [base url](https://html.spec.whatwg.org/multipage/#api-base-url)
- /// for this global scope.
- pub fn api_base_url(&self) -> Url {
- match *self {
- // https://html.spec.whatwg.org/multipage/#script-settings-for-browsing-contexts:api-base-url
- GlobalRef::Window(ref window) => window.Document().base_url(),
- // https://html.spec.whatwg.org/multipage/#script-settings-for-workers:api-base-url
- GlobalRef::Worker(ref worker) => worker.get_url().clone(),
- }
- }
-
/// `ScriptChan` used to send messages to the event loop of this global's
/// thread.
pub fn script_chan(&self) -> Box<ScriptChan + Send> {
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index b455536ed1c..96787adb303 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -4,11 +4,15 @@
use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
use dom::bindings::cell::DOMRefCell;
+use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
+use dom::bindings::inheritance::Castable;
use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::reflector::Reflectable;
use dom::bindings::str::DOMString;
use dom::crypto::Crypto;
use dom::eventtarget::EventTarget;
+use dom::window::Window;
+use dom::workerglobalscope::WorkerGlobalScope;
use ipc_channel::ipc::IpcSender;
use js::jsapi::{JS_GetContext, JS_GetObjectRuntime, JSContext};
use msg::constellation_msg::PipelineId;
@@ -18,6 +22,7 @@ use std::cell::Cell;
use std::collections::HashMap;
use std::collections::hash_map::Entry;
use time::{Timespec, get_time};
+use url::Url;
#[dom_struct]
pub struct GlobalScope {
@@ -160,6 +165,20 @@ impl GlobalScope {
pub fn pipeline_id(&self) -> PipelineId {
self.pipeline_id
}
+
+ /// Get the [base url](https://html.spec.whatwg.org/multipage/#api-base-url)
+ /// for this global scope.
+ pub fn api_base_url(&self) -> Url {
+ if let Some(window) = self.downcast::<Window>() {
+ // https://html.spec.whatwg.org/multipage/#script-settings-for-browsing-contexts:api-base-url
+ return window.Document().base_url();
+ }
+ if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
+ // https://html.spec.whatwg.org/multipage/#script-settings-for-workers:api-base-url
+ return worker.get_url().clone();
+ }
+ unreachable!();
+ }
}
fn timestamp_in_ms(time: Timespec) -> u64 {
diff --git a/components/script/dom/serviceworkercontainer.rs b/components/script/dom/serviceworkercontainer.rs
index 12bab94fe12..c5d27017f8e 100644
--- a/components/script/dom/serviceworkercontainer.rs
+++ b/components/script/dom/serviceworkercontainer.rs
@@ -58,8 +58,9 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
script_url: USVString,
options: &RegistrationOptions) -> Fallible<Root<ServiceWorkerRegistration>> {
let USVString(ref script_url) = script_url;
+ let api_base_url = self.global_scope().api_base_url();
// Step 3-4
- let script_url = match self.global().r().api_base_url().join(script_url) {
+ let script_url = match api_base_url.join(script_url) {
Ok(url) => url,
Err(_) => return Err(Error::Type("Invalid script URL".to_owned()))
};
@@ -77,7 +78,7 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
let scope = match options.scope {
Some(ref scope) => {
let &USVString(ref inner_scope) = scope;
- match self.global().r().api_base_url().join(inner_scope) {
+ match api_base_url.join(inner_scope) {
Ok(url) => url,
Err(_) => return Err(Error::Type("Invalid scope URL".to_owned()))
}
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index 9b8f3200878..833675fa1e3 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -73,18 +73,18 @@ impl Worker {
// https://html.spec.whatwg.org/multipage/#dom-worker
#[allow(unsafe_code)]
pub fn Constructor(global: GlobalRef, script_url: DOMString) -> Fallible<Root<Worker>> {
+ let global_scope = global.as_global_scope();
// Step 2-4.
- let worker_url = match global.api_base_url().join(&script_url) {
+ let worker_url = match global_scope.api_base_url().join(&script_url) {
Ok(url) => url,
Err(_) => return Err(Error::Syntax),
};
let (sender, receiver) = channel();
let closing = Arc::new(AtomicBool::new(false));
- let worker = Worker::new(global.as_global_scope(), sender.clone(), closing.clone());
+ let worker = Worker::new(global_scope, sender.clone(), closing.clone());
let worker_ref = Trusted::new(worker.r());
- let global_scope = global.as_global_scope();
let worker_load_origin = WorkerScriptLoadOrigin {
referrer_url: None,
referrer_policy: None,
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index 26b6cafcf3a..844d46f904e 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -340,7 +340,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
}
// Step 2
- let base = self.global().r().api_base_url();
+ let base = self.global_scope().api_base_url();
// Step 6
let mut parsed_url = match base.join(&url.0) {
Ok(parsed) => parsed,