just because an observer supports weak refs doesn't mean it is one. (found while leak hunting in) bug 166442 r=jag,jst

git-svn-id: svn://10.0.0.236/trunk@129219 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
danm%netscape.com 2002-09-11 02:35:26 +00:00
parent 0f4feec698
commit 945c4237b2

View File

@ -60,16 +60,16 @@ nsObserverList::~nsObserverList(void)
nsresult
nsObserverList::AddObserver(nsIObserver* anObserver, PRBool ownsWeak)
{
nsresult rv;
PRBool inserted;
nsresult rv;
PRBool inserted;
NS_ENSURE_ARG(anObserver);
nsAutoLock lock(mLock);
if (!mObserverList) {
nsAutoLock lock(mLock);
if (!mObserverList) {
rv = NS_NewISupportsArray(getter_AddRefs(mObserverList));
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv)) return rv;
}
#ifdef NS_WEAK_OBSERVERS
@ -92,8 +92,8 @@ nsObserverList::AddObserver(nsIObserver* anObserver, PRBool ownsWeak)
inserted = mObserverList->AppendElement(observerRef);
#else
if(*anObserver)
inserted = mObserverList->AppendElement(*anObserver);
if (*anObserver)
inserted = mObserverList->AppendElement(*anObserver);
#endif
return inserted ? NS_OK : NS_ERROR_FAILURE;
}
@ -105,23 +105,27 @@ nsObserverList::RemoveObserver(nsIObserver* anObserver)
NS_ENSURE_ARG(anObserver);
nsAutoLock lock(mLock);
nsAutoLock lock(mLock);
if (!mObserverList)
return NS_ERROR_FAILURE;
return NS_ERROR_FAILURE;
#ifdef NS_WEAK_OBSERVERS
nsCOMPtr<nsISupportsWeakReference> weakRefFactory = do_QueryInterface(anObserver);
nsCOMPtr<nsISupports> observerRef;
if ( weakRefFactory )
if (weakRefFactory) {
observerRef = getter_AddRefs(NS_STATIC_CAST(nsISupports*, NS_GetWeakReference(weakRefFactory)));
else
if (observerRef)
removed = mObserverList->RemoveElement(observerRef);
if (!removed)
observerRef = anObserver;
} else
observerRef = anObserver;
if(observerRef)
removed = mObserverList->RemoveElement(observerRef);
if (!removed && observerRef)
removed = mObserverList->RemoveElement(observerRef);
#else
if(*anObserver)
if (*anObserver)
removed = mObserverList->RemoveElement(*anObserver);
#endif
return removed ? NS_OK : NS_ERROR_FAILURE;