Clear the old child docshells when SetDOMDocument is called, so that they don't get persisted in session history before they're GC'd. Also, update SHEntry to hold strong references to the child docshells. Bug 319551, r=sicking sr=bzbarsky a=sicking

git-svn-id: svn://10.0.0.236/branches/MOZILLA_1_8_0_BRANCH@200900 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bryner%brianryner.com
2006-06-26 18:51:35 +00:00
parent 3737fde1b5
commit 25f4c1f246
4 changed files with 17 additions and 8 deletions

View File

@@ -1516,6 +1516,19 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
if (global) {
global->SetNewDocument(aDocument, nsnull, PR_TRUE, PR_TRUE);
}
// Clear the list of old child docshells. CChild docshells for the new
// document will be constructed as frames are created.
nsCOMPtr<nsIDocShellTreeNode> node = do_QueryInterface(container);
if (node) {
PRInt32 count;
node->GetChildCount(&count);
for (PRInt32 i = 0; i < count; ++i) {
nsCOMPtr<nsIDocShellTreeItem> child;
node->GetChildAt(0, getter_AddRefs(child));
node->RemoveChild(child);
}
}
}
rv = SyncParentSubDocMap();

View File

@@ -82,9 +82,7 @@ interface nsISHEntry : nsIHistoryEntry
[noscript] void setViewerBounds([const] in nsRect bounds);
/**
* Saved child docshells corresponding to contentViewer. There are weak
* references since it's assumed that the content viewer's document has
* an owning reference to the subdocument for each shell. The child shells
* Saved child docshells corresponding to contentViewer. The child shells
* are restored as children of the parent docshell, in this order, when the
* parent docshell restores a saved presentation.
*/

View File

@@ -556,16 +556,14 @@ NS_IMETHODIMP
nsSHEntry::AddChildShell(nsIDocShellTreeItem *aShell)
{
NS_ASSERTION(aShell, "Null child shell added to history entry");
mChildShells.AppendElement(aShell);
mChildShells.AppendObject(aShell);
return NS_OK;
}
NS_IMETHODIMP
nsSHEntry::ChildShellAt(PRInt32 aIndex, nsIDocShellTreeItem **aShell)
{
NS_IF_ADDREF(*aShell =
NS_STATIC_CAST(nsIDocShellTreeItem*,
mChildShells.SafeElementAt(aIndex)));
NS_IF_ADDREF(*aShell = mChildShells.SafeObjectAt(aIndex));
return NS_OK;
}

View File

@@ -102,7 +102,7 @@ private:
nsISHEntry * mParent; // weak reference
nsCOMPtr<nsISupports> mWindowState;
nsRect mViewerBounds;
nsVoidArray mChildShells;
nsCOMArray<nsIDocShellTreeItem> mChildShells;
nsCOMPtr<nsISupportsArray> mRefreshURIList;
};