Fix bug 42895 (nsbeta2+), a huge leak whenever a text input receieves an event, by propogating SetDocument(null,...) calls to the anonymous content in ender-lite widgets so that script objects for that content are unrooted. r=hyatt, mjudge

This commit is contained in:
dbaron%fas.harvard.edu 2000-07-14 23:20:48 +00:00
Родитель 4cd1b70fd2
Коммит 7ed087c304
2 изменённых файлов: 52 добавлений и 0 удалений

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

@ -53,6 +53,7 @@
#include "nsIScriptSecurityManager.h"
#include "nsDOMError.h"
#include "nsIPrivateDOMEvent.h"
#include "nsIEditor.h"
#include "nsIPresState.h"
#include "nsIDOMEvent.h"
@ -291,6 +292,31 @@ nsHTMLInputElement::SetParent(nsIContent* aParent)
NS_IMETHODIMP
nsHTMLInputElement::SetDocument(nsIDocument* aDocument, PRBool aDeep, PRBool aCompileEventHandlers)
{
#ifdef ENDER_LITE
// We must tell the anonymous content to remove roots holding their
// JS Objects
// XXX This is somewhat ugly, and could go away if the anonymous
// content creation is done in XBL.
if (!aDocument && aDeep) {
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) {
nsCOMPtr<textControlPlace> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) {
nsCOMPtr<nsIEditor> editor;
textControlFrame->GetEditor(getter_AddRefs(editor));
if (editor) {
nsCOMPtr<nsIDOMElement> root;
editor->GetRootElement(getter_AddRefs(root));
if (root) {
nsCOMPtr<nsIContent> rootContent( do_QueryInterface(root) );
rootContent->SetDocument(nsnull, PR_TRUE, PR_TRUE);
}
}
}
}
}
#endif
return mInner.SetDocumentForFormControls(aDocument, aDeep, aCompileEventHandlers, this, mForm);
}

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

@ -53,6 +53,7 @@
#include "nsIScriptSecurityManager.h"
#include "nsDOMError.h"
#include "nsIPrivateDOMEvent.h"
#include "nsIEditor.h"
#include "nsIPresState.h"
#include "nsIDOMEvent.h"
@ -291,6 +292,31 @@ nsHTMLInputElement::SetParent(nsIContent* aParent)
NS_IMETHODIMP
nsHTMLInputElement::SetDocument(nsIDocument* aDocument, PRBool aDeep, PRBool aCompileEventHandlers)
{
#ifdef ENDER_LITE
// We must tell the anonymous content to remove roots holding their
// JS Objects
// XXX This is somewhat ugly, and could go away if the anonymous
// content creation is done in XBL.
if (!aDocument && aDeep) {
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) {
nsCOMPtr<textControlPlace> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) {
nsCOMPtr<nsIEditor> editor;
textControlFrame->GetEditor(getter_AddRefs(editor));
if (editor) {
nsCOMPtr<nsIDOMElement> root;
editor->GetRootElement(getter_AddRefs(root));
if (root) {
nsCOMPtr<nsIContent> rootContent( do_QueryInterface(root) );
rootContent->SetDocument(nsnull, PR_TRUE, PR_TRUE);
}
}
}
}
}
#endif
return mInner.SetDocumentForFormControls(aDocument, aDeep, aCompileEventHandlers, this, mForm);
}