From df3dddf52842c7cccc77016a6cfc95db07334981 Mon Sep 17 00:00:00 2001 From: "mscott%netscape.com" Date: Tue, 15 Feb 2000 04:49:32 +0000 Subject: [PATCH] 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. git-svn-id: svn://10.0.0.236/trunk@60802 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/gfx/public/nsIImageGroup.h | 2 +- mozilla/gfx/src/nsImageGroup.cpp | 12 +++------ mozilla/gfx/src/nsImageNet.h | 2 +- mozilla/gfx/src/nsImageNetContextAsync.cpp | 30 ++++++++++++---------- mozilla/layout/base/nsPresContext.cpp | 20 +++++++-------- mozilla/layout/base/src/nsPresContext.cpp | 20 +++++++-------- 6 files changed, 42 insertions(+), 44 deletions(-) diff --git a/mozilla/gfx/public/nsIImageGroup.h b/mozilla/gfx/public/nsIImageGroup.h index 4107bbbfcb3..7a2558c268b 100644 --- a/mozilla/gfx/public/nsIImageGroup.h +++ b/mozilla/gfx/public/nsIImageGroup.h @@ -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. diff --git a/mozilla/gfx/src/nsImageGroup.cpp b/mozilla/gfx/src/nsImageGroup.cpp index f44fe26d3fa..a56433cb3ca 100644 --- a/mozilla/gfx/src/nsImageGroup.cpp +++ b/mozilla/gfx/src/nsImageGroup.cpp @@ -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; } diff --git a/mozilla/gfx/src/nsImageNet.h b/mozilla/gfx/src/nsImageNet.h index e08bb473dd2..8af4917fa83 100644 --- a/mozilla/gfx/src/nsImageNet.h +++ b/mozilla/gfx/src/nsImageNet.h @@ -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); diff --git a/mozilla/gfx/src/nsImageNetContextAsync.cpp b/mozilla/gfx/src/nsImageNetContextAsync.cpp index 5667f1865c4..20b8b2700d1 100644 --- a/mozilla/gfx/src/nsImageNetContextAsync.cpp +++ b/mozilla/gfx/src/nsImageNetContextAsync.cpp @@ -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 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 group = do_QueryReferent(mLoadGroup); + nsCOMPtr 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 group = do_QueryReferent(mLoadGroup); - + + nsCOMPtr loadContext (do_QueryReferent(mLoadContext)); + nsCOMPtr 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 channel; - nsCOMPtr group = do_QueryReferent(mLoadGroup); + nsCOMPtr loadContext (do_QueryReferent(mLoadContext)); + nsCOMPtr 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) { diff --git a/mozilla/layout/base/nsPresContext.cpp b/mozilla/layout/base/nsPresContext.cpp index 6fb32373de6..fffd5793a31 100644 --- a/mozilla/layout/base/nsPresContext.cpp +++ b/mozilla/layout/base/nsPresContext.cpp @@ -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 #endif @@ -777,16 +779,14 @@ nsPresContext::GetImageGroup(nsIImageGroup** aResult) } // Initialize the image group - nsCOMPtr loadGroup; - nsCOMPtr doc; - if (NS_SUCCEEDED(mShell->GetDocument(getter_AddRefs(doc)))) { - NS_ASSERTION(doc, "expect document here"); - if (doc) { - doc->GetDocumentLoadGroup(getter_AddRefs(loadGroup)); - } + nsCOMPtr loadHandler (do_GetInterface(mContainer, &rv)); + if (NS_SUCCEEDED(rv) && loadHandler) + { + nsCOMPtr 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; } diff --git a/mozilla/layout/base/src/nsPresContext.cpp b/mozilla/layout/base/src/nsPresContext.cpp index 6fb32373de6..fffd5793a31 100644 --- a/mozilla/layout/base/src/nsPresContext.cpp +++ b/mozilla/layout/base/src/nsPresContext.cpp @@ -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 #endif @@ -777,16 +779,14 @@ nsPresContext::GetImageGroup(nsIImageGroup** aResult) } // Initialize the image group - nsCOMPtr loadGroup; - nsCOMPtr doc; - if (NS_SUCCEEDED(mShell->GetDocument(getter_AddRefs(doc)))) { - NS_ASSERTION(doc, "expect document here"); - if (doc) { - doc->GetDocumentLoadGroup(getter_AddRefs(loadGroup)); - } + nsCOMPtr loadHandler (do_GetInterface(mContainer, &rv)); + if (NS_SUCCEEDED(rv) && loadHandler) + { + nsCOMPtr 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; }