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_workerscope_h__
8 #define mozilla_dom_workerscope_h__
10 #include "mozilla/Attributes.h"
11 #include "mozilla/dom/WorkerCommon.h"
12 #include "mozilla/DOMEventTargetHelper.h"
13 #include "mozilla/dom/DebuggerNotificationManager.h"
14 #include "mozilla/dom/Headers.h"
15 #include "mozilla/dom/RequestBinding.h"
16 #include "nsWeakReference.h"
17 #include "mozilla/dom/ImageBitmapSource.h"
27 struct ChannelPixelLayout
;
35 enum class ImageBitmapFormat
: uint8_t;
37 struct PostMessageOptions
;
39 class RequestOrUSVString
;
41 class WorkerNavigator
;
43 enum class CallerType
: uint32_t;
51 class WorkerGlobalScope
: public DOMEventTargetHelper
,
52 public nsIGlobalObject
,
53 public nsSupportsWeakReference
{
54 typedef mozilla::dom::IDBFactory IDBFactory
;
56 RefPtr
<Console
> mConsole
;
57 RefPtr
<Crypto
> mCrypto
;
58 RefPtr
<WorkerLocation
> mLocation
;
59 RefPtr
<WorkerNavigator
> mNavigator
;
60 RefPtr
<Performance
> mPerformance
;
61 RefPtr
<IDBFactory
> mIndexedDB
;
62 RefPtr
<cache::CacheStorage
> mCacheStorage
;
63 nsCOMPtr
<nsISerialEventTarget
> mSerialEventTarget
;
64 RefPtr
<mozilla::dom::DebuggerNotificationManager
>
65 mDebuggerNotificationManager
;
67 uint32_t mWindowInteractionsAllowed
;
70 WorkerPrivate
* mWorkerPrivate
;
72 explicit WorkerGlobalScope(WorkerPrivate
* aWorkerPrivate
);
73 virtual ~WorkerGlobalScope();
76 int32_t SetTimeoutOrInterval(JSContext
* aCx
, Function
& aHandler
,
77 const int32_t aTimeout
,
78 const Sequence
<JS::Value
>& aArguments
,
79 bool aIsInterval
, ErrorResult
& aRv
);
81 int32_t SetTimeoutOrInterval(JSContext
* aCx
, const nsAString
& aHandler
,
82 const int32_t aTimeout
, bool aIsInterval
,
86 virtual JSObject
* WrapObject(JSContext
* aCx
,
87 JS::Handle
<JSObject
*> aGivenProto
) override
;
89 virtual bool WrapGlobalObject(JSContext
* aCx
,
90 JS::MutableHandle
<JSObject
*> aReflector
) = 0;
92 JSObject
* GetGlobalJSObject() override
{ return GetWrapper(); }
93 JSObject
* GetGlobalJSObjectPreserveColor() const override
{
94 return GetWrapperPreserveColor();
97 NS_DECL_ISUPPORTS_INHERITED
98 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerGlobalScope
,
101 WorkerGlobalScope
* Self() { return this; }
103 void NoteTerminating();
105 already_AddRefed
<Console
> GetConsole(ErrorResult
& aRv
);
107 Console
* GetConsoleIfExists() const { return mConsole
; }
109 Crypto
* GetCrypto(ErrorResult
& aError
);
111 already_AddRefed
<WorkerLocation
> Location();
113 already_AddRefed
<WorkerNavigator
> Navigator();
115 already_AddRefed
<WorkerNavigator
> GetExistingNavigator() const;
117 OnErrorEventHandlerNonNull
* GetOnerror();
118 void SetOnerror(OnErrorEventHandlerNonNull
* aHandler
);
120 void ImportScripts(JSContext
* aCx
, const Sequence
<nsString
>& aScriptURLs
,
124 int32_t SetTimeout(JSContext
* aCx
, Function
& aHandler
, const int32_t aTimeout
,
125 const Sequence
<JS::Value
>& aArguments
, ErrorResult
& aRv
);
127 int32_t SetTimeout(JSContext
* aCx
, const nsAString
& aHandler
,
128 const int32_t aTimeout
,
129 const Sequence
<JS::Value
>& /* unused */, ErrorResult
& aRv
);
131 void ClearTimeout(int32_t aHandle
);
133 int32_t SetInterval(JSContext
* aCx
, Function
& aHandler
,
134 const int32_t aTimeout
,
135 const Sequence
<JS::Value
>& aArguments
, ErrorResult
& aRv
);
137 int32_t SetInterval(JSContext
* aCx
, const nsAString
& aHandler
,
138 const int32_t aTimeout
,
139 const Sequence
<JS::Value
>& /* unused */,
142 void ClearInterval(int32_t aHandle
);
144 void GetOrigin(nsAString
& aOrigin
) const;
145 bool CrossOriginIsolated() const;
147 void Atob(const nsAString
& aAtob
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
148 void Btoa(const nsAString
& aBtoa
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
150 IMPL_EVENT_HANDLER(online
)
151 IMPL_EVENT_HANDLER(offline
)
152 IMPL_EVENT_HANDLER(languagechange
)
153 IMPL_EVENT_HANDLER(rejectionhandled
)
154 IMPL_EVENT_HANDLER(unhandledrejection
)
156 void Dump(const Optional
<nsAString
>& aString
) const;
158 Performance
* GetPerformance();
160 Performance
* GetPerformanceIfExists() const { return mPerformance
; }
162 static bool IsInAutomation(JSContext
* aCx
, JSObject
* /* unused */);
163 void GetJSTestingFunctions(JSContext
* aCx
,
164 JS::MutableHandle
<JSObject
*> aFunctions
,
167 already_AddRefed
<Promise
> Fetch(const RequestOrUSVString
& aInput
,
168 const RequestInit
& aInit
,
169 CallerType aCallerType
, ErrorResult
& aRv
);
171 already_AddRefed
<IDBFactory
> GetIndexedDB(ErrorResult
& aErrorResult
);
173 already_AddRefed
<cache::CacheStorage
> GetCaches(ErrorResult
& aRv
);
175 bool IsSecureContext() const;
177 already_AddRefed
<Promise
> CreateImageBitmap(JSContext
* aCx
,
178 const ImageBitmapSource
& aImage
,
181 already_AddRefed
<Promise
> CreateImageBitmap(JSContext
* aCx
,
182 const ImageBitmapSource
& aImage
,
183 int32_t aSx
, int32_t aSy
,
184 int32_t aSw
, int32_t aSh
,
187 bool WindowInteractionAllowed() const {
188 return mWindowInteractionsAllowed
> 0;
191 void AllowWindowInteraction() { mWindowInteractionsAllowed
++; }
193 void ConsumeWindowInteraction() {
194 MOZ_ASSERT(mWindowInteractionsAllowed
> 0);
195 mWindowInteractionsAllowed
--;
198 // Override DispatchTrait API to target the worker thread. Dispatch may
199 // return failure if the worker thread is not alive.
200 nsresult
Dispatch(TaskCategory aCategory
,
201 already_AddRefed
<nsIRunnable
>&& aRunnable
) override
;
203 nsISerialEventTarget
* EventTargetFor(TaskCategory aCategory
) const override
;
205 AbstractThread
* AbstractMainThreadFor(TaskCategory aCategory
) override
;
207 mozilla::dom::DebuggerNotificationManager
*
208 GetOrCreateDebuggerNotificationManager() override
;
210 mozilla::dom::DebuggerNotificationManager
*
211 GetExistingDebuggerNotificationManager() override
;
213 mozilla::Maybe
<mozilla::dom::EventCallbackDebuggerNotificationType
>
214 GetDebuggerNotificationType() const override
{
215 return mozilla::Some(
216 mozilla::dom::EventCallbackDebuggerNotificationType::Global
);
219 Maybe
<ClientInfo
> GetClientInfo() const override
;
221 Maybe
<ClientState
> GetClientState() const;
223 Maybe
<ServiceWorkerDescriptor
> GetController() const override
;
225 RefPtr
<mozilla::dom::ServiceWorkerRegistration
> GetServiceWorkerRegistration(
226 const ServiceWorkerRegistrationDescriptor
& aDescriptor
) const override
;
228 RefPtr
<mozilla::dom::ServiceWorkerRegistration
>
229 GetOrCreateServiceWorkerRegistration(
230 const ServiceWorkerRegistrationDescriptor
& aDescriptor
) override
;
232 uint64_t WindowID() const;
234 void FirstPartyStorageAccessGranted();
237 class DedicatedWorkerGlobalScope final
: public WorkerGlobalScope
{
238 const nsString mName
;
240 ~DedicatedWorkerGlobalScope() {}
243 DedicatedWorkerGlobalScope(WorkerPrivate
* aWorkerPrivate
,
244 const nsString
& aName
);
246 virtual bool WrapGlobalObject(
247 JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aReflector
) override
;
249 void GetName(DOMString
& aName
) const { aName
.AsAString() = mName
; }
251 void PostMessage(JSContext
* aCx
, JS::Handle
<JS::Value
> aMessage
,
252 const Sequence
<JSObject
*>& aTransferable
, ErrorResult
& aRv
);
253 void PostMessage(JSContext
* aCx
, JS::Handle
<JS::Value
> aMessage
,
254 const PostMessageOptions
& aOptions
, ErrorResult
& aRv
);
258 IMPL_EVENT_HANDLER(message
)
259 IMPL_EVENT_HANDLER(messageerror
)
262 class SharedWorkerGlobalScope final
: public WorkerGlobalScope
{
263 const nsString mName
;
265 ~SharedWorkerGlobalScope() {}
268 SharedWorkerGlobalScope(WorkerPrivate
* aWorkerPrivate
, const nsString
& aName
);
270 virtual bool WrapGlobalObject(
271 JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aReflector
) override
;
273 void GetName(DOMString
& aName
) const { aName
.AsAString() = mName
; }
277 IMPL_EVENT_HANDLER(connect
)
280 class ServiceWorkerGlobalScope final
: public WorkerGlobalScope
{
281 const nsString mScope
;
282 RefPtr
<Clients
> mClients
;
283 RefPtr
<ServiceWorkerRegistration
> mRegistration
;
285 ~ServiceWorkerGlobalScope();
288 NS_DECL_ISUPPORTS_INHERITED
289 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerGlobalScope
,
291 IMPL_EVENT_HANDLER(notificationclick
)
292 IMPL_EVENT_HANDLER(notificationclose
)
294 ServiceWorkerGlobalScope(
295 WorkerPrivate
* aWorkerPrivate
,
296 const ServiceWorkerRegistrationDescriptor
& aRegistrationDescriptor
);
298 virtual bool WrapGlobalObject(
299 JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aReflector
) override
;
301 void GetScope(nsString
& aScope
) const { aScope
= mScope
; }
303 already_AddRefed
<Clients
> GetClients();
305 ServiceWorkerRegistration
* Registration();
307 already_AddRefed
<Promise
> SkipWaiting(ErrorResult
& aRv
);
309 IMPL_EVENT_HANDLER(activate
)
310 IMPL_EVENT_HANDLER(install
)
311 IMPL_EVENT_HANDLER(message
)
312 IMPL_EVENT_HANDLER(messageerror
)
314 IMPL_EVENT_HANDLER(push
)
315 IMPL_EVENT_HANDLER(pushsubscriptionchange
)
317 EventHandlerNonNull
* GetOnfetch();
319 void SetOnfetch(mozilla::dom::EventHandlerNonNull
* aCallback
);
321 void EventListenerAdded(nsAtom
* aType
) override
;
324 class WorkerDebuggerGlobalScope final
: public DOMEventTargetHelper
,
325 public nsIGlobalObject
{
326 WorkerPrivate
* mWorkerPrivate
;
327 RefPtr
<Console
> mConsole
;
328 nsCOMPtr
<nsISerialEventTarget
> mSerialEventTarget
;
331 explicit WorkerDebuggerGlobalScope(WorkerPrivate
* aWorkerPrivate
);
333 NS_DECL_ISUPPORTS_INHERITED
334 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
335 WorkerDebuggerGlobalScope
, DOMEventTargetHelper
)
337 virtual JSObject
* WrapObject(JSContext
* aCx
,
338 JS::Handle
<JSObject
*> aGivenProto
) override
{
339 MOZ_CRASH("Shouldn't get here!");
342 virtual bool WrapGlobalObject(JSContext
* aCx
,
343 JS::MutableHandle
<JSObject
*> aReflector
);
345 JSObject
* GetGlobalJSObject(void) override
{ return GetWrapper(); }
346 JSObject
* GetGlobalJSObjectPreserveColor(void) const override
{
347 return GetWrapperPreserveColor();
350 void GetGlobal(JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aGlobal
,
353 void CreateSandbox(JSContext
* aCx
, const nsAString
& aName
,
354 JS::Handle
<JSObject
*> aPrototype
,
355 JS::MutableHandle
<JSObject
*> aResult
, ErrorResult
& aRv
);
357 void LoadSubScript(JSContext
* aCx
, const nsAString
& aURL
,
358 const Optional
<JS::Handle
<JSObject
*>>& aSandbox
,
361 MOZ_CAN_RUN_SCRIPT
void EnterEventLoop();
363 void LeaveEventLoop();
365 void PostMessage(const nsAString
& aMessage
);
367 IMPL_EVENT_HANDLER(message
)
368 IMPL_EVENT_HANDLER(messageerror
)
370 void SetImmediate(Function
& aHandler
, ErrorResult
& aRv
);
372 void ReportError(JSContext
* aCx
, const nsAString
& aMessage
);
374 void RetrieveConsoleEvents(JSContext
* aCx
, nsTArray
<JS::Value
>& aEvents
,
377 void SetConsoleEventHandler(JSContext
* aCx
, AnyCallback
* aHandler
,
380 already_AddRefed
<Console
> GetConsole(ErrorResult
& aRv
);
382 Console
* GetConsoleIfExists() const { return mConsole
; }
384 void Dump(JSContext
* aCx
, const Optional
<nsAString
>& aString
) const;
386 void Atob(const nsAString
& aAtob
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
387 void Btoa(const nsAString
& aBtoa
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
389 // Override DispatchTrait API to target the worker thread. Dispatch may
390 // return failure if the worker thread is not alive.
391 nsresult
Dispatch(TaskCategory aCategory
,
392 already_AddRefed
<nsIRunnable
>&& aRunnable
) override
;
394 nsISerialEventTarget
* EventTargetFor(TaskCategory aCategory
) const override
;
396 AbstractThread
* AbstractMainThreadFor(TaskCategory aCategory
) override
;
399 virtual ~WorkerDebuggerGlobalScope();
403 } // namespace mozilla
405 inline nsISupports
* ToSupports(mozilla::dom::WorkerGlobalScope
* aScope
) {
406 return static_cast<mozilla::dom::EventTarget
*>(aScope
);
409 #endif /* mozilla_dom_workerscope_h__ */