Filling out document event handlers, adding form events

git-svn-id: svn://10.0.0.236/trunk@6985 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
joki%netscape.com
1998-07-31 22:09:51 +00:00
parent 741dfdf08c
commit ddaa767e02
19 changed files with 382 additions and 138 deletions

View File

@@ -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; i<mListeners->Count(); 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
*/

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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; i<mFocusListeners->Count(); 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; i<mFormListeners->Count(); 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;
}

View File

@@ -85,6 +85,7 @@ protected:
nsVoidArray* mKeyListeners;
nsVoidArray* mLoadListeners;
nsVoidArray* mFocusListeners;
nsVoidArray* mFormListeners;
nsVoidArray* mDragListeners;
};

View File

@@ -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; i<mListeners->Count(); 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
*/

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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; i<mFocusListeners->Count(); 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; i<mFormListeners->Count(); 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;
}

View File

@@ -85,6 +85,7 @@ protected:
nsVoidArray* mKeyListeners;
nsVoidArray* mLoadListeners;
nsVoidArray* mFocusListeners;
nsVoidArray* mFormListeners;
nsVoidArray* mDragListeners;
};

View File

@@ -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;
};

View File

@@ -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;

View File

@@ -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;