diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 47 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/serviceworkerglobalscope.rs | 26 | ||||
-rw-r--r-- | components/script/dom/workerglobalscope.rs | 37 | ||||
-rw-r--r-- | components/script/dom/worklet.rs | 12 |
5 files changed, 72 insertions, 52 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 69c4694af5c..374471b8798 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -22,6 +22,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::messageevent::MessageEvent; use crate::dom::worker::{TrustedWorkerAddress, Worker}; use crate::dom::workerglobalscope::WorkerGlobalScope; +use crate::fetch::load_whole_resource; use crate::script_runtime::ScriptThreadEventCategory::WorkerEvent; use crate::script_runtime::{new_child_runtime, CommonScriptMsg, Runtime, ScriptChan, ScriptPort}; use crate::task_queue::{QueuedTask, QueuedTaskConversion, TaskQueue}; @@ -37,7 +38,7 @@ use js::jsval::UndefinedValue; use js::rust::HandleValue; use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId}; use net_traits::request::{CredentialsMode, Destination, Referrer, RequestBuilder}; -use net_traits::{load_whole_resource, IpcSend}; +use net_traits::IpcSend; use script_traits::{TimerEvent, TimerSource, WorkerGlobalScopeInit, WorkerScriptLoadOrigin}; use servo_rand::random; use servo_url::ServoUrl; @@ -316,25 +317,6 @@ impl DedicatedWorkerGlobalScope { .referrer_policy(referrer_policy) .origin(origin); - let (metadata, bytes) = - match load_whole_resource(request, &init.resource_threads.sender()) { - Err(_) => { - println!("error loading script {}", serialized_worker_url); - parent_sender - .send(CommonScriptMsg::Task( - WorkerEvent, - Box::new(SimpleWorkerErrorHandler::new(worker)), - pipeline_id, - TaskSourceName::DOMManipulation, - )) - .unwrap(); - return; - }, - Ok((metadata, bytes)) => (metadata, bytes), - }; - let url = metadata.final_url; - let source = String::from_utf8_lossy(&bytes); - let runtime = unsafe { new_child_runtime(parent) }; let (devtools_mpsc_chan, devtools_mpsc_port) = unbounded(); @@ -356,7 +338,7 @@ impl DedicatedWorkerGlobalScope { let global = DedicatedWorkerGlobalScope::new( init, - url, + worker_url, devtools_mpsc_port, runtime, parent_sender.clone(), @@ -369,6 +351,29 @@ impl DedicatedWorkerGlobalScope { // FIXME(njn): workers currently don't have a unique ID suitable for using in reporter // registration (#6631), so we instead use a random number and cross our fingers. let scope = global.upcast::<WorkerGlobalScope>(); + let global_scope = global.upcast::<GlobalScope>(); + + let (metadata, bytes) = match load_whole_resource( + request, + &global_scope.resource_threads().sender(), + &global_scope, + ) { + Err(_) => { + println!("error loading script {}", serialized_worker_url); + parent_sender + .send(CommonScriptMsg::Task( + WorkerEvent, + Box::new(SimpleWorkerErrorHandler::new(worker)), + pipeline_id, + TaskSourceName::DOMManipulation, + )) + .unwrap(); + return; + }, + Ok((metadata, bytes)) => (metadata, bytes), + }; + scope.set_url(metadata.final_url); + let source = String::from_utf8_lossy(&bytes); unsafe { // Handle interrupt requests diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 9bbfb30d46c..66fb85b6732 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -120,7 +120,7 @@ impl FrameRenderer for MediaFrameRenderer { let mut txn = Transaction::new(); - let image_data = ImageData::Raw(frame.get_data().clone()); + let image_data = ImageData::Raw(frame.get_data()); if let Some(old_image_key) = mem::replace(&mut self.very_old_frame, self.old_frame.take()) { txn.delete_image(old_image_key); diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 6acae53ae05..1ecdbf00b9b 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -19,6 +19,7 @@ use crate::dom::extendablemessageevent::ExtendableMessageEvent; use crate::dom::globalscope::GlobalScope; use crate::dom::worker::TrustedWorkerAddress; use crate::dom::workerglobalscope::WorkerGlobalScope; +use crate::fetch::load_whole_resource; use crate::script_runtime::{new_rt_and_cx, CommonScriptMsg, Runtime, ScriptChan}; use crate::task_queue::{QueuedTask, QueuedTaskConversion, TaskQueue}; use crate::task_source::TaskSourceName; @@ -31,7 +32,7 @@ use js::jsapi::{JSAutoCompartment, JSContext, JS_AddInterruptCallback}; use js::jsval::UndefinedValue; use msg::constellation_msg::PipelineId; use net_traits::request::{CredentialsMode, Destination, Referrer, RequestBuilder}; -use net_traits::{load_whole_resource, CustomResponseMediator, IpcSend}; +use net_traits::{CustomResponseMediator, IpcSend}; use script_traits::{ ScopeThings, ServiceWorkerMsg, TimerEvent, WorkerGlobalScopeInit, WorkerScriptLoadOrigin, }; @@ -292,16 +293,19 @@ impl ServiceWorkerGlobalScope { .referrer_policy(referrer_policy) .origin(origin); - let (url, source) = - match load_whole_resource(request, &init.resource_threads.sender()) { - Err(_) => { - println!("error loading script {}", serialized_worker_url); - return; - }, - Ok((metadata, bytes)) => { - (metadata.final_url, String::from_utf8(bytes).unwrap()) - }, - }; + let (url, source) = match load_whole_resource( + request, + &init.resource_threads.sender(), + &GlobalScope::current().expect("No current global object"), + ) { + Err(_) => { + println!("error loading script {}", serialized_worker_url); + return; + }, + Ok((metadata, bytes)) => { + (metadata.final_url, String::from_utf8(bytes).unwrap()) + }, + }; let runtime = new_rt_and_cx(); diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 3c876b9fc50..41b90fa2fa9 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function; use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit; use crate::dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods; @@ -42,10 +43,11 @@ use js::panic::maybe_resume_unwind; use js::rust::{HandleValue, ParentRuntime}; use msg::constellation_msg::PipelineId; use net_traits::request::{CredentialsMode, Destination, RequestBuilder as NetRequestInit}; -use net_traits::{load_whole_resource, IpcSend}; +use net_traits::IpcSend; use script_traits::WorkerGlobalScopeInit; use script_traits::{TimerEvent, TimerEventId}; use servo_url::{MutableOrigin, ServoUrl}; +use std::cell::Ref; use std::default::Default; use std::rc::Rc; use std::sync::atomic::{AtomicBool, Ordering}; @@ -78,7 +80,7 @@ pub struct WorkerGlobalScope { globalscope: GlobalScope, worker_id: WorkerId, - worker_url: ServoUrl, + worker_url: DomRefCell<ServoUrl>, #[ignore_malloc_size_of = "Arc"] closing: Option<Arc<AtomicBool>>, #[ignore_malloc_size_of = "Defined in js"] @@ -123,7 +125,7 @@ impl WorkerGlobalScope { Default::default(), ), worker_id: init.worker_id, - worker_url, + worker_url: DomRefCell::new(worker_url), closing, runtime, location: Default::default(), @@ -159,8 +161,12 @@ impl WorkerGlobalScope { } } - pub fn get_url(&self) -> &ServoUrl { - &self.worker_url + pub fn get_url(&self) -> Ref<ServoUrl> { + self.worker_url.borrow() + } + + pub fn set_url(&self, url: ServoUrl) { + *self.worker_url.borrow_mut() = url; } pub fn get_worker_id(&self) -> WorkerId { @@ -187,7 +193,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { // https://html.spec.whatwg.org/multipage/#dom-workerglobalscope-location fn Location(&self) -> DomRoot<WorkerLocation> { self.location - .or_init(|| WorkerLocation::new(self, self.worker_url.clone())) + .or_init(|| WorkerLocation::new(self, self.worker_url.borrow().clone())) } // https://html.spec.whatwg.org/multipage/#handler-workerglobalscope-onerror @@ -197,7 +203,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { fn ImportScripts(&self, url_strings: Vec<DOMString>) -> ErrorResult { let mut urls = Vec::with_capacity(url_strings.len()); for url in url_strings { - let url = self.worker_url.join(&url); + let url = self.worker_url.borrow().join(&url); match url { Ok(url) => urls.push(url), Err(_) => return Err(Error::Syntax), @@ -215,13 +221,14 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { .pipeline_id(Some(self.upcast::<GlobalScope>().pipeline_id())) .referrer_policy(None); - let (url, source) = - match load_whole_resource(request, &global_scope.resource_threads().sender()) { - Err(_) => return Err(Error::Network), - Ok((metadata, bytes)) => { - (metadata.final_url, String::from_utf8(bytes).unwrap()) - }, - }; + let (url, source) = match fetch::load_whole_resource( + request, + &global_scope.resource_threads().sender(), + &global_scope, + ) { + Err(_) => return Err(Error::Network), + Ok((metadata, bytes)) => (metadata.final_url, String::from_utf8(bytes).unwrap()), + }; let result = self.runtime.evaluate_script( self.reflector().get_jsobject(), @@ -381,7 +388,7 @@ impl WorkerGlobalScope { match self.runtime.evaluate_script( self.reflector().get_jsobject(), &source, - self.worker_url.as_str(), + self.worker_url.borrow().as_str(), 1, rval.handle_mut(), ) { diff --git a/components/script/dom/worklet.rs b/components/script/dom/worklet.rs index 90421efac61..a7611517d13 100644 --- a/components/script/dom/worklet.rs +++ b/components/script/dom/worklet.rs @@ -33,6 +33,7 @@ use crate::dom::workletglobalscope::WorkletGlobalScope; use crate::dom::workletglobalscope::WorkletGlobalScopeInit; use crate::dom::workletglobalscope::WorkletGlobalScopeType; use crate::dom::workletglobalscope::WorkletTask; +use crate::fetch::load_whole_resource; use crate::script_runtime::new_rt_and_cx; use crate::script_runtime::CommonScriptMsg; use crate::script_runtime::Runtime; @@ -47,7 +48,6 @@ use js::jsapi::JSTracer; use js::jsapi::JS_GetGCParameter; use js::jsapi::JS_GC; use msg::constellation_msg::PipelineId; -use net_traits::load_whole_resource; use net_traits::request::Destination; use net_traits::request::RequestBuilder; use net_traits::request::RequestMode; @@ -631,9 +631,13 @@ impl WorkletThread { .credentials_mode(credentials.into()) .origin(origin); - let script = load_whole_resource(request, &resource_fetcher) - .ok() - .and_then(|(_, bytes)| String::from_utf8(bytes).ok()); + let script = load_whole_resource( + request, + &resource_fetcher, + &global_scope.upcast::<GlobalScope>(), + ) + .ok() + .and_then(|(_, bytes)| String::from_utf8(bytes).ok()); // Step 4. // NOTE: the spec parses and executes the script in separate steps, |