Fix crasher bug 202439 by properly refcounting the transferable hook list. r=brade, sr=bz/me.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user