Bug 749589 - Less-leaky classinfo for XTF, r=jst

This commit is contained in:
Olli Pettay 2012-05-12 00:51:13 +03:00
parent 6cf1af95ac
commit 7e0a679739
2 changed files with 61 additions and 7 deletions

View File

@ -82,6 +82,10 @@ nsXTFElementWrapper::~nsXTFElementWrapper()
{
mXTFElement->OnDestroyed();
mXTFElement = nsnull;
if (mClassInfo) {
mClassInfo->Disconnect();
mClassInfo = nsnull;
}
}
nsresult
@ -126,13 +130,19 @@ nsXTFElementWrapper::QueryInterface(REFNSIID aIID, void** aInstancePtr)
NS_IMPL_QUERY_CYCLE_COLLECTION(nsXTFElementWrapper)
if (aIID.Equals(NS_GET_IID(nsIClassInfo)) ||
aIID.Equals(NS_GET_IID(nsXPCClassInfo))) {
*aInstancePtr = static_cast<nsIClassInfo*>(this);
NS_ADDREF_THIS();
if (!mClassInfo) {
mClassInfo = new nsXTFClassInfo(this);
}
NS_ADDREF(mClassInfo);
*aInstancePtr = static_cast<nsIClassInfo*>(mClassInfo);
return NS_OK;
}
if (aIID.Equals(NS_GET_IID(nsIXPCScriptable))) {
*aInstancePtr = static_cast<nsIXPCScriptable*>(this);
NS_ADDREF_THIS();
if (!mClassInfo) {
mClassInfo = new nsXTFClassInfo(this);
}
NS_ADDREF(mClassInfo);
*aInstancePtr = static_cast<nsIXPCScriptable*>(mClassInfo);
return NS_OK;
}
if (aIID.Equals(NS_GET_IID(nsIXTFElementWrapper))) {
@ -161,6 +171,15 @@ nsXTFElementWrapper::QueryInterface(REFNSIID aIID, void** aInstancePtr)
return NS_ERROR_NO_INTERFACE;
}
nsXPCClassInfo*
nsXTFElementWrapper::GetClassInfo()
{
if (!mClassInfo) {
mClassInfo = new nsXTFClassInfo(this);
}
return mClassInfo;
}
//----------------------------------------------------------------------
// nsIContent methods:
@ -1013,3 +1032,8 @@ NS_NewXTFElementWrapper(nsIXTFElement* aXTFElement,
*aResult = result;
return NS_OK;
}
NS_IMPL_ISUPPORTS3(nsXTFClassInfo,
nsIClassInfo,
nsXPCClassInfo,
nsIXPCScriptable)

View File

@ -45,6 +45,7 @@
#include "nsIXTFElement.h"
typedef nsXMLElement nsXTFElementWrapperBase;
class nsXTFClassInfo;
// Pseudo IID for nsXTFElementWrapper
// {599EB85F-ABC0-4B52-A1B0-EA103D48E3AE}
@ -53,8 +54,7 @@ typedef nsXMLElement nsXTFElementWrapperBase;
class nsXTFElementWrapper : public nsXTFElementWrapperBase,
public nsIXTFElementWrapper,
public nsXPCClassInfo
public nsIXTFElementWrapper
{
public:
nsXTFElementWrapper(already_AddRefed<nsINodeInfo> aNodeInfo, nsIXTFElement* aXTFElement);
@ -153,7 +153,7 @@ public:
}
nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
virtual nsXPCClassInfo* GetClassInfo() { return this; }
virtual nsXPCClassInfo* GetClassInfo();
virtual void NodeInfoChanged(nsINodeInfo* aOldNodeInfo)
{
@ -193,10 +193,40 @@ protected:
nsAttrName mTmpAttrName;
nsCOMPtr<nsIAtom> mClassAttributeName;
nsRefPtr<nsXTFClassInfo> mClassInfo;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsXTFElementWrapper, NS_XTFELEMENTWRAPPER_IID)
class nsXTFClassInfo : public nsXPCClassInfo
{
public:
nsXTFClassInfo(nsXTFElementWrapper* aWrapper) : mWrapper(aWrapper) {}
void Disconnect() { mWrapper = nsnull; }
NS_DECL_ISUPPORTS
NS_FORWARD_SAFE_NSICLASSINFO(mWrapper);
NS_FORWARD_SAFE_NSIXPCSCRIPTABLE(mWrapper);
// nsXPCClassInfo
virtual void PreserveWrapper(nsISupports* aNative)
{
if (mWrapper) {
mWrapper->PreserveWrapper(aNative);
}
}
virtual PRUint32 GetInterfacesBitmap()
{
return mWrapper ? mWrapper->GetInterfacesBitmap() : 0;
}
private:
nsXTFElementWrapper* mWrapper;
};
nsresult
NS_NewXTFElementWrapper(nsIXTFElement* aXTFElement, already_AddRefed<nsINodeInfo> aNodeInfo,
nsIContent** aResult);