diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2016-10-02 01:15:12 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2016-10-06 21:35:43 +0200 |
commit | 3302a53d38721fa18bcf0c3886f24f37cfd6bd13 (patch) | |
tree | 37cdd5aac3f9f5dd7abe06fbb219b8c277d52108 /components/script | |
parent | cb02d7911a5dd98846ddf4a0c2dd6b2fc9032a07 (diff) | |
download | servo-3302a53d38721fa18bcf0c3886f24f37cfd6bd13.tar.gz servo-3302a53d38721fa18bcf0c3886f24f37cfd6bd13.zip |
Introduce GlobalScope::api_base_url
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/bindings/global.rs | 12 | ||||
-rw-r--r-- | components/script/dom/globalscope.rs | 19 | ||||
-rw-r--r-- | components/script/dom/serviceworkercontainer.rs | 5 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 6 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 2 |
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, |