diff --git a/caps/nsJSPrincipals.cpp b/caps/nsJSPrincipals.cpp index 61d95ebab7a6..aee99870c017 100644 --- a/caps/nsJSPrincipals.cpp +++ b/caps/nsJSPrincipals.cpp @@ -344,13 +344,14 @@ static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, JS_WriteBytes(aWriter, aBaseDomain.get(), aBaseDomain.Length()); } -static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, - const PrincipalInfo& aInfo) { +/* static */ +bool nsJSPrincipals::WritePrincipalInfo(JSStructuredCloneWriter* aWriter, + const PrincipalInfo& aInfo) { if (aInfo.type() == PrincipalInfo::TNullPrincipalInfo) { const NullPrincipalInfo& nullInfo = aInfo; return JS_WriteUint32Pair(aWriter, SCTAG_DOM_NULL_PRINCIPAL, 0) && - WritePrincipalInfo(aWriter, nullInfo.attrs(), nullInfo.spec(), - EmptyCString(), EmptyCString()); + ::WritePrincipalInfo(aWriter, nullInfo.attrs(), nullInfo.spec(), + EmptyCString(), EmptyCString()); } if (aInfo.type() == PrincipalInfo::TSystemPrincipalInfo) { return JS_WriteUint32Pair(aWriter, SCTAG_DOM_SYSTEM_PRINCIPAL, 0); @@ -373,8 +374,8 @@ static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, MOZ_ASSERT(aInfo.type() == PrincipalInfo::TContentPrincipalInfo); const ContentPrincipalInfo& cInfo = aInfo; return JS_WriteUint32Pair(aWriter, SCTAG_DOM_CONTENT_PRINCIPAL, 0) && - WritePrincipalInfo(aWriter, cInfo.attrs(), cInfo.spec(), - cInfo.originNoSuffix(), cInfo.baseDomain()); + ::WritePrincipalInfo(aWriter, cInfo.attrs(), cInfo.spec(), + cInfo.originNoSuffix(), cInfo.baseDomain()); } bool nsJSPrincipals::write(JSContext* aCx, JSStructuredCloneWriter* aWriter) { diff --git a/caps/nsJSPrincipals.h b/caps/nsJSPrincipals.h index a7504affbdec..e72323064e33 100644 --- a/caps/nsJSPrincipals.h +++ b/caps/nsJSPrincipals.h @@ -9,6 +9,12 @@ #include "jsapi.h" #include "nsIPrincipal.h" +namespace mozilla { +namespace ipc { +class PrincipalInfo; +} // namespace ipc +} // namespace mozilla + class nsJSPrincipals : public nsIPrincipal, public JSPrincipals { public: /* SpiderMonkey security callbacks. */ @@ -24,6 +30,9 @@ class nsJSPrincipals : public nsIPrincipal, public JSPrincipals { uint32_t aTag, JSPrincipals** aOutPrincipals); + /* For write() implementations of off-main-thread JSPrincipals. */ + static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, + const mozilla::ipc::PrincipalInfo& aInfo); // This class is used on the main thread to specify which principal to use // when reading principals data that was set on a DOM worker thread. // DOM workers do not use principals from Gecko's point of view, and any diff --git a/dom/worklet/WorkletPrincipals.cpp b/dom/worklet/WorkletPrincipals.cpp index 9eef61473e3f..519a4e3089de 100644 --- a/dom/worklet/WorkletPrincipals.cpp +++ b/dom/worklet/WorkletPrincipals.cpp @@ -6,7 +6,7 @@ #include "WorkletPrincipals.h" -#include "mozilla/Assertions.h" +#include "nsJSPrincipals.h" namespace mozilla { namespace dom { @@ -20,8 +20,11 @@ WorkletPrincipals::~WorkletPrincipals() = default; bool WorkletPrincipals::write(JSContext* aCx, JSStructuredCloneWriter* aWriter) { - MOZ_CRASH("WorkletPrincipals::write not implemented"); - return false; + // This is a serialization of the NullPrincipal corresponding to the worklet + // environment settings object for the WorkletGlobalScope. + // https://drafts.css-houdini.org/worklets/#set-up-a-worklet-environment-settings-object + return nsJSPrincipals::WritePrincipalInfo(aWriter, + mWorkletImpl->PrincipalInfo()); } void WorkletPrincipals::Destroy(JSPrincipals* aPrincipals) {