Bug 1163861 - Pass window IDs in nsILoadInfo (r=ckerschb)

This commit is contained in:
Bill McCloskey 2015-05-08 12:52:49 -07:00
parent 71efcb229e
commit 3d39da47b9
12 changed files with 133 additions and 28 deletions

View File

@ -7,8 +7,11 @@
#include "mozilla/LoadInfo.h"
#include "mozilla/Assertions.h"
#include "nsFrameLoader.h"
#include "nsIDocShell.h"
#include "nsIDocument.h"
#include "nsIDOMDocument.h"
#include "nsIFrameLoader.h"
#include "nsISupportsImpl.h"
#include "nsISupportsUtils.h"
@ -28,8 +31,9 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
, mSecurityFlags(aSecurityFlags)
, mContentPolicyType(aContentPolicyType)
, mBaseURI(aBaseURI)
, mInnerWindowID(aLoadingContext ?
aLoadingContext->OwnerDoc()->InnerWindowID() : 0)
, mInnerWindowID(0)
, mOuterWindowID(0)
, mParentOuterWindowID(0)
{
MOZ_ASSERT(mLoadingPrincipal);
MOZ_ASSERT(mTriggeringPrincipal);
@ -43,18 +47,51 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
if (mSecurityFlags & nsILoadInfo::SEC_SANDBOXED) {
mSecurityFlags ^= nsILoadInfo::SEC_FORCE_INHERIT_PRINCIPAL;
}
if (aLoadingContext) {
nsCOMPtr<nsPIDOMWindow> outerWindow;
// When the element being loaded is a frame, we choose the frame's window
// for the window ID and the frame element's window as the parent
// window. This is the behavior that Chrome exposes to add-ons.
nsCOMPtr<nsIFrameLoaderOwner> frameLoaderOwner = do_QueryInterface(aLoadingContext);
if (frameLoaderOwner) {
nsCOMPtr<nsIFrameLoader> fl = frameLoaderOwner->GetFrameLoader();
nsCOMPtr<nsIDocShell> docShell;
if (fl && NS_SUCCEEDED(fl->GetDocShell(getter_AddRefs(docShell))) && docShell) {
outerWindow = do_GetInterface(docShell);
}
} else {
outerWindow = aLoadingContext->OwnerDoc()->GetWindow();
}
if (outerWindow) {
nsCOMPtr<nsPIDOMWindow> inner = outerWindow->GetCurrentInnerWindow();
mInnerWindowID = inner ? inner->WindowID() : 0;
mOuterWindowID = outerWindow->WindowID();
nsCOMPtr<nsIDOMWindow> parent;
outerWindow->GetParent(getter_AddRefs(parent));
nsCOMPtr<nsPIDOMWindow> piParent = do_QueryInterface(parent);
mParentOuterWindowID = piParent->WindowID();
}
}
}
LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
nsIPrincipal* aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
uint32_t aInnerWindowID)
uint64_t aInnerWindowID,
uint64_t aOuterWindowID,
uint64_t aParentOuterWindowID)
: mLoadingPrincipal(aLoadingPrincipal)
, mTriggeringPrincipal(aTriggeringPrincipal)
, mSecurityFlags(aSecurityFlags)
, mContentPolicyType(aContentPolicyType)
, mInnerWindowID(aInnerWindowID)
, mOuterWindowID(aOuterWindowID)
, mParentOuterWindowID(aParentOuterWindowID)
{
MOZ_ASSERT(mLoadingPrincipal);
MOZ_ASSERT(mTriggeringPrincipal);
@ -154,10 +191,24 @@ LoadInfo::BaseURI()
}
NS_IMETHODIMP
LoadInfo::GetInnerWindowID(uint32_t* aResult)
LoadInfo::GetInnerWindowID(uint64_t* aResult)
{
*aResult = mInnerWindowID;
return NS_OK;
}
NS_IMETHODIMP
LoadInfo::GetOuterWindowID(uint64_t* aResult)
{
*aResult = mOuterWindowID;
return NS_OK;
}
NS_IMETHODIMP
LoadInfo::GetParentOuterWindowID(uint64_t* aResult)
{
*aResult = mParentOuterWindowID;
return NS_OK;
}
} // namespace mozilla

