Bug 664299 - Pass the loading principal to imgILoader::loadImage so we can operate on it later. r=bz

This commit is contained in:
Joe Drew 2011-07-14 14:47:32 -04:00
Родитель d281d1ff4a
Коммит 2acb1181b7
11 изменённых файлов: 56 добавлений и 22 удалений

Просмотреть файл

@ -2324,6 +2324,7 @@ nsContentUtils::LoadImage(nsIURI* aURI, nsIDocument* aLoadingDocument,
return imgLoader->LoadImage(aURI, /* uri to load */
documentURI, /* initialDocumentURI */
aReferrer, /* referrer */
aLoadingPrincipal, /* loading principal */
loadGroup, /* loadgroup */
aObserver, /* imgIDecoderObserver */
aLoadingDocument, /* uniquification key */

Просмотреть файл

@ -341,9 +341,9 @@ nsContextMenuInfo::GetBackgroundImageRequestInternal(nsIDOMNode *aDOMNode, imgIR
"@mozilla.org/image/loader;1"));
NS_ENSURE_TRUE(il, NS_ERROR_FAILURE);
return il->LoadImage(bgUri, nsnull, nsnull, nsnull, nsnull, nsnull,
nsIRequest::LOAD_NORMAL, nsnull, nsnull,
channelPolicy, aRequest);
return il->LoadImage(bgUri, nsnull, nsnull, principal, nsnull,
nsnull, nsnull, nsIRequest::LOAD_NORMAL, nsnull,
nsnull, channelPolicy, aRequest);
}
}

Просмотреть файл

