Files
tubestation/dom/workers/WorkerScope.h
Cristian Tuns cedc63bf4c Backed out 9 changesets (bug 1631263, bug 1838080) for causing wpt failures in script-transform-generateKeyFrame.https.html CLOSED TREE
Backed out changeset a857a01fb321 (bug 1631263)
Backed out changeset dc46d2be4c25 (bug 1631263)
Backed out changeset 581c7a4d8f5f (bug 1631263)
Backed out changeset 7a2c4be3701d (bug 1631263)
Backed out changeset e091677e39fa (bug 1838080)
Backed out changeset 1eb303981213 (bug 1838080)
Backed out changeset 6c10370ed682 (bug 1838080)
Backed out changeset a614605b47ee (bug 1838080)
Backed out changeset 86fcc8ba6779 (bug 1838080)
2023-07-19 17:03:55 -04:00

563 lines
17 KiB
C++

/* -*- 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 "js/TypeDecls.h"
#include "js/loader/ModuleLoaderBase.h"
#include "mozilla/Assertions.h"
#include "mozilla/Attributes.h"
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/Maybe.h"
#include "mozilla/NotNull.h"
#include "mozilla/RefPtr.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/dom/AnimationFrameProvider.h"
#include "mozilla/dom/ImageBitmapBinding.h"
#include "mozilla/dom/ImageBitmapSource.h"
#include "mozilla/dom/PerformanceWorker.h"
#include "mozilla/dom/SafeRefPtr.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "nsCOMPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIGlobalObject.h"
#include "nsISupports.h"
#include "nsWeakReference.h"
#ifdef XP_WIN
# undef PostMessage
#endif
class nsAtom;
class nsISerialEventTarget;
namespace mozilla {
class ErrorResult;
struct VsyncEvent;
namespace extensions {
class ExtensionBrowser;
} // namespace extensions
namespace dom {
class AnyCallback;
enum class CallerType : uint32_t;
class ClientInfo;
class ClientSource;
class Clients;
class Console;
class Crypto;
class DOMString;
class DebuggerNotificationManager;
enum class EventCallbackDebuggerNotificationType : uint8_t;
class EventHandlerNonNull;
class FontFaceSet;
class Function;
class IDBFactory;
class OnErrorEventHandlerNonNull;
template <typename T>
class Optional;
class Performance;
class Promise;
class RequestOrUSVString;
template <typename T>
class Sequence;
class ServiceWorkerDescriptor;
class ServiceWorkerRegistration;
class ServiceWorkerRegistrationDescriptor;
struct StructuredSerializeOptions;
class WorkerDocumentListener;
class WorkerLocation;
class WorkerNavigator;
class WorkerPrivate;
class VsyncWorkerChild;
class WebTaskScheduler;
class WebTaskSchedulerWorker;
struct RequestInit;
namespace cache {
class CacheStorage;
} // namespace cache
class WorkerGlobalScopeBase : public DOMEventTargetHelper,
public nsSupportsWeakReference,
public nsIGlobalObject {
friend class WorkerPrivate;
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WorkerGlobalScopeBase,
DOMEventTargetHelper)
WorkerGlobalScopeBase(WorkerPrivate* aWorkerPrivate,
UniquePtr<ClientSource> aClientSource);
virtual bool WrapGlobalObject(JSContext* aCx,
JS::MutableHandle<JSObject*> aReflector) = 0;
// EventTarget implementation
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) final {
MOZ_CRASH("WrapObject not supported; use WrapGlobalObject.");
}
// nsIGlobalObject implementation
JSObject* GetGlobalJSObject() final;
JSObject* GetGlobalJSObjectPreserveColor() const final;
bool IsSharedMemoryAllowed() const final;
bool ShouldResistFingerprinting(RFPTarget aTarget) const final;
OriginTrials Trials() const final;
StorageAccess GetStorageAccess() final;
Maybe<ClientInfo> GetClientInfo() const final;
Maybe<ServiceWorkerDescriptor> GetController() const final;
mozilla::Result<mozilla::ipc::PrincipalInfo, nsresult> GetStorageKey() final;
virtual void Control(const ServiceWorkerDescriptor& aServiceWorker);
// DispatcherTrait implementation
nsresult Dispatch(TaskCategory aCategory,
already_AddRefed<nsIRunnable>&& aRunnable) final;
nsISerialEventTarget* EventTargetFor(TaskCategory) const final;
AbstractThread* AbstractMainThreadFor(TaskCategory) final {
MOZ_CRASH("AbstractMainThreadFor not supported for workers.");
}
MOZ_CAN_RUN_SCRIPT
void ReportError(JSContext* aCx, JS::Handle<JS::Value> aError,
CallerType aCallerType, ErrorResult& aRv);
// atob, btoa, and dump are declared (separately) by both WorkerGlobalScope
// and WorkerDebuggerGlobalScope WebIDL interfaces
void Atob(const nsAString& aAtob, nsAString& aOut, ErrorResult& aRv) const;
void Btoa(const nsAString& aBtoa, nsAString& aOut, ErrorResult& aRv) const;
already_AddRefed<Console> GetConsole(ErrorResult& aRv);
Console* GetConsoleIfExists() const { return mConsole; }
void InitModuleLoader(JS::loader::ModuleLoaderBase* aModuleLoader) {
if (!mModuleLoader) {
mModuleLoader = aModuleLoader;
}
}
// The nullptr here is not used, but is required to make the override method
// have the same signature as other GetModuleLoader methods on globals.
JS::loader::ModuleLoaderBase* GetModuleLoader(
JSContext* aCx = nullptr) override {
return mModuleLoader;
};
uint64_t WindowID() const;
// Usually global scope dies earlier than the WorkerPrivate, but if we see
// it leak at least we can tell it to not carry away a dead pointer.
void NoteWorkerTerminated() { mWorkerPrivate = nullptr; }
ClientSource& MutableClientSourceRef() const { return *mClientSource; }
// WorkerPrivate wants to be able to forbid script when its state machine
// demands it.
void WorkerPrivateSaysForbidScript() { StartForbiddingScript(); }
void WorkerPrivateSaysAllowScript() { StopForbiddingScript(); }
protected:
~WorkerGlobalScopeBase();
CheckedUnsafePtr<WorkerPrivate> mWorkerPrivate;
void AssertIsOnWorkerThread() const {
MOZ_ASSERT(mWorkerThreadUsedOnlyForAssert == PR_GetCurrentThread());
}
private:
RefPtr<Console> mConsole;
RefPtr<JS::loader::ModuleLoaderBase> mModuleLoader;
const UniquePtr<ClientSource> mClientSource;
nsCOMPtr<nsISerialEventTarget> mSerialEventTarget;
#ifdef DEBUG
PRThread* mWorkerThreadUsedOnlyForAssert;
#endif
};
namespace workerinternals {
class NamedWorkerGlobalScopeMixin {
public:
explicit NamedWorkerGlobalScopeMixin(const nsAString& aName) : mName(aName) {}
void GetName(DOMString& aName) const;
protected:
~NamedWorkerGlobalScopeMixin() = default;
private:
const nsString mName;
};
} // namespace workerinternals
class WorkerGlobalScope : public WorkerGlobalScopeBase {
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(WorkerGlobalScope,
WorkerGlobalScopeBase)
using WorkerGlobalScopeBase::WorkerGlobalScopeBase;
void NoteTerminating();
void NoteShuttingDown();
// nsIGlobalObject implementation
RefPtr<ServiceWorkerRegistration> GetServiceWorkerRegistration(
const ServiceWorkerRegistrationDescriptor& aDescriptor) const final;
RefPtr<ServiceWorkerRegistration> GetOrCreateServiceWorkerRegistration(
const ServiceWorkerRegistrationDescriptor& aDescriptor) final;
DebuggerNotificationManager* GetOrCreateDebuggerNotificationManager() final;
DebuggerNotificationManager* GetExistingDebuggerNotificationManager() final;
Maybe<EventCallbackDebuggerNotificationType> GetDebuggerNotificationType()
const final;
mozilla::dom::StorageManager* GetStorageManager() final;
void SetIsNotEligibleForMessaging() { mIsEligibleForMessaging = false; }
bool IsEligibleForMessaging() final;
// WorkerGlobalScope WebIDL implementation
WorkerGlobalScope* Self() { return this; }
already_AddRefed<WorkerLocation> Location();
already_AddRefed<WorkerNavigator> Navigator();
already_AddRefed<WorkerNavigator> GetExistingNavigator() const;
FontFaceSet* GetFonts(ErrorResult&);
FontFaceSet* GetFonts() final { return GetFonts(IgnoreErrors()); }
void ImportScripts(JSContext* aCx, const Sequence<nsString>& aScriptURLs,
ErrorResult& aRv);
OnErrorEventHandlerNonNull* GetOnerror();
void SetOnerror(OnErrorEventHandlerNonNull* aHandler);
IMPL_EVENT_HANDLER(languagechange)
IMPL_EVENT_HANDLER(offline)
IMPL_EVENT_HANDLER(online)
IMPL_EVENT_HANDLER(rejectionhandled)
IMPL_EVENT_HANDLER(unhandledrejection)
void Dump(const Optional<nsAString>& aString) const;
Performance* GetPerformance();
Performance* GetPerformanceIfExists() const { return mPerformance; }
static bool IsInAutomation(JSContext* aCx, JSObject*);
void GetJSTestingFunctions(JSContext* aCx,
JS::MutableHandle<JSObject*> aFunctions,
ErrorResult& aRv);
// GlobalCrypto WebIDL implementation
Crypto* GetCrypto(ErrorResult& aError);
// WindowOrWorkerGlobalScope WebIDL implementation
void GetOrigin(nsAString& aOrigin) const;
bool CrossOriginIsolated() const final;
MOZ_CAN_RUN_SCRIPT
int32_t SetTimeout(JSContext* aCx, Function& aHandler, int32_t aTimeout,
const Sequence<JS::Value>& aArguments, ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT
int32_t SetTimeout(JSContext* aCx, const nsAString& aHandler,
int32_t aTimeout, const Sequence<JS::Value>&,
ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT
void ClearTimeout(int32_t aHandle);
MOZ_CAN_RUN_SCRIPT
int32_t SetInterval(JSContext* aCx, Function& aHandler, int32_t aTimeout,
const Sequence<JS::Value>& aArguments, ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT
int32_t SetInterval(JSContext* aCx, const nsAString& aHandler,
int32_t aTimeout, const Sequence<JS::Value>&,
ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT
void ClearInterval(int32_t aHandle);
already_AddRefed<Promise> CreateImageBitmap(
const ImageBitmapSource& aImage, const ImageBitmapOptions& aOptions,
ErrorResult& aRv);
already_AddRefed<Promise> CreateImageBitmap(
const ImageBitmapSource& aImage, int32_t aSx, int32_t aSy, int32_t aSw,
int32_t aSh, const ImageBitmapOptions& aOptions, ErrorResult& aRv);
void StructuredClone(JSContext* aCx, JS::Handle<JS::Value> aValue,
const StructuredSerializeOptions& aOptions,
JS::MutableHandle<JS::Value> aRetval,
ErrorResult& aError);
already_AddRefed<Promise> Fetch(const RequestOrUSVString& aInput,
const RequestInit& aInit,
CallerType aCallerType, ErrorResult& aRv);
bool IsSecureContext() const;
already_AddRefed<IDBFactory> GetIndexedDB(JSContext* aCx,
ErrorResult& aErrorResult);
already_AddRefed<cache::CacheStorage> GetCaches(ErrorResult& aRv);
WebTaskScheduler* Scheduler();
WebTaskScheduler* GetExistingScheduler() const;
bool WindowInteractionAllowed() const;
void AllowWindowInteraction();
void ConsumeWindowInteraction();
void StorageAccessPermissionGranted();
virtual void OnDocumentVisible(bool aVisible) {}
MOZ_CAN_RUN_SCRIPT_BOUNDARY
virtual void OnVsync(const VsyncEvent& aVsync) {}
protected:
~WorkerGlobalScope();
private:
MOZ_CAN_RUN_SCRIPT
int32_t SetTimeoutOrInterval(JSContext* aCx, Function& aHandler,
int32_t aTimeout,
const Sequence<JS::Value>& aArguments,
bool aIsInterval, ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT
int32_t SetTimeoutOrInterval(JSContext* aCx, const nsAString& aHandler,
int32_t aTimeout, bool aIsInterval,
ErrorResult& aRv);
RefPtr<Crypto> mCrypto;
RefPtr<WorkerLocation> mLocation;
RefPtr<WorkerNavigator> mNavigator;
RefPtr<FontFaceSet> mFontFaceSet;
RefPtr<Performance> mPerformance;
RefPtr<IDBFactory> mIndexedDB;
RefPtr<cache::CacheStorage> mCacheStorage;
RefPtr<DebuggerNotificationManager> mDebuggerNotificationManager;
RefPtr<WebTaskSchedulerWorker> mWebTaskScheduler;
uint32_t mWindowInteractionsAllowed = 0;
bool mIsEligibleForMessaging{true};
};
class DedicatedWorkerGlobalScope final
: public WorkerGlobalScope,
public workerinternals::NamedWorkerGlobalScopeMixin {
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
DedicatedWorkerGlobalScope, WorkerGlobalScope)
DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate,
UniquePtr<ClientSource> aClientSource,
const nsString& aName);
bool WrapGlobalObject(JSContext* aCx,
JS::MutableHandle<JSObject*> aReflector) override;
void PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
const Sequence<JSObject*>& aTransferable, ErrorResult& aRv);
void PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
const StructuredSerializeOptions& aOptions,
ErrorResult& aRv);
void Close();
MOZ_CAN_RUN_SCRIPT
int32_t RequestAnimationFrame(FrameRequestCallback& aCallback,
ErrorResult& aError);
MOZ_CAN_RUN_SCRIPT
void CancelAnimationFrame(int32_t aHandle, ErrorResult& aError);
void OnDocumentVisible(bool aVisible) override;
MOZ_CAN_RUN_SCRIPT_BOUNDARY
void OnVsync(const VsyncEvent& aVsync) override;
IMPL_EVENT_HANDLER(message)
IMPL_EVENT_HANDLER(messageerror)
private:
~DedicatedWorkerGlobalScope() = default;
FrameRequestManager mFrameRequestManager;
RefPtr<VsyncWorkerChild> mVsyncChild;
RefPtr<WorkerDocumentListener> mDocListener;
bool mDocumentVisible = false;
};
class SharedWorkerGlobalScope final
: public WorkerGlobalScope,
public workerinternals::NamedWorkerGlobalScopeMixin {
public:
SharedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate,
UniquePtr<ClientSource> aClientSource,
const nsString& aName);
bool WrapGlobalObject(JSContext* aCx,
JS::MutableHandle<JSObject*> aReflector) override;
void Close();
IMPL_EVENT_HANDLER(connect)
private:
~SharedWorkerGlobalScope() = default;
};
class ServiceWorkerGlobalScope final : public WorkerGlobalScope {
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerGlobalScope,
WorkerGlobalScope)
ServiceWorkerGlobalScope(
WorkerPrivate* aWorkerPrivate, UniquePtr<ClientSource> aClientSource,
const ServiceWorkerRegistrationDescriptor& aRegistrationDescriptor);
bool WrapGlobalObject(JSContext* aCx,
JS::MutableHandle<JSObject*> aReflector) override;
already_AddRefed<Clients> GetClients();
ServiceWorkerRegistration* Registration();
already_AddRefed<Promise> SkipWaiting(ErrorResult& aRv);
SafeRefPtr<extensions::ExtensionBrowser> AcquireExtensionBrowser();
IMPL_EVENT_HANDLER(install)
IMPL_EVENT_HANDLER(activate)
EventHandlerNonNull* GetOnfetch();
void SetOnfetch(EventHandlerNonNull* aCallback);
void EventListenerAdded(nsAtom* aType) override;
IMPL_EVENT_HANDLER(message)
IMPL_EVENT_HANDLER(messageerror)
IMPL_EVENT_HANDLER(notificationclick)
IMPL_EVENT_HANDLER(notificationclose)
IMPL_EVENT_HANDLER(push)
IMPL_EVENT_HANDLER(pushsubscriptionchange)
private:
~ServiceWorkerGlobalScope();
void NoteFetchHandlerWasAdded() const;
RefPtr<Clients> mClients;
const nsString mScope;
RefPtr<ServiceWorkerRegistration> mRegistration;
SafeRefPtr<extensions::ExtensionBrowser> mExtensionBrowser;
};
class WorkerDebuggerGlobalScope final : public WorkerGlobalScopeBase {
public:
using WorkerGlobalScopeBase::WorkerGlobalScopeBase;
bool WrapGlobalObject(JSContext* aCx,
JS::MutableHandle<JSObject*> aReflector) override;
void Control(const ServiceWorkerDescriptor& aServiceWorker) override {
MOZ_CRASH("Can't control debugger workers.");
}
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);
MOZ_CAN_RUN_SCRIPT void EnterEventLoop();
void LeaveEventLoop();
void PostMessage(const nsAString& aMessage);
void SetImmediate(Function& aHandler, ErrorResult& aRv);
void ReportError(JSContext* aCx, const nsAString& aMessage);
void RetrieveConsoleEvents(JSContext* aCx, nsTArray<JS::Value>& aEvents,
ErrorResult& aRv);
void ClearConsoleEvents(JSContext* aCx, ErrorResult& aRv);
void SetConsoleEventHandler(JSContext* aCx, AnyCallback* aHandler,
ErrorResult& aRv);
void Dump(JSContext* aCx, const Optional<nsAString>& aString) const;
IMPL_EVENT_HANDLER(message)
IMPL_EVENT_HANDLER(messageerror)
private:
~WorkerDebuggerGlobalScope() = default;
};
} // namespace dom
} // namespace mozilla
inline nsISupports* ToSupports(mozilla::dom::WorkerGlobalScope* aScope) {
return static_cast<mozilla::dom::EventTarget*>(aScope);
}
#endif /* mozilla_dom_workerscope_h__ */