View File

@ -53,7 +53,9 @@ private:
nsIPrincipal* aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
uint32_t aInnerWindowID);
uint64_t aInnerWindowID,
uint64_t aOuterWindowID,
uint64_t aParentOuterWindowID);
friend class net::HttpChannelParent;
friend class net::FTPChannelParent;
@ -67,7 +69,9 @@ private:
nsSecurityFlags mSecurityFlags;
nsContentPolicyType mContentPolicyType;
nsCOMPtr<nsIURI> mBaseURI;
uint32_t mInnerWindowID;
uint64_t mInnerWindowID;
uint64_t mOuterWindowID;
uint64_t mParentOuterWindowID;
};
} // namespace mozilla

View File

@ -17,7 +17,7 @@ typedef unsigned long nsSecurityFlags;
/**
* An nsILoadOwner represents per-load information about who started the load.
*/
[scriptable, builtinclass, uuid(768a1f20-57d4-462a-812a-41c04e5d1e19)]
[scriptable, builtinclass, uuid(dcf54f49-2d63-4c34-9da1-54df235f354c)]
interface nsILoadInfo : nsISupports
{
/**
@ -182,22 +182,44 @@ interface nsILoadInfo : nsISupports
nsIURI binaryBaseURI();
/**
* The innerWindowId of the loadingDocument, used to identify
* the loadingDocument in e10s where the loadingDocument is
* not available.
* Typically these are the window IDs of the window in which the element being
* loaded lives. However, if the element being loaded is <frame
* src="foo.html"> (or, more generally, if the element QIs to
* nsIFrameLoaderOwner) then the window IDs are for the window containing the
* foo.html document. In this case, parentOuterWindowID is the window ID of
* the window containing the <frame> element.
*
* Warning: If the loadingDocument is null, then the
* innerWindowId is 0.
* Note that these window IDs can be 0 if the window is not
* available. parentOuterWindowID will be the same as outerWindowID if the
* window has no parent.
*/
readonly attribute unsigned long innerWindowID;
readonly attribute unsigned long long innerWindowID;
readonly attribute unsigned long long outerWindowID;
readonly attribute unsigned long long parentOuterWindowID;
%{ C++
inline uint32_t GetInnerWindowID()
inline uint64_t GetInnerWindowID()
{
uint32_t result;
uint64_t result;
mozilla::DebugOnly<nsresult> rv = GetInnerWindowID(&result);
MOZ_ASSERT(NS_SUCCEEDED(rv));
return result;
}
%}
inline uint64_t GetOuterWindowID()
{
uint64_t result;
mozilla::DebugOnly<nsresult> rv = GetOuterWindowID(&result);
MOZ_ASSERT(NS_SUCCEEDED(rv));
return result;
}
inline uint64_t GetParentOuterWindowID()
{
uint64_t result;
mozilla::DebugOnly<nsresult> rv = GetParentOuterWindowID(&result);
MOZ_ASSERT(NS_SUCCEEDED(rv));
return result;
}
%}
};

View File

@ -65,7 +65,9 @@ struct HttpChannelOpenArgs
PrincipalInfo triggeringPrincipalInfo;
uint32_t securityFlags;
uint32_t contentPolicyType;
uint32_t innerWindowID;
uint64_t innerWindowID;
uint64_t outerWindowID;
uint64_t parentOuterWindowID;
OptionalHttpResponseHead synthesizedResponseHead;
uint32_t cacheKey;
};
@ -96,7 +98,9 @@ struct FTPChannelOpenArgs
PrincipalInfo triggeringPrincipalInfo;
uint32_t securityFlags;
uint32_t contentPolicyType;
uint32_t innerWindowID;
uint64_t innerWindowID;
uint64_t outerWindowID;
uint64_t parentOuterWindowID;
};
struct FTPChannelConnectArgs
@ -142,7 +146,9 @@ struct WebSocketLoadInfoArgs
PrincipalInfo triggeringPrincipalInfo;
uint32_t securityFlags;
uint32_t contentPolicyType;
uint32_t innerWindowID;
uint64_t innerWindowID;
uint64_t outerWindowID;
uint64_t parentOuterWindowID;
};
} // namespace ipc

