From ddaa767e02eff135c0ed4bb1130aea5fc8d19b7f Mon Sep 17 00:00:00 2001 From: "joki%netscape.com" Date: Fri, 31 Jul 1998 22:09:51 +0000 Subject: [PATCH] Filling out document event handlers, adding form events git-svn-id: svn://10.0.0.236/trunk@6985 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/base/src/nsDocument.cpp | 102 +++++++++--------- mozilla/content/base/src/nsDocument.h | 3 +- mozilla/content/events/src/nsDOMEvent.cpp | 12 ++- mozilla/content/events/src/nsDOMEvent.h | 2 +- .../content/events/src/nsDOMEventsIIDs.cpp | 2 + mozilla/content/events/src/nsDOMEventsIIDs.h | 1 + .../events/src/nsEventListenerManager.cpp | 89 +++++++++++++-- .../events/src/nsEventListenerManager.h | 1 + mozilla/layout/base/src/nsDocument.cpp | 102 +++++++++--------- mozilla/layout/base/src/nsDocument.h | 3 +- mozilla/layout/events/src/nsDOMEvent.cpp | 12 ++- mozilla/layout/events/src/nsDOMEvent.h | 2 +- mozilla/layout/events/src/nsDOMEventsIIDs.cpp | 2 + mozilla/layout/events/src/nsDOMEventsIIDs.h | 1 + .../events/src/nsEventListenerManager.cpp | 89 +++++++++++++-- .../events/src/nsEventListenerManager.h | 1 + mozilla/layout/html/base/src/nsHTMLContent.h | 3 +- .../layout/html/base/src/nsHTMLTagContent.cpp | 86 ++++++++++++--- .../layout/html/forms/src/nsInputFrame.cpp | 7 +- 19 files changed, 382 insertions(+), 138 deletions(-) diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index b09185c7a7b..240594ab122 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -957,22 +957,65 @@ PRBool nsDocument::SetProperty(JSContext *aContext, jsval aID, jsval *aVp) mPropName.SetString(JS_GetStringChars(JS_ValueToString(aContext, aID))); mPrefix.SetString(mPropName, 2); if (mPrefix == "on") { + nsIEventListenerManager *mManager = nsnull; + if (mPropName == "onmousedown" || mPropName == "onmouseup" || mPropName == "onclick" || mPropName == "onmouseover" || mPropName == "onmouseout") { - if (NS_OK != SetScriptEventListener(aContext, kIDOMMouseListenerIID)) { - return PR_FALSE; + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } } } - else if (mPropName == "onkeydown" || mPropName == "onkeyup" || mPropName == "onkeypress" ) { - if (NS_OK != SetScriptEventListener(aContext, kIDOMKeyListenerIID)) { - return PR_FALSE; + else if (mPropName == "onkeydown" || mPropName == "onkeyup" || mPropName == "onkeypress") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMKeyListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } } } - else if (mPropName == "onmousemove" ) { - if (NS_OK != SetScriptEventListener(aContext, kIDOMMouseMotionListenerIID)) { - return PR_FALSE; + else if (mPropName == "onmousemove") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseMotionListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } } } + else if (mPropName == "onfocus" || mPropName == "onblur") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMFocusListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + else if (mPropName == "onsubmit" || mPropName == "onreset") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMFormListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + else if (mPropName == "onload" || mPropName == "onunload" || mPropName == "onabort" || + mPropName == "onerror") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMLoadListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + NS_IF_RELEASE(mManager); } } return PR_TRUE; @@ -997,49 +1040,6 @@ void nsDocument::Finalize(JSContext *aContext) { } -nsresult nsDocument::SetScriptEventListener(JSContext *aContext, REFNSIID aListenerTypeIID) -{ - //First get the mScriptObject or make one if we don't have one. - nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); - - if (nsnull == mScriptObject) { - GetScriptObject(mScriptCX, &mScriptObject); - } - - if (nsnull != mScriptObject) { - nsIEventListenerManager *mManager = nsnull; - nsVoidArray *mListeners; - - if (NS_OK == GetListenerManager(&mManager) && - NS_OK == mManager->GetEventListeners(&mListeners, aListenerTypeIID)) { - //Run through the listeners for this IID and see if a script listener is registered - //If so, we're set. - if (nsnull != mListeners) { - nsIScriptEventListener *mScriptListener; - nsIDOMEventListener *mEventListener; - for (int i=0; iCount(); i++) { - mEventListener = (nsIDOMEventListener*)mListeners->ElementAt(i); - if (NS_OK == mEventListener->QueryInterface(kIScriptEventListenerIID, (void**)&mScriptListener)) { - NS_RELEASE(mScriptListener); - NS_RELEASE(mManager); - return NS_OK; - } - } - } - //If we didn't find a script listener or no listeners existed create and add a new one. - nsIDOMEventListener *mScriptListener; - if (NS_OK == NS_NewScriptEventListener(&mScriptListener, mScriptCX, mScriptObject)) { - mManager->AddEventListener(mScriptListener, aListenerTypeIID); - NS_RELEASE(mScriptListener); - NS_RELEASE(mManager); - return NS_OK; - } - } - NS_IF_RELEASE(mManager); - } - return NS_ERROR_FAILURE; -} - /** * Returns the Selection Object */ diff --git a/mozilla/content/base/src/nsDocument.h b/mozilla/content/base/src/nsDocument.h index 98d35e63303..05ac7c26e24 100644 --- a/mozilla/content/base/src/nsDocument.h +++ b/mozilla/content/base/src/nsDocument.h @@ -235,6 +235,7 @@ public: NS_IMETHOD ReleaseEvent(nsIDOMEventListener *aListener); NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); + NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, @@ -269,8 +270,6 @@ protected: protected: virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook - NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); - nsresult SetScriptEventListener(JSContext *aContext, REFNSIID aListenerTypeIID); nsDocument(); virtual ~nsDocument(); diff --git a/mozilla/content/events/src/nsDOMEvent.cpp b/mozilla/content/events/src/nsDOMEvent.cpp index 32b43457e36..97e38f75804 100644 --- a/mozilla/content/events/src/nsDOMEvent.cpp +++ b/mozilla/content/events/src/nsDOMEvent.cpp @@ -28,7 +28,7 @@ static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID); static char* mEventNames[] = { "onmousedown", "onmouseup", "onclick", "ondblclick", "onmouseover", "onmouseout", "onmousemove", "onkeydown", "onkeyup", "onkeypress", "onfocus", "onblur", - "onload", "onunload", "onabort", "onerror" + "onload", "onunload", "onabort", "onerror", "onsubmit", "onreset" }; nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent) { @@ -224,15 +224,19 @@ NS_METHOD nsDOMEvent::GetButton(PRUint32* aButton) switch (mEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: case NS_MOUSE_LEFT_BUTTON_DOWN: + case NS_MOUSE_LEFT_CLICK: case NS_MOUSE_LEFT_DOUBLECLICK: *aButton = 1; break; case NS_MOUSE_MIDDLE_BUTTON_UP: case NS_MOUSE_MIDDLE_BUTTON_DOWN: + case NS_MOUSE_MIDDLE_CLICK: + case NS_MOUSE_MIDDLE_DOUBLECLICK: *aButton = 2; break; case NS_MOUSE_RIGHT_BUTTON_UP: case NS_MOUSE_RIGHT_BUTTON_DOWN: + case NS_MOUSE_RIGHT_CLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: *aButton = 3; break; @@ -286,9 +290,11 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType) case NS_MOUSE_RIGHT_BUTTON_UP: return mEventNames[eDOMEvents_mouseup]; case NS_MOUSE_LEFT_CLICK: + case NS_MOUSE_MIDDLE_CLICK: case NS_MOUSE_RIGHT_CLICK: return mEventNames[eDOMEvents_click]; case NS_MOUSE_LEFT_DOUBLECLICK: + case NS_MOUSE_MIDDLE_DOUBLECLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: return mEventNames[eDOMEvents_dblclick]; case NS_MOUSE_ENTER: @@ -314,6 +320,10 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType) return mEventNames[eDOMEvents_abort]; case NS_IMAGE_ERROR: return mEventNames[eDOMEvents_error]; + case NS_FORM_SUBMIT: + return mEventNames[eDOMEvents_submit]; + case NS_FORM_RESET: + return mEventNames[eDOMEvents_reset]; default: break; } diff --git a/mozilla/content/events/src/nsDOMEvent.h b/mozilla/content/events/src/nsDOMEvent.h index ba78b51e334..578b9d1fa0a 100644 --- a/mozilla/content/events/src/nsDOMEvent.h +++ b/mozilla/content/events/src/nsDOMEvent.h @@ -38,7 +38,7 @@ public: enum nsDOMEvents { eDOMEvents_mousedown=0, eDOMEvents_mouseup=1, eDOMEvents_click=2, eDOMEvents_dblclick=3, eDOMEvents_mouseover=4, eDOMEvents_mouseout=5, eDOMEvents_mousemove=6, eDOMEvents_keydown=7, eDOMEvents_keyup=8, eDOMEvents_keypress=9, eDOMEvents_focus=10, eDOMEvents_blur=11, - eDOMEvents_load=12, eDOMEvents_unload=13, eDOMEvents_abort=14, eDOMEvents_error=15 + eDOMEvents_load=12, eDOMEvents_unload=13, eDOMEvents_abort=14, eDOMEvents_error=15, eDOMEvents_submit, eDOMEvents_reset }; nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent); diff --git a/mozilla/content/events/src/nsDOMEventsIIDs.cpp b/mozilla/content/events/src/nsDOMEventsIIDs.cpp index c3b86931972..9eb15732752 100644 --- a/mozilla/content/events/src/nsDOMEventsIIDs.cpp +++ b/mozilla/content/events/src/nsDOMEventsIIDs.cpp @@ -20,6 +20,7 @@ #include "nsIDOMKeyListener.h" #include "nsIDOMMouseMotionListener.h" #include "nsIDOMFocusListener.h" +#include "nsIDOMFormListener.h" #include "nsIDOMLoadListener.h" #include "nsIDOMDragListener.h" @@ -27,5 +28,6 @@ NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID); NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID); NS_DEFINE_IID(kIDOMMouseMotionListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID); NS_DEFINE_IID(kIDOMFocusListenerIID, NS_IDOMFOCUSLISTENER_IID); +NS_DEFINE_IID(kIDOMFormListenerIID, NS_IDOMFORMLISTENER_IID); NS_DEFINE_IID(kIDOMLoadListenerIID, NS_IDOMLOADLISTENER_IID); NS_DEFINE_IID(kIDOMDragListenerIID, NS_IDOMDRAGLISTENER_IID); diff --git a/mozilla/content/events/src/nsDOMEventsIIDs.h b/mozilla/content/events/src/nsDOMEventsIIDs.h index 814feabfbf3..ac74cdd06f2 100644 --- a/mozilla/content/events/src/nsDOMEventsIIDs.h +++ b/mozilla/content/events/src/nsDOMEventsIIDs.h @@ -24,6 +24,7 @@ extern const nsIID kIDOMMouseListenerIID; extern const nsIID kIDOMKeyListenerIID; extern const nsIID kIDOMMouseMotionListenerIID; extern const nsIID kIDOMFocusListenerIID; +extern const nsIID kIDOMFormListenerIID; extern const nsIID kIDOMLoadListenerIID; extern const nsIID kIDOMDragListenerIID; diff --git a/mozilla/content/events/src/nsEventListenerManager.cpp b/mozilla/content/events/src/nsEventListenerManager.cpp index add0af673c0..c42ecb9f5c1 100644 --- a/mozilla/content/events/src/nsEventListenerManager.cpp +++ b/mozilla/content/events/src/nsEventListenerManager.cpp @@ -26,21 +26,17 @@ #include "nsIDOMMouseMotionListener.h" #include "nsIDOMKeyListener.h" #include "nsIDOMFocusListener.h" +#include "nsIDOMFormListener.h" #include "nsIDOMLoadListener.h" #include "nsIDOMDragListener.h" #include "nsIEventStateManager.h" #include "nsIPrivateDOMEvent.h" #include "nsIScriptObjectOwner.h" #include "nsIScriptEventListener.h" +#include "nsDOMEventsIIDs.h" static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID); static NS_DEFINE_IID(kIDOMEventListenerIID, NS_IDOMEVENTLISTENER_IID); -static NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID); -static NS_DEFINE_IID(kIDOMMouseMotionListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID); -static NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID); -static NS_DEFINE_IID(kIDOMFocusListenerIID, NS_IDOMFOCUSLISTENER_IID); -static NS_DEFINE_IID(kIDOMLoadListenerIID, NS_IDOMLOADLISTENER_IID); -static NS_DEFINE_IID(kIDOMDragListenerIID, NS_IDOMDRAGLISTENER_IID); static NS_DEFINE_IID(kIDOMEventIID, NS_IDOMEVENT_IID); static NS_DEFINE_IID(kIScriptEventListenerIID, NS_ISCRIPTEVENTLISTENER_IID); @@ -52,6 +48,7 @@ nsEventListenerManager::nsEventListenerManager() mKeyListeners = nsnull; mLoadListeners = nsnull; mFocusListeners = nsnull; + mFormListeners = nsnull; mDragListeners = nsnull; NS_INIT_REFCNT(); } @@ -64,6 +61,7 @@ nsEventListenerManager::~nsEventListenerManager() ReleaseListeners(mKeyListeners); ReleaseListeners(mLoadListeners); ReleaseListeners(mFocusListeners); + ReleaseListeners(mFormListeners); ReleaseListeners(mDragListeners); } @@ -102,6 +100,9 @@ nsVoidArray** nsEventListenerManager::GetListenersByIID(const nsIID& aIID) else if (aIID.Equals(kIDOMFocusListenerIID)) { return &mFocusListeners; } + else if (aIID.Equals(kIDOMFormListenerIID)) { + return &mFocusListeners; + } else if (aIID.Equals(kIDOMDragListenerIID)) { return &mDragListeners; } @@ -284,7 +285,13 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, case NS_MOUSE_RIGHT_BUTTON_UP: mRet = mMouseListener->MouseUp(*aDOMEvent); break; + case NS_MOUSE_LEFT_CLICK: + case NS_MOUSE_MIDDLE_CLICK: + case NS_MOUSE_RIGHT_CLICK: + mRet = mMouseListener->MouseClick(*aDOMEvent); + break; case NS_MOUSE_LEFT_DOUBLECLICK: + case NS_MOUSE_MIDDLE_DOUBLECLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: mRet = mMouseListener->MouseDblClick(*aDOMEvent); break; @@ -374,6 +381,76 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } break; + case NS_GOTFOCUS: + case NS_LOSTFOCUS: + if (nsnull != mFocusListeners) { + if (nsnull == *aDOMEvent) { + mRet = NS_NewDOMEvent(aDOMEvent, aPresContext, aEvent); + } + if (NS_OK == mRet) { + for (int i=0; iCount(); i++) { + nsIDOMEventListener *mEventListener; + nsIDOMFocusListener *mFocusListener; + + mEventListener = (nsIDOMEventListener*)mFocusListeners->ElementAt(i); + + if (NS_OK == mEventListener->QueryInterface(kIDOMFocusListenerIID, (void**)&mFocusListener)) { + switch(aEvent->message) { + case NS_GOTFOCUS: + mRet = mFocusListener->Focus(*aDOMEvent); + break; + case NS_LOSTFOCUS: + mRet = mFocusListener->Blur(*aDOMEvent); + break; + default: + break; + } + NS_RELEASE(mFocusListener); + } + else { + mRet = mEventListener->ProcessEvent(*aDOMEvent); + } + aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; + } + } + } + break; + + case NS_FORM_SUBMIT: + case NS_FORM_RESET: + if (nsnull != mFormListeners) { + if (nsnull == *aDOMEvent) { + mRet = NS_NewDOMEvent(aDOMEvent, aPresContext, aEvent); + } + if (NS_OK == mRet) { + for (int i=0; iCount(); i++) { + nsIDOMEventListener *mEventListener; + nsIDOMFormListener *mFormListener; + + mEventListener = (nsIDOMEventListener*)mFormListeners->ElementAt(i); + + if (NS_OK == mEventListener->QueryInterface(kIDOMFormListenerIID, (void**)&mFormListener)) { + switch(aEvent->message) { + case NS_FORM_SUBMIT: + mRet = mFormListener->Submit(*aDOMEvent); + break; + case NS_FORM_RESET: + mRet = mFormListener->Reset(*aDOMEvent); + break; + default: + break; + } + NS_RELEASE(mFormListener); + } + else { + mRet = mEventListener->ProcessEvent(*aDOMEvent); + } + aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; + } + } + } + break; + default: break; } diff --git a/mozilla/content/events/src/nsEventListenerManager.h b/mozilla/content/events/src/nsEventListenerManager.h index d35d9f9613d..8ec35a326ae 100644 --- a/mozilla/content/events/src/nsEventListenerManager.h +++ b/mozilla/content/events/src/nsEventListenerManager.h @@ -85,6 +85,7 @@ protected: nsVoidArray* mKeyListeners; nsVoidArray* mLoadListeners; nsVoidArray* mFocusListeners; + nsVoidArray* mFormListeners; nsVoidArray* mDragListeners; }; diff --git a/mozilla/layout/base/src/nsDocument.cpp b/mozilla/layout/base/src/nsDocument.cpp index b09185c7a7b..240594ab122 100644 --- a/mozilla/layout/base/src/nsDocument.cpp +++ b/mozilla/layout/base/src/nsDocument.cpp @@ -957,22 +957,65 @@ PRBool nsDocument::SetProperty(JSContext *aContext, jsval aID, jsval *aVp) mPropName.SetString(JS_GetStringChars(JS_ValueToString(aContext, aID))); mPrefix.SetString(mPropName, 2); if (mPrefix == "on") { + nsIEventListenerManager *mManager = nsnull; + if (mPropName == "onmousedown" || mPropName == "onmouseup" || mPropName == "onclick" || mPropName == "onmouseover" || mPropName == "onmouseout") { - if (NS_OK != SetScriptEventListener(aContext, kIDOMMouseListenerIID)) { - return PR_FALSE; + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } } } - else if (mPropName == "onkeydown" || mPropName == "onkeyup" || mPropName == "onkeypress" ) { - if (NS_OK != SetScriptEventListener(aContext, kIDOMKeyListenerIID)) { - return PR_FALSE; + else if (mPropName == "onkeydown" || mPropName == "onkeyup" || mPropName == "onkeypress") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMKeyListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } } } - else if (mPropName == "onmousemove" ) { - if (NS_OK != SetScriptEventListener(aContext, kIDOMMouseMotionListenerIID)) { - return PR_FALSE; + else if (mPropName == "onmousemove") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseMotionListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } } } + else if (mPropName == "onfocus" || mPropName == "onblur") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMFocusListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + else if (mPropName == "onsubmit" || mPropName == "onreset") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMFormListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + else if (mPropName == "onload" || mPropName == "onunload" || mPropName == "onabort" || + mPropName == "onerror") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMLoadListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + NS_IF_RELEASE(mManager); } } return PR_TRUE; @@ -997,49 +1040,6 @@ void nsDocument::Finalize(JSContext *aContext) { } -nsresult nsDocument::SetScriptEventListener(JSContext *aContext, REFNSIID aListenerTypeIID) -{ - //First get the mScriptObject or make one if we don't have one. - nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); - - if (nsnull == mScriptObject) { - GetScriptObject(mScriptCX, &mScriptObject); - } - - if (nsnull != mScriptObject) { - nsIEventListenerManager *mManager = nsnull; - nsVoidArray *mListeners; - - if (NS_OK == GetListenerManager(&mManager) && - NS_OK == mManager->GetEventListeners(&mListeners, aListenerTypeIID)) { - //Run through the listeners for this IID and see if a script listener is registered - //If so, we're set. - if (nsnull != mListeners) { - nsIScriptEventListener *mScriptListener; - nsIDOMEventListener *mEventListener; - for (int i=0; iCount(); i++) { - mEventListener = (nsIDOMEventListener*)mListeners->ElementAt(i); - if (NS_OK == mEventListener->QueryInterface(kIScriptEventListenerIID, (void**)&mScriptListener)) { - NS_RELEASE(mScriptListener); - NS_RELEASE(mManager); - return NS_OK; - } - } - } - //If we didn't find a script listener or no listeners existed create and add a new one. - nsIDOMEventListener *mScriptListener; - if (NS_OK == NS_NewScriptEventListener(&mScriptListener, mScriptCX, mScriptObject)) { - mManager->AddEventListener(mScriptListener, aListenerTypeIID); - NS_RELEASE(mScriptListener); - NS_RELEASE(mManager); - return NS_OK; - } - } - NS_IF_RELEASE(mManager); - } - return NS_ERROR_FAILURE; -} - /** * Returns the Selection Object */ diff --git a/mozilla/layout/base/src/nsDocument.h b/mozilla/layout/base/src/nsDocument.h index 98d35e63303..05ac7c26e24 100644 --- a/mozilla/layout/base/src/nsDocument.h +++ b/mozilla/layout/base/src/nsDocument.h @@ -235,6 +235,7 @@ public: NS_IMETHOD ReleaseEvent(nsIDOMEventListener *aListener); NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); + NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, @@ -269,8 +270,6 @@ protected: protected: virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook - NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); - nsresult SetScriptEventListener(JSContext *aContext, REFNSIID aListenerTypeIID); nsDocument(); virtual ~nsDocument(); diff --git a/mozilla/layout/events/src/nsDOMEvent.cpp b/mozilla/layout/events/src/nsDOMEvent.cpp index 32b43457e36..97e38f75804 100644 --- a/mozilla/layout/events/src/nsDOMEvent.cpp +++ b/mozilla/layout/events/src/nsDOMEvent.cpp @@ -28,7 +28,7 @@ static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID); static char* mEventNames[] = { "onmousedown", "onmouseup", "onclick", "ondblclick", "onmouseover", "onmouseout", "onmousemove", "onkeydown", "onkeyup", "onkeypress", "onfocus", "onblur", - "onload", "onunload", "onabort", "onerror" + "onload", "onunload", "onabort", "onerror", "onsubmit", "onreset" }; nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent) { @@ -224,15 +224,19 @@ NS_METHOD nsDOMEvent::GetButton(PRUint32* aButton) switch (mEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: case NS_MOUSE_LEFT_BUTTON_DOWN: + case NS_MOUSE_LEFT_CLICK: case NS_MOUSE_LEFT_DOUBLECLICK: *aButton = 1; break; case NS_MOUSE_MIDDLE_BUTTON_UP: case NS_MOUSE_MIDDLE_BUTTON_DOWN: + case NS_MOUSE_MIDDLE_CLICK: + case NS_MOUSE_MIDDLE_DOUBLECLICK: *aButton = 2; break; case NS_MOUSE_RIGHT_BUTTON_UP: case NS_MOUSE_RIGHT_BUTTON_DOWN: + case NS_MOUSE_RIGHT_CLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: *aButton = 3; break; @@ -286,9 +290,11 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType) case NS_MOUSE_RIGHT_BUTTON_UP: return mEventNames[eDOMEvents_mouseup]; case NS_MOUSE_LEFT_CLICK: + case NS_MOUSE_MIDDLE_CLICK: case NS_MOUSE_RIGHT_CLICK: return mEventNames[eDOMEvents_click]; case NS_MOUSE_LEFT_DOUBLECLICK: + case NS_MOUSE_MIDDLE_DOUBLECLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: return mEventNames[eDOMEvents_dblclick]; case NS_MOUSE_ENTER: @@ -314,6 +320,10 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType) return mEventNames[eDOMEvents_abort]; case NS_IMAGE_ERROR: return mEventNames[eDOMEvents_error]; + case NS_FORM_SUBMIT: + return mEventNames[eDOMEvents_submit]; + case NS_FORM_RESET: + return mEventNames[eDOMEvents_reset]; default: break; } diff --git a/mozilla/layout/events/src/nsDOMEvent.h b/mozilla/layout/events/src/nsDOMEvent.h index ba78b51e334..578b9d1fa0a 100644 --- a/mozilla/layout/events/src/nsDOMEvent.h +++ b/mozilla/layout/events/src/nsDOMEvent.h @@ -38,7 +38,7 @@ public: enum nsDOMEvents { eDOMEvents_mousedown=0, eDOMEvents_mouseup=1, eDOMEvents_click=2, eDOMEvents_dblclick=3, eDOMEvents_mouseover=4, eDOMEvents_mouseout=5, eDOMEvents_mousemove=6, eDOMEvents_keydown=7, eDOMEvents_keyup=8, eDOMEvents_keypress=9, eDOMEvents_focus=10, eDOMEvents_blur=11, - eDOMEvents_load=12, eDOMEvents_unload=13, eDOMEvents_abort=14, eDOMEvents_error=15 + eDOMEvents_load=12, eDOMEvents_unload=13, eDOMEvents_abort=14, eDOMEvents_error=15, eDOMEvents_submit, eDOMEvents_reset }; nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent); diff --git a/mozilla/layout/events/src/nsDOMEventsIIDs.cpp b/mozilla/layout/events/src/nsDOMEventsIIDs.cpp index c3b86931972..9eb15732752 100644 --- a/mozilla/layout/events/src/nsDOMEventsIIDs.cpp +++ b/mozilla/layout/events/src/nsDOMEventsIIDs.cpp @@ -20,6 +20,7 @@ #include "nsIDOMKeyListener.h" #include "nsIDOMMouseMotionListener.h" #include "nsIDOMFocusListener.h" +#include "nsIDOMFormListener.h" #include "nsIDOMLoadListener.h" #include "nsIDOMDragListener.h" @@ -27,5 +28,6 @@ NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID); NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID); NS_DEFINE_IID(kIDOMMouseMotionListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID); NS_DEFINE_IID(kIDOMFocusListenerIID, NS_IDOMFOCUSLISTENER_IID); +NS_DEFINE_IID(kIDOMFormListenerIID, NS_IDOMFORMLISTENER_IID); NS_DEFINE_IID(kIDOMLoadListenerIID, NS_IDOMLOADLISTENER_IID); NS_DEFINE_IID(kIDOMDragListenerIID, NS_IDOMDRAGLISTENER_IID); diff --git a/mozilla/layout/events/src/nsDOMEventsIIDs.h b/mozilla/layout/events/src/nsDOMEventsIIDs.h index 814feabfbf3..ac74cdd06f2 100644 --- a/mozilla/layout/events/src/nsDOMEventsIIDs.h +++ b/mozilla/layout/events/src/nsDOMEventsIIDs.h @@ -24,6 +24,7 @@ extern const nsIID kIDOMMouseListenerIID; extern const nsIID kIDOMKeyListenerIID; extern const nsIID kIDOMMouseMotionListenerIID; extern const nsIID kIDOMFocusListenerIID; +extern const nsIID kIDOMFormListenerIID; extern const nsIID kIDOMLoadListenerIID; extern const nsIID kIDOMDragListenerIID; diff --git a/mozilla/layout/events/src/nsEventListenerManager.cpp b/mozilla/layout/events/src/nsEventListenerManager.cpp index add0af673c0..c42ecb9f5c1 100644 --- a/mozilla/layout/events/src/nsEventListenerManager.cpp +++ b/mozilla/layout/events/src/nsEventListenerManager.cpp @@ -26,21 +26,17 @@ #include "nsIDOMMouseMotionListener.h" #include "nsIDOMKeyListener.h" #include "nsIDOMFocusListener.h" +#include "nsIDOMFormListener.h" #include "nsIDOMLoadListener.h" #include "nsIDOMDragListener.h" #include "nsIEventStateManager.h" #include "nsIPrivateDOMEvent.h" #include "nsIScriptObjectOwner.h" #include "nsIScriptEventListener.h" +#include "nsDOMEventsIIDs.h" static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID); static NS_DEFINE_IID(kIDOMEventListenerIID, NS_IDOMEVENTLISTENER_IID); -static NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID); -static NS_DEFINE_IID(kIDOMMouseMotionListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID); -static NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID); -static NS_DEFINE_IID(kIDOMFocusListenerIID, NS_IDOMFOCUSLISTENER_IID); -static NS_DEFINE_IID(kIDOMLoadListenerIID, NS_IDOMLOADLISTENER_IID); -static NS_DEFINE_IID(kIDOMDragListenerIID, NS_IDOMDRAGLISTENER_IID); static NS_DEFINE_IID(kIDOMEventIID, NS_IDOMEVENT_IID); static NS_DEFINE_IID(kIScriptEventListenerIID, NS_ISCRIPTEVENTLISTENER_IID); @@ -52,6 +48,7 @@ nsEventListenerManager::nsEventListenerManager() mKeyListeners = nsnull; mLoadListeners = nsnull; mFocusListeners = nsnull; + mFormListeners = nsnull; mDragListeners = nsnull; NS_INIT_REFCNT(); } @@ -64,6 +61,7 @@ nsEventListenerManager::~nsEventListenerManager() ReleaseListeners(mKeyListeners); ReleaseListeners(mLoadListeners); ReleaseListeners(mFocusListeners); + ReleaseListeners(mFormListeners); ReleaseListeners(mDragListeners); } @@ -102,6 +100,9 @@ nsVoidArray** nsEventListenerManager::GetListenersByIID(const nsIID& aIID) else if (aIID.Equals(kIDOMFocusListenerIID)) { return &mFocusListeners; } + else if (aIID.Equals(kIDOMFormListenerIID)) { + return &mFocusListeners; + } else if (aIID.Equals(kIDOMDragListenerIID)) { return &mDragListeners; } @@ -284,7 +285,13 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, case NS_MOUSE_RIGHT_BUTTON_UP: mRet = mMouseListener->MouseUp(*aDOMEvent); break; + case NS_MOUSE_LEFT_CLICK: + case NS_MOUSE_MIDDLE_CLICK: + case NS_MOUSE_RIGHT_CLICK: + mRet = mMouseListener->MouseClick(*aDOMEvent); + break; case NS_MOUSE_LEFT_DOUBLECLICK: + case NS_MOUSE_MIDDLE_DOUBLECLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: mRet = mMouseListener->MouseDblClick(*aDOMEvent); break; @@ -374,6 +381,76 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } break; + case NS_GOTFOCUS: + case NS_LOSTFOCUS: + if (nsnull != mFocusListeners) { + if (nsnull == *aDOMEvent) { + mRet = NS_NewDOMEvent(aDOMEvent, aPresContext, aEvent); + } + if (NS_OK == mRet) { + for (int i=0; iCount(); i++) { + nsIDOMEventListener *mEventListener; + nsIDOMFocusListener *mFocusListener; + + mEventListener = (nsIDOMEventListener*)mFocusListeners->ElementAt(i); + + if (NS_OK == mEventListener->QueryInterface(kIDOMFocusListenerIID, (void**)&mFocusListener)) { + switch(aEvent->message) { + case NS_GOTFOCUS: + mRet = mFocusListener->Focus(*aDOMEvent); + break; + case NS_LOSTFOCUS: + mRet = mFocusListener->Blur(*aDOMEvent); + break; + default: + break; + } + NS_RELEASE(mFocusListener); + } + else { + mRet = mEventListener->ProcessEvent(*aDOMEvent); + } + aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; + } + } + } + break; + + case NS_FORM_SUBMIT: + case NS_FORM_RESET: + if (nsnull != mFormListeners) { + if (nsnull == *aDOMEvent) { + mRet = NS_NewDOMEvent(aDOMEvent, aPresContext, aEvent); + } + if (NS_OK == mRet) { + for (int i=0; iCount(); i++) { + nsIDOMEventListener *mEventListener; + nsIDOMFormListener *mFormListener; + + mEventListener = (nsIDOMEventListener*)mFormListeners->ElementAt(i); + + if (NS_OK == mEventListener->QueryInterface(kIDOMFormListenerIID, (void**)&mFormListener)) { + switch(aEvent->message) { + case NS_FORM_SUBMIT: + mRet = mFormListener->Submit(*aDOMEvent); + break; + case NS_FORM_RESET: + mRet = mFormListener->Reset(*aDOMEvent); + break; + default: + break; + } + NS_RELEASE(mFormListener); + } + else { + mRet = mEventListener->ProcessEvent(*aDOMEvent); + } + aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; + } + } + } + break; + default: break; } diff --git a/mozilla/layout/events/src/nsEventListenerManager.h b/mozilla/layout/events/src/nsEventListenerManager.h index d35d9f9613d..8ec35a326ae 100644 --- a/mozilla/layout/events/src/nsEventListenerManager.h +++ b/mozilla/layout/events/src/nsEventListenerManager.h @@ -85,6 +85,7 @@ protected: nsVoidArray* mKeyListeners; nsVoidArray* mLoadListeners; nsVoidArray* mFocusListeners; + nsVoidArray* mFormListeners; nsVoidArray* mDragListeners; }; diff --git a/mozilla/layout/html/base/src/nsHTMLContent.h b/mozilla/layout/html/base/src/nsHTMLContent.h index 1204c79a9f8..173f2aee9e8 100644 --- a/mozilla/layout/html/base/src/nsHTMLContent.h +++ b/mozilla/layout/html/base/src/nsHTMLContent.h @@ -135,6 +135,7 @@ public: // nsIDOMEventReceiver interface NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); + NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, @@ -155,8 +156,6 @@ protected: nsIContent* mParent; void* mScriptObject; - nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult); - nsIEventListenerManager* mListenerManager; }; diff --git a/mozilla/layout/html/base/src/nsHTMLTagContent.cpp b/mozilla/layout/html/base/src/nsHTMLTagContent.cpp index 227dcbcc449..dd64051201d 100644 --- a/mozilla/layout/html/base/src/nsHTMLTagContent.cpp +++ b/mozilla/layout/html/base/src/nsHTMLTagContent.cpp @@ -37,6 +37,7 @@ #include "nsIEventListenerManager.h" #include "nsIScriptEventListener.h" #include "nsIScriptContextOwner.h" +#include "nsIScriptGlobalObject.h" #include "nsDOMEventsIIDs.h" #include "jsapi.h" @@ -45,7 +46,8 @@ static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID); static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID); static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID); -static NS_DEFINE_IID(kIScriptObjectOwner, NS_ISCRIPTOBJECTOWNER_IID); +static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID); +static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); static NS_DEFINE_IID(kIScriptEventListenerIID, NS_ISCRIPTEVENTLISTENER_IID); static NS_DEFINE_IID(kIJSScriptObjectIID, NS_IJSSCRIPTOBJECT_IID); @@ -387,10 +389,34 @@ nsHTMLTagContent::AddScriptEventListener(nsIAtom* aAttribute, nsHTMLValue& aValu if (nsnull != mDocument) { mOwner = mDocument->GetScriptContextOwner(); if (NS_OK == mOwner->GetScriptContext(&mContext)) { - if (nsnull != mListenerManager || NS_OK == GetListenerManager(&mListenerManager)) { - nsString mValue; - aValue.GetStringValue(mValue); - mRet = mListenerManager->AddScriptEventListener(mContext, this, aAttribute, mValue, aIID); + if (nsHTMLAtoms::body == mTag || nsHTMLAtoms::frameset == mTag) { + nsIDOMEventReceiver *mReceiver; + nsIScriptGlobalObject *mGlobal = mContext->GetGlobalObject(); + + if (nsnull != mGlobal && NS_OK == mGlobal->QueryInterface(kIDOMEventReceiverIID, (void**)&mReceiver)) { + nsIEventListenerManager *mManager; + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptObjectOwner *mObjectOwner; + if (NS_OK == mGlobal->QueryInterface(kIScriptObjectOwnerIID, (void**)&mObjectOwner)) { + nsString mValue; + aValue.GetStringValue(mValue); + mRet = mManager->AddScriptEventListener(mContext, mObjectOwner, aAttribute, mValue, aIID); + NS_RELEASE(mObjectOwner); + } + NS_RELEASE(mManager); + } + NS_RELEASE(mReceiver); + } + NS_IF_RELEASE(mGlobal); + } + else { + nsIEventListenerManager *mManager; + if (NS_OK == GetListenerManager(&mManager)) { + nsString mValue; + aValue.GetStringValue(mValue); + mRet = mManager->AddScriptEventListener(mContext, this, aAttribute, mValue, aIID); + NS_RELEASE(mManager); + } } NS_RELEASE(mContext); } @@ -582,31 +608,65 @@ PRBool nsHTMLTagContent::SetProperty(JSContext *aContext, jsval aID, jsval *a mPropName.SetString(JS_GetStringChars(JS_ValueToString(aContext, aID))); mPrefix.SetString(mPropName, 2); if (mPrefix == "on") { + nsIEventListenerManager *mManager = nsnull; + if (mPropName == "onmousedown" || mPropName == "onmouseup" || mPropName == "onclick" || mPropName == "onmouseover" || mPropName == "onmouseout") { - if (nsnull != mListenerManager || NS_OK == GetListenerManager(&mListenerManager)) { + if (NS_OK == GetListenerManager(&mManager)) { nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); - if (NS_OK != mListenerManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseListenerIID)) { + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseListenerIID)) { + NS_RELEASE(mManager); return PR_FALSE; } } } - else if (mPropName == "onkeydown" || mPropName == "onkeyup" || mPropName == "onkeypress" ) { - if (nsnull != mListenerManager || NS_OK == GetListenerManager(&mListenerManager)) { + else if (mPropName == "onkeydown" || mPropName == "onkeyup" || mPropName == "onkeypress") { + if (NS_OK == GetListenerManager(&mManager)) { nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); - if (NS_OK != mListenerManager->RegisterScriptEventListener(mScriptCX, this, kIDOMKeyListenerIID)) { + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMKeyListenerIID)) { + NS_RELEASE(mManager); return PR_FALSE; } } } - else if (mPropName == "onmousemove" ) { - if (nsnull != mListenerManager || NS_OK == GetListenerManager(&mListenerManager)) { + else if (mPropName == "onmousemove") { + if (NS_OK == GetListenerManager(&mManager)) { nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); - if (NS_OK != mListenerManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseMotionListenerIID)) { + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMMouseMotionListenerIID)) { + NS_RELEASE(mManager); return PR_FALSE; } } } + else if (mPropName == "onfocus" || mPropName == "onblur") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMFocusListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + else if (mPropName == "onsubmit" || mPropName == "onreset") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMFormListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + else if (mPropName == "onload" || mPropName == "onunload" || mPropName == "onabort" || + mPropName == "onerror") { + if (NS_OK == GetListenerManager(&mManager)) { + nsIScriptContext *mScriptCX = (nsIScriptContext *)JS_GetContextPrivate(aContext); + if (NS_OK != mManager->RegisterScriptEventListener(mScriptCX, this, kIDOMLoadListenerIID)) { + NS_RELEASE(mManager); + return PR_FALSE; + } + } + } + NS_IF_RELEASE(mManager); } } return PR_TRUE; diff --git a/mozilla/layout/html/forms/src/nsInputFrame.cpp b/mozilla/layout/html/forms/src/nsInputFrame.cpp index 76ae5216b60..f0bb098dca6 100644 --- a/mozilla/layout/html/forms/src/nsInputFrame.cpp +++ b/mozilla/layout/html/forms/src/nsInputFrame.cpp @@ -34,6 +34,7 @@ #include "nsViewsCID.h" #include "nsRepository.h" #include "nsGUIEvent.h" +#include "nsDOMEvent.h" #include "nsIFontCache.h" #include "nsIFontMetrics.h" #include "nsIFormManager.h" @@ -361,7 +362,11 @@ NS_METHOD nsInputFrame::HandleEvent(nsIPresContext& aPresContext, nsGUIEvent* aEvent, nsEventStatus& aEventStatus) { - // make sure that the widget in the event is this + if (nsnull != mContent) { + mContent->HandleDOMEvent(aPresContext, (nsEvent*)aEvent, nsnull, DOM_EVENT_INIT, aEventStatus); + } + + // make sure that the widget in the event is this // XXX if there is no view, it could be an image button. Unfortunately, // every image button will get every event. nsIView* view;