From 9d110a060046329fa1f29b5e7d41f9dd13567daa Mon Sep 17 00:00:00 2001 From: Josh Aas Date: Fri, 16 Jul 2010 15:55:54 -0400 Subject: [PATCH] Improve memory mgmt and reduce COM pointer type usage in plugin stream code. b=578913 r=benwa (re-landing, did not cause Ts Shutdown regression) --- modules/plugin/base/src/nsPluginHost.cpp | 97 +++++++++---------- modules/plugin/base/src/nsPluginHost.h | 12 +-- .../base/src/nsPluginStreamListenerPeer.cpp | 62 ++++++------ .../base/src/nsPluginStreamListenerPeer.h | 12 +-- 4 files changed, 88 insertions(+), 95 deletions(-) diff --git a/modules/plugin/base/src/nsPluginHost.cpp b/modules/plugin/base/src/nsPluginHost.cpp index 07932abd9c80..f31a404d7681 100644 --- a/modules/plugin/base/src/nsPluginHost.cpp +++ b/modules/plugin/base/src/nsPluginHost.cpp @@ -594,11 +594,12 @@ NS_IMETHODIMP nsPluginHost::GetURL(nsISupports* pluginInst, const char* referrer, PRBool forceJSEnabled) { - return GetURLWithHeaders(pluginInst, url, target, streamListener, - altHost, referrer, forceJSEnabled, nsnull, nsnull); + return GetURLWithHeaders(static_cast(pluginInst), + url, target, streamListener, altHost, referrer, + forceJSEnabled, nsnull, nsnull); } -nsresult nsPluginHost::GetURLWithHeaders(nsISupports* pluginInst, +nsresult nsPluginHost::GetURLWithHeaders(nsNPAPIPluginInstance* pluginInst, const char* url, const char* target, nsIPluginStreamListener* streamListener, @@ -616,18 +617,13 @@ nsresult nsPluginHost::GetURLWithHeaders(nsISupports* pluginInst, if (!target && !streamListener) return NS_ERROR_ILLEGAL_VALUE; - nsresult rv; - nsCOMPtr instance = do_QueryInterface(pluginInst, &rv); - if (NS_FAILED(rv)) - return rv; - - rv = DoURLLoadSecurityCheck(instance, url); + nsresult rv = DoURLLoadSecurityCheck(pluginInst, url); if (NS_FAILED(rv)) return rv; if (target) { nsCOMPtr owner; - rv = instance->GetOwner(getter_AddRefs(owner)); + rv = pluginInst->GetOwner(getter_AddRefs(owner)); if (owner) { if ((0 == PL_strcmp(target, "newwindow")) || (0 == PL_strcmp(target, "_new"))) @@ -640,7 +636,7 @@ nsresult nsPluginHost::GetURLWithHeaders(nsISupports* pluginInst, } if (streamListener) - rv = NewPluginURLStream(string, instance, streamListener, nsnull, + rv = NewPluginURLStream(string, pluginInst, streamListener, nsnull, getHeaders, getHeadersLength); return rv; @@ -670,9 +666,7 @@ NS_IMETHODIMP nsPluginHost::PostURL(nsISupports* pluginInst, if (!target && !streamListener) return NS_ERROR_ILLEGAL_VALUE; - nsCOMPtr instance = do_QueryInterface(pluginInst, &rv); - if (NS_FAILED(rv)) - return rv; + nsNPAPIPluginInstance* instance = static_cast(pluginInst); rv = DoURLLoadSecurityCheck(instance, url); if (NS_FAILED(rv)) @@ -950,8 +944,8 @@ NS_IMETHODIMP nsPluginHost::InstantiatePluginForChannel(nsIChannel* aChannel, // Called by nsPluginInstanceOwner NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, - nsIURI* aURL, - nsIPluginInstanceOwner *aOwner) + nsIURI* aURL, + nsIPluginInstanceOwner *aOwner) { NS_ENSURE_ARG_POINTER(aOwner); @@ -967,8 +961,7 @@ NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, PR_LogFlush(); #endif - nsresult rv; - nsIPluginInstance *instance = nsnull; + nsresult rv; nsCOMPtr pti; nsPluginTagType tagType; @@ -1046,18 +1039,18 @@ NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, PLUGIN_LOG(PLUGIN_LOG_NOISY, ("nsPluginHost::InstantiateEmbeddedPlugin FoundStopped mime=%s\n", aMimeType)); - aOwner->GetInstance(instance); + nsCOMPtr instanceCOMPtr; + aOwner->GetInstance(getter_AddRefs(instanceCOMPtr)); + nsNPAPIPluginInstance *instance = static_cast(instanceCOMPtr.get()); if (!isJava && bCanHandleInternally) rv = NewEmbeddedPluginStream(aURL, aOwner, instance); // notify Java DOM component nsresult res; - nsCOMPtr javaDOM = - do_GetService("@mozilla.org/blackwood/java-dom;1", &res); + nsCOMPtr javaDOM = do_GetService("@mozilla.org/blackwood/java-dom;1", &res); if (NS_SUCCEEDED(res) && javaDOM) javaDOM->SetInstance(instance); - NS_IF_RELEASE(instance); return NS_OK; } @@ -1071,15 +1064,15 @@ NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, if (NS_FAILED(rv)) return NS_ERROR_FAILURE; - rv = aOwner->GetInstance(instance); - + nsCOMPtr instanceCOMPtr; + rv = aOwner->GetInstance(getter_AddRefs(instanceCOMPtr)); // if we have a failure error, it means we found a plugin for the mimetype, // but we had a problem with the entry point if (rv == NS_ERROR_FAILURE) return rv; // if we are here then we have loaded a plugin for this mimetype - + nsNPAPIPluginInstance *instance = static_cast(instanceCOMPtr.get()); NPWindow *window = nsnull; //we got a plugin built, now stream @@ -1091,8 +1084,7 @@ NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, // If we've got a native window, the let the plugin know about it. if (window->window) { - nsCOMPtr inst = instance; - ((nsPluginNativeWindow*)window)->CallSetWindow(inst); + ((nsPluginNativeWindow*)window)->CallSetWindow(instanceCOMPtr); } // create an initial stream with data @@ -1116,8 +1108,6 @@ NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, do_GetService("@mozilla.org/blackwood/java-dom;1", &res); if (NS_SUCCEEDED(res) && javaDOM) javaDOM->SetInstance(instance); - - NS_RELEASE(instance); } #ifdef PLUGIN_LOGGING @@ -1136,9 +1126,9 @@ NS_IMETHODIMP nsPluginHost::InstantiateEmbeddedPlugin(const char *aMimeType, // Called by full-page case NS_IMETHODIMP nsPluginHost::InstantiateFullPagePlugin(const char *aMimeType, - nsIURI* aURI, - nsIStreamListener *&aStreamListener, - nsIPluginInstanceOwner *aOwner) + nsIURI* aURI, + nsIStreamListener *&aStreamListener, + nsIPluginInstanceOwner *aOwner) { #ifdef PLUGIN_LOGGING nsCAutoString urlSpec; @@ -1152,22 +1142,24 @@ NS_IMETHODIMP nsPluginHost::InstantiateFullPagePlugin(const char *aMimeType, PLUGIN_LOG(PLUGIN_LOG_NOISY, ("nsPluginHost::InstantiateFullPagePlugin FoundStopped mime=%s\n",aMimeType)); - nsIPluginInstance* instance; - aOwner->GetInstance(instance); + nsPluginTag* pluginTag = FindPluginForType(aMimeType, PR_TRUE); - if (!pluginTag || !pluginTag->mIsJavaPlugin) - NewFullPagePluginStream(aStreamListener, aURI, instance); - NS_IF_RELEASE(instance); + if (!pluginTag || !pluginTag->mIsJavaPlugin) { + nsCOMPtr instanceCOMPtr; + aOwner->GetInstance(getter_AddRefs(instanceCOMPtr)); + NewFullPagePluginStream(aStreamListener, aURI, static_cast(instanceCOMPtr.get())); + } return NS_OK; } nsresult rv = SetUpPluginInstance(aMimeType, aURI, aOwner); if (NS_OK == rv) { - nsCOMPtr instance; - NPWindow* win = nsnull; + nsCOMPtr instanceCOMPtr; + aOwner->GetInstance(getter_AddRefs(instanceCOMPtr)); + nsNPAPIPluginInstance *instance = static_cast(instanceCOMPtr.get()); - aOwner->GetInstance(*getter_AddRefs(instance)); + NPWindow* win = nsnull; aOwner->GetWindow(win); if (win && instance) { @@ -1177,13 +1169,13 @@ NS_IMETHODIMP nsPluginHost::InstantiateFullPagePlugin(const char *aMimeType, // If we've got a native window, the let the plugin know about it. nsPluginNativeWindow * window = (nsPluginNativeWindow *)win; if (window->window) - window->CallSetWindow(instance); + window->CallSetWindow(instanceCOMPtr); rv = NewFullPagePluginStream(aStreamListener, aURI, instance); // If we've got a native window, the let the plugin know about it. if (window->window) - window->CallSetWindow(instance); + window->CallSetWindow(instanceCOMPtr); } } @@ -2869,7 +2861,7 @@ nsPluginHost::EnsurePrivateDirServiceProvider() #endif /* XP_WIN */ nsresult nsPluginHost::NewPluginURLStream(const nsString& aURL, - nsIPluginInstance *aInstance, + nsNPAPIPluginInstance *aInstance, nsIPluginStreamListener* aListener, nsIInputStream *aPostStream, const char *aHeadersData, @@ -2923,7 +2915,7 @@ nsresult nsPluginHost::NewPluginURLStream(const nsString& aURL, } nsRefPtr listenerPeer = new nsPluginStreamListenerPeer(); - if (listenerPeer == NULL) + if (!listenerPeer) return NS_ERROR_OUT_OF_MEMORY; rv = listenerPeer->Initialize(url, aInstance, aListener); @@ -2992,8 +2984,8 @@ nsresult nsPluginHost::NewPluginURLStream(const nsString& aURL, // Called by GetURL and PostURL nsresult -nsPluginHost::DoURLLoadSecurityCheck(nsIPluginInstance *aInstance, - const char* aURL) +nsPluginHost::DoURLLoadSecurityCheck(nsNPAPIPluginInstance *aInstance, + const char* aURL) { if (!aURL || *aURL == '\0') return NS_OK; @@ -3158,15 +3150,14 @@ nsPluginHost::StoppedInstanceTagCount() nsresult nsPluginHost::NewEmbeddedPluginStreamListener(nsIURI* aURL, nsIPluginInstanceOwner *aOwner, - nsIPluginInstance* aInstance, + nsNPAPIPluginInstance* aInstance, nsIStreamListener** aListener) { if (!aURL) return NS_OK; - nsRefPtr listener = - new nsPluginStreamListenerPeer(); - if (listener == nsnull) + nsRefPtr listener = new nsPluginStreamListenerPeer(); + if (!listener) return NS_ERROR_OUT_OF_MEMORY; nsresult rv; @@ -3175,7 +3166,7 @@ nsresult nsPluginHost::NewEmbeddedPluginStreamListener(nsIURI* aURL, // if we only have an owner, then we need to pass it in // so the listener can set up the instance later after // we've determined the mimetype of the stream - if (aInstance != nsnull) + if (aInstance) rv = listener->InitializeEmbedded(aURL, aInstance); else if (aOwner != nsnull) rv = listener->InitializeEmbedded(aURL, nsnull, aOwner); @@ -3190,7 +3181,7 @@ nsresult nsPluginHost::NewEmbeddedPluginStreamListener(nsIURI* aURL, // Called by InstantiateEmbeddedPlugin() nsresult nsPluginHost::NewEmbeddedPluginStream(nsIURI* aURL, nsIPluginInstanceOwner *aOwner, - nsIPluginInstance* aInstance) + nsNPAPIPluginInstance* aInstance) { nsCOMPtr listener; nsresult rv = NewEmbeddedPluginStreamListener(aURL, aOwner, aInstance, @@ -3225,7 +3216,7 @@ nsresult nsPluginHost::NewEmbeddedPluginStream(nsIURI* aURL, // Called by InstantiateFullPagePlugin() nsresult nsPluginHost::NewFullPagePluginStream(nsIStreamListener *&aStreamListener, nsIURI* aURI, - nsIPluginInstance *aInstance) + nsNPAPIPluginInstance *aInstance) { nsPluginStreamListenerPeer *listener = new nsPluginStreamListenerPeer(); if (!listener) diff --git a/modules/plugin/base/src/nsPluginHost.h b/modules/plugin/base/src/nsPluginHost.h index 08713cc6de5a..8d5940ce7894 100644 --- a/modules/plugin/base/src/nsPluginHost.h +++ b/modules/plugin/base/src/nsPluginHost.h @@ -114,14 +114,14 @@ public: nsresult NewPluginURLStream(const nsString& aURL, - nsIPluginInstance *aInstance, + nsNPAPIPluginInstance *aInstance, nsIPluginStreamListener *aListener, nsIInputStream *aPostStream = nsnull, const char *aHeadersData = nsnull, PRUint32 aHeadersDataLen = 0); nsresult - GetURLWithHeaders(nsISupports* pluginInst, + GetURLWithHeaders(nsNPAPIPluginInstance *pluginInst, const char* url, const char* target = NULL, nsIPluginStreamListener* streamListener = NULL, @@ -132,7 +132,7 @@ public: const char* getHeaders = NULL); nsresult - DoURLLoadSecurityCheck(nsIPluginInstance *aInstance, + DoURLLoadSecurityCheck(nsNPAPIPluginInstance *aInstance, const char* aURL); nsresult @@ -185,14 +185,14 @@ private: nsresult NewEmbeddedPluginStreamListener(nsIURI* aURL, nsIPluginInstanceOwner *aOwner, - nsIPluginInstance* aInstance, + nsNPAPIPluginInstance* aInstance, nsIStreamListener** aListener); nsresult - NewEmbeddedPluginStream(nsIURI* aURL, nsIPluginInstanceOwner *aOwner, nsIPluginInstance* aInstance); + NewEmbeddedPluginStream(nsIURI* aURL, nsIPluginInstanceOwner *aOwner, nsNPAPIPluginInstance* aInstance); nsresult - NewFullPagePluginStream(nsIStreamListener *&aStreamListener, nsIURI* aURI, nsIPluginInstance *aInstance); + NewFullPagePluginStream(nsIStreamListener *&aStreamListener, nsIURI* aURI, nsNPAPIPluginInstance *aInstance); // Return an nsPluginTag for this type, if any. If aCheckEnabled is // true, only enabled plugins will be returned. diff --git a/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp b/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp index cb810b23a37b..a5d518e384ef 100644 --- a/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp +++ b/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp @@ -283,7 +283,7 @@ nsPluginStreamListenerPeer::~nsPluginStreamListenerPeer() // Called as a result of GetURL and PostURL nsresult nsPluginStreamListenerPeer::Initialize(nsIURI *aURL, - nsIPluginInstance *aInstance, + nsNPAPIPluginInstance *aInstance, nsIPluginStreamListener* aListener, PRInt32 requestCount) { @@ -299,7 +299,7 @@ nsresult nsPluginStreamListenerPeer::Initialize(nsIURI *aURL, mURL = aURL; - mInstance = aInstance; + mPluginInstance = aInstance; mPStreamListener = aListener; mPendingRequests = requestCount; @@ -317,7 +317,7 @@ nsresult nsPluginStreamListenerPeer::Initialize(nsIURI *aURL, * instance owner. */ nsresult nsPluginStreamListenerPeer::InitializeEmbedded(nsIURI *aURL, - nsIPluginInstance* aInstance, + nsNPAPIPluginInstance* aInstance, nsIPluginInstanceOwner *aOwner) { #ifdef PLUGIN_LOGGING @@ -333,8 +333,8 @@ nsresult nsPluginStreamListenerPeer::InitializeEmbedded(nsIURI *aURL, mURL = aURL; if (aInstance) { - NS_ASSERTION(mInstance == nsnull, "nsPluginStreamListenerPeer::InitializeEmbedded mInstance != nsnull"); - mInstance = aInstance; + NS_ASSERTION(mPluginInstance == nsnull, "nsPluginStreamListenerPeer::InitializeEmbedded mPluginInstance != nsnull"); + mPluginInstance = aInstance; } else { mOwner = aOwner; } @@ -347,13 +347,13 @@ nsresult nsPluginStreamListenerPeer::InitializeEmbedded(nsIURI *aURL, } // Called by NewFullPagePluginStream() -nsresult nsPluginStreamListenerPeer::InitializeFullPage(nsIURI* aURL, nsIPluginInstance *aInstance) +nsresult nsPluginStreamListenerPeer::InitializeFullPage(nsIURI* aURL, nsNPAPIPluginInstance *aInstance) { PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsPluginStreamListenerPeer::InitializeFullPage instance=%p\n",aInstance)); - NS_ASSERTION(mInstance == nsnull, "nsPluginStreamListenerPeer::InitializeFullPage mInstance != nsnull"); - mInstance = aInstance; + NS_ASSERTION(mPluginInstance == nsnull, "nsPluginStreamListenerPeer::InitializeFullPage mPluginInstance != nsnull"); + mPluginInstance = aInstance; mURL = aURL; @@ -445,7 +445,7 @@ nsPluginStreamListenerPeer::SetupPluginCacheFile(nsIChannel* channel) // add this listenerPeer to list of stream peers for this instance // it'll delay release of listenerPeer until nsPluginInstanceTag::~nsPluginInstanceTag // and the temp file is going to stay alive until then - nsPluginInstanceTag *instanceTag = pluginHost->FindInstanceTag(mInstance); + nsPluginInstanceTag *instanceTag = pluginHost->FindInstanceTag(mPluginInstance); if (instanceTag) instanceTag->mStreams.AppendObject(this); @@ -484,8 +484,8 @@ nsPluginStreamListenerPeer::OnStartRequest(nsIRequest *request, if (responseCode > 206) { // not normal PRBool bWantsAllNetworkStreams = PR_FALSE; - mInstance->GetValueFromPlugin(NPPVpluginWantsAllNetworkStreams, - (void*)&bWantsAllNetworkStreams); + mPluginInstance->GetValueFromPlugin(NPPVpluginWantsAllNetworkStreams, + (void*)&bWantsAllNetworkStreams); if (!bWantsAllNetworkStreams) { mRequestFailed = PR_TRUE; return NS_ERROR_FAILURE; @@ -563,18 +563,20 @@ nsPluginStreamListenerPeer::OnStartRequest(nsIRequest *request, NPWindow* window = nsnull; - // if we don't have an nsIPluginInstance (mInstance), it means + // if we don't have an nsNPAPIPluginInstance (mPluginInstance), it means // we weren't able to load a plugin previously because we // didn't have the mimetype. Now that we do (aContentType), // we'll try again with SetUpPluginInstance() // which is called by InstantiateEmbeddedPlugin() // NOTE: we don't want to try again if we didn't get the MIME type this time - if (!mInstance && mOwner && !aContentType.IsEmpty()) { - mOwner->GetInstance(getter_AddRefs(mInstance)); - + if (!mPluginInstance && mOwner && !aContentType.IsEmpty()) { + nsCOMPtr pluginInstCOMPtr; + mOwner->GetInstance(getter_AddRefs(pluginInstCOMPtr)); + mPluginInstance = static_cast(pluginInstCOMPtr.get()); + mOwner->GetWindow(window); - if (!mInstance && window) { + if (!mPluginInstance && window) { nsRefPtr pluginHost = dont_AddRef(nsPluginHost::GetInst()); // determine if we need to try embedded again. FullPage takes a different code path @@ -586,14 +588,14 @@ nsPluginStreamListenerPeer::OnStartRequest(nsIRequest *request, rv = pluginHost->SetUpPluginInstance(aContentType.get(), aURL, mOwner); if (NS_OK == rv) { - mOwner->GetInstance(getter_AddRefs(mInstance)); - if (mInstance) { - mInstance->Start(); + mOwner->GetInstance(getter_AddRefs(pluginInstCOMPtr)); + mPluginInstance = static_cast(pluginInstCOMPtr.get()); + if (mPluginInstance) { + mPluginInstance->Start(); mOwner->CreateWidget(); // If we've got a native window, the let the plugin know about it. if (window->window) { - nsCOMPtr inst = mInstance; - ((nsPluginNativeWindow*)window)->CallSetWindow(inst); + ((nsPluginNativeWindow*)window)->CallSetWindow(pluginInstCOMPtr); } } } @@ -773,14 +775,14 @@ nsPluginStreamListenerPeer::SetStreamOffset(PRInt32 value) nsresult nsPluginStreamListenerPeer::ServeStreamAsFile(nsIRequest *request, nsISupports* aContext) { - if (!mInstance) + if (!mPluginInstance) return NS_ERROR_FAILURE; - // mInstance->Stop calls mPStreamListener->CleanUpStream(), so stream will be properly clean up - mInstance->Stop(); - mInstance->Start(); + // mPluginInstance->Stop calls mPStreamListener->CleanUpStream(), so stream will be properly clean up + mPluginInstance->Stop(); + mPluginInstance->Start(); nsCOMPtr owner; - mInstance->GetOwner(getter_AddRefs(owner)); + mPluginInstance->GetOwner(getter_AddRefs(owner)); if (owner) { NPWindow* window = nsnull; owner->GetWindow(window); @@ -794,8 +796,8 @@ nsresult nsPluginStreamListenerPeer::ServeStreamAsFile(nsIRequest *request, } #endif if (window->window) { - nsCOMPtr inst = mInstance; - ((nsPluginNativeWindow*)window)->CallSetWindow(inst); + nsCOMPtr pluginInstCOMPtr = mPluginInstance.get(); + ((nsPluginNativeWindow*)window)->CallSetWindow(pluginInstCOMPtr); } } @@ -1067,8 +1069,8 @@ nsresult nsPluginStreamListenerPeer::SetUpStreamListener(nsIRequest *request, // NOTE: this should only happen when a stream was NOT created // with GetURL or PostURL (i.e. it's the initial stream we // send to the plugin as determined by the SRC or DATA attribute) - if (!mPStreamListener && mInstance) - rv = mInstance->NewStreamToPlugin(getter_AddRefs(mPStreamListener)); + if (!mPStreamListener && mPluginInstance) + rv = mPluginInstance->NewStreamToPlugin(getter_AddRefs(mPStreamListener)); if (NS_FAILED(rv)) return rv; diff --git a/modules/plugin/base/src/nsPluginStreamListenerPeer.h b/modules/plugin/base/src/nsPluginStreamListenerPeer.h index 56724d398547..ebd01934c48f 100644 --- a/modules/plugin/base/src/nsPluginStreamListenerPeer.h +++ b/modules/plugin/base/src/nsPluginStreamListenerPeer.h @@ -46,6 +46,7 @@ #include "nsWeakReference.h" #include "nsNPAPIPluginStreamListener.h" #include "nsHashtable.h" +#include "nsNPAPIPluginInstance.h" class nsIChannel; @@ -98,21 +99,21 @@ public: // Called by GetURL and PostURL (via NewStream) nsresult Initialize(nsIURI *aURL, - nsIPluginInstance *aInstance, + nsNPAPIPluginInstance *aInstance, nsIPluginStreamListener *aListener, PRInt32 requestCount = 1); nsresult InitializeEmbedded(nsIURI *aURL, - nsIPluginInstance* aInstance, + nsNPAPIPluginInstance* aInstance, nsIPluginInstanceOwner *aOwner = nsnull); - nsresult InitializeFullPage(nsIURI* aURL, nsIPluginInstance *aInstance); + nsresult InitializeFullPage(nsIURI* aURL, nsNPAPIPluginInstance *aInstance); nsresult OnFileAvailable(nsIFile* aFile); nsresult ServeStreamAsFile(nsIRequest *request, nsISupports *ctxt); - nsIPluginInstance *GetPluginInstance() { return mInstance; } + nsNPAPIPluginInstance *GetPluginInstance() { return mPluginInstance; } private: nsresult SetUpStreamListener(nsIRequest* request, nsIURI* aURL); @@ -121,7 +122,6 @@ private: nsCOMPtr mURL; nsCString mURLSpec; // Have to keep this member because GetURL hands out char* nsCOMPtr mOwner; - nsCOMPtr mInstance; nsCOMPtr mPStreamListener; // Set to PR_TRUE if we request failed (like with a HTTP response of 404) @@ -148,7 +148,7 @@ private: nsCString mContentType; PRBool mSeekable; PRUint32 mModified; - nsCOMPtr mPluginInstance; + nsRefPtr mPluginInstance; PRInt32 mStreamOffset; PRBool mStreamComplete;