From e65a2c3ebb74fa9b700b909812accf0cb195be68 Mon Sep 17 00:00:00 2001 From: Yaron Tausky Date: Fri, 15 Nov 2019 12:25:57 +0000 Subject: [PATCH] Bug 1591892 - Expose {window, self}.crossOriginIsolated r=bzbarsky Differential Revision: https://phabricator.services.mozilla.com/D52532 --HG-- extra : moz-landing-system : lando --- dom/base/nsGlobalWindowInner.cpp | 8 +++++++- dom/base/nsGlobalWindowInner.h | 4 +++- dom/base/nsGlobalWindowOuter.cpp | 2 +- dom/webidl/WindowOrWorkerGlobalScope.webidl | 1 + dom/workers/Worker.cpp | 4 ++-- dom/workers/WorkerPrivate.cpp | 10 ++++++++-- dom/workers/WorkerPrivate.h | 4 +++- dom/workers/WorkerScope.cpp | 4 ++++ dom/workers/WorkerScope.h | 1 + 9 files changed, 30 insertions(+), 8 deletions(-) diff --git a/dom/base/nsGlobalWindowInner.cpp b/dom/base/nsGlobalWindowInner.cpp index 10c810e08416..6f91e72aaeda 100644 --- a/dom/base/nsGlobalWindowInner.cpp +++ b/dom/base/nsGlobalWindowInner.cpp @@ -2359,7 +2359,7 @@ void nsGlobalWindowInner::UpdateTopInnerWindow() { mTopInnerWindow->UpdateWebSocketCount(-(int32_t)mNumOfOpenWebSockets); } -bool nsGlobalWindowInner::IsCrossOriginIsolated() const { +bool nsGlobalWindowInner::IsSharedMemoryAllowed() const { MOZ_ASSERT(NS_IsMainThread()); if (StaticPrefs:: @@ -2367,6 +2367,12 @@ bool nsGlobalWindowInner::IsCrossOriginIsolated() const { return true; } + return CrossOriginIsolated(); +} + +bool nsGlobalWindowInner::CrossOriginIsolated() const { + MOZ_ASSERT(NS_IsMainThread()); + if (!StaticPrefs::dom_postMessage_sharedArrayBuffer_withCOOP_COEP()) { return false; } diff --git a/dom/base/nsGlobalWindowInner.h b/dom/base/nsGlobalWindowInner.h index 6d96b2cfbe3f..17ecebd50c7b 100644 --- a/dom/base/nsGlobalWindowInner.h +++ b/dom/base/nsGlobalWindowInner.h @@ -940,8 +940,10 @@ class nsGlobalWindowInner final : public mozilla::dom::EventTarget, return GetExtantDoc() && GetExtantDoc()->IsInSyncOperation(); } + bool IsSharedMemoryAllowed() const; + // https://whatpr.org/html/4734/structured-data.html#cross-origin-isolated - bool IsCrossOriginIsolated() const; + bool CrossOriginIsolated() const; protected: // Web IDL helpers diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp index 4f789ce119b4..14e40877dca8 100644 --- a/dom/base/nsGlobalWindowOuter.cpp +++ b/dom/base/nsGlobalWindowOuter.cpp @@ -6058,7 +6058,7 @@ void nsGlobalWindowOuter::PostMessageMozOuter(JSContext* aCx, JS::CloneDataPolicy clonePolicy; if (GetDocGroup() && callerInnerWindow && - callerInnerWindow->IsCrossOriginIsolated()) { + callerInnerWindow->IsSharedMemoryAllowed()) { clonePolicy.allowSharedMemory(); } event->Write(aCx, aMessage, aTransfer, clonePolicy, aError); diff --git a/dom/webidl/WindowOrWorkerGlobalScope.webidl b/dom/webidl/WindowOrWorkerGlobalScope.webidl index 91dd66d252c9..8cff7b714f65 100644 --- a/dom/webidl/WindowOrWorkerGlobalScope.webidl +++ b/dom/webidl/WindowOrWorkerGlobalScope.webidl @@ -14,6 +14,7 @@ [Exposed=(Window,Worker)] interface mixin WindowOrWorkerGlobalScope { [Replaceable] readonly attribute USVString origin; + readonly attribute boolean crossOriginIsolated; // base64 utility methods [Throws] diff --git a/dom/workers/Worker.cpp b/dom/workers/Worker.cpp index f0d3232adeb4..a5244ceff5f1 100644 --- a/dom/workers/Worker.cpp +++ b/dom/workers/Worker.cpp @@ -104,12 +104,12 @@ void Worker::PostMessage(JSContext* aCx, JS::Handle aMessage, JS::CloneDataPolicy clonePolicy; if (NS_IsMainThread()) { nsGlobalWindowInner* win = nsContentUtils::CallerInnerWindow(); - if (win && win->IsCrossOriginIsolated()) { + if (win && win->IsSharedMemoryAllowed()) { clonePolicy.allowSharedMemory(); } } else { WorkerPrivate* worker = GetCurrentThreadWorkerPrivate(); - if (worker && worker->IsCrossOriginIsolated()) { + if (worker && worker->IsSharedMemoryAllowed()) { clonePolicy.allowSharedMemory(); } } diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index 29a2da5907c9..469a93ae8e55 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -3950,7 +3950,7 @@ void WorkerPrivate::PostMessageToParent( } JS::CloneDataPolicy clonePolicy; - if (IsCrossOriginIsolated()) { + if (IsSharedMemoryAllowed()) { clonePolicy.allowSharedMemory(); } runnable->Write(aCx, aMessage, transferable, clonePolicy, aRv); @@ -4974,7 +4974,7 @@ const nsAString& WorkerPrivate::Id() { return mId; } -bool WorkerPrivate::IsCrossOriginIsolated() const { +bool WorkerPrivate::IsSharedMemoryAllowed() const { AssertIsOnWorkerThread(); if (StaticPrefs:: @@ -4982,6 +4982,12 @@ bool WorkerPrivate::IsCrossOriginIsolated() const { return true; } + return CrossOriginIsolated(); +} + +bool WorkerPrivate::CrossOriginIsolated() const { + AssertIsOnWorkerThread(); + if (!StaticPrefs::dom_postMessage_sharedArrayBuffer_withCOOP_COEP()) { return false; } diff --git a/dom/workers/WorkerPrivate.h b/dom/workers/WorkerPrivate.h index 99e3becebb14..a15d65c6080b 100644 --- a/dom/workers/WorkerPrivate.h +++ b/dom/workers/WorkerPrivate.h @@ -896,8 +896,10 @@ class WorkerPrivate : public RelativeTimeline { const nsID& AgentClusterId() const { return mAgentClusterId; } + bool IsSharedMemoryAllowed() const; + // https://whatpr.org/html/4734/structured-data.html#cross-origin-isolated - bool IsCrossOriginIsolated() const; + bool CrossOriginIsolated() const; private: WorkerPrivate( diff --git a/dom/workers/WorkerScope.cpp b/dom/workers/WorkerScope.cpp index 9fac4a2fd48f..a309522cb1dc 100644 --- a/dom/workers/WorkerScope.cpp +++ b/dom/workers/WorkerScope.cpp @@ -386,6 +386,10 @@ void WorkerGlobalScope::GetOrigin(nsAString& aOrigin) const { aOrigin = mWorkerPrivate->Origin(); } +bool WorkerGlobalScope::CrossOriginIsolated() const { + return mWorkerPrivate->CrossOriginIsolated(); +} + void WorkerGlobalScope::Atob(const nsAString& aAtob, nsAString& aOutput, ErrorResult& aRv) const { mWorkerPrivate->AssertIsOnWorkerThread(); diff --git a/dom/workers/WorkerScope.h b/dom/workers/WorkerScope.h index abe95123b0c6..f61123b1a6f9 100644 --- a/dom/workers/WorkerScope.h +++ b/dom/workers/WorkerScope.h @@ -142,6 +142,7 @@ class WorkerGlobalScope : public DOMEventTargetHelper, void ClearInterval(int32_t aHandle); void GetOrigin(nsAString& aOrigin) const; + bool CrossOriginIsolated() const; void Atob(const nsAString& aAtob, nsAString& aOutput, ErrorResult& aRv) const; void Btoa(const nsAString& aBtoa, nsAString& aOutput, ErrorResult& aRv) const;