diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index b8e02fd2f82..0282adec4d9 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -242,6 +242,7 @@ LoadInfoToLoadInfoArgs(nsILoadInfo *aLoadInfo, aLoadInfo->GetParentOuterWindowID(), aLoadInfo->GetEnforceSecurity(), aLoadInfo->GetInitialSecurityCheckDone(), + aLoadInfo->GetOriginAttributes(), redirectChain); return NS_OK; @@ -286,6 +287,7 @@ LoadInfoArgsToLoadInfo(const OptionalLoadInfoArgs& aOptionalLoadInfoArgs, loadInfoArgs.parentOuterWindowID(), loadInfoArgs.enforceSecurity(), loadInfoArgs.initialSecurityCheckDone(), + loadInfoArgs.originAttributes(), redirectChain); loadInfo.forget(outLoadInfo); diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp index 82ae12f2331..8433ef11f8d 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp @@ -81,6 +81,8 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal, mUpgradeInsecureRequests = aLoadingContext->OwnerDoc()->GetUpgradeInsecureRequests(); } + + mOriginAttributes = BasePrincipal::Cast(mLoadingPrincipal)->OriginAttributesRef(); } LoadInfo::LoadInfo(const LoadInfo& rhs) @@ -108,6 +110,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal, uint64_t aParentOuterWindowID, bool aEnforceSecurity, bool aInitialSecurityCheckDone, + const OriginAttributes& aOriginAttributes, nsTArray>& aRedirectChain) : mLoadingPrincipal(aLoadingPrincipal) , mTriggeringPrincipal(aTriggeringPrincipal) @@ -119,6 +122,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal, , mParentOuterWindowID(aParentOuterWindowID) , mEnforceSecurity(aEnforceSecurity) , mInitialSecurityCheckDone(aInitialSecurityCheckDone) + , mOriginAttributes(aOriginAttributes) { MOZ_ASSERT(mLoadingPrincipal); MOZ_ASSERT(mTriggeringPrincipal); @@ -290,6 +294,44 @@ LoadInfo::GetParentOuterWindowID(uint64_t* aResult) return NS_OK; } +NS_IMETHODIMP +LoadInfo::GetScriptableOriginAttributes(JSContext* aCx, + JS::MutableHandle aOriginAttributes) +{ + if (NS_WARN_IF(!ToJSValue(aCx, mOriginAttributes, aOriginAttributes))) { + return NS_ERROR_FAILURE; + } + return NS_OK; +} + +NS_IMETHODIMP +LoadInfo::SetScriptableOriginAttributes(JSContext* aCx, + JS::Handle aOriginAttributes) +{ + OriginAttributes attrs; + if (!aOriginAttributes.isObject() || !attrs.Init(aCx, aOriginAttributes)) { + return NS_ERROR_INVALID_ARG; + } + + mOriginAttributes = attrs; + return NS_OK; +} + +nsresult +LoadInfo::GetOriginAttributes(mozilla::OriginAttributes* aOriginAttributes) +{ + NS_ENSURE_ARG(aOriginAttributes); + *aOriginAttributes = mOriginAttributes; + return NS_OK; +} + +nsresult +LoadInfo::SetOriginAttributes(const mozilla::OriginAttributes& aOriginAttributes) +{ + mOriginAttributes = aOriginAttributes; + return NS_OK; +} + NS_IMETHODIMP LoadInfo::SetEnforceSecurity(bool aEnforceSecurity) { diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h index bf0a7200aea..23d64aaee9f 100644 --- a/netwerk/base/LoadInfo.h +++ b/netwerk/base/LoadInfo.h @@ -14,6 +14,8 @@ #include "nsIURI.h" #include "nsTArray.h" +#include "mozilla/BasePrincipal.h" + class nsINode; class nsXMLHttpRequest; @@ -68,6 +70,7 @@ private: uint64_t aParentOuterWindowID, bool aEnforceSecurity, bool aInitialSecurityCheckDone, + const OriginAttributes& aOriginAttributes, nsTArray>& aRedirectChain); LoadInfo(const LoadInfo& rhs); @@ -95,6 +98,7 @@ private: uint64_t mParentOuterWindowID; bool mEnforceSecurity; bool mInitialSecurityCheckDone; + OriginAttributes mOriginAttributes; nsTArray> mRedirectChain; }; diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl index ef2e17ba906..a61b67e38ae 100644 --- a/netwerk/base/nsILoadInfo.idl +++ b/netwerk/base/nsILoadInfo.idl @@ -13,16 +13,19 @@ interface nsIPrincipal; %{C++ #include "nsTArray.h" +#include "mozilla/BasePrincipal.h" %} [ref] native const_nsIPrincipalArray(const nsTArray>); +native OriginAttributes(mozilla::OriginAttributes); +[ref] native const_OriginAttributesRef(const mozilla::OriginAttributes); typedef unsigned long nsSecurityFlags; /** * An nsILoadOwner represents per-load information about who started the load. */ -[scriptable, builtinclass, uuid(c6dacd0c-7faf-4943-811f-03583591bc85)] +[scriptable, builtinclass, uuid(51313616-163f-4be1-aba0-e3d471b7f7a2)] interface nsILoadInfo : nsISupports { /** @@ -343,6 +346,29 @@ interface nsILoadInfo : nsISupports } %} + /** + * Customized OriginAttributes within LoadInfo to allow overwriting of the + * default originAttributes from the loadingPrincipal. + */ + [implicit_jscontext, binaryname(ScriptableOriginAttributes)] + attribute jsval originAttributes; + + [noscript, nostdcall, binaryname(GetOriginAttributes)] + OriginAttributes binaryGetOriginAttributes(); + + [noscript, nostdcall, binaryname(SetOriginAttributes)] + void binarySetOriginAttributes(in const_OriginAttributesRef aOriginAttrs); + +%{ C++ + inline mozilla::OriginAttributes GetOriginAttributes() + { + mozilla::OriginAttributes result; + mozilla::DebugOnly rv = GetOriginAttributes(&result); + MOZ_ASSERT(NS_SUCCEEDED(rv)); + return result; + } +%} + /** * Whenever a channel is openend by asyncOpen2() [or also open2()], * lets set this flag so that redirects of such channels are also diff --git a/netwerk/ipc/NeckoChannelParams.ipdlh b/netwerk/ipc/NeckoChannelParams.ipdlh index 6cbf433fd63..6028f3c93c1 100644 --- a/netwerk/ipc/NeckoChannelParams.ipdlh +++ b/netwerk/ipc/NeckoChannelParams.ipdlh @@ -26,17 +26,18 @@ namespace net { struct LoadInfoArgs { - PrincipalInfo requestingPrincipalInfo; - PrincipalInfo triggeringPrincipalInfo; - uint32_t securityFlags; - uint32_t contentPolicyType; - bool upgradeInsecureRequests; - uint64_t innerWindowID; - uint64_t outerWindowID; - uint64_t parentOuterWindowID; - bool enforceSecurity; - bool initialSecurityCheckDone; - PrincipalInfo[] redirectChain; + PrincipalInfo requestingPrincipalInfo; + PrincipalInfo triggeringPrincipalInfo; + uint32_t securityFlags; + uint32_t contentPolicyType; + bool upgradeInsecureRequests; + uint64_t innerWindowID; + uint64_t outerWindowID; + uint64_t parentOuterWindowID; + bool enforceSecurity; + bool initialSecurityCheckDone; + OriginAttributes originAttributes; + PrincipalInfo[] redirectChain; }; /**