Bug 1193552 - Remove baseURI from LoadInfo (r=sicking,jkitch)

This commit is contained in:
Christoph Kerschbaumer 2015-08-19 10:43:30 -07:00
parent c96f86e39f
commit a12861eafc
15 changed files with 162 additions and 110 deletions

View File

@ -48,6 +48,7 @@
#include "prenv.h"
#include "nsIDOMWindow.h"
#include "nsIGlobalObject.h"
#include "nsIViewSourceChannel.h"
#include "nsIWebBrowserChrome.h"
#include "nsPoint.h"
#include "nsIObserverService.h"
@ -10395,20 +10396,18 @@ nsDocShell::DoURILoad(nsIURI* aURI,
}
if (!isSrcdoc) {
nsCOMPtr<nsILoadInfo> loadInfo =
new LoadInfo(requestingNode ? requestingNode->NodePrincipal() :
triggeringPrincipal.get(),
triggeringPrincipal,
requestingNode,
securityFlags,
aContentPolicyType,
aBaseURI);
rv = NS_NewChannelInternal(getter_AddRefs(channel),
aURI,
loadInfo,
nullptr, // loadGroup
static_cast<nsIInterfaceRequestor*>(this),
loadFlags);
requestingNode,
requestingNode
? requestingNode->NodePrincipal()
: triggeringPrincipal.get(),
triggeringPrincipal,
securityFlags,
aContentPolicyType,
nullptr, // loadGroup
static_cast<nsIInterfaceRequestor*>(this),
loadFlags);
if (NS_FAILED(rv)) {
if (rv == NS_ERROR_UNKNOWN_PROTOCOL) {
@ -10425,6 +10424,12 @@ nsDocShell::DoURILoad(nsIURI* aURI,
}
return rv;
}
if (aBaseURI) {
nsCOMPtr<nsIViewSourceChannel> vsc = do_QueryInterface(channel);
if (vsc) {
vsc->SetBaseURI(aBaseURI);
}
}
} else {
nsAutoCString scheme;
rv = aURI->GetScheme(scheme);
@ -10436,17 +10441,15 @@ nsDocShell::DoURILoad(nsIURI* aURI,
nsViewSourceHandler* vsh = nsViewSourceHandler::GetInstance();
NS_ENSURE_TRUE(vsh, NS_ERROR_FAILURE);
rv = vsh->NewSrcdocChannel(aURI, aSrcdoc, getter_AddRefs(channel));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsILoadInfo> loadInfo =
new LoadInfo(requestingNode ? requestingNode->NodePrincipal() :
triggeringPrincipal.get(),
triggeringPrincipal,
requestingNode,
securityFlags,
aContentPolicyType,
aBaseURI);
channel->SetLoadInfo(loadInfo);
rv = vsh->NewSrcdocChannel(aURI, aBaseURI, aSrcdoc,
requestingNode,
requestingNode
? requestingNode->NodePrincipal()
: triggeringPrincipal.get(),
triggeringPrincipal,
securityFlags,
aContentPolicyType,
getter_AddRefs(channel));
} else {
rv = NS_NewInputStreamChannelInternal(getter_AddRefs(channel),
aURI,
@ -10459,9 +10462,11 @@ nsDocShell::DoURILoad(nsIURI* aURI,
triggeringPrincipal,
securityFlags,
aContentPolicyType,
true,
aBaseURI);
true);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(channel);
MOZ_ASSERT(isc);
isc->SetBaseURI(aBaseURI);
}
}
@ -11735,7 +11740,7 @@ nsDocShell::AddToSessionHistory(nsIURI* aURI, nsIChannel* aChannel,
nsCOMPtr<nsILoadInfo> loadInfo;
aChannel->GetLoadInfo(getter_AddRefs(loadInfo));
nsCOMPtr<nsIURI> baseURI;
loadInfo->GetBaseURI(getter_AddRefs(baseURI));
inStrmChan->GetBaseURI(getter_AddRefs(baseURI));
entry->SetBaseURI(baseURI);
}
}

