diff --git a/content/xbl/public/Makefile.in b/content/xbl/public/Makefile.in index 46d3b37b14d..cf6e7216550 100644 --- a/content/xbl/public/Makefile.in +++ b/content/xbl/public/Makefile.in @@ -31,6 +31,7 @@ MODULE = layout EXPORTS = \ nsIBindingManager.h \ nsIXBLBinding.h \ + nsIXBLBindingAttachedHandler.h \ nsIXBLDocumentInfo.h \ nsIXBLService.h \ $(NULL) diff --git a/content/xbl/public/Manifest b/content/xbl/public/Manifest index ea931b547e1..39dfd5d0744 100644 --- a/content/xbl/public/Manifest +++ b/content/xbl/public/Manifest @@ -1,5 +1,6 @@ nsIBindingManager.h nsIXBLBinding.h +nsIXBLBindingAttachedHandler.h nsIXBLDocumentInfo.h nsIXBLService.h diff --git a/content/xbl/public/makefile.win b/content/xbl/public/makefile.win index 21ed48436d7..778a2c7a1eb 100644 --- a/content/xbl/public/makefile.win +++ b/content/xbl/public/makefile.win @@ -24,6 +24,7 @@ DEPTH=..\..\.. EXPORTS = \ nsIBindingManager.h \ nsIXBLBinding.h \ + nsIXBLBindingAttachedHandler.h \ nsIXBLDocumentInfo.h \ nsIXBLService.h \ $(NULL) diff --git a/content/xbl/public/nsIBindingManager.h b/content/xbl/public/nsIBindingManager.h index e33153fc7b5..be05bb99a25 100644 --- a/content/xbl/public/nsIBindingManager.h +++ b/content/xbl/public/nsIBindingManager.h @@ -37,6 +37,7 @@ class nsIContent; class nsIXBLBinding; +class nsIXBLBindingAttachedHandler; class nsIXBLDocumentInfo; class nsIAtom; class nsIStreamListener; @@ -64,6 +65,7 @@ public: NS_IMETHOD LoadBindingDocument(nsIDocument* aDocument, const nsAReadableString& aURL) = 0; NS_IMETHOD AddToAttachedQueue(nsIXBLBinding* aBinding)=0; + NS_IMETHOD AddHandlerToAttachedQueue(nsIXBLBindingAttachedHandler* aHandler)=0; NS_IMETHOD ClearAttachedQueue()=0; NS_IMETHOD ProcessAttachedQueue()=0; diff --git a/content/xbl/src/nsBindingManager.cpp b/content/xbl/src/nsBindingManager.cpp index 4b3e86b4d13..4a2edb4daf4 100644 --- a/content/xbl/src/nsBindingManager.cpp +++ b/content/xbl/src/nsBindingManager.cpp @@ -49,6 +49,7 @@ #include "nsIXBLBinding.h" #include "nsIXBLDocumentInfo.h" +#include "nsIXBLBindingAttachedHandler.h" #include "nsIStyleSheet.h" #include "nsIHTMLStyleSheet.h" @@ -168,6 +169,7 @@ public: NS_IMETHOD LoadBindingDocument(nsIDocument* aBoundDoc, const nsAReadableString& aURL); NS_IMETHOD AddToAttachedQueue(nsIXBLBinding* aBinding); + NS_IMETHOD AddHandlerToAttachedQueue(nsIXBLBindingAttachedHandler* aHandler); NS_IMETHOD ClearAttachedQueue(); NS_IMETHOD ProcessAttachedQueue(); @@ -400,6 +402,17 @@ nsBindingManager::AddToAttachedQueue(nsIXBLBinding* aBinding) return NS_OK; } +NS_IMETHODIMP +nsBindingManager::AddHandlerToAttachedQueue(nsIXBLBindingAttachedHandler* aBinding) +{ + if (!mAttachedQueue) + NS_NewISupportsArray(getter_AddRefs(mAttachedQueue)); // This call addrefs the array. + + mAttachedQueue->AppendElement(aBinding); + + return NS_OK; +} + NS_IMETHODIMP nsBindingManager::ClearAttachedQueue() { @@ -417,10 +430,18 @@ nsBindingManager::ProcessAttachedQueue() PRUint32 count; mAttachedQueue->Count(&count); for (PRUint32 i = 0; i < count; i++) { - nsCOMPtr binding; - mAttachedQueue->GetElementAt(0, getter_AddRefs(binding)); + nsCOMPtr supp; + mAttachedQueue->GetElementAt(0, getter_AddRefs(supp)); mAttachedQueue->RemoveElementAt(0); - binding->ExecuteAttachedHandler(); + + nsCOMPtr binding(do_QueryInterface(supp)); + if (binding) + binding->ExecuteAttachedHandler(); + else { + nsCOMPtr handler(do_QueryInterface(supp)); + if (handler) + handler->OnBindingAttached(); + } } ClearAttachedQueue(); diff --git a/content/xbl/src/nsXBLBinding.cpp b/content/xbl/src/nsXBLBinding.cpp index fd97dc32824..1cc5d8fdcab 100644 --- a/content/xbl/src/nsXBLBinding.cpp +++ b/content/xbl/src/nsXBLBinding.cpp @@ -1201,7 +1201,11 @@ nsXBLBinding::GetID(nsCString& aResult) NS_IMETHODIMP nsXBLBinding::InheritsStyle(PRBool* aResult) { - *aResult = mInheritStyle; + if (mContent) + *aResult = mInheritStyle; + else if (mNextBinding) + return mNextBinding->InheritsStyle(aResult); + return NS_OK; } diff --git a/layout/xbl/public/Makefile.in b/layout/xbl/public/Makefile.in index 46d3b37b14d..cf6e7216550 100644 --- a/layout/xbl/public/Makefile.in +++ b/layout/xbl/public/Makefile.in @@ -31,6 +31,7 @@ MODULE = layout EXPORTS = \ nsIBindingManager.h \ nsIXBLBinding.h \ + nsIXBLBindingAttachedHandler.h \ nsIXBLDocumentInfo.h \ nsIXBLService.h \ $(NULL) diff --git a/layout/xbl/public/Manifest b/layout/xbl/public/Manifest index ea931b547e1..39dfd5d0744 100644 --- a/layout/xbl/public/Manifest +++ b/layout/xbl/public/Manifest @@ -1,5 +1,6 @@ nsIBindingManager.h nsIXBLBinding.h +nsIXBLBindingAttachedHandler.h nsIXBLDocumentInfo.h nsIXBLService.h diff --git a/layout/xbl/public/makefile.win b/layout/xbl/public/makefile.win index 21ed48436d7..778a2c7a1eb 100644 --- a/layout/xbl/public/makefile.win +++ b/layout/xbl/public/makefile.win @@ -24,6 +24,7 @@ DEPTH=..\..\.. EXPORTS = \ nsIBindingManager.h \ nsIXBLBinding.h \ + nsIXBLBindingAttachedHandler.h \ nsIXBLDocumentInfo.h \ nsIXBLService.h \ $(NULL) diff --git a/layout/xbl/public/nsIBindingManager.h b/layout/xbl/public/nsIBindingManager.h index e33153fc7b5..be05bb99a25 100644 --- a/layout/xbl/public/nsIBindingManager.h +++ b/layout/xbl/public/nsIBindingManager.h @@ -37,6 +37,7 @@ class nsIContent; class nsIXBLBinding; +class nsIXBLBindingAttachedHandler; class nsIXBLDocumentInfo; class nsIAtom; class nsIStreamListener; @@ -64,6 +65,7 @@ public: NS_IMETHOD LoadBindingDocument(nsIDocument* aDocument, const nsAReadableString& aURL) = 0; NS_IMETHOD AddToAttachedQueue(nsIXBLBinding* aBinding)=0; + NS_IMETHOD AddHandlerToAttachedQueue(nsIXBLBindingAttachedHandler* aHandler)=0; NS_IMETHOD ClearAttachedQueue()=0; NS_IMETHOD ProcessAttachedQueue()=0; diff --git a/layout/xbl/src/nsBindingManager.cpp b/layout/xbl/src/nsBindingManager.cpp index 4b3e86b4d13..4a2edb4daf4 100644 --- a/layout/xbl/src/nsBindingManager.cpp +++ b/layout/xbl/src/nsBindingManager.cpp @@ -49,6 +49,7 @@ #include "nsIXBLBinding.h" #include "nsIXBLDocumentInfo.h" +#include "nsIXBLBindingAttachedHandler.h" #include "nsIStyleSheet.h" #include "nsIHTMLStyleSheet.h" @@ -168,6 +169,7 @@ public: NS_IMETHOD LoadBindingDocument(nsIDocument* aBoundDoc, const nsAReadableString& aURL); NS_IMETHOD AddToAttachedQueue(nsIXBLBinding* aBinding); + NS_IMETHOD AddHandlerToAttachedQueue(nsIXBLBindingAttachedHandler* aHandler); NS_IMETHOD ClearAttachedQueue(); NS_IMETHOD ProcessAttachedQueue(); @@ -400,6 +402,17 @@ nsBindingManager::AddToAttachedQueue(nsIXBLBinding* aBinding) return NS_OK; } +NS_IMETHODIMP +nsBindingManager::AddHandlerToAttachedQueue(nsIXBLBindingAttachedHandler* aBinding) +{ + if (!mAttachedQueue) + NS_NewISupportsArray(getter_AddRefs(mAttachedQueue)); // This call addrefs the array. + + mAttachedQueue->AppendElement(aBinding); + + return NS_OK; +} + NS_IMETHODIMP nsBindingManager::ClearAttachedQueue() { @@ -417,10 +430,18 @@ nsBindingManager::ProcessAttachedQueue() PRUint32 count; mAttachedQueue->Count(&count); for (PRUint32 i = 0; i < count; i++) { - nsCOMPtr binding; - mAttachedQueue->GetElementAt(0, getter_AddRefs(binding)); + nsCOMPtr supp; + mAttachedQueue->GetElementAt(0, getter_AddRefs(supp)); mAttachedQueue->RemoveElementAt(0); - binding->ExecuteAttachedHandler(); + + nsCOMPtr binding(do_QueryInterface(supp)); + if (binding) + binding->ExecuteAttachedHandler(); + else { + nsCOMPtr handler(do_QueryInterface(supp)); + if (handler) + handler->OnBindingAttached(); + } } ClearAttachedQueue(); diff --git a/layout/xbl/src/nsXBLBinding.cpp b/layout/xbl/src/nsXBLBinding.cpp index fd97dc32824..1cc5d8fdcab 100644 --- a/layout/xbl/src/nsXBLBinding.cpp +++ b/layout/xbl/src/nsXBLBinding.cpp @@ -1201,7 +1201,11 @@ nsXBLBinding::GetID(nsCString& aResult) NS_IMETHODIMP nsXBLBinding::InheritsStyle(PRBool* aResult) { - *aResult = mInheritStyle; + if (mContent) + *aResult = mInheritStyle; + else if (mNextBinding) + return mNextBinding->InheritsStyle(aResult); + return NS_OK; }