mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
This is one of those do the right thing bugs even though I don't have a PDT+ bug for it. Travis and I noticed
today that image urls weren't properly getting added to the doc loader of the containing document. So the top level document would report a document done notification before the document may really be done. The fix is to pass the load cookie nsISupports object which originates from the docshell that is opening the url down into the gfx image code instead of passing the load group down. r=travis.
This commit is contained in:
parent
e90f418de4
commit
23a00a46c6
@ -63,7 +63,7 @@ public:
|
||||
* Initialize an image group with a device context. All images
|
||||
* in this group will be decoded for the specified device context.
|
||||
*/
|
||||
virtual nsresult Init(nsIDeviceContext *aDeviceContext, nsILoadGroup* aLoadGroup) = 0;
|
||||
virtual nsresult Init(nsIDeviceContext *aDeviceContext, nsISupports *aLoadContext) = 0;
|
||||
|
||||
/**
|
||||
* Add an observers to be informed of image group notifications.
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include "il_util.h"
|
||||
#include "nsIDeviceContext.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "nsILoadGroup.h"
|
||||
#include "nsGfxCIID.h"
|
||||
|
||||
static NS_DEFINE_IID(kIImageGroupIID, NS_IIMAGEGROUP_IID);
|
||||
@ -46,7 +45,7 @@ public:
|
||||
ImageGroupImpl(nsIImageManager *aManager);
|
||||
virtual ~ImageGroupImpl();
|
||||
|
||||
nsresult Init(nsIDeviceContext *aDeviceContext, nsILoadGroup* aLoadGroup);
|
||||
nsresult Init(nsIDeviceContext *aDeviceContext, nsISupports * aLoadContext);
|
||||
|
||||
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
||||
|
||||
@ -80,7 +79,6 @@ public:
|
||||
nsIDeviceContext *mDeviceContext;
|
||||
ilINetContext* mNetContext;
|
||||
nsIStreamListener** mListenerRequest;
|
||||
nsILoadGroup* mLoadGroup;
|
||||
};
|
||||
|
||||
ImageGroupImpl::ImageGroupImpl(nsIImageManager *aManager)
|
||||
@ -113,7 +111,6 @@ ImageGroupImpl::~ImageGroupImpl()
|
||||
|
||||
NS_IF_RELEASE(mManager);
|
||||
NS_IF_RELEASE(mNetContext);
|
||||
NS_IF_RELEASE(mLoadGroup);
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(ImageGroupImpl, kIImageGroupIID)
|
||||
@ -168,7 +165,7 @@ ReconnectHack(void* arg, nsIStreamListener* aListener)
|
||||
}
|
||||
|
||||
nsresult
|
||||
ImageGroupImpl::Init(nsIDeviceContext *aDeviceContext, nsILoadGroup* aLoadGroup)
|
||||
ImageGroupImpl::Init(nsIDeviceContext *aDeviceContext, nsISupports *aLoadContext)
|
||||
{
|
||||
ilIImageRenderer *renderer;
|
||||
nsresult result;
|
||||
@ -183,11 +180,8 @@ ImageGroupImpl::Init(nsIDeviceContext *aDeviceContext, nsILoadGroup* aLoadGroup)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
mLoadGroup = aLoadGroup;
|
||||
NS_IF_ADDREF(mLoadGroup);
|
||||
|
||||
// Create an async net context
|
||||
result = NS_NewImageNetContext(&mNetContext, mLoadGroup, ReconnectHack, this);
|
||||
result = NS_NewImageNetContext(&mNetContext, aLoadContext, ReconnectHack, this);
|
||||
if (NS_OK != result) {
|
||||
return result;
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ typedef PRBool (*nsReconnectCB)(void* arg, nsIStreamListener* aListener);
|
||||
|
||||
extern "C" NS_GFX_(nsresult)
|
||||
NS_NewImageNetContext(ilINetContext **aInstancePtrResult,
|
||||
nsILoadGroup* aLoadGroup,
|
||||
nsISupports* aLoadContext,
|
||||
nsReconnectCB aReconnectCallback,
|
||||
void* aReconnectArg);
|
||||
|
||||
|
@ -58,7 +58,7 @@ class ImageConsumer;
|
||||
class ImageNetContextImpl : public ilINetContext {
|
||||
public:
|
||||
ImageNetContextImpl(NET_ReloadMethod aReloadPolicy,
|
||||
nsILoadGroup* aLoadGroup,
|
||||
nsISupports * aLoadContext,
|
||||
nsReconnectCB aReconnectCallback,
|
||||
void* aReconnectArg);
|
||||
virtual ~ImageNetContextImpl();
|
||||
@ -95,7 +95,7 @@ public:
|
||||
|
||||
nsVoidArray *mRequests;
|
||||
NET_ReloadMethod mReloadPolicy;
|
||||
nsWeakPtr mLoadGroup;
|
||||
nsWeakPtr mLoadContext;
|
||||
nsReconnectCB mReconnectCallback;
|
||||
void* mReconnectArg;
|
||||
};
|
||||
@ -199,7 +199,9 @@ ImageConsumer::SetParentContentListener(nsIURIContentListener* aParent)
|
||||
NS_IMETHODIMP
|
||||
ImageConsumer::GetLoadCookie(nsISupports ** aLoadCookie)
|
||||
{
|
||||
*aLoadCookie = nsnull;
|
||||
nsCOMPtr<nsISupports> loadContext = do_QueryReferent(mContext->mLoadContext);
|
||||
*aLoadCookie = loadContext;
|
||||
NS_IF_ADDREF(*aLoadCookie);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -504,13 +506,13 @@ ImageConsumer::~ImageConsumer()
|
||||
}
|
||||
|
||||
ImageNetContextImpl::ImageNetContextImpl(NET_ReloadMethod aReloadPolicy,
|
||||
nsILoadGroup* aLoadGroup,
|
||||
nsISupports * aLoadContext,
|
||||
nsReconnectCB aReconnectCallback,
|
||||
void* aReconnectArg)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mRequests = nsnull;
|
||||
mLoadGroup = getter_AddRefs(NS_GetWeakReference(aLoadGroup));
|
||||
mLoadContext = getter_AddRefs(NS_GetWeakReference(aLoadContext));
|
||||
mReloadPolicy = aReloadPolicy;
|
||||
mReconnectCallback = aReconnectCallback;
|
||||
mReconnectArg = aReconnectArg;
|
||||
@ -527,7 +529,6 @@ ImageNetContextImpl::~ImageNetContextImpl()
|
||||
}
|
||||
delete mRequests;
|
||||
}
|
||||
/// NS_IF_RELEASE(mLoadGroup);
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(ImageNetContextImpl, kIImageNetContextIID)
|
||||
@ -536,14 +537,14 @@ ilINetContext*
|
||||
ImageNetContextImpl::Clone()
|
||||
{
|
||||
ilINetContext *cx;
|
||||
nsCOMPtr<nsILoadGroup> group = do_QueryReferent(mLoadGroup);
|
||||
nsCOMPtr<nsISupports> loadContext = do_QueryReferent(mLoadContext);
|
||||
|
||||
//mReconnectArg is ImageGroup. If GetURL is triggered
|
||||
//by timer for animation, ImageGroup may have been unloaded
|
||||
//before timer kicks off.
|
||||
//mReconnectCallback=nsnull; mReconnectArg=nsnull;
|
||||
|
||||
if (NS_NewImageNetContext(&cx, group, mReconnectCallback, mReconnectArg) == NS_OK)
|
||||
if (NS_NewImageNetContext(&cx, loadContext, mReconnectCallback, mReconnectArg) == NS_OK)
|
||||
{
|
||||
return cx;
|
||||
}
|
||||
@ -587,8 +588,9 @@ ImageNetContextImpl::CreateURL(const char *aURL,
|
||||
NET_ReloadMethod aReloadMethod)
|
||||
{
|
||||
ilIURL *url;
|
||||
nsCOMPtr<nsILoadGroup> group = do_QueryReferent(mLoadGroup);
|
||||
|
||||
|
||||
nsCOMPtr<nsISupports> loadContext (do_QueryReferent(mLoadContext));
|
||||
nsCOMPtr<nsILoadGroup> group (do_GetInterface(loadContext));
|
||||
if (NS_NewImageURL(&url, aURL, group) == NS_OK)
|
||||
{
|
||||
return url;
|
||||
@ -666,7 +668,9 @@ ImageNetContextImpl::GetURL (ilIURL * aURL,
|
||||
|| !(*mReconnectCallback)(mReconnectArg, ic)) {
|
||||
// first, create a channel for the protocol....
|
||||
nsCOMPtr<nsIChannel> channel;
|
||||
nsCOMPtr<nsILoadGroup> group = do_QueryReferent(mLoadGroup);
|
||||
nsCOMPtr<nsISupports> loadContext (do_QueryReferent(mLoadContext));
|
||||
nsCOMPtr<nsILoadGroup> group (do_GetInterface(loadContext));
|
||||
|
||||
rv = NS_OpenURI(getter_AddRefs(channel), nsurl, group);
|
||||
if (NS_FAILED(rv)) goto error;
|
||||
|
||||
@ -736,7 +740,7 @@ ImageNetContextImpl::RequestDone(ImageConsumer *aConsumer, nsIChannel* channel,
|
||||
|
||||
extern "C" NS_GFX_(nsresult)
|
||||
NS_NewImageNetContext(ilINetContext **aInstancePtrResult,
|
||||
nsILoadGroup* aLoadGroup,
|
||||
nsISupports * aLoadContext,
|
||||
nsReconnectCB aReconnectCallback,
|
||||
void* aReconnectArg)
|
||||
{
|
||||
@ -746,7 +750,7 @@ NS_NewImageNetContext(ilINetContext **aInstancePtrResult,
|
||||
}
|
||||
|
||||
ilINetContext *cx = new ImageNetContextImpl(TV_IMG_NTWK_SERVER,
|
||||
aLoadGroup,
|
||||
aLoadContext,
|
||||
aReconnectCallback,
|
||||
aReconnectArg);
|
||||
if (cx == nsnull) {
|
||||
|
@ -32,13 +32,15 @@
|
||||
#include "nsIRenderingContext.h"
|
||||
#include "nsEventStateManager.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsILoadGroup.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIStyleContext.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsILookAndFeel.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIURIContentListener.h"
|
||||
#include "nsIInterfaceRequestor.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
@ -777,16 +779,14 @@ nsPresContext::GetImageGroup(nsIImageGroup** aResult)
|
||||
}
|
||||
|
||||
// Initialize the image group
|
||||
nsCOMPtr<nsILoadGroup> loadGroup;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
if (NS_SUCCEEDED(mShell->GetDocument(getter_AddRefs(doc)))) {
|
||||
NS_ASSERTION(doc, "expect document here");
|
||||
if (doc) {
|
||||
doc->GetDocumentLoadGroup(getter_AddRefs(loadGroup));
|
||||
}
|
||||
nsCOMPtr<nsIURIContentListener> loadHandler (do_GetInterface(mContainer, &rv));
|
||||
if (NS_SUCCEEDED(rv) && loadHandler)
|
||||
{
|
||||
nsCOMPtr<nsISupports> loadContext;
|
||||
loadHandler->GetLoadCookie(getter_AddRefs(loadContext));
|
||||
rv = mImageGroup->Init(mDeviceContext, loadContext);
|
||||
}
|
||||
if (rv == NS_OK)
|
||||
rv = mImageGroup->Init(mDeviceContext, loadGroup);
|
||||
|
||||
if (NS_OK != rv) {
|
||||
return rv;
|
||||
}
|
||||
|
@ -32,13 +32,15 @@
|
||||
#include "nsIRenderingContext.h"
|
||||
#include "nsEventStateManager.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsILoadGroup.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIStyleContext.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsILookAndFeel.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIURIContentListener.h"
|
||||
#include "nsIInterfaceRequestor.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
@ -777,16 +779,14 @@ nsPresContext::GetImageGroup(nsIImageGroup** aResult)
|
||||
}
|
||||
|
||||
// Initialize the image group
|
||||
nsCOMPtr<nsILoadGroup> loadGroup;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
if (NS_SUCCEEDED(mShell->GetDocument(getter_AddRefs(doc)))) {
|
||||
NS_ASSERTION(doc, "expect document here");
|
||||
if (doc) {
|
||||
doc->GetDocumentLoadGroup(getter_AddRefs(loadGroup));
|
||||
}
|
||||
nsCOMPtr<nsIURIContentListener> loadHandler (do_GetInterface(mContainer, &rv));
|
||||
if (NS_SUCCEEDED(rv) && loadHandler)
|
||||
{
|
||||
nsCOMPtr<nsISupports> loadContext;
|
||||
loadHandler->GetLoadCookie(getter_AddRefs(loadContext));
|
||||
rv = mImageGroup->Init(mDeviceContext, loadContext);
|
||||
}
|
||||
if (rv == NS_OK)
|
||||
rv = mImageGroup->Init(mDeviceContext, loadGroup);
|
||||
|
||||
if (NS_OK != rv) {
|
||||
return rv;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user