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/DOMPrefs.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
;
65 uint32_t mWindowInteractionsAllowed
;
68 WorkerPrivate
* mWorkerPrivate
;
70 explicit WorkerGlobalScope(WorkerPrivate
* aWorkerPrivate
);
71 virtual ~WorkerGlobalScope();
74 virtual JSObject
* WrapObject(JSContext
* aCx
,
75 JS::Handle
<JSObject
*> aGivenProto
) override
;
77 virtual bool WrapGlobalObject(JSContext
* aCx
,
78 JS::MutableHandle
<JSObject
*> aReflector
) = 0;
80 JSObject
* GetGlobalJSObject() override
{ return GetWrapper(); }
81 JSObject
* GetGlobalJSObjectPreserveColor() const override
{
82 return GetWrapperPreserveColor();
85 NS_DECL_ISUPPORTS_INHERITED
86 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerGlobalScope
,
89 WorkerGlobalScope
* Self() { return this; }
91 void NoteTerminating();
93 already_AddRefed
<Console
> GetConsole(ErrorResult
& aRv
);
95 Console
* GetConsoleIfExists() const { return mConsole
; }
97 Crypto
* GetCrypto(ErrorResult
& aError
);
99 already_AddRefed
<WorkerLocation
> Location();
101 already_AddRefed
<WorkerNavigator
> Navigator();
103 already_AddRefed
<WorkerNavigator
> GetExistingNavigator() const;
105 OnErrorEventHandlerNonNull
* GetOnerror();
106 void SetOnerror(OnErrorEventHandlerNonNull
* aHandler
);
108 void ImportScripts(JSContext
* aCx
, const Sequence
<nsString
>& aScriptURLs
,
111 int32_t SetTimeout(JSContext
* aCx
, Function
& aHandler
, const int32_t aTimeout
,
112 const Sequence
<JS::Value
>& aArguments
, ErrorResult
& aRv
);
113 int32_t SetTimeout(JSContext
* aCx
, const nsAString
& aHandler
,
114 const int32_t aTimeout
,
115 const Sequence
<JS::Value
>& /* unused */, ErrorResult
& aRv
);
116 void ClearTimeout(int32_t aHandle
);
117 int32_t SetInterval(JSContext
* aCx
, Function
& aHandler
,
118 const int32_t aTimeout
,
119 const Sequence
<JS::Value
>& aArguments
, ErrorResult
& aRv
);
120 int32_t SetInterval(JSContext
* aCx
, const nsAString
& aHandler
,
121 const int32_t aTimeout
,
122 const Sequence
<JS::Value
>& /* unused */,
124 void ClearInterval(int32_t aHandle
);
126 void GetOrigin(nsAString
& aOrigin
) const;
128 void Atob(const nsAString
& aAtob
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
129 void Btoa(const nsAString
& aBtoa
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
131 IMPL_EVENT_HANDLER(online
)
132 IMPL_EVENT_HANDLER(offline
)
133 IMPL_EVENT_HANDLER(rejectionhandled
)
134 IMPL_EVENT_HANDLER(unhandledrejection
)
136 void Dump(const Optional
<nsAString
>& aString
) const;
138 Performance
* GetPerformance();
140 Performance
* GetPerformanceIfExists() const { return mPerformance
; }
142 static bool IsInAutomation(JSContext
* aCx
, JSObject
* /* unused */);
143 void GetJSTestingFunctions(JSContext
* aCx
,
144 JS::MutableHandle
<JSObject
*> aFunctions
,
147 already_AddRefed
<Promise
> Fetch(const RequestOrUSVString
& aInput
,
148 const RequestInit
& aInit
,
149 CallerType aCallerType
, ErrorResult
& aRv
);
151 already_AddRefed
<IDBFactory
> GetIndexedDB(ErrorResult
& aErrorResult
);
153 already_AddRefed
<cache::CacheStorage
> GetCaches(ErrorResult
& aRv
);
155 bool IsSecureContext() const;
157 already_AddRefed
<Promise
> CreateImageBitmap(JSContext
* aCx
,
158 const ImageBitmapSource
& aImage
,
161 already_AddRefed
<Promise
> CreateImageBitmap(JSContext
* aCx
,
162 const ImageBitmapSource
& aImage
,
163 int32_t aSx
, int32_t aSy
,
164 int32_t aSw
, int32_t aSh
,
167 bool WindowInteractionAllowed() const {
168 return mWindowInteractionsAllowed
> 0;
171 void AllowWindowInteraction() { mWindowInteractionsAllowed
++; }
173 void ConsumeWindowInteraction() {
174 MOZ_ASSERT(mWindowInteractionsAllowed
> 0);
175 mWindowInteractionsAllowed
--;
178 // Override DispatchTrait API to target the worker thread. Dispatch may
179 // return failure if the worker thread is not alive.
180 nsresult
Dispatch(TaskCategory aCategory
,
181 already_AddRefed
<nsIRunnable
>&& aRunnable
) override
;
183 nsISerialEventTarget
* EventTargetFor(TaskCategory aCategory
) const override
;
185 AbstractThread
* AbstractMainThreadFor(TaskCategory aCategory
) override
;
187 Maybe
<ClientInfo
> GetClientInfo() const override
;
189 Maybe
<ClientState
> GetClientState() const;
191 Maybe
<ServiceWorkerDescriptor
> GetController() const override
;
193 RefPtr
<mozilla::dom::ServiceWorkerRegistration
> GetServiceWorkerRegistration(
194 const ServiceWorkerRegistrationDescriptor
& aDescriptor
) const override
;
196 RefPtr
<mozilla::dom::ServiceWorkerRegistration
>
197 GetOrCreateServiceWorkerRegistration(
198 const ServiceWorkerRegistrationDescriptor
& aDescriptor
) override
;
200 void FirstPartyStorageAccessGranted();
203 class DedicatedWorkerGlobalScope final
: public WorkerGlobalScope
{
204 const nsString mName
;
206 ~DedicatedWorkerGlobalScope() {}
209 DedicatedWorkerGlobalScope(WorkerPrivate
* aWorkerPrivate
,
210 const nsString
& aName
);
212 virtual bool WrapGlobalObject(
213 JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aReflector
) override
;
215 void GetName(DOMString
& aName
) const { aName
.AsAString() = mName
; }
217 void PostMessage(JSContext
* aCx
, JS::Handle
<JS::Value
> aMessage
,
218 const Sequence
<JSObject
*>& aTransferable
, ErrorResult
& aRv
);
219 void PostMessage(JSContext
* aCx
, JS::Handle
<JS::Value
> aMessage
,
220 const PostMessageOptions
& aOptions
, ErrorResult
& aRv
);
224 IMPL_EVENT_HANDLER(message
)
225 IMPL_EVENT_HANDLER(messageerror
)
228 class SharedWorkerGlobalScope final
: public WorkerGlobalScope
{
229 const nsString mName
;
231 ~SharedWorkerGlobalScope() {}
234 SharedWorkerGlobalScope(WorkerPrivate
* aWorkerPrivate
, const nsString
& aName
);
236 virtual bool WrapGlobalObject(
237 JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aReflector
) override
;
239 void GetName(DOMString
& aName
) const { aName
.AsAString() = mName
; }
243 IMPL_EVENT_HANDLER(connect
)
246 class ServiceWorkerGlobalScope final
: public WorkerGlobalScope
{
247 const nsString mScope
;
248 RefPtr
<Clients
> mClients
;
249 RefPtr
<ServiceWorkerRegistration
> mRegistration
;
251 ~ServiceWorkerGlobalScope();
254 NS_DECL_ISUPPORTS_INHERITED
255 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerGlobalScope
,
257 IMPL_EVENT_HANDLER(notificationclick
)
258 IMPL_EVENT_HANDLER(notificationclose
)
260 ServiceWorkerGlobalScope(
261 WorkerPrivate
* aWorkerPrivate
,
262 const ServiceWorkerRegistrationDescriptor
& aRegistrationDescriptor
);
264 virtual bool WrapGlobalObject(
265 JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aReflector
) override
;
267 void GetScope(nsString
& aScope
) const { aScope
= mScope
; }
269 already_AddRefed
<Clients
> GetClients();
271 ServiceWorkerRegistration
* Registration();
273 already_AddRefed
<Promise
> SkipWaiting(ErrorResult
& aRv
);
275 IMPL_EVENT_HANDLER(activate
)
276 IMPL_EVENT_HANDLER(install
)
277 IMPL_EVENT_HANDLER(message
)
278 IMPL_EVENT_HANDLER(messageerror
)
280 IMPL_EVENT_HANDLER(push
)
281 IMPL_EVENT_HANDLER(pushsubscriptionchange
)
283 EventHandlerNonNull
* GetOnfetch();
285 void SetOnfetch(mozilla::dom::EventHandlerNonNull
* aCallback
);
287 void EventListenerAdded(nsAtom
* aType
) override
;
290 class WorkerDebuggerGlobalScope final
: public DOMEventTargetHelper
,
291 public nsIGlobalObject
{
292 WorkerPrivate
* mWorkerPrivate
;
293 RefPtr
<Console
> mConsole
;
294 nsCOMPtr
<nsISerialEventTarget
> mSerialEventTarget
;
297 explicit WorkerDebuggerGlobalScope(WorkerPrivate
* aWorkerPrivate
);
299 NS_DECL_ISUPPORTS_INHERITED
300 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
301 WorkerDebuggerGlobalScope
, DOMEventTargetHelper
)
303 virtual JSObject
* WrapObject(JSContext
* aCx
,
304 JS::Handle
<JSObject
*> aGivenProto
) override
{
305 MOZ_CRASH("Shouldn't get here!");
308 virtual bool WrapGlobalObject(JSContext
* aCx
,
309 JS::MutableHandle
<JSObject
*> aReflector
);
311 JSObject
* GetGlobalJSObject(void) override
{ return GetWrapper(); }
312 JSObject
* GetGlobalJSObjectPreserveColor(void) const override
{
313 return GetWrapperPreserveColor();
316 void GetGlobal(JSContext
* aCx
, JS::MutableHandle
<JSObject
*> aGlobal
,
319 void CreateSandbox(JSContext
* aCx
, const nsAString
& aName
,
320 JS::Handle
<JSObject
*> aPrototype
,
321 JS::MutableHandle
<JSObject
*> aResult
, ErrorResult
& aRv
);
323 void LoadSubScript(JSContext
* aCx
, const nsAString
& aURL
,
324 const Optional
<JS::Handle
<JSObject
*>>& aSandbox
,
327 MOZ_CAN_RUN_SCRIPT
void EnterEventLoop();
329 void LeaveEventLoop();
331 void PostMessage(const nsAString
& aMessage
);
333 IMPL_EVENT_HANDLER(message
)
334 IMPL_EVENT_HANDLER(messageerror
)
336 void SetImmediate(Function
& aHandler
, ErrorResult
& aRv
);
338 void ReportError(JSContext
* aCx
, const nsAString
& aMessage
);
340 void RetrieveConsoleEvents(JSContext
* aCx
, nsTArray
<JS::Value
>& aEvents
,
343 void SetConsoleEventHandler(JSContext
* aCx
, AnyCallback
* aHandler
,
346 already_AddRefed
<Console
> GetConsole(ErrorResult
& aRv
);
348 Console
* GetConsoleIfExists() const { return mConsole
; }
350 void Dump(JSContext
* aCx
, const Optional
<nsAString
>& aString
) const;
352 void Atob(const nsAString
& aAtob
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
353 void Btoa(const nsAString
& aBtoa
, nsAString
& aOutput
, ErrorResult
& aRv
) const;
355 // Override DispatchTrait API to target the worker thread. Dispatch may
356 // return failure if the worker thread is not alive.
357 nsresult
Dispatch(TaskCategory aCategory
,
358 already_AddRefed
<nsIRunnable
>&& aRunnable
) override
;
360 nsISerialEventTarget
* EventTargetFor(TaskCategory aCategory
) const override
;
362 AbstractThread
* AbstractMainThreadFor(TaskCategory aCategory
) override
;
365 virtual ~WorkerDebuggerGlobalScope();
369 } // namespace mozilla
371 inline nsISupports
* ToSupports(mozilla::dom::WorkerGlobalScope
* aScope
) {
372 return static_cast<mozilla::dom::EventTarget
*>(aScope
);
375 #endif /* mozilla_dom_workerscope_h__ */