15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_COORDINATOR_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_COORDINATOR_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <deque> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/service_worker_register_job.h" 12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_unregister_job.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/content_export.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "url/gurl.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EmbeddedWorkerRegistry; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ServiceWorkerProviderHost; 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ServiceWorkerRegistration; 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ServiceWorkerStorage; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// This class manages all in-flight registration or unregistration jobs. 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT ServiceWorkerJobCoordinator { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit ServiceWorkerJobCoordinator( 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::WeakPtr<ServiceWorkerContextCore> context); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ~ServiceWorkerJobCoordinator(); 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Register(const GURL& pattern, 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& script_url, 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceWorkerProviderHost* provider_host, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ServiceWorkerRegisterJob::RegistrationCallback& callback); 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Unregister( 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& pattern, 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const ServiceWorkerUnregisterJob::UnregistrationCallback& callback); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Update(ServiceWorkerRegistration* registration); 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Calls ServiceWorkerRegisterJobBase::Abort() on all jobs and removes them. 426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void AbortAll(); 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Removes the job. A job that was not aborted must call FinishJob when it is 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // done. 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void FinishJob(const GURL& pattern, ServiceWorkerRegisterJobBase* job); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class JobQueue { 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JobQueue(); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ~JobQueue(); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Adds a job to the queue. If an identical job is already in the queue, no 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // new job is added. Returns the job in the queue, regardless of whether it 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // was newly added. 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceWorkerRegisterJobBase* Push( 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_ptr<ServiceWorkerRegisterJobBase> job); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Removes a job from the queue. 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void Pop(ServiceWorkerRegisterJobBase* job); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool empty() { return jobs_.empty(); } 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Aborts all jobs in the queue and removes them. 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void AbortAll(); 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Marks that the browser is shutting down, so jobs may be destroyed before 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // finishing. 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void ClearForShutdown(); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::deque<ServiceWorkerRegisterJobBase*> jobs_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::map<GURL, JobQueue> RegistrationJobMap; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The ServiceWorkerContextCore object should always outlive the 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // job coordinator, the core owns the coordinator. 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::WeakPtr<ServiceWorkerContextCore> context_; 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) RegistrationJobMap job_queues_; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ServiceWorkerJobCoordinator); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_COORDINATOR_H_ 89