Bug 377899, Cycle between nsXULTooltipListener and nsGlobalWindows causes leaks, r=neil,sr=peterv

This commit is contained in:
Olli.Pettay@helsinki.fi 2007-04-25 10:18:50 -07:00
Родитель b301c8bc96
Коммит 033e829d2f
3 изменённых файлов: 27 добавлений и 12 удалений

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

@ -242,7 +242,6 @@ nsLayoutStatics::Shutdown()
nsXULElement::ReleaseGlobals();
nsXULPrototypeCache::ReleaseGlobals();
nsXULPrototypeElement::ReleaseGlobals();
nsXULTooltipListener::ReleaseInstance();
nsSprocketLayout::Shutdown();
#endif

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

@ -67,10 +67,7 @@ nsXULTooltipListener* nsXULTooltipListener::mInstance = nsnull;
//// nsISupports
nsXULTooltipListener::nsXULTooltipListener()
: mSourceNode(nsnull)
, mTargetNode(nsnull)
, mCurrentTooltip(nsnull)
, mMouseClientX(0)
: mMouseClientX(0)
, mMouseClientY(0)
#ifdef MOZ_XUL
, mIsSourceTree(PR_FALSE)
@ -90,6 +87,9 @@ nsXULTooltipListener::nsXULTooltipListener()
nsXULTooltipListener::~nsXULTooltipListener()
{
if (nsXULTooltipListener::mInstance == this) {
ClearTooltipCache();
}
HideTooltip();
if (--sTooltipListenerCount == 0) {
@ -99,8 +99,7 @@ nsXULTooltipListener::~nsXULTooltipListener()
}
}
NS_IMPL_ADDREF(nsXULTooltipListener)
NS_IMPL_RELEASE(nsXULTooltipListener)
NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULTooltipListener)
NS_INTERFACE_MAP_BEGIN(nsXULTooltipListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMMouseListener)
@ -109,8 +108,24 @@ NS_INTERFACE_MAP_BEGIN(nsXULTooltipListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMXULListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsIDOMEventListener, nsIDOMMouseListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMMouseMotionListener)
NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsXULTooltipListener)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULTooltipListener)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULTooltipListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXULTooltipListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mSourceNode)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mTargetNode)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mCurrentTooltip)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULTooltipListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mSourceNode)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mTargetNode)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mCurrentTooltip)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
//////////////////////////////////////////////////////////////////////////
//// nsIDOMMouseListener

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

@ -38,6 +38,7 @@
#ifndef nsXULTooltipListener_h__
#define nsXULTooltipListener_h__
#include "nsCycleCollectionParticipant.h"
#include "nsIDOMMouseListener.h"
#include "nsIDOMMouseMotionListener.h"
#include "nsIDOMKeyListener.h"
@ -59,9 +60,9 @@ class nsXULTooltipListener : public nsIDOMMouseListener,
public nsIDOMXULListener
{
public:
// nsISupports
NS_DECL_ISUPPORTS
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsXULTooltipListener,
nsIDOMMouseListener)
// nsIDOMMouseListener
NS_IMETHOD MouseDown(nsIDOMEvent* aMouseEvent);
@ -97,10 +98,10 @@ public:
nsresult RemoveTooltipSupport(nsIContent* aNode);
static nsXULTooltipListener* GetInstance() {
if (!mInstance)
NS_IF_ADDREF(mInstance = new nsXULTooltipListener());
mInstance = new nsXULTooltipListener();
return mInstance;
}
static void ReleaseInstance() { NS_IF_RELEASE(mInstance); }
static void ClearTooltipCache() { mInstance = nsnull; }
protected: