Changed Destroy() to release references to and destroy its child
web shells. This fixes it so we don't leak all of the web shells for frameset documents git-svn-id: svn://10.0.0.236/trunk@15120 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -311,6 +311,7 @@ protected:
|
||||
nsVoidArray mRefreshments;
|
||||
|
||||
void ReleaseChildren();
|
||||
void DestroyChildren();
|
||||
|
||||
static nsIPluginHost *mPluginHost;
|
||||
static nsIPluginManager *mPluginManager;
|
||||
@@ -442,8 +443,12 @@ nsWebShell::~nsWebShell()
|
||||
}
|
||||
NS_IF_RELEASE(mScriptContext);
|
||||
|
||||
// XXX Because we hold references to the children and they hold references
|
||||
// to us we never get destroyed. See Destroy() instead...
|
||||
#if 0
|
||||
// Release references on our children
|
||||
ReleaseChildren();
|
||||
#endif
|
||||
|
||||
// Free up history memory
|
||||
PRInt32 i, n = mHistory.Count();
|
||||
@@ -470,6 +475,19 @@ nsWebShell::ReleaseChildren()
|
||||
mChildren.Clear();
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShell::DestroyChildren()
|
||||
{
|
||||
PRInt32 i, n = mChildren.Count();
|
||||
for (i = 0; i < n; i++) {
|
||||
nsIWebShell* shell = (nsIWebShell*) mChildren.ElementAt(i);
|
||||
shell->SetParent(nsnull);
|
||||
shell->Destroy();
|
||||
NS_RELEASE(shell);
|
||||
}
|
||||
mChildren.Clear();
|
||||
}
|
||||
|
||||
NS_IMPL_THREADSAFE_ADDREF(nsWebShell)
|
||||
NS_IMPL_THREADSAFE_RELEASE(nsWebShell)
|
||||
|
||||
@@ -704,6 +722,8 @@ nsWebShell::Destroy()
|
||||
|
||||
NS_IF_RELEASE(mContentViewer);
|
||||
|
||||
// Destroy our child web shells and release references to them
|
||||
DestroyChildren();
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user