diff --git a/dom/base/nsIGlobalObject.cpp b/dom/base/nsIGlobalObject.cpp index 9d17b16e50b2..6b5ce7b88381 100644 --- a/dom/base/nsIGlobalObject.cpp +++ b/dom/base/nsIGlobalObject.cpp @@ -182,6 +182,14 @@ Maybe nsIGlobalObject::GetClientInfo() const { return Maybe(); } +Maybe nsIGlobalObject::GetAgentClusterId() const { + Maybe ci = GetClientInfo(); + if (ci.isSome()) { + return ci.value().AgentClusterId(); + } + return Nothing(); +} + Maybe nsIGlobalObject::GetController() const { // By default globals do not have a service worker controller. Only real // window and worker globals can currently be controlled as a client. diff --git a/dom/base/nsIGlobalObject.h b/dom/base/nsIGlobalObject.h index ccaf46003d2c..b6f9cb233189 100644 --- a/dom/base/nsIGlobalObject.h +++ b/dom/base/nsIGlobalObject.h @@ -144,6 +144,8 @@ class nsIGlobalObject : public nsISupports, virtual mozilla::Maybe GetClientInfo() const; + virtual mozilla::Maybe GetAgentClusterId() const; + virtual mozilla::Maybe GetController() const; diff --git a/dom/broadcastchannel/BroadcastChannel.cpp b/dom/broadcastchannel/BroadcastChannel.cpp index 5be78d743944..eab817207705 100644 --- a/dom/broadcastchannel/BroadcastChannel.cpp +++ b/dom/broadcastchannel/BroadcastChannel.cpp @@ -353,10 +353,7 @@ void BroadcastChannel::PostMessage(JSContext* aCx, nsCOMPtr global = GetOwnerGlobal(); MOZ_ASSERT(global); if (global) { - Maybe clientInfo = global->GetClientInfo(); - if (clientInfo) { - agentClusterId = clientInfo->AgentClusterId(); - } + agentClusterId = global->GetAgentClusterId(); } RefPtr data = new SharedMessageBody( diff --git a/dom/ipc/SharedMessageBody.cpp b/dom/ipc/SharedMessageBody.cpp index 0a1d32df6742..6b3cb11d42a4 100644 --- a/dom/ipc/SharedMessageBody.cpp +++ b/dom/ipc/SharedMessageBody.cpp @@ -71,13 +71,10 @@ void SharedMessageBody::Read(JSContext* aCx, nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx); MOZ_ASSERT(global); - Maybe clientInfo = global->GetClientInfo(); - if (clientInfo) { - Maybe agentClusterId = clientInfo->AgentClusterId(); - if (agentClusterId.isSome() && - mAgentClusterId.value().Equals(agentClusterId.value())) { - cloneDataPolicy.allowIntraClusterClonableSharedObjects(); - } + Maybe agentClusterId = global->GetAgentClusterId(); + if (agentClusterId.isSome() && + mAgentClusterId.value().Equals(agentClusterId.value())) { + cloneDataPolicy.allowIntraClusterClonableSharedObjects(); } } diff --git a/dom/media/webaudio/AudioWorkletGlobalScope.cpp b/dom/media/webaudio/AudioWorkletGlobalScope.cpp index b672dbbcca8d..945cf23747ad 100644 --- a/dom/media/webaudio/AudioWorkletGlobalScope.cpp +++ b/dom/media/webaudio/AudioWorkletGlobalScope.cpp @@ -33,7 +33,7 @@ NS_IMPL_ADDREF_INHERITED(AudioWorkletGlobalScope, WorkletGlobalScope) NS_IMPL_RELEASE_INHERITED(AudioWorkletGlobalScope, WorkletGlobalScope) AudioWorkletGlobalScope::AudioWorkletGlobalScope(AudioWorkletImpl* aImpl) - : mImpl(aImpl) {} + : WorkletGlobalScope(aImpl->GetAgentClusterId()), mImpl(aImpl) {} bool AudioWorkletGlobalScope::WrapGlobalObject( JSContext* aCx, JS::MutableHandle aReflector) { diff --git a/dom/messagechannel/MessagePort.cpp b/dom/messagechannel/MessagePort.cpp index 519c49a2947c..5e1830453b26 100644 --- a/dom/messagechannel/MessagePort.cpp +++ b/dom/messagechannel/MessagePort.cpp @@ -332,10 +332,7 @@ void MessagePort::PostMessage(JSContext* aCx, JS::Handle aMessage, Maybe agentClusterId; nsCOMPtr global = GetOwnerGlobal(); if (global) { - Maybe clientInfo = global->GetClientInfo(); - if (clientInfo) { - agentClusterId = clientInfo->AgentClusterId(); - } + agentClusterId = global->GetAgentClusterId(); } RefPtr data = new SharedMessageBody( diff --git a/dom/worklet/WorkletGlobalScope.cpp b/dom/worklet/WorkletGlobalScope.cpp index 3ffbadd7ff93..f4e4e86f0d12 100644 --- a/dom/worklet/WorkletGlobalScope.cpp +++ b/dom/worklet/WorkletGlobalScope.cpp @@ -36,8 +36,8 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WorkletGlobalScope) NS_INTERFACE_MAP_ENTRY(WorkletGlobalScope) NS_INTERFACE_MAP_END -WorkletGlobalScope::WorkletGlobalScope() - : mCreationTimeStamp(TimeStamp::Now()) {} +WorkletGlobalScope::WorkletGlobalScope(const Maybe& aAgentClusterId) + : mCreationTimeStamp(TimeStamp::Now()), mAgentClusterId(aAgentClusterId) {} WorkletGlobalScope::~WorkletGlobalScope() = default; diff --git a/dom/worklet/WorkletGlobalScope.h b/dom/worklet/WorkletGlobalScope.h index dc09a3c6080e..b7a5dbb1c7a1 100644 --- a/dom/worklet/WorkletGlobalScope.h +++ b/dom/worklet/WorkletGlobalScope.h @@ -9,6 +9,7 @@ #include "mozilla/Attributes.h" #include "mozilla/ErrorResult.h" +#include "mozilla/Maybe.h" #include "mozilla/TimeStamp.h" #include "mozilla/dom/BindingDeclarations.h" #include "nsDOMNavigationTiming.h" @@ -37,7 +38,7 @@ class WorkletGlobalScope : public nsIGlobalObject, public nsWrapperCache { NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WorkletGlobalScope) - WorkletGlobalScope(); + explicit WorkletGlobalScope(const Maybe& aAgentClusterId); nsIGlobalObject* GetParentObject() const { return nullptr; } @@ -64,12 +65,15 @@ class WorkletGlobalScope : public nsIGlobalObject, public nsWrapperCache { return duration.ToMilliseconds(); } + Maybe GetAgentClusterId() const override { return mAgentClusterId; } + protected: ~WorkletGlobalScope(); ; private: TimeStamp mCreationTimeStamp; + Maybe mAgentClusterId; RefPtr mConsole; }; diff --git a/dom/worklet/WorkletImpl.cpp b/dom/worklet/WorkletImpl.cpp index af18294b7aa0..b8cc204c8a79 100644 --- a/dom/worklet/WorkletImpl.cpp +++ b/dom/worklet/WorkletImpl.cpp @@ -40,6 +40,10 @@ WorkletImpl::WorkletImpl(nsPIDOMWindowInner* aWindow, nsIPrincipal* aPrincipal) mTerminated(false) { Unused << NS_WARN_IF( NS_FAILED(ipc::PrincipalToPrincipalInfo(mPrincipal, &mPrincipalInfo))); + + if (aWindow->GetDocGroup()) { + mAgentClusterId.emplace(aWindow->GetDocGroup()->AgentClusterId()); + } } WorkletImpl::~WorkletImpl() { diff --git a/dom/worklet/WorkletImpl.h b/dom/worklet/WorkletImpl.h index d879095b6ee4..f976aeb831f1 100644 --- a/dom/worklet/WorkletImpl.h +++ b/dom/worklet/WorkletImpl.h @@ -8,6 +8,7 @@ #define mozilla_dom_worklet_WorkletImpl_h #include "MainThreadUtils.h" +#include "mozilla/Maybe.h" #include "mozilla/OriginAttributes.h" #include "mozilla/ipc/PBackgroundSharedTypes.h" @@ -74,6 +75,8 @@ class WorkletImpl { } const ipc::PrincipalInfo& PrincipalInfo() const { return mPrincipalInfo; } + const Maybe& GetAgentClusterId() const { return mAgentClusterId; } + protected: WorkletImpl(nsPIDOMWindowInner* aWindow, nsIPrincipal* aPrincipal); virtual ~WorkletImpl(); @@ -93,6 +96,8 @@ class WorkletImpl { // Execution thread only. RefPtr mGlobalScope; + + Maybe mAgentClusterId; }; } // namespace mozilla diff --git a/layout/style/PaintWorkletGlobalScope.cpp b/layout/style/PaintWorkletGlobalScope.cpp index 07e2b6d50333..4f8f9558a5c2 100644 --- a/layout/style/PaintWorkletGlobalScope.cpp +++ b/layout/style/PaintWorkletGlobalScope.cpp @@ -15,7 +15,7 @@ namespace mozilla { namespace dom { PaintWorkletGlobalScope::PaintWorkletGlobalScope(PaintWorkletImpl* aImpl) - : mImpl(aImpl) {} + : WorkletGlobalScope(aImpl->GetAgentClusterId()), mImpl(aImpl) {} bool PaintWorkletGlobalScope::WrapGlobalObject( JSContext* aCx, JS::MutableHandle aReflector) {