зеркало из https://github.com/mozilla/pjs.git
Partial fix for frame based and general memory leaks of webshells and prescontexts
This commit is contained in:
Родитель
b0b51df865
Коммит
0e164d9aca
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче