Fix crasher bug 202439 by properly refcounting the transferable hook list. r=brade, sr=bz/me.

This commit is contained in:
sfraser@netscape.com
2003-04-18 02:03:44 +00:00
parent 558db8e5d5
commit 6bbb43bd88
2 changed files with 9 additions and 21 deletions

View File

@@ -243,7 +243,6 @@ nsDocShell::nsDocShell():
mIsBeingDestroyed(PR_FALSE), mIsBeingDestroyed(PR_FALSE),
mIsExecutingOnLoadHandler(PR_FALSE), mIsExecutingOnLoadHandler(PR_FALSE),
mEditorData(nsnull), mEditorData(nsnull),
mTransferableHookData(nsnull),
mParent(nsnull), mParent(nsnull),
mTreeOwner(nsnull), mTreeOwner(nsnull),
mChromeEventHandler(nsnull), mChromeEventHandler(nsnull),
@@ -431,16 +430,9 @@ NS_IMETHODIMP nsDocShell::GetInterface(const nsIID & aIID, void **aSink)
} }
else if (aIID.Equals(NS_GET_IID(nsIClipboardDragDropHookList)) else if (aIID.Equals(NS_GET_IID(nsIClipboardDragDropHookList))
&& NS_SUCCEEDED(EnsureTransferableHookData())) { && NS_SUCCEEDED(EnsureTransferableHookData())) {
nsCOMPtr<nsIClipboardDragDropHookList> hook = *aSink = mTransferableHookData;
NS_STATIC_CAST(nsIClipboardDragDropHookList *, mTransferableHookData); NS_ADDREF((nsISupports *)*aSink);
if (hook) return NS_OK;
{
*aSink = hook;
NS_ADDREF((nsISupports *)*aSink);
return NS_OK;
}
return NS_NOINTERFACE;
} }
else if (aIID.Equals(NS_GET_IID(nsISelectionDisplay))) { else if (aIID.Equals(NS_GET_IID(nsISelectionDisplay))) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
@@ -2991,9 +2983,6 @@ nsDocShell::Destroy()
delete mEditorData; delete mEditorData;
mEditorData = 0; mEditorData = 0;
nsIClipboardDragDropHookList *list = NS_STATIC_CAST(nsIClipboardDragDropHookList *, mTransferableHookData);
NS_IF_RELEASE(list);
delete mTransferableHookData;
mTransferableHookData = nsnull; mTransferableHookData = nsnull;
// Save the state of the current document, before destroying the window. // Save the state of the current document, before destroying the window.
@@ -6741,13 +6730,12 @@ nsDocShell::EnsureEditorData()
nsresult nsresult
nsDocShell::EnsureTransferableHookData() nsDocShell::EnsureTransferableHookData()
{ {
if (!mTransferableHookData) { if (!mTransferableHookData) {
mTransferableHookData = new nsTransferableHookData(); mTransferableHookData = new nsTransferableHookData(); // owning addref
if (!mTransferableHookData) return NS_ERROR_OUT_OF_MEMORY; if (!mTransferableHookData) return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(NS_STATIC_CAST(nsIClipboardDragDropHookList *, mTransferableHookData)); }
}
return NS_OK; return NS_OK;
} }

View File

@@ -362,7 +362,7 @@ protected:
nsDocShellEditorData* mEditorData; // editor data, if any nsDocShellEditorData* mEditorData; // editor data, if any
// Transferable hooks/callbacks // Transferable hooks/callbacks
nsTransferableHookData* mTransferableHookData; nsCOMPtr<nsIClipboardDragDropHookList> mTransferableHookData;
// WEAK REFERENCES BELOW HERE. // WEAK REFERENCES BELOW HERE.
// Note these are intentionally not addrefd. Doing so will create a cycle. // Note these are intentionally not addrefd. Doing so will create a cycle.