зеркало из https://github.com/mozilla/gecko-dev.git
Bug 664299 - Pass the loading principal to imgILoader::loadImage so we can operate on it later. r=bz
This commit is contained in:
Родитель
d281d1ff4a
Коммит
2acb1181b7
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче