From fbce22d79ee810ce82e5de2a5b69029d908df56d Mon Sep 17 00:00:00 2001 From: "Olli.Pettay%helsinki.fi" Date: Fri, 24 Feb 2006 19:13:43 +0000 Subject: [PATCH] Bug 328344, action module elements leak, r=aaronr+doronr git-svn-id: svn://10.0.0.236/trunk@191175 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/extensions/xforms/nsXFormsActionElement.cpp | 13 +++++++++---- mozilla/extensions/xforms/nsXFormsActionElement.h | 6 +++--- .../extensions/xforms/nsXFormsActionModuleBase.cpp | 10 ++++++++-- .../extensions/xforms/nsXFormsActionModuleBase.h | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/mozilla/extensions/xforms/nsXFormsActionElement.cpp b/mozilla/extensions/xforms/nsXFormsActionElement.cpp index 894514173ed..6ae4753c361 100644 --- a/mozilla/extensions/xforms/nsXFormsActionElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsActionElement.cpp @@ -52,7 +52,7 @@ #define DEFERRED_REVALIDATE 0x04 #define DEFERRED_REFRESH 0x08 -nsXFormsActionElement::nsXFormsActionElement() +nsXFormsActionElement::nsXFormsActionElement() : mElement(nsnull) { } @@ -71,9 +71,14 @@ nsXFormsActionElement::OnCreated(nsIXTFXMLVisualWrapper *aWrapper) nsresult rv = nsXFormsXMLVisualStub::OnCreated(aWrapper); NS_ENSURE_SUCCESS(rv, rv); - rv = aWrapper->GetElementNode(getter_AddRefs(mElement)); - NS_ENSURE_SUCCESS(rv, rv); - + // It's ok to keep a weak pointer to mElement. mElement will have an + // owning reference to this object, so as long as we null out mElement in + // OnDestroyed, it will always be valid. + nsCOMPtr node; + aWrapper->GetElementNode(getter_AddRefs(node)); + mElement = node; + NS_ASSERTION(mElement, "Wrapper is not an nsIDOMElement, we'll crash soon"); + nsCOMPtr domDoc; mElement->GetOwnerDocument(getter_AddRefs(domDoc)); rv = domDoc->CreateElementNS(NS_LITERAL_STRING(NS_NAMESPACE_XHTML), diff --git a/mozilla/extensions/xforms/nsXFormsActionElement.h b/mozilla/extensions/xforms/nsXFormsActionElement.h index 54cf7ec6e87..fec2766ed62 100644 --- a/mozilla/extensions/xforms/nsXFormsActionElement.h +++ b/mozilla/extensions/xforms/nsXFormsActionElement.h @@ -60,9 +60,9 @@ public: NS_IMETHOD GetInsertionPoint(nsIDOMElement **aElement); NS_IMETHOD OnDestroyed(); private: - nsCOMPtr mElement; - nsCOMPtr mVisualElement; - nsCOMPtr mParentAction; + nsIDOMElement* mElement; + nsCOMPtr mVisualElement; + nsCOMPtr mParentAction; nsDataHashtable mDeferredUpdates; }; diff --git a/mozilla/extensions/xforms/nsXFormsActionModuleBase.cpp b/mozilla/extensions/xforms/nsXFormsActionModuleBase.cpp index f9cd8e236f9..c2e5bb7744c 100644 --- a/mozilla/extensions/xforms/nsXFormsActionModuleBase.cpp +++ b/mozilla/extensions/xforms/nsXFormsActionModuleBase.cpp @@ -49,7 +49,7 @@ #include "nsIDOMDocumentEvent.h" #include "nsIDOMEventTarget.h" -nsXFormsActionModuleBase::nsXFormsActionModuleBase() +nsXFormsActionModuleBase::nsXFormsActionModuleBase() : mElement(nsnull) { } @@ -65,7 +65,13 @@ NS_IMPL_ISUPPORTS_INHERITED2(nsXFormsActionModuleBase, NS_IMETHODIMP nsXFormsActionModuleBase::OnCreated(nsIXTFGenericElementWrapper *aWrapper) { - aWrapper->GetElementNode(getter_AddRefs(mElement)); + // It's ok to keep a weak pointer to mElement. mElement will have an + // owning reference to this object, so as long as we null out mElement in + // OnDestroyed, it will always be valid. + nsCOMPtr node; + aWrapper->GetElementNode(getter_AddRefs(node)); + mElement = node; + NS_ASSERTION(mElement, "Wrapper is not an nsIDOMElement, we'll crash soon"); return NS_OK; } diff --git a/mozilla/extensions/xforms/nsXFormsActionModuleBase.h b/mozilla/extensions/xforms/nsXFormsActionModuleBase.h index 0fd957b1527..2d431fc8faa 100644 --- a/mozilla/extensions/xforms/nsXFormsActionModuleBase.h +++ b/mozilla/extensions/xforms/nsXFormsActionModuleBase.h @@ -58,7 +58,7 @@ public: NS_DECL_NSIDOMEVENTLISTENER NS_IMETHOD OnDestroyed(); protected: - nsCOMPtr mElement; + nsIDOMElement* mElement; }; #endif