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:
mscott%netscape.com 2000-02-15 04:49:32 +00:00
parent e90f418de4
commit 23a00a46c6
6 changed files with 42 additions and 44 deletions

View File

@ -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.

View File

@ -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;
}

View File

@ -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);

View File

@ -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) {

View File

@ -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;
}

View File

@ -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;
}