Partial fix for frame based and general memory leaks of webshells and prescontexts

This commit is contained in:
joki%netscape.com 1998-08-09 07:43:22 +00:00
Родитель b0b51df865
Коммит 0e164d9aca
5 изменённых файлов: 34 добавлений и 4 удалений

Просмотреть файл

@ -104,6 +104,7 @@ public:
NS_IMETHOD MoveTo(PRInt32 aX, PRInt32 aY);
NS_IMETHOD Show();
NS_IMETHOD Hide();
NS_IMETHOD SetContentViewer(nsIContentViewer* aViewer);
NS_IMETHOD GetContentViewer(nsIContentViewer*& aResult);
NS_IMETHOD SetContainer(nsIWebShellContainer* aContainer);
NS_IMETHOD GetContainer(nsIWebShellContainer*& aResult);
@ -303,6 +304,9 @@ nsWebShell::ReleaseChildren()
for (i = 0; i < n; i++) {
nsIWebShell* shell = (nsIWebShell*) mChildren.ElementAt(i);
shell->SetParent(nsnull);
//Break circular reference of webshell to contentviewer
shell->SetContentViewer(nsnull);
NS_RELEASE(shell);
}
mChildren.Clear();
@ -575,6 +579,15 @@ nsWebShell::Hide()
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::SetContentViewer(nsIContentViewer* aViewer)
{
NS_IF_RELEASE(mContentViewer);
mContentViewer = aViewer;
NS_IF_ADDREF(aViewer);
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::GetContentViewer(nsIContentViewer*& aResult)
{
@ -654,16 +667,17 @@ nsresult
nsWebShell::GetRootWebShell(nsIWebShell*& aResult)
{
nsIWebShell* top = this;
NS_ADDREF(this);
for (;;) {
nsIWebShell* parent;
top->GetParent(parent);
if (nsnull == parent) {
break;
}
NS_RELEASE(top);
top = parent;
}
aResult = top;
NS_ADDREF(top);
return NS_OK;
}

Просмотреть файл

@ -313,8 +313,9 @@ PresShell::~PresShell()
if (nsnull != mRootFrame) {
mRootFrame->DeleteFrame();
}
NS_IF_RELEASE(mPresContext);
NS_IF_RELEASE(mViewManager);
//Release mPresContext after mViewManager
NS_IF_RELEASE(mPresContext);
NS_IF_RELEASE(mStyleSet);
mRefCnt = 0;
}

Просмотреть файл

@ -1068,6 +1068,7 @@ void nsHTMLTagContent::TriggerLink(nsIPresContext& aPresContext,
else {
handler->OnOverLink(nsnull, absURLSpec, aTargetSpec);
}
NS_RELEASE(handler);
}
}

Просмотреть файл

@ -100,8 +100,8 @@ public:
NS_IMETHOD Hide() = 0;
NS_IMETHOD SetContentViewer(nsIContentViewer* aViewer) = 0;
NS_IMETHOD GetContentViewer(nsIContentViewer*& aResult) = 0;
// XXX SetContentViewer?
NS_IMETHOD SetContainer(nsIWebShellContainer* aContainer) = 0;
NS_IMETHOD GetContainer(nsIWebShellContainer*& aResult) = 0;

Просмотреть файл

@ -104,6 +104,7 @@ public:
NS_IMETHOD MoveTo(PRInt32 aX, PRInt32 aY);
NS_IMETHOD Show();
NS_IMETHOD Hide();
NS_IMETHOD SetContentViewer(nsIContentViewer* aViewer);
NS_IMETHOD GetContentViewer(nsIContentViewer*& aResult);
NS_IMETHOD SetContainer(nsIWebShellContainer* aContainer);
NS_IMETHOD GetContainer(nsIWebShellContainer*& aResult);
@ -303,6 +304,9 @@ nsWebShell::ReleaseChildren()
for (i = 0; i < n; i++) {
nsIWebShell* shell = (nsIWebShell*) mChildren.ElementAt(i);
shell->SetParent(nsnull);
//Break circular reference of webshell to contentviewer
shell->SetContentViewer(nsnull);
NS_RELEASE(shell);
}
mChildren.Clear();
@ -575,6 +579,15 @@ nsWebShell::Hide()
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::SetContentViewer(nsIContentViewer* aViewer)
{
NS_IF_RELEASE(mContentViewer);
mContentViewer = aViewer;
NS_IF_ADDREF(aViewer);
return NS_OK;
}
NS_IMETHODIMP
nsWebShell::GetContentViewer(nsIContentViewer*& aResult)
{
@ -654,16 +667,17 @@ nsresult
nsWebShell::GetRootWebShell(nsIWebShell*& aResult)
{
nsIWebShell* top = this;
NS_ADDREF(this);
for (;;) {
nsIWebShell* parent;
top->GetParent(parent);
if (nsnull == parent) {
break;
}
NS_RELEASE(top);
top = parent;
}
aResult = top;
NS_ADDREF(top);
return NS_OK;
}