View File

@ -163,6 +163,8 @@ propagateLoadInfo(nsILoadInfo *aLoadInfo,
openArgs.securityFlags() = aLoadInfo->GetSecurityFlags();
openArgs.contentPolicyType() = aLoadInfo->GetContentPolicyType();
openArgs.innerWindowID() = aLoadInfo->GetInnerWindowID();
openArgs.outerWindowID() = aLoadInfo->GetOuterWindowID();
openArgs.parentOuterWindowID() = aLoadInfo->GetParentOuterWindowID();
return;
}
@ -174,6 +176,8 @@ propagateLoadInfo(nsILoadInfo *aLoadInfo,
openArgs.securityFlags() = nsILoadInfo::SEC_NORMAL;
openArgs.contentPolicyType() = nsIContentPolicy::TYPE_OTHER;
openArgs.innerWindowID() = 0;
openArgs.outerWindowID() = 0;
openArgs.parentOuterWindowID() = 0;
}
NS_IMETHODIMP

View File

@ -89,7 +89,8 @@ FTPChannelParent::Init(const FTPChannelCreationArgs& aArgs)
const FTPChannelOpenArgs& a = aArgs.get_FTPChannelOpenArgs();
return DoAsyncOpen(a.uri(), a.startPos(), a.entityID(), a.uploadStream(),
a.requestingPrincipalInfo(), a.triggeringPrincipalInfo(),
a.securityFlags(), a.contentPolicyType(), a.innerWindowID());
a.securityFlags(), a.contentPolicyType(),
a.innerWindowID(), a.outerWindowID(), a.parentOuterWindowID());
}
case FTPChannelCreationArgs::TFTPChannelConnectArgs:
{
@ -111,7 +112,9 @@ FTPChannelParent::DoAsyncOpen(const URIParams& aURI,
const ipc::PrincipalInfo& aTriggeringPrincipalInfo,
const uint32_t& aSecurityFlags,
const uint32_t& aContentPolicyType,
const uint32_t& aInnerWindowID)
const uint64_t& aInnerWindowID,
const uint64_t& aOuterWindowID,
const uint64_t& aParentOuterWindowID)
{
nsCOMPtr<nsIURI> uri = DeserializeURI(aURI);
if (!uri)
@ -154,7 +157,7 @@ FTPChannelParent::DoAsyncOpen(const URIParams& aURI,
nsCOMPtr<nsILoadInfo> loadInfo =
new mozilla::LoadInfo(requestingPrincipal, triggeringPrincipal,
aSecurityFlags, aContentPolicyType,
aInnerWindowID);
aInnerWindowID, aOuterWindowID, aParentOuterWindowID);
nsCOMPtr<nsIChannel> chan;
rv = NS_NewChannelInternal(getter_AddRefs(chan), uri, loadInfo,

View File

@ -68,7 +68,9 @@ protected:
const ipc::PrincipalInfo& aTriggeringPrincipalInfo,
const uint32_t& aSecurityFlags,
const uint32_t& aContentPolicyType,
const uint32_t& aInnerWindowID);
const uint64_t& aInnerWindowID,
const uint64_t& aOuterWindowID,
const uint64_t& aParentOuterWindowID);
// used to connect redirected-to channel in parent with just created
// ChildChannel. Used during HTTP->FTP redirects.

View File

