Bug 724284, cleanup XBL proto setup, r=bz

This commit is contained in:
Olli Pettay 2012-02-07 10:35:58 +02:00
parent 3565957a55
commit 23494816a3

View File

@ -1470,6 +1470,28 @@ nsXBLPrototypeBinding::CreateKeyHandlers()
}
}
class XBLPrototypeSetupCleanup
{
public:
XBLPrototypeSetupCleanup(nsXBLDocumentInfo* aDocInfo, const nsACString& aID)
: mDocInfo(aDocInfo), mID(aID) {}
~XBLPrototypeSetupCleanup()
{
if (mDocInfo) {
mDocInfo->RemovePrototypeBinding(mID);
}
}
void Disconnect()
{
mDocInfo = nsnull;
}
nsXBLDocumentInfo* mDocInfo;
nsCAutoString mID;
};
nsresult
nsXBLPrototypeBinding::Read(nsIObjectInputStream* aStream,
nsXBLDocumentInfo* aDocInfo,
@ -1554,6 +1576,8 @@ nsXBLPrototypeBinding::Read(nsIObjectInputStream* aStream,
rv = aDocInfo->SetPrototypeBinding(id, this);
NS_ENSURE_SUCCESS(rv, rv);
XBLPrototypeSetupCleanup cleanup(aDocInfo, id);
nsCAutoString className;
rv = aStream->ReadCString(className);
NS_ENSURE_SUCCESS(rv, rv);
@ -1567,10 +1591,7 @@ nsXBLPrototypeBinding::Read(nsIObjectInputStream* aStream,
// occurs, the mapping should be removed again so that we don't keep an
// invalid binding around.
rv = mImplementation->Read(context, aStream, this, globalObject);
if (NS_FAILED(rv)) {
aDocInfo->RemovePrototypeBinding(id);
return rv;
}
NS_ENSURE_SUCCESS(rv, rv);
}
// Next read in the handlers.
@ -1627,6 +1648,7 @@ nsXBLPrototypeBinding::Read(nsIObjectInputStream* aStream,
aDocInfo->SetFirstPrototypeBinding(this);
}
cleanup.Disconnect();
return NS_OK;
}