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:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -85,6 +85,7 @@ protected:
|
||||
nsVoidArray* mKeyListeners;
|
||||
nsVoidArray* mLoadListeners;
|
||||
nsVoidArray* mFocusListeners;
|
||||
nsVoidArray* mFormListeners;
|
||||
nsVoidArray* mDragListeners;
|
||||
|
||||
};
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -85,6 +85,7 @@ protected:
|
||||
nsVoidArray* mKeyListeners;
|
||||
nsVoidArray* mLoadListeners;
|
||||
nsVoidArray* mFocusListeners;
|
||||
nsVoidArray* mFormListeners;
|
||||
nsVoidArray* mDragListeners;
|
||||
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user