diff --git a/mozilla/content/xbl/src/nsXBLBinding.cpp b/mozilla/content/xbl/src/nsXBLBinding.cpp index cab521e80c2..307d4af4318 100644 --- a/mozilla/content/xbl/src/nsXBLBinding.cpp +++ b/mozilla/content/xbl/src/nsXBLBinding.cpp @@ -639,6 +639,9 @@ nsXBLBinding::InstallEventHandlers(nsIContent* aBoundElement) // Call AddScriptEventListener for other IID types nsAutoString value; child->GetAttribute(kNameSpaceID_None, kValueAtom, value); + if (value.IsEmpty()) + GetTextData(child, value); + AddScriptEventListener(mBoundElement, eventAtom, value, iid); } } diff --git a/mozilla/content/xbl/src/nsXBLEventHandler.cpp b/mozilla/content/xbl/src/nsXBLEventHandler.cpp index e3a1f9dd69d..6d836fa0481 100644 --- a/mozilla/content/xbl/src/nsXBLEventHandler.cpp +++ b/mozilla/content/xbl/src/nsXBLEventHandler.cpp @@ -39,6 +39,7 @@ #include "nsIDOMXULElement.h" #include "nsIDOMNSHTMLTextAreaElement.h" #include "nsIDOMNSHTMLInputElement.h" +#include "nsIDOMText.h" PRUint32 nsXBLEventHandler::gRefCnt = 0; nsIAtom* nsXBLEventHandler::kKeyCodeAtom = nsnull; @@ -437,9 +438,12 @@ nsXBLEventHandler::ExecuteHandler(const nsString& aEventName, nsIDOMEvent* aEven // Compile the event handler. nsAutoString handlerText; mHandlerElement->GetAttribute(kNameSpaceID_None, kValueAtom, handlerText); - if (handlerText.IsEmpty()) - return NS_OK; // For whatever reason, they didn't give us anything to do. - + if (handlerText.IsEmpty()) { + // look to see if action content is contained by the handler element + GetTextData(mHandlerElement, handlerText); + if (handlerText.IsEmpty()) + return NS_OK; // For whatever reason, they didn't give us anything to do. + } // Compile the handler and bind it to the element. nsCOMPtr boundDocument; @@ -1080,6 +1084,28 @@ PRBool nsXBLEventHandler::IsMatchingKeyCode(const PRUint32 aChar, const nsString return ret; } +nsresult +nsXBLEventHandler::GetTextData(nsIContent *aParent, nsString& aResult) +{ + aResult.Truncate(0); + + nsCOMPtr textChild; + PRInt32 textCount; + aParent->ChildCount(textCount); + nsAutoString answer; + for (PRInt32 j = 0; j < textCount; j++) { + // Get the child. + aParent->ChildAt(j, *getter_AddRefs(textChild)); + nsCOMPtr text(do_QueryInterface(textChild)); + if (text) { + nsAutoString data; + text->GetData(data); + aResult += data; + } + } + return NS_OK; +} + PRBool nsXBLEventHandler::IsMatchingCharCode(const PRUint32 aChar, const nsString& aKeyName) { diff --git a/mozilla/content/xbl/src/nsXBLEventHandler.h b/mozilla/content/xbl/src/nsXBLEventHandler.h index c2820569c33..1d31e421758 100644 --- a/mozilla/content/xbl/src/nsXBLEventHandler.h +++ b/mozilla/content/xbl/src/nsXBLEventHandler.h @@ -95,6 +95,8 @@ protected: static nsIAtom* kValueAtom; static nsIAtom* kCommandAtom; + static nsresult GetTextData(nsIContent *aParent, nsString& aResult); + protected: nsIContent* mBoundElement; // Both of these refs are weak. nsIContent* mHandlerElement; diff --git a/mozilla/layout/xbl/src/nsXBLBinding.cpp b/mozilla/layout/xbl/src/nsXBLBinding.cpp index cab521e80c2..307d4af4318 100644 --- a/mozilla/layout/xbl/src/nsXBLBinding.cpp +++ b/mozilla/layout/xbl/src/nsXBLBinding.cpp @@ -639,6 +639,9 @@ nsXBLBinding::InstallEventHandlers(nsIContent* aBoundElement) // Call AddScriptEventListener for other IID types nsAutoString value; child->GetAttribute(kNameSpaceID_None, kValueAtom, value); + if (value.IsEmpty()) + GetTextData(child, value); + AddScriptEventListener(mBoundElement, eventAtom, value, iid); } } diff --git a/mozilla/layout/xbl/src/nsXBLEventHandler.cpp b/mozilla/layout/xbl/src/nsXBLEventHandler.cpp index e3a1f9dd69d..6d836fa0481 100644 --- a/mozilla/layout/xbl/src/nsXBLEventHandler.cpp +++ b/mozilla/layout/xbl/src/nsXBLEventHandler.cpp @@ -39,6 +39,7 @@ #include "nsIDOMXULElement.h" #include "nsIDOMNSHTMLTextAreaElement.h" #include "nsIDOMNSHTMLInputElement.h" +#include "nsIDOMText.h" PRUint32 nsXBLEventHandler::gRefCnt = 0; nsIAtom* nsXBLEventHandler::kKeyCodeAtom = nsnull; @@ -437,9 +438,12 @@ nsXBLEventHandler::ExecuteHandler(const nsString& aEventName, nsIDOMEvent* aEven // Compile the event handler. nsAutoString handlerText; mHandlerElement->GetAttribute(kNameSpaceID_None, kValueAtom, handlerText); - if (handlerText.IsEmpty()) - return NS_OK; // For whatever reason, they didn't give us anything to do. - + if (handlerText.IsEmpty()) { + // look to see if action content is contained by the handler element + GetTextData(mHandlerElement, handlerText); + if (handlerText.IsEmpty()) + return NS_OK; // For whatever reason, they didn't give us anything to do. + } // Compile the handler and bind it to the element. nsCOMPtr boundDocument; @@ -1080,6 +1084,28 @@ PRBool nsXBLEventHandler::IsMatchingKeyCode(const PRUint32 aChar, const nsString return ret; } +nsresult +nsXBLEventHandler::GetTextData(nsIContent *aParent, nsString& aResult) +{ + aResult.Truncate(0); + + nsCOMPtr textChild; + PRInt32 textCount; + aParent->ChildCount(textCount); + nsAutoString answer; + for (PRInt32 j = 0; j < textCount; j++) { + // Get the child. + aParent->ChildAt(j, *getter_AddRefs(textChild)); + nsCOMPtr text(do_QueryInterface(textChild)); + if (text) { + nsAutoString data; + text->GetData(data); + aResult += data; + } + } + return NS_OK; +} + PRBool nsXBLEventHandler::IsMatchingCharCode(const PRUint32 aChar, const nsString& aKeyName) { diff --git a/mozilla/layout/xbl/src/nsXBLEventHandler.h b/mozilla/layout/xbl/src/nsXBLEventHandler.h index c2820569c33..1d31e421758 100644 --- a/mozilla/layout/xbl/src/nsXBLEventHandler.h +++ b/mozilla/layout/xbl/src/nsXBLEventHandler.h @@ -95,6 +95,8 @@ protected: static nsIAtom* kValueAtom; static nsIAtom* kCommandAtom; + static nsresult GetTextData(nsIContent *aParent, nsString& aResult); + protected: nsIContent* mBoundElement; // Both of these refs are weak. nsIContent* mHandlerElement;