diff options
Diffstat (limited to 'components/script/serviceworkerjob.rs')
-rw-r--r-- | components/script/serviceworkerjob.rs | 90 |
1 files changed, 63 insertions, 27 deletions
diff --git a/components/script/serviceworkerjob.rs b/components/script/serviceworkerjob.rs index a9d5243ea3d..0dacdfd83d8 100644 --- a/components/script/serviceworkerjob.rs +++ b/components/script/serviceworkerjob.rs @@ -28,13 +28,13 @@ use task_source::dom_manipulation::DOMManipulationTaskSource; pub enum JobType { Register, Unregister, - Update + Update, } #[derive(Clone)] pub enum SettleType { Resolve(Trusted<ServiceWorkerRegistration>), - Reject(Error) + Reject(Error), } #[must_root] @@ -47,17 +47,19 @@ pub struct Job { pub equivalent_jobs: Vec<Job>, // client can be a window client, worker client so `Client` will be an enum in future pub client: Dom<Client>, - pub referrer: ServoUrl + pub referrer: ServoUrl, } impl Job { #[allow(unrooted_must_root)] // https://w3c.github.io/ServiceWorker/#create-job-algorithm - pub fn create_job(job_type: JobType, - scope_url: ServoUrl, - script_url: ServoUrl, - promise: Rc<Promise>, - client: &Client) -> Job { + pub fn create_job( + job_type: JobType, + scope_url: ServoUrl, + script_url: ServoUrl, + promise: Rc<Promise>, + client: &Client, + ) -> Job { Job { job_type: job_type, scope_url: scope_url, @@ -65,7 +67,7 @@ impl Job { promise: promise, equivalent_jobs: vec![], client: Dom::from_ref(client), - referrer: client.creation_url() + referrer: client.creation_url(), } } #[allow(unrooted_must_root)] @@ -83,7 +85,7 @@ impl PartialEq for Job { JobType::Register | JobType::Update => { self.scope_url == other.scope_url && self.script_url == other.script_url }, - JobType::Unregister => self.scope_url == other.scope_url + JobType::Unregister => self.scope_url == other.scope_url, } } else { false @@ -158,16 +160,22 @@ impl JobQueue { // Step 1-3 if !UrlHelper::is_origin_trustworthy(&job.script_url) { // Step 1.1 - reject_job_promise(job, - Error::Type("Invalid script ServoURL".to_owned()), - &script_thread.dom_manipulation_task_source(pipeline_id)); + reject_job_promise( + job, + Error::Type("Invalid script ServoURL".to_owned()), + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 1.2 (see run_job) return; - } else if job.script_url.origin() != job.referrer.origin() || job.scope_url.origin() != job.referrer.origin() { + } else if job.script_url.origin() != job.referrer.origin() || + job.scope_url.origin() != job.referrer.origin() + { // Step 2.1/3.1 - reject_job_promise(job, - Error::Security, - &script_thread.dom_manipulation_task_source(pipeline_id)); + reject_job_promise( + job, + Error::Security, + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 2.2/3.2 (see run_job) return; } @@ -182,7 +190,11 @@ impl JobQueue { if let Some(ref newest_worker) = reg.get_newest_worker() { if (&*newest_worker).get_script_url() == job.script_url { // Step 5.3.1 - resolve_job_promise(job, &*reg, &script_thread.dom_manipulation_task_source(pipeline_id)); + resolve_job_promise( + job, + &*reg, + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 5.3.2 (see run_job) return; } @@ -202,7 +214,7 @@ impl JobQueue { debug!("finishing previous job"); let run_job = if let Some(job_vec) = (*self.0.borrow_mut()).get_mut(&scope_url) { assert_eq!(job_vec.first().as_ref().unwrap().scope_url, scope_url); - let _ = job_vec.remove(0); + let _ = job_vec.remove(0); !job_vec.is_empty() } else { warn!("non-existent job vector for Servourl: {:?}", scope_url); @@ -227,16 +239,24 @@ impl JobQueue { None => { let err_type = Error::Type("No registration to update".to_owned()); // Step 2.1 - reject_job_promise(job, err_type, &script_thread.dom_manipulation_task_source(pipeline_id)); + reject_job_promise( + job, + err_type, + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 2.2 (see run_job) return; - } + }, }; // Step 2 if reg.get_uninstalling() { let err_type = Error::Type("Update called on an uninstalling registration".to_owned()); // Step 2.1 - reject_job_promise(job, err_type, &script_thread.dom_manipulation_task_source(pipeline_id)); + reject_job_promise( + job, + err_type, + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 2.2 (see run_job) return; } @@ -244,10 +264,14 @@ impl JobQueue { let newest_worker = reg.get_newest_worker(); let newest_worker_url = newest_worker.as_ref().map(|w| w.get_script_url()); // Step 4 - if newest_worker_url.as_ref() == Some(&job.script_url) && job.job_type == JobType::Update { + if newest_worker_url.as_ref() == Some(&job.script_url) && job.job_type == JobType::Update { let err_type = Error::Type("Invalid script ServoURL".to_owned()); // Step 4.1 - reject_job_promise(job, err_type, &script_thread.dom_manipulation_task_source(pipeline_id)); + reject_job_promise( + job, + err_type, + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 4.2 (see run_job) return; } @@ -255,7 +279,11 @@ impl JobQueue { if let Some(newest_worker) = newest_worker { job.client.set_controller(&*newest_worker); // Step 8.1 - resolve_job_promise(job, &*reg, &script_thread.dom_manipulation_task_source(pipeline_id)); + resolve_job_promise( + job, + &*reg, + &script_thread.dom_manipulation_task_source(pipeline_id), + ); // Step 8.2 present in run_job } // TODO Step 9 (create new service worker) @@ -270,7 +298,11 @@ fn settle_job_promise(promise: &Promise, settle: SettleType) { } #[allow(unrooted_must_root)] -fn queue_settle_promise_for_job(job: &Job, settle: SettleType, task_source: &DOMManipulationTaskSource) { +fn queue_settle_promise_for_job( + job: &Job, + settle: SettleType, + task_source: &DOMManipulationTaskSource, +) { let global = job.client.global(); let promise = TrustedPromise::new(job.promise.clone()); // FIXME(nox): Why are errors silenced here? @@ -298,6 +330,10 @@ fn reject_job_promise(job: &Job, err: Error, task_source: &DOMManipulationTaskSo queue_settle_promise(job, SettleType::Reject(err), task_source) } -fn resolve_job_promise(job: &Job, reg: &ServiceWorkerRegistration, task_source: &DOMManipulationTaskSource) { +fn resolve_job_promise( + job: &Job, + reg: &ServiceWorkerRegistration, + task_source: &DOMManipulationTaskSource, +) { queue_settle_promise(job, SettleType::Resolve(Trusted::new(reg)), task_source) } |