/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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; struct StructuredSerializeOptions; 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 mConsole; RefPtr mCrypto; RefPtr mLocation; RefPtr mNavigator; RefPtr mPerformance; RefPtr mIndexedDB; RefPtr 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 aGivenProto) override; virtual bool WrapGlobalObject(JSContext* aCx, JS::MutableHandle 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 Location(); already_AddRefed Navigator(); already_AddRefed GetExistingNavigator() const; void Close(JSContext* aCx, ErrorResult& aRv); OnErrorEventHandlerNonNull* GetOnerror(); void SetOnerror(OnErrorEventHandlerNonNull* aHandler); void ImportScripts(const Sequence& aScriptURLs, ErrorResult& aRv); int32_t SetTimeout(JSContext* aCx, Function& aHandler, const int32_t aTimeout, const Sequence& aArguments, ErrorResult& aRv); int32_t SetTimeout(JSContext* aCx, const nsAString& aHandler, const int32_t aTimeout, const Sequence& /* unused */, ErrorResult& aRv); void ClearTimeout(int32_t aHandle); int32_t SetInterval(JSContext* aCx, Function& aHandler, const int32_t aTimeout, const Sequence& aArguments, ErrorResult& aRv); int32_t SetInterval(JSContext* aCx, const nsAString& aHandler, const int32_t aTimeout, const Sequence& /* 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; void GetOrigin(nsAString& aOrigin) const; IMPL_EVENT_HANDLER(online) IMPL_EVENT_HANDLER(offline) void Dump(const Optional& aString) const; Performance* GetPerformance(); already_AddRefed Fetch(const RequestOrUSVString& aInput, const RequestInit& aInit, ErrorResult& aRv); already_AddRefed GetIndexedDB(ErrorResult& aErrorResult); already_AddRefed GetCaches(ErrorResult& aRv); bool IsSecureContext() const; already_AddRefed CreateImageBitmap(const ImageBitmapSource& aImage, ErrorResult& aRv); already_AddRefed CreateImageBitmap(const ImageBitmapSource& aImage, int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh, ErrorResult& aRv); already_AddRefed CreateImageBitmap(const ImageBitmapSource& aImage, int32_t aOffset, int32_t aLength, mozilla::dom::ImageBitmapFormat aFormat, const mozilla::dom::Sequence& aLayout, mozilla::ErrorResult& aRv); void StructuredClone(JSContext* aCx, JS::Handle aValue, const StructuredSerializeOptions& aOptions, JS::MutableHandle aRv, ErrorResult& aError); 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 aReflector) override; void PostMessage(JSContext* aCx, JS::Handle aMessage, const Sequence& aTransferable, ErrorResult& aRv); void PostMessage(JSContext* aCx, JS::Handle aMessage, const StructuredSerializeOptions& aOptions, 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 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 mClients; RefPtr 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 aReflector) override; static bool OpenWindowEnabled(JSContext* aCx, JSObject* aObj); void GetScope(nsString& aScope) const { aScope = mScope; } workers::ServiceWorkerClients* Clients(); ServiceWorkerRegistration* Registration(); already_AddRefed 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 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 aGivenProto) override { MOZ_CRASH("Shouldn't get here!"); } virtual bool WrapGlobalObject(JSContext* aCx, JS::MutableHandle aReflector); virtual JSObject* GetGlobalJSObject(void) override { return GetWrapper(); } void GetGlobal(JSContext* aCx, JS::MutableHandle aGlobal, ErrorResult& aRv); void CreateSandbox(JSContext* aCx, const nsAString& aName, JS::Handle aPrototype, JS::MutableHandle aResult, ErrorResult& aRv); void LoadSubScript(JSContext* aCx, const nsAString& aURL, const Optional>& 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& 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& aString) const; private: virtual ~WorkerDebuggerGlobalScope(); }; } // namespace dom } // namespace mozilla inline nsISupports* ToSupports(mozilla::dom::WorkerGlobalScope* aScope) { return static_cast(aScope); } #endif /* mozilla_dom_workerscope_h__ */