mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 21:05:36 +00:00
Bug 749589 - Less-leaky classinfo for XTF, r=jst
This commit is contained in:
parent
6cf1af95ac
commit
7e0a679739
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user