1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/* -*- 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/. */
#include "WorkletGlobalScope.h"
#include "js/RealmOptions.h"
#include "mozilla/SchedulerGroup.h"
#include "mozilla/dom/Console.h"
#include "mozilla/dom/WorkletGlobalScopeBinding.h"
#include "mozilla/dom/WorkletImpl.h"
#include "mozilla/dom/WorkletThread.h"
#include "mozilla/dom/worklet/WorkletModuleLoader.h"
#include "nsContentUtils.h"
#include "nsJSUtils.h"
#include "nsRFPService.h"
#include "nsThreadUtils.h"
using JS::loader::ModuleLoaderBase;
using mozilla::dom::loader::WorkletModuleLoader;
namespace mozilla::dom {
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(WorkletGlobalScope)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WorkletGlobalScope)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK(mConsole)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mModuleLoader)
tmp->UnlinkObjectsInGlobal();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WorkletGlobalScope)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsole)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mModuleLoader)
tmp->TraverseObjectsInGlobal(cb);
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(WorkletGlobalScope)
NS_IMPL_CYCLE_COLLECTING_RELEASE(WorkletGlobalScope)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WorkletGlobalScope)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsIGlobalObject)
NS_INTERFACE_MAP_ENTRY(WorkletGlobalScope)
NS_INTERFACE_MAP_END
WorkletGlobalScope::WorkletGlobalScope(WorkletImpl* aImpl)
: mImpl(aImpl), mCreationTimeStamp(TimeStamp::Now()) {}
WorkletGlobalScope::~WorkletGlobalScope() = default;
JSObject* WorkletGlobalScope::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) {
MOZ_CRASH("We should never get here!");
return nullptr;
}
nsISerialEventTarget* WorkletGlobalScope::SerialEventTarget() const {
WorkletThread::AssertIsOnWorkletThread();
return NS_GetCurrentThread();
}
nsresult WorkletGlobalScope::Dispatch(
already_AddRefed<nsIRunnable>&& aRunnable) const {
WorkletThread::AssertIsOnWorkletThread();
return SerialEventTarget()->Dispatch(std::move(aRunnable));
}
already_AddRefed<Console> WorkletGlobalScope::GetConsole(JSContext* aCx,
ErrorResult& aRv) {
if (!mConsole) {
MOZ_ASSERT(Impl());
const WorkletLoadInfo& loadInfo = Impl()->LoadInfo();
mConsole = Console::CreateForWorklet(aCx, this, loadInfo.OuterWindowID(),
loadInfo.InnerWindowID(), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
}
RefPtr<Console> console = mConsole;
return console.forget();
}
void WorkletGlobalScope::InitModuleLoader(WorkletModuleLoader* aModuleLoader) {
MOZ_ASSERT(!mModuleLoader);
mModuleLoader = aModuleLoader;
}
ModuleLoaderBase* WorkletGlobalScope::GetModuleLoader(JSContext* aCx) {
return mModuleLoader;
};
OriginTrials WorkletGlobalScope::Trials() const { return mImpl->Trials(); }
Maybe<nsID> WorkletGlobalScope::GetAgentClusterId() const {
return mImpl->GetAgentClusterId();
}
bool WorkletGlobalScope::IsSharedMemoryAllowed() const {
return mImpl->IsSharedMemoryAllowed();
}
bool WorkletGlobalScope::ShouldResistFingerprinting(RFPTarget aTarget) const {
return mImpl->ShouldResistFingerprinting(aTarget);
}
void WorkletGlobalScope::Dump(const Optional<nsAString>& aString) const {
WorkletThread::AssertIsOnWorkletThread();
if (!nsJSUtils::DumpEnabled()) {
return;
}
if (!aString.WasPassed()) {
return;
}
NS_ConvertUTF16toUTF8 str(aString.Value());
MOZ_LOG(nsContentUtils::DOMDumpLog(), mozilla::LogLevel::Debug,
("[Worklet.Dump] %s", str.get()));
#ifdef ANDROID
__android_log_print(ANDROID_LOG_INFO, "Gecko", "%s", str.get());
#endif
fputs(str.get(), stdout);
fflush(stdout);
}
JS::RealmOptions WorkletGlobalScope::CreateRealmOptions() const {
JS::RealmOptions options;
options.creationOptions().setForceUTC(
ShouldResistFingerprinting(RFPTarget::JSDateTimeUTC));
options.creationOptions().setAlwaysUseFdlibm(
ShouldResistFingerprinting(RFPTarget::JSMathFdlibm));
if (ShouldResistFingerprinting(RFPTarget::JSLocale)) {
nsCString locale = nsRFPService::GetSpoofedJSLocale();
options.creationOptions().setLocaleCopyZ(locale.get());
}
// The SharedArrayBuffer global constructor property should not be present in
// a fresh global object when shared memory objects aren't allowed (because
// COOP/COEP support isn't enabled, or because COOP/COEP don't act to isolate
// this worklet to a separate process).
options.creationOptions().setDefineSharedArrayBufferConstructor(
IsSharedMemoryAllowed());
return options;
}
} // namespace mozilla::dom
|