File: ServiceWorkerRegistrationImpl.h

package info (click to toggle)
thunderbird 1:60.8.0-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,339,208 kB
  • sloc: cpp: 5,456,704; ansic: 2,360,384; python: 596,095; asm: 340,963; java: 326,291; xml: 258,664; sh: 84,366; makefile: 23,702; perl: 17,317; objc: 3,768; yacc: 1,766; ada: 1,681; lex: 1,364; pascal: 1,264; cs: 879; exp: 527; php: 436; lisp: 258; ruby: 153; awk: 152; sed: 53; csh: 27
file content (141 lines) | stat: -rw-r--r-- 4,440 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/Unused.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIDocument.h"
#include "nsPIDOMWindow.h"
#include "ServiceWorkerManager.h"
#include "ServiceWorkerRegistration.h"
#include "ServiceWorkerRegistrationListener.h"

namespace mozilla {
namespace dom {

class Promise;
class PushManager;
class ServiceWorker;

////////////////////////////////////////////////////
// Main Thread implementation

class ServiceWorkerRegistrationMainThread final
    : public ServiceWorkerRegistration::Inner,
      public ServiceWorkerRegistrationListener {
 public:
  NS_INLINE_DECL_REFCOUNTING(ServiceWorkerRegistrationMainThread, override)

  explicit ServiceWorkerRegistrationMainThread(
      const ServiceWorkerRegistrationDescriptor& aDescriptor);

  // ServiceWorkerRegistration::Inner
  void SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;

  void ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;

  already_AddRefed<Promise> Update(ErrorResult& aRv) override;

  already_AddRefed<Promise> Unregister(ErrorResult& aRv) override;

  already_AddRefed<Promise> ShowNotification(
      JSContext* aCx, const nsAString& aTitle,
      const NotificationOptions& aOptions, ErrorResult& aRv) override;

  already_AddRefed<Promise> GetNotifications(
      const GetNotificationOptions& aOptions, ErrorResult& aRv) override;

  already_AddRefed<PushManager> GetPushManager(JSContext* aCx,
                                               ErrorResult& aRv) override;

  // ServiceWorkerRegistrationListener
  void UpdateFound() override;

  void UpdateState(
      const ServiceWorkerRegistrationDescriptor& aDescriptor) override;

  void RegistrationRemoved() override;

  void GetScope(nsAString& aScope) const override { aScope = mScope; }

  bool MatchesDescriptor(
      const ServiceWorkerRegistrationDescriptor& aDescriptor) override;

 private:
  ~ServiceWorkerRegistrationMainThread();

  void StartListeningForEvents();

  void StopListeningForEvents();

  void RegistrationRemovedInternal();

  RefPtr<ServiceWorkerRegistration> mOuter;
  const nsString mScope;
  bool mListeningForEvents;
};

////////////////////////////////////////////////////
// Worker Thread implementation

class WorkerListener;

class ServiceWorkerRegistrationWorkerThread final
    : public ServiceWorkerRegistration::Inner,
      public WorkerHolder {
 public:
  NS_INLINE_DECL_REFCOUNTING(ServiceWorkerRegistrationWorkerThread, override)

  ServiceWorkerRegistrationWorkerThread(
      WorkerPrivate* aWorkerPrivate,
      const ServiceWorkerRegistrationDescriptor& aDescriptor);

  void RegistrationRemoved();

  // ServiceWorkerRegistration::Inner
  void SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;

  void ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;

  already_AddRefed<Promise> Update(ErrorResult& aRv) override;

  already_AddRefed<Promise> Unregister(ErrorResult& aRv) override;

  already_AddRefed<Promise> ShowNotification(
      JSContext* aCx, const nsAString& aTitle,
      const NotificationOptions& aOptions, ErrorResult& aRv) override;

  already_AddRefed<Promise> GetNotifications(
      const GetNotificationOptions& aOptions, ErrorResult& aRv) override;

  already_AddRefed<PushManager> GetPushManager(JSContext* aCx,
                                               ErrorResult& aRv) override;

  // WorkerHolder
  bool Notify(WorkerStatus aStatus) override;

  void UpdateFound();

 private:
  ~ServiceWorkerRegistrationWorkerThread();

  void InitListener();

  void ReleaseListener();

  // Store a strong reference to the outer binding object.  This will create
  // a ref-cycle.  We must hold it alive in case any events need to be fired
  // on it.  The cycle is broken when the global becomes detached or the
  // registration is removed in the ServiceWorkerManager.
  RefPtr<ServiceWorkerRegistration> mOuter;

  WorkerPrivate* mWorkerPrivate;
  const nsString mScope;
  RefPtr<WorkerListener> mListener;
};

}  // namespace dom
}  // namespace mozilla