View File

@ -23,8 +23,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
nsIPrincipal* aTriggeringPrincipal,
nsINode* aLoadingContext,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
nsIURI* aBaseURI)
nsContentPolicyType aContentPolicyType)
: mLoadingPrincipal(aLoadingContext ?
aLoadingContext->NodePrincipal() : aLoadingPrincipal)
, mTriggeringPrincipal(aTriggeringPrincipal ?
@ -32,7 +31,6 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
, mLoadingContext(do_GetWeakReference(aLoadingContext))
, mSecurityFlags(aSecurityFlags)
, mContentPolicyType(aContentPolicyType)
, mBaseURI(aBaseURI)
, mUpgradeInsecureRequests(false)
, mInnerWindowID(0)
, mOuterWindowID(0)
@ -226,20 +224,6 @@ LoadInfo::InternalContentPolicyType()
return mContentPolicyType;
}
NS_IMETHODIMP
LoadInfo::GetBaseURI(nsIURI** aBaseURI)
{
*aBaseURI = mBaseURI;
NS_IF_ADDREF(*aBaseURI);
return NS_OK;
}
nsIURI*
LoadInfo::BaseURI()
{
return mBaseURI;
}
NS_IMETHODIMP
LoadInfo::GetUpgradeInsecureRequests(bool* aResult)
{

View File

@ -48,8 +48,7 @@ public:
nsIPrincipal* aTriggeringPrincipal,
nsINode* aLoadingContext,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
nsIURI* aBaseURI = nullptr);
nsContentPolicyType aContentPolicyType);
private:
// private constructor that is only allowed to be called from within
@ -80,7 +79,6 @@ private:
nsWeakPtr mLoadingContext;
nsSecurityFlags mSecurityFlags;
nsContentPolicyType mContentPolicyType;
nsCOMPtr<nsIURI> mBaseURI;
bool mUpgradeInsecureRequests;
uint64_t mInnerWindowID;
uint64_t mOuterWindowID;

View File

@ -13,7 +13,7 @@ interface nsIURI;
* This interface provides methods to initialize an input stream channel.
* The input stream channel serves as a data pump for an input stream.
*/
[scriptable, uuid(e1e95852-914b-4d83-b574-23f114db9b89)]
[scriptable, uuid(ea730238-4bfd-4015-8489-8f264d05b343)]
interface nsIInputStreamChannel : nsISupports
{
/**
@ -55,4 +55,10 @@ interface nsIInputStreamChannel : nsISupports
* Returns true if srcdocData has been set within the channel.
*/
readonly attribute boolean isSrcdocChannel;
/**
* The base URI to be used for the channel. Used when the base URI cannot
* be inferred by other means, for example when this is a srcdoc channel.
*/
attribute nsIURI baseURI;
};

View File

