Line data Source code
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/. */
6 :
7 : #ifndef mozilla_dom_workerscope_h__
8 : #define mozilla_dom_workerscope_h__
9 :
10 : #include "Workers.h"
11 : #include "mozilla/DOMEventTargetHelper.h"
12 : #include "mozilla/dom/Headers.h"
13 : #include "mozilla/dom/RequestBinding.h"
14 : #include "nsWeakReference.h"
15 : #include "mozilla/dom/ImageBitmapSource.h"
16 :
17 : namespace mozilla {
18 : namespace dom {
19 :
20 : class AnyCallback;
21 : struct ChannelPixelLayout;
22 : class Console;
23 : class Crypto;
24 : class Function;
25 : class IDBFactory;
26 : enum class ImageBitmapFormat : uint8_t;
27 : class Performance;
28 : class Promise;
29 : class RequestOrUSVString;
30 : class ServiceWorkerRegistration;
31 : class WorkerLocation;
32 : class WorkerNavigator;
33 : enum class CallerType : uint32_t;
34 :
35 : namespace cache {
36 :
37 : class CacheStorage;
38 :
39 : } // namespace cache
40 :
41 : namespace workers {
42 :
43 : class ServiceWorkerClients;
44 : class WorkerPrivate;
45 :
46 : } // namespace workers
47 :
48 : class WorkerGlobalScope : public DOMEventTargetHelper,
49 : public nsIGlobalObject,
50 : public nsSupportsWeakReference
51 : {
52 : typedef mozilla::dom::IDBFactory IDBFactory;
53 :
54 : RefPtr<Console> mConsole;
55 : RefPtr<Crypto> mCrypto;
56 : RefPtr<WorkerLocation> mLocation;
57 : RefPtr<WorkerNavigator> mNavigator;
58 : RefPtr<Performance> mPerformance;
59 : RefPtr<IDBFactory> mIndexedDB;
60 : RefPtr<cache::CacheStorage> mCacheStorage;
61 : nsCOMPtr<nsISerialEventTarget> mSerialEventTarget;
62 :
63 : uint32_t mWindowInteractionsAllowed;
64 :
65 : protected:
66 : typedef mozilla::dom::workers::WorkerPrivate WorkerPrivate;
67 : WorkerPrivate* mWorkerPrivate;
68 :
69 : explicit WorkerGlobalScope(WorkerPrivate* aWorkerPrivate);
70 : virtual ~WorkerGlobalScope();
71 :
72 : public:
73 : virtual JSObject*
74 : WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
75 :
76 : virtual bool
77 : WrapGlobalObject(JSContext* aCx, JS::MutableHandle<JSObject*> aReflector) = 0;
78 :
79 : virtual JSObject*
80 201 : GetGlobalJSObject(void) override
81 : {
82 201 : return GetWrapper();
83 : }
84 :
85 : NS_DECL_ISUPPORTS_INHERITED
86 17 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerGlobalScope,
87 : DOMEventTargetHelper)
88 :
89 : WorkerGlobalScope*
90 0 : Self()
91 : {
92 0 : return this;
93 : }
94 :
95 : Console*
96 : GetConsole(ErrorResult& aRv);
97 :
98 : Console*
99 0 : GetConsoleIfExists() const
100 : {
101 0 : return mConsole;
102 : }
103 :
104 : Crypto*
105 : GetCrypto(ErrorResult& aError);
106 :
107 : already_AddRefed<WorkerLocation>
108 : Location();
109 :
110 : already_AddRefed<WorkerNavigator>
111 : Navigator();
112 :
113 : already_AddRefed<WorkerNavigator>
114 : GetExistingNavigator() const;
115 :
116 : OnErrorEventHandlerNonNull*
117 : GetOnerror();
118 : void
119 : SetOnerror(OnErrorEventHandlerNonNull* aHandler);
120 :
121 : void
122 : ImportScripts(const Sequence<nsString>& aScriptURLs, ErrorResult& aRv);
123 :
124 : int32_t
125 : SetTimeout(JSContext* aCx, Function& aHandler, const int32_t aTimeout,
126 : const Sequence<JS::Value>& aArguments, ErrorResult& aRv);
127 : int32_t
128 : SetTimeout(JSContext* aCx, const nsAString& aHandler, const int32_t aTimeout,
129 : const Sequence<JS::Value>& /* unused */, ErrorResult& aRv);
130 : void
131 : ClearTimeout(int32_t aHandle);
132 : int32_t
133 : SetInterval(JSContext* aCx, Function& aHandler,
134 : const Optional<int32_t>& aTimeout,
135 : const Sequence<JS::Value>& aArguments, ErrorResult& aRv);
136 : int32_t
137 : SetInterval(JSContext* aCx, const nsAString& aHandler,
138 : const Optional<int32_t>& aTimeout,
139 : const Sequence<JS::Value>& /* unused */, ErrorResult& aRv);
140 : void
141 : ClearInterval(int32_t aHandle);
142 :
143 : void
144 : GetOrigin(nsAString& aOrigin) const;
145 :
146 : void
147 : Atob(const nsAString& aAtob, nsAString& aOutput, ErrorResult& aRv) const;
148 : void
149 : Btoa(const nsAString& aBtoa, nsAString& aOutput, ErrorResult& aRv) const;
150 :
151 0 : IMPL_EVENT_HANDLER(online)
152 0 : IMPL_EVENT_HANDLER(offline)
153 :
154 : void
155 : Dump(const Optional<nsAString>& aString) const;
156 :
157 : Performance* GetPerformance();
158 :
159 : already_AddRefed<Promise>
160 : Fetch(const RequestOrUSVString& aInput, const RequestInit& aInit,
161 : CallerType aCallerType, ErrorResult& aRv);
162 :
163 : already_AddRefed<IDBFactory>
164 : GetIndexedDB(ErrorResult& aErrorResult);
165 :
166 : already_AddRefed<cache::CacheStorage>
167 : GetCaches(ErrorResult& aRv);
168 :
169 : bool IsSecureContext() const;
170 :
171 : already_AddRefed<Promise>
172 : CreateImageBitmap(JSContext* aCx,
173 : const ImageBitmapSource& aImage, ErrorResult& aRv);
174 :
175 : already_AddRefed<Promise>
176 : CreateImageBitmap(JSContext* aCx,
177 : const ImageBitmapSource& aImage,
178 : int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
179 : ErrorResult& aRv);
180 :
181 : already_AddRefed<mozilla::dom::Promise>
182 : CreateImageBitmap(JSContext* aCx,
183 : const ImageBitmapSource& aImage,
184 : int32_t aOffset, int32_t aLength,
185 : mozilla::dom::ImageBitmapFormat aFormat,
186 : const mozilla::dom::Sequence<mozilla::dom::ChannelPixelLayout>& aLayout,
187 : mozilla::ErrorResult& aRv);
188 :
189 : bool
190 0 : WindowInteractionAllowed() const
191 : {
192 0 : return mWindowInteractionsAllowed > 0;
193 : }
194 :
195 : void
196 0 : AllowWindowInteraction()
197 : {
198 0 : mWindowInteractionsAllowed++;
199 0 : }
200 :
201 : void
202 0 : ConsumeWindowInteraction()
203 : {
204 0 : MOZ_ASSERT(mWindowInteractionsAllowed > 0);
205 0 : mWindowInteractionsAllowed--;
206 0 : }
207 :
208 : // Override DispatchTrait API to target the worker thread. Dispatch may
209 : // return failure if the worker thread is not alive.
210 : nsresult
211 : Dispatch(const char* aName, TaskCategory aCategory,
212 : already_AddRefed<nsIRunnable>&& aRunnable) override;
213 :
214 : nsISerialEventTarget*
215 : EventTargetFor(TaskCategory aCategory) const override;
216 :
217 : AbstractThread*
218 : AbstractMainThreadFor(TaskCategory aCategory) override;
219 : };
220 :
221 : class DedicatedWorkerGlobalScope final : public WorkerGlobalScope
222 : {
223 : const nsString mName;
224 :
225 0 : ~DedicatedWorkerGlobalScope() { }
226 :
227 : public:
228 : DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate,
229 : const nsString& aName);
230 :
231 : virtual bool
232 : WrapGlobalObject(JSContext* aCx,
233 : JS::MutableHandle<JSObject*> aReflector) override;
234 :
235 0 : void GetName(DOMString& aName) const
236 : {
237 0 : aName.AsAString() = mName;
238 0 : }
239 :
240 : void
241 : PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
242 : const Sequence<JSObject*>& aTransferable,
243 : ErrorResult& aRv);
244 :
245 : void
246 : Close(JSContext* aCx);
247 :
248 0 : IMPL_EVENT_HANDLER(message)
249 : };
250 :
251 : class SharedWorkerGlobalScope final : public WorkerGlobalScope
252 : {
253 : const nsString mName;
254 :
255 0 : ~SharedWorkerGlobalScope() { }
256 :
257 : public:
258 : SharedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate,
259 : const nsString& aName);
260 :
261 : virtual bool
262 : WrapGlobalObject(JSContext* aCx,
263 : JS::MutableHandle<JSObject*> aReflector) override;
264 :
265 0 : void GetName(DOMString& aName) const
266 : {
267 0 : aName.AsAString() = mName;
268 0 : }
269 :
270 : void
271 : Close(JSContext* aCx);
272 :
273 0 : IMPL_EVENT_HANDLER(connect)
274 : };
275 :
276 : class ServiceWorkerGlobalScope final : public WorkerGlobalScope
277 : {
278 : const nsString mScope;
279 : RefPtr<workers::ServiceWorkerClients> mClients;
280 : RefPtr<ServiceWorkerRegistration> mRegistration;
281 :
282 : ~ServiceWorkerGlobalScope();
283 :
284 : public:
285 : NS_DECL_ISUPPORTS_INHERITED
286 0 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerGlobalScope,
287 : WorkerGlobalScope)
288 0 : IMPL_EVENT_HANDLER(notificationclick)
289 0 : IMPL_EVENT_HANDLER(notificationclose)
290 :
291 : ServiceWorkerGlobalScope(WorkerPrivate* aWorkerPrivate, const nsACString& aScope);
292 :
293 : virtual bool
294 : WrapGlobalObject(JSContext* aCx,
295 : JS::MutableHandle<JSObject*> aReflector) override;
296 :
297 : static bool
298 : OpenWindowEnabled(JSContext* aCx, JSObject* aObj);
299 :
300 : void
301 0 : GetScope(nsString& aScope) const
302 : {
303 0 : aScope = mScope;
304 0 : }
305 :
306 : workers::ServiceWorkerClients*
307 : Clients();
308 :
309 : ServiceWorkerRegistration*
310 : Registration();
311 :
312 : already_AddRefed<Promise>
313 : SkipWaiting(ErrorResult& aRv);
314 :
315 0 : IMPL_EVENT_HANDLER(activate)
316 0 : IMPL_EVENT_HANDLER(install)
317 0 : IMPL_EVENT_HANDLER(message)
318 :
319 0 : IMPL_EVENT_HANDLER(push)
320 0 : IMPL_EVENT_HANDLER(pushsubscriptionchange)
321 :
322 : EventHandlerNonNull*
323 : GetOnfetch();
324 :
325 : void
326 : SetOnfetch(mozilla::dom::EventHandlerNonNull* aCallback);
327 :
328 : using DOMEventTargetHelper::AddEventListener;
329 : virtual void
330 : AddEventListener(const nsAString& aType,
331 : dom::EventListener* aListener,
332 : const dom::AddEventListenerOptionsOrBoolean& aOptions,
333 : const dom::Nullable<bool>& aWantsUntrusted,
334 : ErrorResult& aRv) override;
335 : };
336 :
337 : class WorkerDebuggerGlobalScope final : public DOMEventTargetHelper,
338 : public nsIGlobalObject
339 : {
340 : typedef mozilla::dom::workers::WorkerPrivate WorkerPrivate;
341 :
342 : WorkerPrivate* mWorkerPrivate;
343 : RefPtr<Console> mConsole;
344 : nsCOMPtr<nsISerialEventTarget> mSerialEventTarget;
345 :
346 : public:
347 : explicit WorkerDebuggerGlobalScope(WorkerPrivate* aWorkerPrivate);
348 :
349 : NS_DECL_ISUPPORTS_INHERITED
350 0 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerDebuggerGlobalScope,
351 : DOMEventTargetHelper)
352 :
353 : virtual JSObject*
354 0 : WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override
355 : {
356 0 : MOZ_CRASH("Shouldn't get here!");
357 : }
358 :
359 : virtual bool
360 : WrapGlobalObject(JSContext* aCx,
361 : JS::MutableHandle<JSObject*> aReflector);
362 :
363 : virtual JSObject*
364 0 : GetGlobalJSObject(void) override
365 : {
366 0 : return GetWrapper();
367 : }
368 :
369 : void
370 : GetGlobal(JSContext* aCx, JS::MutableHandle<JSObject*> aGlobal,
371 : ErrorResult& aRv);
372 :
373 : void
374 : CreateSandbox(JSContext* aCx, const nsAString& aName,
375 : JS::Handle<JSObject*> aPrototype,
376 : JS::MutableHandle<JSObject*> aResult,
377 : ErrorResult& aRv);
378 :
379 : void
380 : LoadSubScript(JSContext* aCx, const nsAString& aURL,
381 : const Optional<JS::Handle<JSObject*>>& aSandbox,
382 : ErrorResult& aRv);
383 :
384 : void
385 : EnterEventLoop();
386 :
387 : void
388 : LeaveEventLoop();
389 :
390 : void
391 : PostMessage(const nsAString& aMessage);
392 :
393 0 : IMPL_EVENT_HANDLER(message)
394 :
395 : void
396 : SetImmediate(Function& aHandler, ErrorResult& aRv);
397 :
398 : void
399 : ReportError(JSContext* aCx, const nsAString& aMessage);
400 :
401 : void
402 : RetrieveConsoleEvents(JSContext* aCx, nsTArray<JS::Value>& aEvents,
403 : ErrorResult& aRv);
404 :
405 : void
406 : SetConsoleEventHandler(JSContext* aCx, AnyCallback* aHandler,
407 : ErrorResult& aRv);
408 :
409 : Console*
410 : GetConsole(ErrorResult& aRv);
411 :
412 : Console*
413 0 : GetConsoleIfExists() const
414 : {
415 0 : return mConsole;
416 : }
417 :
418 : void
419 : Dump(JSContext* aCx, const Optional<nsAString>& aString) const;
420 :
421 : // Override DispatchTrait API to target the worker thread. Dispatch may
422 : // return failure if the worker thread is not alive.
423 : nsresult
424 : Dispatch(const char* aName, TaskCategory aCategory,
425 : already_AddRefed<nsIRunnable>&& aRunnable) override;
426 :
427 : nsISerialEventTarget*
428 : EventTargetFor(TaskCategory aCategory) const override;
429 :
430 : AbstractThread*
431 : AbstractMainThreadFor(TaskCategory aCategory) override;
432 :
433 : private:
434 : virtual ~WorkerDebuggerGlobalScope();
435 : };
436 :
437 : } // namespace dom
438 : } // namespace mozilla
439 :
440 : inline nsISupports*
441 : ToSupports(mozilla::dom::WorkerGlobalScope* aScope)
442 : {
443 : return static_cast<nsIDOMEventTarget*>(aScope);
444 : }
445 :
446 : #endif /* mozilla_dom_workerscope_h__ */
|