Make really sure that pending binding constructor events block onload. Bug

394676, r+sr+a=sicking


git-svn-id: svn://10.0.0.236/trunk@237229 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bzbarsky%mit.edu 2007-10-03 23:38:32 +00:00
parent a0222a38bd
commit e5bb426135
3 changed files with 17 additions and 5 deletions

View File

@ -1093,7 +1093,7 @@ nsDocument::Init()
mRadioGroups.Init();
// Force initialization.
nsBindingManager *bindingManager = new nsBindingManager();
nsBindingManager *bindingManager = new nsBindingManager(this);
NS_ENSURE_TRUE(bindingManager, NS_ERROR_OUT_OF_MEMORY);
NS_ADDREF(mBindingManager = bindingManager);

View File

@ -385,9 +385,10 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(nsBindingManager)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsBindingManager)
// Constructors/Destructors
nsBindingManager::nsBindingManager(void)
nsBindingManager::nsBindingManager(nsIDocument* aDocument)
: mProcessingAttachedStack(PR_FALSE),
mProcessOnEndUpdate(PR_FALSE)
mProcessOnEndUpdate(PR_FALSE),
mDocument(aDocument)
{
mContentListTable.ops = nsnull;
mAnonymousNodesTable.ops = nsnull;
@ -804,7 +805,10 @@ nsBindingManager::AddToAttachedQueue(nsXBLBinding* aBinding)
mProcessAttachedQueueEvent =
new nsRunnableMethod<nsBindingManager>(
this, &nsBindingManager::DoProcessAttachedQueue);
NS_DispatchToCurrentThread(mProcessAttachedQueueEvent);
nsresult rv = NS_DispatchToCurrentThread(mProcessAttachedQueueEvent);
if (NS_SUCCEEDED(rv) && mDocument) {
mDocument->BlockOnload();
}
}
return NS_OK;
@ -819,6 +823,10 @@ nsBindingManager::DoProcessAttachedQueue()
"Shouldn't have pending bindings!");
mProcessAttachedQueueEvent = nsnull;
if (mDocument) {
mDocument->UnblockOnload(PR_TRUE);
}
}
void
@ -1378,6 +1386,7 @@ nsBindingManager::NodeWillBeDestroyed(const nsINode *aNode)
{
// Make sure to not run any more XBL constructors
mProcessingAttachedStack = PR_TRUE;
mDocument = nsnull;
NS_BINDINGMANAGER_NOTIFY_OBSERVERS(NodeWillBeDestroyed, (aNode));
}

View File

@ -70,7 +70,7 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSIMUTATIONOBSERVER
nsBindingManager();
nsBindingManager(nsIDocument* aDocument);
~nsBindingManager();
nsXBLBinding* GetBinding(nsIContent* aContent);
@ -291,6 +291,9 @@ protected:
// Our posted event to process the attached queue, if any
friend class nsRunnableMethod<nsBindingManager>;
nsCOMPtr<nsIRunnable> mProcessAttachedQueueEvent;
// Our document. This is a weak ref; the document owns us
nsIDocument* mDocument;
};
#endif