mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
Bug 1163861 - Pass window IDs in nsILoadInfo (r=ckerschb)
This commit is contained in:
parent
71efcb229e
commit
3d39da47b9
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
%}
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user