diff options
Diffstat (limited to 'dom/workers/WorkerScope.h')
-rw-r--r-- | dom/workers/WorkerScope.h | 389 |
1 files changed, 389 insertions, 0 deletions
diff --git a/dom/workers/WorkerScope.h b/dom/workers/WorkerScope.h new file mode 100644 index 000000000..53d0a578e --- /dev/null +++ b/dom/workers/WorkerScope.h @@ -0,0 +1,389 @@ +/* -*- 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/. */ + +#ifndef mozilla_dom_workerscope_h__ +#define mozilla_dom_workerscope_h__ + +#include "Workers.h" +#include "mozilla/DOMEventTargetHelper.h" +#include "mozilla/dom/Headers.h" +#include "mozilla/dom/RequestBinding.h" +#include "nsWeakReference.h" +#include "mozilla/dom/ImageBitmapSource.h" + +namespace mozilla { +namespace dom { + +class AnyCallback; +struct ChannelPixelLayout; +class Console; +class Crypto; +class Function; +class IDBFactory; +enum class ImageBitmapFormat : uint32_t; +class Performance; +class Promise; +class RequestOrUSVString; +class ServiceWorkerRegistration; +class WorkerLocation; +class WorkerNavigator; + +namespace cache { + +class CacheStorage; + +} // namespace cache + +namespace workers { + +class ServiceWorkerClients; +class WorkerPrivate; + +} // namespace workers + +class WorkerGlobalScope : public DOMEventTargetHelper, + public nsIGlobalObject, + public nsSupportsWeakReference +{ + typedef mozilla::dom::IDBFactory IDBFactory; + + RefPtr<Console> mConsole; + RefPtr<Crypto> mCrypto; + RefPtr<WorkerLocation> mLocation; + RefPtr<WorkerNavigator> mNavigator; + RefPtr<Performance> mPerformance; + RefPtr<IDBFactory> mIndexedDB; + RefPtr<cache::CacheStorage> mCacheStorage; + + uint32_t mWindowInteractionsAllowed; + +protected: + typedef mozilla::dom::workers::WorkerPrivate WorkerPrivate; + WorkerPrivate* mWorkerPrivate; + + explicit WorkerGlobalScope(WorkerPrivate* aWorkerPrivate); + virtual ~WorkerGlobalScope(); + +public: + virtual JSObject* + WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; + + virtual bool + WrapGlobalObject(JSContext* aCx, JS::MutableHandle<JSObject*> aReflector) = 0; + + virtual JSObject* + GetGlobalJSObject(void) override + { + return GetWrapper(); + } + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerGlobalScope, + DOMEventTargetHelper) + + WorkerGlobalScope* + Self() + { + return this; + } + + Console* + GetConsole(ErrorResult& aRv); + + Console* + GetConsoleIfExists() const + { + return mConsole; + } + + Crypto* + GetCrypto(ErrorResult& aError); + + already_AddRefed<WorkerLocation> + Location(); + + already_AddRefed<WorkerNavigator> + Navigator(); + + already_AddRefed<WorkerNavigator> + GetExistingNavigator() const; + + void + Close(JSContext* aCx, ErrorResult& aRv); + + OnErrorEventHandlerNonNull* + GetOnerror(); + void + SetOnerror(OnErrorEventHandlerNonNull* aHandler); + + void + ImportScripts(const Sequence<nsString>& aScriptURLs, ErrorResult& aRv); + + int32_t + SetTimeout(JSContext* aCx, Function& aHandler, const int32_t aTimeout, + const Sequence<JS::Value>& aArguments, ErrorResult& aRv); + int32_t + SetTimeout(JSContext* aCx, const nsAString& aHandler, const int32_t aTimeout, + const Sequence<JS::Value>& /* unused */, ErrorResult& aRv); + void + ClearTimeout(int32_t aHandle); + int32_t + SetInterval(JSContext* aCx, Function& aHandler, + const Optional<int32_t>& aTimeout, + const Sequence<JS::Value>& aArguments, ErrorResult& aRv); + int32_t + SetInterval(JSContext* aCx, const nsAString& aHandler, + const Optional<int32_t>& aTimeout, + const Sequence<JS::Value>& /* unused */, ErrorResult& aRv); + void + ClearInterval(int32_t aHandle); + + void + Atob(const nsAString& aAtob, nsAString& aOutput, ErrorResult& aRv) const; + void + Btoa(const nsAString& aBtoa, nsAString& aOutput, ErrorResult& aRv) const; + + IMPL_EVENT_HANDLER(online) + IMPL_EVENT_HANDLER(offline) + + void + Dump(const Optional<nsAString>& aString) const; + + Performance* GetPerformance(); + + already_AddRefed<Promise> + Fetch(const RequestOrUSVString& aInput, const RequestInit& aInit, ErrorResult& aRv); + + already_AddRefed<IDBFactory> + GetIndexedDB(ErrorResult& aErrorResult); + + already_AddRefed<cache::CacheStorage> + GetCaches(ErrorResult& aRv); + + bool IsSecureContext() const; + + already_AddRefed<Promise> + CreateImageBitmap(const ImageBitmapSource& aImage, ErrorResult& aRv); + + already_AddRefed<Promise> + CreateImageBitmap(const ImageBitmapSource& aImage, + int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh, + ErrorResult& aRv); + + already_AddRefed<mozilla::dom::Promise> + CreateImageBitmap(const ImageBitmapSource& aImage, + int32_t aOffset, int32_t aLength, + mozilla::dom::ImageBitmapFormat aFormat, + const mozilla::dom::Sequence<mozilla::dom::ChannelPixelLayout>& aLayout, + mozilla::ErrorResult& aRv); + + bool + WindowInteractionAllowed() const + { + return mWindowInteractionsAllowed > 0; + } + + void + AllowWindowInteraction() + { + mWindowInteractionsAllowed++; + } + + void + ConsumeWindowInteraction() + { + MOZ_ASSERT(mWindowInteractionsAllowed > 0); + mWindowInteractionsAllowed--; + } +}; + +class DedicatedWorkerGlobalScope final : public WorkerGlobalScope +{ + ~DedicatedWorkerGlobalScope() { } + +public: + explicit DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate); + + virtual bool + WrapGlobalObject(JSContext* aCx, + JS::MutableHandle<JSObject*> aReflector) override; + + void + PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage, + const Optional<Sequence<JS::Value>>& aTransferable, + ErrorResult& aRv); + + IMPL_EVENT_HANDLER(message) +}; + +class SharedWorkerGlobalScope final : public WorkerGlobalScope +{ + const nsCString mName; + + ~SharedWorkerGlobalScope() { } + +public: + SharedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate, + const nsCString& aName); + + virtual bool + WrapGlobalObject(JSContext* aCx, + JS::MutableHandle<JSObject*> aReflector) override; + + void GetName(DOMString& aName) const + { + aName.AsAString() = NS_ConvertUTF8toUTF16(mName); + } + + IMPL_EVENT_HANDLER(connect) +}; + +class ServiceWorkerGlobalScope final : public WorkerGlobalScope +{ + const nsString mScope; + RefPtr<workers::ServiceWorkerClients> mClients; + RefPtr<ServiceWorkerRegistration> mRegistration; + + ~ServiceWorkerGlobalScope(); + +public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerGlobalScope, + WorkerGlobalScope) + IMPL_EVENT_HANDLER(notificationclick) + IMPL_EVENT_HANDLER(notificationclose) + + ServiceWorkerGlobalScope(WorkerPrivate* aWorkerPrivate, const nsACString& aScope); + + virtual bool + WrapGlobalObject(JSContext* aCx, + JS::MutableHandle<JSObject*> aReflector) override; + + static bool + OpenWindowEnabled(JSContext* aCx, JSObject* aObj); + + void + GetScope(nsString& aScope) const + { + aScope = mScope; + } + + workers::ServiceWorkerClients* + Clients(); + + ServiceWorkerRegistration* + Registration(); + + already_AddRefed<Promise> + SkipWaiting(ErrorResult& aRv); + + IMPL_EVENT_HANDLER(activate) + IMPL_EVENT_HANDLER(fetch) + IMPL_EVENT_HANDLER(install) + IMPL_EVENT_HANDLER(message) + + IMPL_EVENT_HANDLER(push) + IMPL_EVENT_HANDLER(pushsubscriptionchange) + +}; + +class WorkerDebuggerGlobalScope final : public DOMEventTargetHelper, + public nsIGlobalObject +{ + typedef mozilla::dom::workers::WorkerPrivate WorkerPrivate; + + WorkerPrivate* mWorkerPrivate; + RefPtr<Console> mConsole; + +public: + explicit WorkerDebuggerGlobalScope(WorkerPrivate* aWorkerPrivate); + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerDebuggerGlobalScope, + DOMEventTargetHelper) + + virtual JSObject* + WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override + { + MOZ_CRASH("Shouldn't get here!"); + } + + virtual bool + WrapGlobalObject(JSContext* aCx, + JS::MutableHandle<JSObject*> aReflector); + + virtual JSObject* + GetGlobalJSObject(void) override + { + return GetWrapper(); + } + + void + GetGlobal(JSContext* aCx, JS::MutableHandle<JSObject*> aGlobal, + ErrorResult& aRv); + + void + CreateSandbox(JSContext* aCx, const nsAString& aName, + JS::Handle<JSObject*> aPrototype, + JS::MutableHandle<JSObject*> aResult, + ErrorResult& aRv); + + void + LoadSubScript(JSContext* aCx, const nsAString& aURL, + const Optional<JS::Handle<JSObject*>>& aSandbox, + ErrorResult& aRv); + + void + EnterEventLoop(); + + void + LeaveEventLoop(); + + void + PostMessage(const nsAString& aMessage); + + IMPL_EVENT_HANDLER(message) + + void + SetImmediate(Function& aHandler, ErrorResult& aRv); + + void + ReportError(JSContext* aCx, const nsAString& aMessage); + + void + RetrieveConsoleEvents(JSContext* aCx, nsTArray<JS::Value>& aEvents, + ErrorResult& aRv); + + void + SetConsoleEventHandler(JSContext* aCx, AnyCallback* aHandler, + ErrorResult& aRv); + + Console* + GetConsole(ErrorResult& aRv); + + Console* + GetConsoleIfExists() const + { + return mConsole; + } + + void + Dump(JSContext* aCx, const Optional<nsAString>& aString) const; + +private: + virtual ~WorkerDebuggerGlobalScope(); +}; + +} // namespace dom +} // namespace mozilla + +inline nsISupports* +ToSupports(mozilla::dom::WorkerGlobalScope* aScope) +{ + return static_cast<nsIDOMEventTarget*>(aScope); +} + +#endif /* mozilla_dom_workerscope_h__ */ |