@ -10,7 +10,6 @@
interface nsIDOMDocument;
interface nsINode;
interface nsIPrincipal;
interface nsIURI;
%{C++
#include "nsTArray.h"
@ -23,7 +22,7 @@ typedef unsigned long nsSecurityFlags;
/**
* An nsILoadOwner represents per-load information about who started the load.
*/
[scriptable, builtinclass, uuid(cc51498e-f8f8-469d-85ba-6dcba17027e4)]
[scriptable, builtinclass, uuid(99abb145-29d2-4a0a-8bca-213fa6211cc9)]
interface nsILoadInfo : nsISupports
{
/**
@ -270,19 +269,6 @@ interface nsILoadInfo : nsISupports
[noscript, notxpcom]
nsContentPolicyType internalContentPolicyType();
/**
* A base URI for use in situations where it cannot otherwise be inferred.
* This attribute may be null. The value of this attribute may be
* ignored if the base URI can be inferred by the channel's URI.
*/
readonly attribute nsIURI baseURI;
/**
* A C++-friendly version of baseURI.
*/
[noscript, notxpcom, nostdcall, binaryname(BaseURI)]
nsIURI binaryBaseURI();
/**
* Returns true if document or any of the documents ancestors
* up to the toplevel document make use of the CSP directive

View File

@ -89,3 +89,18 @@ nsInputStreamChannel::GetIsSrcdocChannel(bool *aIsSrcdocChannel)
*aIsSrcdocChannel = mIsSrcdocChannel;
return NS_OK;
}
NS_IMETHODIMP
nsInputStreamChannel::GetBaseURI(nsIURI** aBaseURI)
{
*aBaseURI = mBaseURI;
NS_IF_ADDREF(*aBaseURI);
return NS_OK;
}
NS_IMETHODIMP
nsInputStreamChannel::SetBaseURI(nsIURI* aBaseURI)
{
mBaseURI = aBaseURI;
return NS_OK;
}

View File

@ -33,6 +33,7 @@ protected:
private:
nsCOMPtr<nsIInputStream> mContentStream;
nsCOMPtr<nsIURI> mBaseURI;
nsString mSrcdocData;
bool mIsSrcdocChannel;
};

View File

@ -310,16 +310,14 @@ NS_NewInputStreamChannelInternal(nsIChannel **outChannel,
nsIPrincipal *aLoadingPrincipal,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
nsIURI *aBaseURI /* = nullptr */)
nsContentPolicyType aContentPolicyType)
{
nsCOMPtr<nsILoadInfo> loadInfo =
new mozilla::LoadInfo(aLoadingPrincipal,
aTriggeringPrincipal,
aLoadingNode,
aSecurityFlags,
aContentPolicyType,
aBaseURI);
aContentPolicyType);
if (!loadInfo) {
return NS_ERROR_UNEXPECTED;
}
@ -363,8 +361,7 @@ NS_NewInputStreamChannelInternal(nsIChannel **outChannel,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
bool aIsSrcdocChannel /* = false */,
nsIURI *aBaseURI /* = nullptr */)
bool aIsSrcdocChannel /* = false */)
{
nsresult rv;
nsCOMPtr<nsIStringInputStream> stream;
@ -390,8 +387,7 @@ NS_NewInputStreamChannelInternal(nsIChannel **outChannel,
aLoadingPrincipal,
aTriggeringPrincipal,
aSecurityFlags,
aContentPolicyType,
aBaseURI);
aContentPolicyType);
NS_ENSURE_SUCCESS(rv, rv);
@ -412,8 +408,7 @@ NS_NewInputStreamChannel(nsIChannel **outChannel,
nsIPrincipal *aLoadingPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
bool aIsSrcdocChannel /* = false */,
nsIURI *aBaseURI /* = nullptr */)
bool aIsSrcdocChannel /* = false */)
{
return NS_NewInputStreamChannelInternal(outChannel,
aUri,
@ -424,8 +419,7 @@ NS_NewInputStreamChannel(nsIChannel **outChannel,
nullptr, // aTriggeringPrincipal
aSecurityFlags,
aContentPolicyType,
aIsSrcdocChannel,
aBaseURI);
aIsSrcdocChannel);
}
nsresult

View File

