Bug 1885602 - Part 5: Implement navigating to the SUMO help topic from the menu heade...
[gecko.git] / dom / worklet / WorkletGlobalScope.cpp
blob4437db398e255a9d4e93ba73da1b3bcf45f23664
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)
46 NS_INTERFACE_MAP_END
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!");
56 return nullptr;
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,
71 ErrorResult& aRv) {
72 if (!mConsole) {
73 MOZ_ASSERT(Impl());
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())) {
78 return nullptr;
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) {
92 return mModuleLoader;
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()) {
113 return;
116 if (!aString.WasPassed()) {
117 return;
120 NS_ConvertUTF16toUTF8 str(aString.Value());
122 MOZ_LOG(nsContentUtils::DOMDumpLog(), mozilla::LogLevel::Debug,
123 ("[Worklet.Dump] %s", str.get()));
124 #ifdef ANDROID
125 __android_log_print(ANDROID_LOG_INFO, "Gecko", "%s", str.get());
126 #endif
127 fputs(str.get(), stdout);
128 fflush(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());
150 return options;
153 } // namespace mozilla::dom