diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index a4605b5c0e2..300f44fda70 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -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); diff --git a/mozilla/content/xbl/src/nsBindingManager.cpp b/mozilla/content/xbl/src/nsBindingManager.cpp index d76dbb1a2f4..70b01d129f0 100644 --- a/mozilla/content/xbl/src/nsBindingManager.cpp +++ b/mozilla/content/xbl/src/nsBindingManager.cpp @@ -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( 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)); } diff --git a/mozilla/content/xbl/src/nsBindingManager.h b/mozilla/content/xbl/src/nsBindingManager.h index 2bdfac96f5b..4be40d21d41 100755 --- a/mozilla/content/xbl/src/nsBindingManager.h +++ b/mozilla/content/xbl/src/nsBindingManager.h @@ -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; nsCOMPtr mProcessAttachedQueueEvent; + + // Our document. This is a weak ref; the document owns us + nsIDocument* mDocument; }; #endif