@ -288,8 +288,7 @@ nsresult NS_NewInputStreamChannelInternal(nsIChannel **outChannel,
nsIPrincipal *aLoadingPrincipal,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
nsIURI *aBaseURI = nullptr);
nsContentPolicyType aContentPolicyType);
nsresult /* NS_NewInputStreamChannelPrincipal */
@ -311,8 +310,7 @@ nsresult NS_NewInputStreamChannelInternal(nsIChannel **outChannel,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
bool aIsSrcdocChannel = false,
nsIURI *aBaseURI = nullptr);
bool aIsSrcdocChannel = false);
nsresult NS_NewInputStreamChannel(nsIChannel **outChannel,
nsIURI *aUri,
@ -321,8 +319,7 @@ nsresult NS_NewInputStreamChannel(nsIChannel **outChannel,
nsIPrincipal *aLoadingPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
bool aIsSrcdocChannel = false,
nsIURI *aBaseURI = nullptr);
bool aIsSrcdocChannel = false);
nsresult NS_NewInputStreamPump(nsIInputStreamPump **result,
nsIInputStream *stream,

View File

@ -5,7 +5,7 @@
#include "nsIChannel.idl"
[uuid(72d9580a-b636-4392-b888-6c003c56f3d7)]
[uuid(3e9800f8-edb7-4c9a-9285-09b4f045b019)]
interface nsIViewSourceChannel : nsIChannel
{
/**
@ -24,6 +24,15 @@ interface nsIViewSourceChannel : nsIChannel
* Whether the channel was created to view the source of a srcdoc document.
*/
readonly attribute boolean isSrcdocChannel;
/**
* Set to indicate the base URI. If this channel is a srcdoc channel, it
* returns the base URI provided by the embedded channel. It is used to
* provide an indication of the base URI in circumstances where it isn't
* otherwise recoverable. Returns null when it isn't set and isn't a
* srcdoc channel.
*/
attribute nsIURI baseURI;
};

View File

@ -13,6 +13,7 @@
#include "nsContentSecurityManager.h"
#include "nsNullPrincipal.h"
#include "nsServiceManagerUtils.h"
#include "nsIInputStreamChannel.h"
NS_IMPL_ADDREF(nsViewSourceChannel)
NS_IMPL_RELEASE(nsViewSourceChannel)
@ -91,9 +92,15 @@ nsViewSourceChannel::Init(nsIURI* uri)
}
nsresult
nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc)
nsViewSourceChannel::InitSrcdoc(nsIURI* aURI,
nsIURI* aBaseURI,
const nsAString &aSrcdoc,
nsINode *aLoadingNode,
nsIPrincipal *aLoadingPrincipal,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType)
{
nsresult rv;
nsCOMPtr<nsIURI> inStreamURI;
@ -104,14 +111,16 @@ nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc)
NS_LITERAL_STRING("about:srcdoc"));
NS_ENSURE_SUCCESS(rv, rv);
rv = NS_NewInputStreamChannel(getter_AddRefs(mChannel),
inStreamURI,
aSrcdoc,
NS_LITERAL_CSTRING("text/html"),
nsContentUtils::GetSystemPrincipal(),
nsILoadInfo::SEC_NORMAL,
nsIContentPolicy::TYPE_OTHER,
true);
rv = NS_NewInputStreamChannelInternal(getter_AddRefs(mChannel),
inStreamURI,
aSrcdoc,
NS_LITERAL_CSTRING("text/html"),
aLoadingNode,
aLoadingPrincipal,
aTriggeringPrincipal,
aSecurityFlags,
aContentPolicyType,
true);
NS_ENSURE_SUCCESS(rv, rv);
mOriginalURI = aURI;
@ -124,6 +133,10 @@ nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc)
mCacheInfoChannel = do_QueryInterface(mChannel);
mApplicationCacheChannel = do_QueryInterface(mChannel);
mUploadChannel = do_QueryInterface(mChannel);
nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(mChannel);
MOZ_ASSERT(isc);
isc->SetBaseURI(aBaseURI);
return NS_OK;
}
@ -592,6 +605,27 @@ nsViewSourceChannel::GetIsSrcdocChannel(bool* aIsSrcdocChannel)
return NS_OK;
}
NS_IMETHODIMP
nsViewSourceChannel::GetBaseURI(nsIURI** aBaseURI)
{
if (mIsSrcdocChannel) {
nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(mChannel);
if (isc) {
return isc->GetBaseURI(aBaseURI);
}
}
*aBaseURI = mBaseURI;
NS_IF_ADDREF(*aBaseURI);
return NS_OK;
}
NS_IMETHODIMP
nsViewSourceChannel::SetBaseURI(nsIURI* aBaseURI)
{
mBaseURI = aBaseURI;
return NS_OK;
}
// nsIRequestObserver methods
NS_IMETHODIMP
nsViewSourceChannel::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext)

View File

