Fixes bug 106313 (smoketest blocker). Allowing notification of weak references, regression caused by my nsIObserverService landing. sr=alecf@netscape.com.

This commit is contained in:
dougt%netscape.com 2001-10-24 18:02:46 +00:00
Родитель 73767ca64c
Коммит 5879839812
2 изменённых файлов: 88 добавлений и 1 удалений

Просмотреть файл

@ -131,5 +131,76 @@ nsObserverList::GetObserverList(nsISimpleEnumerator** anEnumerator)
{
nsAutoLock lock(mLock);
return NS_NewArrayEnumerator(anEnumerator, mObserverList);
ObserverListEnumerator * enumerator= new ObserverListEnumerator(mObserverList);
NS_IF_ADDREF(enumerator);
*anEnumerator = enumerator;
return NS_OK;
}
ObserverListEnumerator::ObserverListEnumerator(nsISupportsArray* aValueArray)
: mValueArray(aValueArray),
mIndex(0)
{
NS_INIT_REFCNT();
NS_IF_ADDREF(mValueArray);
}
ObserverListEnumerator::~ObserverListEnumerator(void)
{
NS_IF_RELEASE(mValueArray);
}
NS_IMPL_ISUPPORTS1(ObserverListEnumerator, nsISimpleEnumerator)
NS_IMETHODIMP
ObserverListEnumerator::HasMoreElements(PRBool* aResult)
{
NS_PRECONDITION(aResult != 0, "null ptr");
if (! aResult)
return NS_ERROR_NULL_POINTER;
if (!mValueArray) {
*aResult = PR_FALSE;
return NS_OK;
}
PRUint32 cnt;
nsresult rv = mValueArray->Count(&cnt);
if (NS_FAILED(rv)) return rv;
*aResult = (mIndex < (PRInt32) cnt);
return NS_OK;
}
NS_IMETHODIMP
ObserverListEnumerator::GetNext(nsISupports** aResult)
{
NS_PRECONDITION(aResult != 0, "null ptr");
if (! aResult)
return NS_ERROR_NULL_POINTER;
if (!mValueArray) {
*aResult = nsnull;
return NS_OK;
}
PRUint32 cnt;
nsresult rv = mValueArray->Count(&cnt);
if (NS_FAILED(rv)) return rv;
if (mIndex >= (PRInt32) cnt)
return NS_ERROR_UNEXPECTED;
*aResult = mValueArray->ElementAt(mIndex++);
if (*aResult) {
nsCOMPtr<nsIWeakReference> weakRefFactory = do_QueryInterface(*aResult);
if ( weakRefFactory ) {
nsCOMPtr<nsISupports> weakref = do_QueryReferent(weakRefFactory);
NS_RELEASE(*aResult);
NS_ADDREF(*aResult = weakref);
return NS_OK;
}
}
return NS_OK;
}

Просмотреть файл

@ -41,6 +41,22 @@
#include "nsIObserver.h"
#include "nsIEnumerator.h"
#include "nsISupportsArray.h"
#include "nsISimpleEnumerator.h"
class ObserverListEnumerator : public nsISimpleEnumerator
{
public:
// nsISupports interface
NS_DECL_ISUPPORTS
NS_DECL_NSISIMPLEENUMERATOR
ObserverListEnumerator(nsISupportsArray* aValueArray);
virtual ~ObserverListEnumerator(void);
protected:
nsISupportsArray* mValueArray;
PRInt32 mIndex;
};
class nsObserverList
{