@ -1790,6 +1790,7 @@ nsImageFrame::LoadIcon(const nsAString& aSpec,
relevant for cookies, so does not
apply to icons. */
nsnull, /* referrer (not relevant for icons) */
nsnull, /* principal (not relevant for icons) */
loadGroup,
gIconLoad,
nsnull, /* Not associated with any particular document */

Просмотреть файл

@ -44,6 +44,7 @@ interface imgIRequest;
interface nsIChannel;
interface nsILoadGroup;
interface nsIPrincipal;
interface nsIStreamListener;
interface nsIURI;
@ -59,7 +60,7 @@ interface nsIChannelPolicy;
* @version 0.3
* @see imagelib2
*/
[scriptable, uuid(47fbc3e7-c654-4ffb-83fc-a861394145ee)]
[scriptable, uuid(20a5e3e9-0d5b-482c-9f41-942b5f19e5a3)]
interface imgILoader : nsISupports
{
/**
@ -67,6 +68,7 @@ interface imgILoader : nsISupports
* @param aURI the URI to load
* @param aInitialDocumentURI the URI that 'initiated' the load -- used for 3rd party cookie blocking
* @param aReferrerURI the 'referring' URI
* @param aLoadingPrincipal the principal of the loading document
* @param aLoadGroup Loadgroup to put the image load into
* @param aObserver the observer (may be null)
* @param aCX some random data
@ -85,6 +87,7 @@ interface imgILoader : nsISupports
imgIRequest loadImage(in nsIURI aURI,
in nsIURI aInitialDocumentURL,
in nsIURI aReferrerURI,
in nsIPrincipal aLoadingPrincipal,
in nsILoadGroup aLoadGroup,
in imgIDecoderObserver aObserver,
in nsISupports aCX,

Просмотреть файл

@ -1140,7 +1140,8 @@ PRBool imgLoader::ValidateRequestWithNewChannel(imgRequest *request,
nsLoadFlags aLoadFlags,
imgIRequest *aExistingRequest,
imgIRequest **aProxyRequest,
nsIChannelPolicy *aPolicy)
nsIChannelPolicy *aPolicy,
nsIPrincipal* aLoadingPrincipal)
{
// now we need to insert a new channel request object inbetween the real
// request and the proxy that basically delays loading the image until it
@ -1243,7 +1244,8 @@ PRBool imgLoader::ValidateEntry(imgCacheEntry *aEntry,
PRBool aCanMakeNewChannel,
imgIRequest *aExistingRequest,
imgIRequest **aProxyRequest,
nsIChannelPolicy *aPolicy = nsnull)
nsIChannelPolicy *aPolicy,
nsIPrincipal* aLoadingPrincipal)
{
LOG_SCOPE(gImgLog, "imgLoader::ValidateEntry");
@ -1357,7 +1359,8 @@ PRBool imgLoader::ValidateEntry(imgCacheEntry *aEntry,
return ValidateRequestWithNewChannel(request, aURI, aInitialDocumentURI,
aReferrerURI, aLoadGroup, aObserver,
aCX, aLoadFlags, aExistingRequest,
aProxyRequest, aPolicy);
aProxyRequest, aPolicy,
aLoadingPrincipal);
}
return !validateRequest;
@ -1487,11 +1490,12 @@ nsresult imgLoader::EvictEntries(imgCacheQueue &aQueueToClear)
nsIRequest::VALIDATE_ONCE_PER_SESSION)
/* imgIRequest loadImage (in nsIURI aURI, in nsIURI initialDocumentURI, in nsILoadGroup aLoadGroup, in imgIDecoderObserver aObserver, in nsISupports aCX, in nsLoadFlags aLoadFlags, in nsISupports cacheKey, in imgIRequest aRequest); */
/* imgIRequest loadImage (in nsIURI aURI, in nsIURI initialDocumentURI, in nsIPrincipal loadingPrincipal, in nsILoadGroup aLoadGroup, in imgIDecoderObserver aObserver, in nsISupports aCX, in nsLoadFlags aLoadFlags, in nsISupports cacheKey, in imgIRequest aRequest); */
NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI,
nsIURI *aInitialDocumentURI,
nsIURI *aReferrerURI,
nsIPrincipal* aLoadingPrincipal,
nsILoadGroup *aLoadGroup,
imgIDecoderObserver *aObserver,
nsISupports *aCX,
@ -1556,7 +1560,7 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI,
if (cache.Get(spec, getter_AddRefs(entry)) && entry) {
if (ValidateEntry(entry, aURI, aInitialDocumentURI, aReferrerURI,
aLoadGroup, aObserver, aCX, requestFlags, PR_TRUE,
aRequest, _retval, aPolicy)) {
aRequest, _retval, aPolicy, aLoadingPrincipal)) {
request = getter_AddRefs(entry->GetRequest());
// If this entry has no proxies, its request has no reference to the entry.
@ -1613,7 +1617,8 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI,
newChannel->SetLoadGroup(loadGroup);
void *cacheId = NS_GetCurrentThread();
request->Init(aURI, aURI, loadGroup, newChannel, entry, cacheId, aCX);
request->Init(aURI, aURI, loadGroup, newChannel, entry, cacheId, aCX,
aLoadingPrincipal);
// Pass the windowID of the loading document, if possible.
nsCOMPtr<nsIDocument> doc = do_QueryInterface(aCX);
@ -1742,7 +1747,8 @@ NS_IMETHODIMP imgLoader::LoadImageWithChannel(nsIChannel *channel, imgIDecoderOb
// XXX -- should this be changed? it's pretty much verbatim from the old
// code, but seems nonsensical.
if (ValidateEntry(entry, uri, nsnull, nsnull, nsnull, aObserver, aCX,
requestFlags, PR_FALSE, nsnull, nsnull)) {
requestFlags, PR_FALSE, nsnull, nsnull, nsnull,
nsnull)) {
request = getter_AddRefs(entry->GetRequest());
} else {
nsCOMPtr<nsICachingChannel> cacheChan(do_QueryInterface(channel));
@ -1798,7 +1804,10 @@ NS_IMETHODIMP imgLoader::LoadImageWithChannel(nsIChannel *channel, imgIDecoderOb
// We use originalURI here to fulfil the imgIRequest contract on GetURI.
nsCOMPtr<nsIURI> originalURI;
channel->GetOriginalURI(getter_AddRefs(originalURI));
request->Init(originalURI, uri, channel, channel, entry, NS_GetCurrentThread(), aCX);
// No principal specified here, because we're not passed one.
request->Init(originalURI, uri, channel, channel, entry,
NS_GetCurrentThread(), aCX, nsnull);
ProxyListener *pl = new ProxyListener(static_cast<nsIStreamListener *>(request.get()));
NS_ADDREF(pl);
@ -2092,6 +2101,8 @@ NS_IMETHODIMP imgCacheValidator::OnStartRequest(nsIRequest *aRequest, nsISupport
LOG_MSG_WITH_PARAM(gImgLog, "imgCacheValidator::OnStartRequest creating new request", "uri", spec.get());
#endif
nsCOMPtr<nsIPrincipal> loadingPrincipal = mRequest->GetLoadingPrincipal();
// Doom the old request's cache entry
mRequest->RemoveFromCache();
@ -2101,7 +2112,8 @@ NS_IMETHODIMP imgCacheValidator::OnStartRequest(nsIRequest *aRequest, nsISupport
// We use originalURI here to fulfil the imgIRequest contract on GetURI.
nsCOMPtr<nsIURI> originalURI;
channel->GetOriginalURI(getter_AddRefs(originalURI));
mNewRequest->Init(originalURI, uri, channel, channel, mNewEntry, NS_GetCurrentThread(), mContext);
mNewRequest->Init(originalURI, uri, channel, channel, mNewEntry,
NS_GetCurrentThread(), mContext, loadingPrincipal);
ProxyListener *pl = new ProxyListener(static_cast<nsIStreamListener *>(mNewRequest));

Просмотреть файл

@ -308,7 +308,8 @@ private: // methods
nsLoadFlags aLoadFlags, PRBool aCanMakeNewChannel,
imgIRequest *aExistingRequest,
imgIRequest **aProxyRequest,
nsIChannelPolicy *aPolicy);
nsIChannelPolicy *aPolicy,
nsIPrincipal* aLoadingPrincipal);
PRBool ValidateRequestWithNewChannel(imgRequest *request, nsIURI *aURI,
nsIURI *aInitialDocumentURI,
nsIURI *aReferrerURI,
@ -317,7 +318,8 @@ private: // methods
nsISupports *aCX, nsLoadFlags aLoadFlags,
imgIRequest *aExistingRequest,
imgIRequest **aProxyRequest,
nsIChannelPolicy *aPolicy);
nsIChannelPolicy *aPolicy,
nsIPrincipal* aLoadingPrincipal);
nsresult CreateNewProxyForRequest(imgRequest *aRequest, nsILoadGroup *aLoadGroup,
imgIDecoderObserver *aObserver,

Просмотреть файл

@ -205,7 +205,8 @@ nsresult imgRequest::Init(nsIURI *aURI,
nsIChannel *aChannel,
imgCacheEntry *aCacheEntry,
void *aCacheId,
void *aLoadId)
void *aLoadId,
nsIPrincipal* aLoadingPrincipal)
{
LOG_FUNC(gImgLog, "imgRequest::Init");
@ -225,6 +226,8 @@ nsresult imgRequest::Init(nsIURI *aURI,
mChannel = aChannel;
mTimedChannel = do_QueryInterface(mChannel);
mLoadingPrincipal = aLoadingPrincipal;
mChannel->GetNotificationCallbacks(getter_AddRefs(mPrevChannelSink));
NS_ASSERTION(mPrevChannelSink != this,

Просмотреть файл

@ -95,7 +95,8 @@ public:
nsIChannel *aChannel,
imgCacheEntry *aCacheEntry,
void *aCacheId,
void *aLoadId);
void *aLoadId,
nsIPrincipal* aLoadingPrincipal);
// Callers must call imgRequestProxy::Notify later.
nsresult AddProxy(imgRequestProxy *proxy);
@ -135,6 +136,14 @@ public:
// wins.
static void SetCacheValidation(imgCacheEntry* aEntry, nsIRequest* aRequest);
// The principal for the document that loaded this image. Used when trying to
// validate a CORS image load.
already_AddRefed<nsIPrincipal> GetLoadingPrincipal() const
{
nsCOMPtr<nsIPrincipal> principal = mLoadingPrincipal;
return principal.forget();
}
private:
friend class imgCacheEntry;
friend class imgRequestProxy;
@ -216,6 +225,9 @@ private:
nsCOMPtr<nsIURI> mURI;
// The URI of the resource we ended up loading after all redirects, etc.
nsCOMPtr<nsIURI> mCurrentURI;
// The principal of the document which loaded this image. Used when validating for CORS.
nsCOMPtr<nsIPrincipal> mLoadingPrincipal;
// The principal of this image.
nsCOMPtr<nsIPrincipal> mPrincipal;
// Status-tracker -- transferred to mImage, when it gets instantiated
nsAutoPtr<imgStatusTracker> mStatusTracker;

Просмотреть файл

@ -82,7 +82,7 @@ function checkSecondLoad()
var loader = Cc["@mozilla.org/image/loader;1"].getService(Ci.imgILoader);
var listener = new ImageListener(checkClone, secondLoadDone);
requests.push(loader.loadImage(uri, null, null, null, listener, null, 0, null, null, null));
requests.push(loader.loadImage(uri, null, null, null, null, listener, null, 0, null, null, null));
listener.synchronous = false;
}
@ -185,7 +185,7 @@ function startImageCallback(otherCb)
// Make sure we can load the same image immediately out of the cache.
do_test_pending();
var listener2 = new ImageListener(null, function(foo, bar) { do_test_finished(); });
requests.push(loader.loadImage(uri, null, null, null, listener2, null, 0, null, null, null));
requests.push(loader.loadImage(uri, null, null, null, null, listener2, null, 0, null, null, null));
listener2.synchronous = false;
// Now that we've started another load, chain to the callback.
@ -199,7 +199,7 @@ function run_test()
do_test_pending();
var listener = new ImageListener(startImageCallback(checkClone), firstLoadDone);
var req = loader.loadImage(uri, null, null, null, listener, null, 0, null, null, null);
var req = loader.loadImage(uri, null, null, null, null, listener, null, 0, null, null, null);
requests.push(req);
// Ensure that we don't cause any mayhem when we lock an image.

Просмотреть файл

@ -262,7 +262,7 @@ nsAlertsIconListener::StartRequest(const nsAString & aImageUrl)
if (!il)
return ShowAlert(NULL);
return il->LoadImage(imageUri, nsnull, nsnull, nsnull, this,
return il->LoadImage(imageUri, nsnull, nsnull, nsnull, nsnull, this,
nsnull, nsIRequest::LOAD_NORMAL, nsnull, nsnull,
nsnull, getter_AddRefs(mIconRequest));
}

Просмотреть файл

@ -341,7 +341,7 @@ nsMenuItemIconX::LoadIcon(nsIURI* aIconURI)
// Passing in null for channelPolicy here since nsMenuItemIconX::LoadIcon is
// not exposed to web content
rv = loader->LoadImage(aIconURI, nsnull, nsnull, loadGroup, this,
rv = loader->LoadImage(aIconURI, nsnull, nsnull, nsnull, loadGroup, this,
nsnull, nsIRequest::LOAD_NORMAL, nsnull, nsnull,
nsnull, getter_AddRefs(mIconRequest));
if (NS_FAILED(rv)) return rv;