1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTER_JOB_H_
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTER_JOB_H_
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_register_job_base.h"
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_registration.h"
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/common/service_worker/service_worker_status_code.h"
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "url/gurl.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace content {
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ServiceWorkerJobCoordinator;
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ServiceWorkerStorage;
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Handles the registration of a Service Worker.
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// The registration flow includes most or all of the following,
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// depending on what is already registered:
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - creating a ServiceWorkerRegistration instance if there isn't
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//    already something registered
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - creating a ServiceWorkerVersion for the new registration instance.
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - starting a worker for the ServiceWorkerVersion
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - telling the Version to evaluate the script
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - firing the 'install' event at the ServiceWorkerVersion
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - firing the 'activate' event at the ServiceWorkerVersion
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - waiting for older ServiceWorkerVersions to deactivate
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//  - designating the new version to be the 'active' version
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ServiceWorkerRegisterJob : public ServiceWorkerRegisterJobBase {
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef base::Callback<void(ServiceWorkerStatusCode status,
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              ServiceWorkerRegistration* registration,
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              ServiceWorkerVersion* version)>
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      RegistrationCallback;
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CONTENT_EXPORT ServiceWorkerRegisterJob(
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::WeakPtr<ServiceWorkerContextCore> context,
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& pattern,
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& script_url);
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual ~ServiceWorkerRegisterJob();
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Registers a callback to be called when the promise would resolve (whether
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // successfully or not). Multiple callbacks may be registered. If |process_id|
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // is not -1, it's added to the existing clients when deciding in which
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // process to create the Service Worker instance.  If there are no existing
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // clients, a new RenderProcessHost will be created.
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AddCallback(const RegistrationCallback& callback, int process_id);
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // ServiceWorkerRegisterJobBase implementation:
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void Start() OVERRIDE;
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void Abort() OVERRIDE;
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool Equals(ServiceWorkerRegisterJobBase* job) OVERRIDE;
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual RegistrationJobType GetType() OVERRIDE;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ServiceWorkerProviderHostWaitingVersionTest,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           AssociateWaitingVersionToDocuments);
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ServiceWorkerProviderHostWaitingVersionTest,
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           DisassociateWaitingVersionFromDocuments);
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  enum Phase {
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     INITIAL,
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     START,
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     REGISTER,
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     UPDATE,
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     INSTALL,
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     STORE,
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     ACTIVATE,
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)     COMPLETE,
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)     ABORT,
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Holds internal state of ServiceWorkerRegistrationJob, to compel use of the
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // getter/setter functions.
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  struct Internal {
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Internal();
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ~Internal();
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    scoped_refptr<ServiceWorkerRegistration> registration;
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Holds 'installing' or 'waiting' version depending on the phase.
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    scoped_refptr<ServiceWorkerVersion> pending_version;
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void set_registration(ServiceWorkerRegistration* registration);
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerRegistration* registration();
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void set_pending_version(ServiceWorkerVersion* version);
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersion* pending_version();
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void SetPhase(Phase phase);
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void HandleExistingRegistrationAndContinue(
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ServiceWorkerStatusCode status,
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      const scoped_refptr<ServiceWorkerRegistration>& registration);
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void RegisterAndContinue(ServiceWorkerStatusCode status);
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void UpdateAndContinue(ServiceWorkerStatusCode status);
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnStartWorkerFinished(ServiceWorkerStatusCode status);
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void OnStoreRegistrationComplete(ServiceWorkerStatusCode status);
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void InstallAndContinue();
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnInstallFinished(ServiceWorkerStatusCode status);
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void ActivateAndContinue();
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnActivateFinished(ServiceWorkerStatusCode status);
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Complete(ServiceWorkerStatusCode status);
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void CompleteInternal(ServiceWorkerStatusCode status);
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void ResolvePromise(ServiceWorkerStatusCode status,
1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      ServiceWorkerRegistration* registration,
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      ServiceWorkerVersion* version);
1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Associates a waiting version to documents matched with a scope of the
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // version.
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CONTENT_EXPORT static void AssociateWaitingVersionToDocuments(
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::WeakPtr<ServiceWorkerContextCore> context,
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ServiceWorkerVersion* version);
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Disassociates a waiting version specified by |version_id| from documents.
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CONTENT_EXPORT static void DisassociateWaitingVersionFromDocuments(
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::WeakPtr<ServiceWorkerContextCore> context,
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int64 version_id);
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The ServiceWorkerContextCore object should always outlive this.
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtr<ServiceWorkerContextCore> context_;
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GURL pattern_;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GURL script_url_;
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<RegistrationCallback> callbacks_;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<int> pending_process_ids_;
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Phase phase_;
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Internal internal_;
1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool is_promise_resolved_;
1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ServiceWorkerStatusCode promise_resolved_status_;
1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<ServiceWorkerRegistration> promise_resolved_registration_;
1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<ServiceWorkerVersion> promise_resolved_version_;
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::WeakPtrFactory<ServiceWorkerRegisterJob> weak_factory_;
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegisterJob);
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
142e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace content
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTER_JOB_H_
146