From 033e829d2f4903dd027972c56ae15dde5de023d7 Mon Sep 17 00:00:00 2001 From: "Olli.Pettay@helsinki.fi" Date: Wed, 25 Apr 2007 10:18:50 -0700 Subject: [PATCH] Bug 377899, Cycle between nsXULTooltipListener and nsGlobalWindows causes leaks, r=neil,sr=peterv --- layout/build/nsLayoutStatics.cpp | 1 - layout/xul/base/src/nsXULTooltipListener.cpp | 27 +++++++++++++++----- layout/xul/base/src/nsXULTooltipListener.h | 11 ++++---- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp index b84238d2b85e..19ad9a7d9460 100644 --- a/layout/build/nsLayoutStatics.cpp +++ b/layout/build/nsLayoutStatics.cpp @@ -242,7 +242,6 @@ nsLayoutStatics::Shutdown() nsXULElement::ReleaseGlobals(); nsXULPrototypeCache::ReleaseGlobals(); nsXULPrototypeElement::ReleaseGlobals(); - nsXULTooltipListener::ReleaseInstance(); nsSprocketLayout::Shutdown(); #endif diff --git a/layout/xul/base/src/nsXULTooltipListener.cpp b/layout/xul/base/src/nsXULTooltipListener.cpp index b779a9003013..2cf6bedb0b6b 100644 --- a/layout/xul/base/src/nsXULTooltipListener.cpp +++ b/layout/xul/base/src/nsXULTooltipListener.cpp @@ -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 diff --git a/layout/xul/base/src/nsXULTooltipListener.h b/layout/xul/base/src/nsXULTooltipListener.h index 6a48b23331fa..89d1be77a0a7 100644 --- a/layout/xul/base/src/nsXULTooltipListener.h +++ b/layout/xul/base/src/nsXULTooltipListener.h @@ -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: