Bug 1731274 [wpt PR 30792] - Add WebIDL.idl as a dependency for webtransport idlharne...
[gecko.git] / dom / serviceworkers / ServiceWorkerEvents.h
blob3a0fbf5ef3aa4e869cb23b777913b10bd3b45eea
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_dom_serviceworkerevents_h__
8 #define mozilla_dom_serviceworkerevents_h__
10 #include "mozilla/Attributes.h"
11 #include "mozilla/dom/Event.h"
12 #include "mozilla/dom/ExtendableEventBinding.h"
13 #include "mozilla/dom/ExtendableMessageEventBinding.h"
14 #include "mozilla/dom/FetchEventBinding.h"
15 #include "mozilla/dom/File.h"
16 #include "mozilla/dom/Promise.h"
17 #include "mozilla/dom/Response.h"
18 #include "mozilla/dom/WorkerCommon.h"
20 #include "nsProxyRelease.h"
21 #include "nsContentUtils.h"
23 class nsIInterceptedChannel;
25 namespace mozilla {
26 namespace dom {
28 class Blob;
29 class Client;
30 class FetchEventOp;
31 class MessagePort;
32 struct PushEventInit;
33 class Request;
34 class ResponseOrPromise;
35 class ServiceWorker;
36 class ServiceWorkerRegistrationInfo;
38 // Defined in ServiceWorker.cpp
39 bool ServiceWorkerVisible(JSContext* aCx, JSObject* aObj);
41 class CancelChannelRunnable final : public Runnable {
42 nsMainThreadPtrHandle<nsIInterceptedChannel> mChannel;
43 nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> mRegistration;
44 const nsresult mStatus;
46 public:
47 CancelChannelRunnable(
48 nsMainThreadPtrHandle<nsIInterceptedChannel>& aChannel,
49 nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo>& aRegistration,
50 nsresult aStatus);
52 NS_IMETHOD Run() override;
55 enum ExtendableEventResult { Rejected = 0, Resolved };
57 class ExtendableEventCallback {
58 public:
59 virtual void FinishedWithResult(ExtendableEventResult aResult) = 0;
61 NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
64 class ExtendableEvent : public Event {
65 public:
66 class ExtensionsHandler {
67 friend class ExtendableEvent;
69 public:
70 virtual bool WaitOnPromise(Promise& aPromise) = 0;
72 NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
74 protected:
75 virtual ~ExtensionsHandler();
77 // Also returns false if the owning ExtendableEvent is destroyed.
78 bool GetDispatchFlag() const;
80 private:
81 // Only the owning ExtendableEvent is allowed to set this data.
82 void SetExtendableEvent(const ExtendableEvent* const aExtendableEvent);
84 MOZ_NON_OWNING_REF const ExtendableEvent* mExtendableEvent = nullptr;
87 private:
88 RefPtr<ExtensionsHandler> mExtensionsHandler;
90 protected:
91 bool GetDispatchFlag() const { return mEvent->mFlags.mIsBeingDispatched; }
93 bool WaitOnPromise(Promise& aPromise);
95 explicit ExtendableEvent(mozilla::dom::EventTarget* aOwner);
97 ~ExtendableEvent() {
98 if (mExtensionsHandler) {
99 mExtensionsHandler->SetExtendableEvent(nullptr);
103 public:
104 NS_DECL_ISUPPORTS_INHERITED
106 void SetKeepAliveHandler(ExtensionsHandler* aExtensionsHandler);
108 virtual JSObject* WrapObjectInternal(
109 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override {
110 return mozilla::dom::ExtendableEvent_Binding::Wrap(aCx, this, aGivenProto);
113 static already_AddRefed<ExtendableEvent> Constructor(
114 mozilla::dom::EventTarget* aOwner, const nsAString& aType,
115 const EventInit& aOptions) {
116 RefPtr<ExtendableEvent> e = new ExtendableEvent(aOwner);
117 bool trusted = e->Init(aOwner);
118 e->InitEvent(aType, aOptions.mBubbles, aOptions.mCancelable);
119 e->SetTrusted(trusted);
120 e->SetComposed(aOptions.mComposed);
121 return e.forget();
124 static already_AddRefed<ExtendableEvent> Constructor(
125 const GlobalObject& aGlobal, const nsAString& aType,
126 const EventInit& aOptions) {
127 nsCOMPtr<EventTarget> target = do_QueryInterface(aGlobal.GetAsSupports());
128 return Constructor(target, aType, aOptions);
131 void WaitUntil(JSContext* aCx, Promise& aPromise, ErrorResult& aRv);
133 virtual ExtendableEvent* AsExtendableEvent() override { return this; }
136 class FetchEvent final : public ExtendableEvent {
137 RefPtr<FetchEventOp> mRespondWithHandler;
138 nsMainThreadPtrHandle<nsIInterceptedChannel> mChannel;
139 nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> mRegistration;
140 RefPtr<Request> mRequest;
141 RefPtr<Promise> mHandled;
142 nsCString mScriptSpec;
143 nsCString mPreventDefaultScriptSpec;
144 nsString mClientId;
145 nsString mResultingClientId;
146 uint32_t mPreventDefaultLineNumber;
147 uint32_t mPreventDefaultColumnNumber;
148 bool mWaitToRespond;
150 protected:
151 explicit FetchEvent(EventTarget* aOwner);
152 ~FetchEvent();
154 public:
155 NS_DECL_ISUPPORTS_INHERITED
156 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(FetchEvent, ExtendableEvent)
158 virtual JSObject* WrapObjectInternal(
159 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override {
160 return FetchEvent_Binding::Wrap(aCx, this, aGivenProto);
163 void PostInit(
164 nsMainThreadPtrHandle<nsIInterceptedChannel>& aChannel,
165 nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo>& aRegistration,
166 const nsACString& aScriptSpec);
168 void PostInit(const nsACString& aScriptSpec,
169 RefPtr<FetchEventOp> aRespondWithHandler);
171 static already_AddRefed<FetchEvent> Constructor(
172 const GlobalObject& aGlobal, const nsAString& aType,
173 const FetchEventInit& aOptions);
175 bool WaitToRespond() const { return mWaitToRespond; }
177 Request* Request_() const {
178 MOZ_ASSERT(mRequest);
179 return mRequest;
182 void GetClientId(nsAString& aClientId) const { aClientId = mClientId; }
184 void GetResultingClientId(nsAString& aResultingClientId) const {
185 aResultingClientId = mResultingClientId;
188 Promise* Handled() const { return mHandled; }
190 void RespondWith(JSContext* aCx, Promise& aArg, ErrorResult& aRv);
192 // Pull in the Event version of PreventDefault so we don't get
193 // shadowing warnings.
194 using Event::PreventDefault;
195 void PreventDefault(JSContext* aCx, CallerType aCallerType) override;
197 void ReportCanceled();
200 class PushMessageData final : public nsISupports, public nsWrapperCache {
201 public:
202 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
203 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PushMessageData)
205 virtual JSObject* WrapObject(JSContext* aCx,
206 JS::Handle<JSObject*> aGivenProto) override;
208 nsIGlobalObject* GetParentObject() const { return mOwner; }
210 void Json(JSContext* cx, JS::MutableHandle<JS::Value> aRetval,
211 ErrorResult& aRv);
212 void Text(nsAString& aData);
213 void ArrayBuffer(JSContext* cx, JS::MutableHandle<JSObject*> aRetval,
214 ErrorResult& aRv);
215 already_AddRefed<mozilla::dom::Blob> Blob(ErrorResult& aRv);
217 PushMessageData(nsIGlobalObject* aOwner, nsTArray<uint8_t>&& aBytes);
219 private:
220 nsCOMPtr<nsIGlobalObject> mOwner;
221 nsTArray<uint8_t> mBytes;
222 nsString mDecodedText;
223 ~PushMessageData();
225 nsresult EnsureDecodedText();
226 uint8_t* GetContentsCopy();
229 class PushEvent final : public ExtendableEvent {
230 RefPtr<PushMessageData> mData;
232 protected:
233 explicit PushEvent(mozilla::dom::EventTarget* aOwner);
234 ~PushEvent() = default;
236 public:
237 NS_DECL_ISUPPORTS_INHERITED
238 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PushEvent, ExtendableEvent)
240 virtual JSObject* WrapObjectInternal(
241 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
243 static already_AddRefed<PushEvent> Constructor(
244 mozilla::dom::EventTarget* aOwner, const nsAString& aType,
245 const PushEventInit& aOptions, ErrorResult& aRv);
247 static already_AddRefed<PushEvent> Constructor(const GlobalObject& aGlobal,
248 const nsAString& aType,
249 const PushEventInit& aOptions,
250 ErrorResult& aRv) {
251 nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports());
252 return Constructor(owner, aType, aOptions, aRv);
255 PushMessageData* GetData() const { return mData; }
258 class ExtendableMessageEvent final : public ExtendableEvent {
259 JS::Heap<JS::Value> mData;
260 nsString mOrigin;
261 nsString mLastEventId;
262 RefPtr<Client> mClient;
263 RefPtr<ServiceWorker> mServiceWorker;
264 RefPtr<MessagePort> mMessagePort;
265 nsTArray<RefPtr<MessagePort>> mPorts;
267 protected:
268 explicit ExtendableMessageEvent(EventTarget* aOwner);
269 ~ExtendableMessageEvent();
271 public:
272 NS_DECL_ISUPPORTS_INHERITED
273 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(ExtendableMessageEvent,
274 ExtendableEvent)
276 virtual JSObject* WrapObjectInternal(
277 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override {
278 return mozilla::dom::ExtendableMessageEvent_Binding::Wrap(aCx, this,
279 aGivenProto);
282 static already_AddRefed<ExtendableMessageEvent> Constructor(
283 mozilla::dom::EventTarget* aOwner, const nsAString& aType,
284 const ExtendableMessageEventInit& aOptions);
286 static already_AddRefed<ExtendableMessageEvent> Constructor(
287 const GlobalObject& aGlobal, const nsAString& aType,
288 const ExtendableMessageEventInit& aOptions);
290 void GetData(JSContext* aCx, JS::MutableHandle<JS::Value> aData,
291 ErrorResult& aRv);
293 void GetSource(
294 Nullable<OwningClientOrServiceWorkerOrMessagePort>& aValue) const;
296 void GetOrigin(nsAString& aOrigin) const { aOrigin = mOrigin; }
298 void GetLastEventId(nsAString& aLastEventId) const {
299 aLastEventId = mLastEventId;
302 void GetPorts(nsTArray<RefPtr<MessagePort>>& aPorts);
305 } // namespace dom
306 } // namespace mozilla
308 #endif /* mozilla_dom_serviceworkerevents_h__ */