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 #include "WorkletGlobalScope.h"
8 #include "mozilla/SchedulerGroup.h"
9 #include "mozilla/dom/WorkletGlobalScopeBinding.h"
10 #include "mozilla/dom/WorkletImpl.h"
11 #include "mozilla/dom/WorkletThread.h"
12 #include "mozilla/dom/worklet/WorkletModuleLoader.h"
13 #include "mozilla/dom/Console.h"
14 #include "js/RealmOptions.h"
15 #include "nsContentUtils.h"
16 #include "nsJSUtils.h"
17 #include "nsThreadUtils.h"
18 #include "nsRFPService.h"
20 using JS::loader::ModuleLoaderBase
;
21 using mozilla::dom::loader::WorkletModuleLoader
;
23 namespace mozilla::dom
{
25 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(WorkletGlobalScope
)
27 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WorkletGlobalScope
)
28 NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
29 NS_IMPL_CYCLE_COLLECTION_UNLINK(mConsole
)
30 NS_IMPL_CYCLE_COLLECTION_UNLINK(mModuleLoader
)
31 tmp
->UnlinkObjectsInGlobal();
32 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
34 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WorkletGlobalScope
)
35 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsole
)
36 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mModuleLoader
)
37 tmp
->TraverseObjectsInGlobal(cb
);
38 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
40 NS_IMPL_CYCLE_COLLECTING_ADDREF(WorkletGlobalScope
)
41 NS_IMPL_CYCLE_COLLECTING_RELEASE(WorkletGlobalScope
)
42 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WorkletGlobalScope
)
43 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
44 NS_INTERFACE_MAP_ENTRY(nsIGlobalObject
)
45 NS_INTERFACE_MAP_ENTRY(WorkletGlobalScope
)
48 WorkletGlobalScope::WorkletGlobalScope(WorkletImpl
* aImpl
)
49 : mImpl(aImpl
), mCreationTimeStamp(TimeStamp::Now()) {}
51 WorkletGlobalScope::~WorkletGlobalScope() = default;
53 JSObject
* WorkletGlobalScope::WrapObject(JSContext
* aCx
,
54 JS::Handle
<JSObject
*> aGivenProto
) {
55 MOZ_CRASH("We should never get here!");
59 nsISerialEventTarget
* WorkletGlobalScope::SerialEventTarget() const {
60 WorkletThread::AssertIsOnWorkletThread();
61 return NS_GetCurrentThread();
64 nsresult
WorkletGlobalScope::Dispatch(
65 already_AddRefed
<nsIRunnable
>&& aRunnable
) const {
66 WorkletThread::AssertIsOnWorkletThread();
67 return SerialEventTarget()->Dispatch(std::move(aRunnable
));
70 already_AddRefed
<Console
> WorkletGlobalScope::GetConsole(JSContext
* aCx
,
74 const WorkletLoadInfo
& loadInfo
= Impl()->LoadInfo();
75 mConsole
= Console::CreateForWorklet(aCx
, this, loadInfo
.OuterWindowID(),
76 loadInfo
.InnerWindowID(), aRv
);
77 if (NS_WARN_IF(aRv
.Failed())) {
82 RefPtr
<Console
> console
= mConsole
;
83 return console
.forget();
86 void WorkletGlobalScope::InitModuleLoader(WorkletModuleLoader
* aModuleLoader
) {
87 MOZ_ASSERT(!mModuleLoader
);
88 mModuleLoader
= aModuleLoader
;
91 ModuleLoaderBase
* WorkletGlobalScope::GetModuleLoader(JSContext
* aCx
) {
95 OriginTrials
WorkletGlobalScope::Trials() const { return mImpl
->Trials(); }
97 Maybe
<nsID
> WorkletGlobalScope::GetAgentClusterId() const {
98 return mImpl
->GetAgentClusterId();
101 bool WorkletGlobalScope::IsSharedMemoryAllowed() const {
102 return mImpl
->IsSharedMemoryAllowed();
105 bool WorkletGlobalScope::ShouldResistFingerprinting(RFPTarget aTarget
) const {
106 return mImpl
->ShouldResistFingerprinting(aTarget
);
109 void WorkletGlobalScope::Dump(const Optional
<nsAString
>& aString
) const {
110 WorkletThread::AssertIsOnWorkletThread();
112 if (!nsJSUtils::DumpEnabled()) {
116 if (!aString
.WasPassed()) {
120 NS_ConvertUTF16toUTF8
str(aString
.Value());
122 MOZ_LOG(nsContentUtils::DOMDumpLog(), mozilla::LogLevel::Debug
,
123 ("[Worklet.Dump] %s", str
.get()));
125 __android_log_print(ANDROID_LOG_INFO
, "Gecko", "%s", str
.get());
127 fputs(str
.get(), stdout
);
131 JS::RealmOptions
WorkletGlobalScope::CreateRealmOptions() const {
132 JS::RealmOptions options
;
134 options
.creationOptions().setForceUTC(
135 ShouldResistFingerprinting(RFPTarget::JSDateTimeUTC
));
136 options
.creationOptions().setAlwaysUseFdlibm(
137 ShouldResistFingerprinting(RFPTarget::JSMathFdlibm
));
138 if (ShouldResistFingerprinting(RFPTarget::JSLocale
)) {
139 nsCString locale
= nsRFPService::GetSpoofedJSLocale();
140 options
.creationOptions().setLocaleCopyZ(locale
.get());
143 // The SharedArrayBuffer global constructor property should not be present in
144 // a fresh global object when shared memory objects aren't allowed (because
145 // COOP/COEP support isn't enabled, or because COOP/COEP don't act to isolate
146 // this worklet to a separate process).
147 options
.creationOptions().setDefineSharedArrayBufferConstructor(
148 IsSharedMemoryAllowed());
153 } // namespace mozilla::dom