@ -1489,6 +1489,8 @@ propagateLoadInfo(nsILoadInfo *aLoadInfo,
openArgs.securityFlags() = aLoadInfo->GetSecurityFlags();
openArgs.contentPolicyType() = aLoadInfo->GetContentPolicyType();
openArgs.innerWindowID() = aLoadInfo->GetInnerWindowID();
openArgs.outerWindowID() = aLoadInfo->GetOuterWindowID();
openArgs.parentOuterWindowID() = aLoadInfo->GetParentOuterWindowID();
return;
}
@ -1500,6 +1502,8 @@ propagateLoadInfo(nsILoadInfo *aLoadInfo,
openArgs.securityFlags() = nsILoadInfo::SEC_NORMAL;
openArgs.contentPolicyType() = nsIContentPolicy::TYPE_OTHER;
openArgs.innerWindowID() = 0;
openArgs.outerWindowID() = 0;
openArgs.parentOuterWindowID() = 0;
}
NS_IMETHODIMP

View File

@ -121,7 +121,8 @@ HttpChannelParent::Init(const HttpChannelCreationArgs& aArgs)
a.entityID(), a.chooseApplicationCache(),
a.appCacheClientID(), a.allowSpdy(), a.allowAltSvc(), a.fds(),
a.requestingPrincipalInfo(), a.triggeringPrincipalInfo(),
a.securityFlags(), a.contentPolicyType(), a.innerWindowID(),
a.securityFlags(), a.contentPolicyType(),
a.innerWindowID(), a.outerWindowID(), a.parentOuterWindowID(),
a.synthesizedResponseHead(), a.cacheKey());
}
case HttpChannelCreationArgs::THttpChannelConnectArgs:
@ -280,7 +281,9 @@ HttpChannelParent::DoAsyncOpen( const URIParams& aURI,
const ipc::PrincipalInfo& aTriggeringPrincipalInfo,
const uint32_t& aSecurityFlags,
const uint32_t& aContentPolicyType,
const uint32_t& aInnerWindowID,
const uint64_t& aInnerWindowID,
const uint64_t& aOuterWindowID,
const uint64_t& aParentOuterWindowID,
const OptionalHttpResponseHead& aSynthesizedResponseHead,
const uint32_t& aCacheKey)
{
@ -335,7 +338,7 @@ HttpChannelParent::DoAsyncOpen( const URIParams& aURI,
nsCOMPtr<nsILoadInfo> loadInfo =
new mozilla::LoadInfo(requestingPrincipal, triggeringPrincipal,
aSecurityFlags, aContentPolicyType,
aInnerWindowID);
aInnerWindowID, aOuterWindowID, aParentOuterWindowID);
nsCOMPtr<nsIChannel> channel;
rv = NS_NewChannelInternal(getter_AddRefs(channel), uri, loadInfo,

View File

@ -120,7 +120,9 @@ protected:
const ipc::PrincipalInfo& aTriggeringPrincipalInfo,
const uint32_t& aSecurityFlags,
const uint32_t& aContentPolicyType,
const uint32_t& aInnerWindowID,
const uint64_t& aInnerWindowID,
const uint64_t& aOuterWindowID,
const uint64_t& aParentOuterWindowID,
const OptionalHttpResponseHead& aSynthesizedResponseHead,
const uint32_t& aCacheKey);

View File

@ -470,6 +470,8 @@ propagateLoadInfo(nsILoadInfo *aLoadInfo,
wsArgs.securityFlags() = aLoadInfo->GetSecurityFlags();
wsArgs.contentPolicyType() = aLoadInfo->GetContentPolicyType();
wsArgs.innerWindowID() = aLoadInfo->GetInnerWindowID();
wsArgs.outerWindowID() = aLoadInfo->GetOuterWindowID();
wsArgs.parentOuterWindowID() = aLoadInfo->GetParentOuterWindowID();
}
NS_IMETHODIMP

View File

@ -111,7 +111,9 @@ WebSocketChannelParent::RecvAsyncOpen(const URIParams& aURI,
triggeringPrincipal,
aLoadInfoArgs.securityFlags(),
aLoadInfoArgs.contentPolicyType(),
aLoadInfoArgs.innerWindowID());
aLoadInfoArgs.innerWindowID(),
aLoadInfoArgs.outerWindowID(),
aLoadInfoArgs.parentOuterWindowID());
rv = mChannel->SetLoadInfo(loadInfo);
if (NS_FAILED(rv)) {
goto fail;