mirror of
https://github.com/servo/servo.git
synced 2025-07-23 15:23:42 +01:00
Introduce GlobalScope::api_base_url
This commit is contained in:
parent
cb02d7911a
commit
3302a53d38
5 changed files with 26 additions and 18 deletions
|
@ -7,7 +7,6 @@
|
||||||
//! This module contains smart pointers to global scopes, to simplify writing
|
//! This module contains smart pointers to global scopes, to simplify writing
|
||||||
//! code that works in workers as well as window scopes.
|
//! 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::conversions::root_from_object;
|
||||||
use dom::bindings::error::{ErrorInfo, report_pending_exception};
|
use dom::bindings::error::{ErrorInfo, report_pending_exception};
|
||||||
use dom::bindings::inheritance::Castable;
|
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
|
/// `ScriptChan` used to send messages to the event loop of this global's
|
||||||
/// thread.
|
/// thread.
|
||||||
pub fn script_chan(&self) -> Box<ScriptChan + Send> {
|
pub fn script_chan(&self) -> Box<ScriptChan + Send> {
|
||||||
|
|
|
@ -4,11 +4,15 @@
|
||||||
|
|
||||||
use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
|
use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
|
||||||
use dom::bindings::cell::DOMRefCell;
|
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::js::{JS, MutNullableHeap, Root};
|
||||||
use dom::bindings::reflector::Reflectable;
|
use dom::bindings::reflector::Reflectable;
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::crypto::Crypto;
|
use dom::crypto::Crypto;
|
||||||
use dom::eventtarget::EventTarget;
|
use dom::eventtarget::EventTarget;
|
||||||
|
use dom::window::Window;
|
||||||
|
use dom::workerglobalscope::WorkerGlobalScope;
|
||||||
use ipc_channel::ipc::IpcSender;
|
use ipc_channel::ipc::IpcSender;
|
||||||
use js::jsapi::{JS_GetContext, JS_GetObjectRuntime, JSContext};
|
use js::jsapi::{JS_GetContext, JS_GetObjectRuntime, JSContext};
|
||||||
use msg::constellation_msg::PipelineId;
|
use msg::constellation_msg::PipelineId;
|
||||||
|
@ -18,6 +22,7 @@ use std::cell::Cell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
use time::{Timespec, get_time};
|
use time::{Timespec, get_time};
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct GlobalScope {
|
pub struct GlobalScope {
|
||||||
|
@ -160,6 +165,20 @@ impl GlobalScope {
|
||||||
pub fn pipeline_id(&self) -> PipelineId {
|
pub fn pipeline_id(&self) -> PipelineId {
|
||||||
self.pipeline_id
|
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 {
|
fn timestamp_in_ms(time: Timespec) -> u64 {
|
||||||
|
|
|
@ -58,8 +58,9 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
|
||||||
script_url: USVString,
|
script_url: USVString,
|
||||||
options: &RegistrationOptions) -> Fallible<Root<ServiceWorkerRegistration>> {
|
options: &RegistrationOptions) -> Fallible<Root<ServiceWorkerRegistration>> {
|
||||||
let USVString(ref script_url) = script_url;
|
let USVString(ref script_url) = script_url;
|
||||||
|
let api_base_url = self.global_scope().api_base_url();
|
||||||
// Step 3-4
|
// 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,
|
Ok(url) => url,
|
||||||
Err(_) => return Err(Error::Type("Invalid script URL".to_owned()))
|
Err(_) => return Err(Error::Type("Invalid script URL".to_owned()))
|
||||||
};
|
};
|
||||||
|
@ -77,7 +78,7 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
|
||||||
let scope = match options.scope {
|
let scope = match options.scope {
|
||||||
Some(ref scope) => {
|
Some(ref scope) => {
|
||||||
let &USVString(ref inner_scope) = 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,
|
Ok(url) => url,
|
||||||
Err(_) => return Err(Error::Type("Invalid scope URL".to_owned()))
|
Err(_) => return Err(Error::Type("Invalid scope URL".to_owned()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,18 +73,18 @@ impl Worker {
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-worker
|
// https://html.spec.whatwg.org/multipage/#dom-worker
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
pub fn Constructor(global: GlobalRef, script_url: DOMString) -> Fallible<Root<Worker>> {
|
pub fn Constructor(global: GlobalRef, script_url: DOMString) -> Fallible<Root<Worker>> {
|
||||||
|
let global_scope = global.as_global_scope();
|
||||||
// Step 2-4.
|
// 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,
|
Ok(url) => url,
|
||||||
Err(_) => return Err(Error::Syntax),
|
Err(_) => return Err(Error::Syntax),
|
||||||
};
|
};
|
||||||
|
|
||||||
let (sender, receiver) = channel();
|
let (sender, receiver) = channel();
|
||||||
let closing = Arc::new(AtomicBool::new(false));
|
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 worker_ref = Trusted::new(worker.r());
|
||||||
|
|
||||||
let global_scope = global.as_global_scope();
|
|
||||||
let worker_load_origin = WorkerScriptLoadOrigin {
|
let worker_load_origin = WorkerScriptLoadOrigin {
|
||||||
referrer_url: None,
|
referrer_url: None,
|
||||||
referrer_policy: None,
|
referrer_policy: None,
|
||||||
|
|
|
@ -340,7 +340,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2
|
// Step 2
|
||||||
let base = self.global().r().api_base_url();
|
let base = self.global_scope().api_base_url();
|
||||||
// Step 6
|
// Step 6
|
||||||
let mut parsed_url = match base.join(&url.0) {
|
let mut parsed_url = match base.join(&url.0) {
|
||||||
Ok(parsed) => parsed,
|
Ok(parsed) => parsed,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue