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:
parent
a0222a38bd
commit
e5bb426135
@ -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);
|
||||
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user