@ -49,7 +49,14 @@ public:
nsresult Init(nsIURI* uri);
nsresult InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc);
nsresult InitSrcdoc(nsIURI* aURI,
nsIURI* aBaseURI,
const nsAString &aSrcdoc,
nsINode *aLoadingNode,
nsIPrincipal *aLoadingPrincipal,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType);
protected:
~nsViewSourceChannel() {}
@ -63,6 +70,7 @@ protected:
nsCOMPtr<nsIUploadChannel> mUploadChannel;
nsCOMPtr<nsIStreamListener> mListener;
nsCOMPtr<nsIURI> mOriginalURI;
nsCOMPtr<nsIURI> mBaseURI;
nsCString mContentType;
bool mIsDocument; // keeps track of the LOAD_DOCUMENT_URI flag
bool mOpened;

View File

@ -124,22 +124,33 @@ nsViewSourceHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
}
nsresult
nsViewSourceHandler::NewSrcdocChannel(nsIURI* uri, const nsAString &srcdoc,
nsIChannel* *result)
nsViewSourceHandler::NewSrcdocChannel(nsIURI *aURI,
nsIURI *aBaseURI,
const nsAString &aSrcdoc,
nsINode *aLoadingNode,
nsIPrincipal *aLoadingPrincipal,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
nsIChannel** outChannel)
{
NS_ENSURE_ARG_POINTER(uri);
NS_ENSURE_ARG_POINTER(aURI);
nsViewSourceChannel *channel = new nsViewSourceChannel();
if (!channel)
if (!channel) {
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(channel);
nsresult rv = channel->InitSrcdoc(uri, srcdoc);
nsresult rv = channel->InitSrcdoc(aURI, aBaseURI, aSrcdoc,
aLoadingNode, aLoadingPrincipal,
aTriggeringPrincipal, aSecurityFlags,
aContentPolicyType);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = static_cast<nsIViewSourceChannel*>(channel);
*outChannel = static_cast<nsIViewSourceChannel*>(channel);
return NS_OK;
}

View File

@ -19,8 +19,15 @@ public:
// Creates a new nsViewSourceChannel to view the source of an about:srcdoc
// URI with contents specified by srcdoc.
nsresult NewSrcdocChannel(nsIURI* uri, const nsAString &srcdoc,
nsIChannel** result);
nsresult NewSrcdocChannel(nsIURI *aURI,
nsIURI *aBaseURI,
const nsAString &aSrcdoc,
nsINode *aLoadingNode,
nsIPrincipal *aLoadingPrincipal,
nsIPrincipal *aTriggeringPrincipal,
nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType,
nsIChannel** outChannel);
static nsViewSourceHandler* GetInstance();

View File

@ -29,7 +29,7 @@
#include "nsIScriptContext.h"
#include "mozilla/Preferences.h"
#include "nsIHTMLDocument.h"
#include "nsILoadInfo.h"
#include "nsIViewSourceChannel.h"
using namespace mozilla;
@ -803,15 +803,12 @@ nsHtml5TreeOpExecutor::GetViewSourceBaseURI()
// We query the channel for the baseURI because in certain situations it
// cannot otherwise be determined. If this process fails, fall back to the
// standard method.
nsCOMPtr<nsIChannel> channel = mDocument->GetChannel();
if (channel) {
nsCOMPtr<nsILoadInfo> loadInfo;
nsresult rv = channel->GetLoadInfo(getter_AddRefs(loadInfo));
if (NS_SUCCEEDED(rv) && loadInfo) {
rv = loadInfo->GetBaseURI(getter_AddRefs(mViewSourceBaseURI));
if (NS_SUCCEEDED(rv) && mViewSourceBaseURI) {
return mViewSourceBaseURI;
}
nsCOMPtr<nsIViewSourceChannel> vsc =
do_QueryInterface(mDocument->GetChannel());
if (vsc) {
nsresult rv = vsc->GetBaseURI(getter_AddRefs(mViewSourceBaseURI));
if (NS_SUCCEEDED(rv) && mViewSourceBaseURI) {
return mViewSourceBaseURI;
}
}