From 8b800510c1e1a5a3977ac8cbed99b9b476f9cc28 Mon Sep 17 00:00:00 2001
From: Dragana Damjanovic
Date: Wed, 21 Oct 2015 23:47:00 +0200
Subject: [PATCH] Bug 1175685 - add OriginAttribute to LoadInfo. r=jonas,
r=ckerschb, r=michal
---
ipc/glue/BackgroundUtils.cpp | 2 ++
netwerk/base/LoadInfo.cpp | 42 ++++++++++++++++++++++++++++
netwerk/base/LoadInfo.h | 4 +++
netwerk/base/nsILoadInfo.idl | 28 ++++++++++++++++++-
netwerk/ipc/NeckoChannelParams.ipdlh | 23 +++++++--------
5 files changed, 87 insertions(+), 12 deletions(-)
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;
};
/**