зеркало из https://github.com/mozilla/gecko-dev.git
Adding form events in, filling out window event handling code.
This commit is contained in:
Родитель
7f5775b231
Коммит
f038ee240b
|
@ -7,6 +7,7 @@ nsIDOMEventListener.h
|
|||
nsIDOMEventCapturer.h
|
||||
nsIDOMEventReceiver.h
|
||||
nsIDOMFocusListener.h
|
||||
nsIDOMFormListener.h
|
||||
nsIDOMKeyListener.h
|
||||
nsIDOMLoadListener.h
|
||||
nsIDOMMouseListener.h
|
||||
|
|
|
@ -25,6 +25,7 @@ EXPORTS = \
|
|||
nsIDOMEventCapturer.h \
|
||||
nsIDOMEventReceiver.h \
|
||||
nsIDOMFocusListener.h \
|
||||
nsIDOMFormListener.h \
|
||||
nsIDOMKeyListener.h \
|
||||
nsIDOMLoadListener.h \
|
||||
nsIDOMMouseListener.h \
|
||||
|
|
|
@ -20,7 +20,7 @@ IGNORE_MANIFEST=1
|
|||
|
||||
DEFINES=-D_IMPL_NS_DOM
|
||||
EXPORTS=nsIDOMEvent.h nsIDOMEventListener.h nsIDOMEventCapturer.h nsIDOMEventReceiver.h \
|
||||
nsIDOMFocusListener.h nsIDOMKeyListener.h nsIDOMLoadListener.h \
|
||||
nsIDOMFocusListener.h nsIDOMFormListener.h nsIDOMKeyListener.h nsIDOMLoadListener.h \
|
||||
nsIDOMMouseListener.h nsIDOMMouseMotionListener.h nsIDOMDragListener.h
|
||||
MODULE=dom
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ public:
|
|||
|
||||
NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) = 0;
|
||||
NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) = 0;
|
||||
NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult) = 0;
|
||||
NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult) = 0;
|
||||
|
||||
};
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef nsIDOMFormListener_h__
|
||||
#define nsIDOMFormListener_h__
|
||||
|
||||
#include "nsIDOMEvent.h"
|
||||
#include "nsIDOMEventListener.h"
|
||||
|
||||
/*
|
||||
* Form submit/reset listener
|
||||
*
|
||||
*/
|
||||
#define NS_IDOMFORMLISTENER_IID \
|
||||
{ /* 566c3f80-28ab-11d2-bd89-00805f8ae3f4 */ \
|
||||
0x566c3f80, 0x28ab, 0x11d2, \
|
||||
{0xbd, 0x89, 0x00, 0x80, 0x5f, 0x8a, 0xe3, 0xf4} }
|
||||
|
||||
class nsIDOMFormListener : public nsIDOMEventListener {
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Processes a form submit event
|
||||
* @param aEvent @see nsIDOMEvent.h
|
||||
* @returns whether the event was consumed or ignored. @see nsresult
|
||||
*/
|
||||
virtual nsresult Submit(nsIDOMEvent* aEvent) = 0;
|
||||
|
||||
/**
|
||||
* Processes a form reset event
|
||||
* @param aEvent @see nsIDOMEvent.h
|
||||
* @returns whether the event was consumed or ignored. @see nsresult
|
||||
*/
|
||||
virtual nsresult Reset(nsIDOMEvent* aEvent) = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif // nsIDOMFormListener_h__
|
|
@ -50,9 +50,14 @@ static NS_DEFINE_IID(kIJSScriptObjectIID, NS_IJSSCRIPTOBJECT_IID);
|
|||
static NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID);
|
||||
static NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIDOMMouseMotionListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIDOMFocusListenerIID, NS_IDOMMOUSELISTENER_IID);
|
||||
static NS_DEFINE_IID(kIDOMFormListenerIID, NS_IDOMKEYLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIDOMLoadListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIDOMDragListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID);
|
||||
static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID);
|
||||
static NS_DEFINE_IID(kIDOMEventCapturerIID, NS_IDOMEVENTCAPTURER_IID);
|
||||
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
|
||||
|
||||
GlobalWindowImpl::GlobalWindowImpl()
|
||||
{
|
||||
|
@ -129,6 +134,11 @@ GlobalWindowImpl::QueryInterface(const nsIID& aIID,
|
|||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kIDOMEventReceiverIID)) {
|
||||
*aInstancePtrResult = (void*)(nsISupports*)(nsIDOMEventReceiver*)this;
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
@ -697,22 +707,65 @@ PRBool GlobalWindowImpl::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 (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;
|
||||
|
@ -737,49 +790,6 @@ void GlobalWindowImpl::Finalize(JSContext *aContext)
|
|||
{
|
||||
}
|
||||
|
||||
nsresult GlobalWindowImpl::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;
|
||||
}
|
||||
|
||||
nsresult GlobalWindowImpl::GetListenerManager(nsIEventListenerManager **aInstancePtrResult)
|
||||
{
|
||||
if (nsnull != mListenerManager) {
|
||||
|
|
|
@ -74,6 +74,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,
|
||||
|
@ -106,9 +107,6 @@ protected:
|
|||
void DropTimeout(nsTimeoutImpl *aTimeout);
|
||||
void HoldTimeout(nsTimeoutImpl *aTimeout);
|
||||
|
||||
nsresult SetScriptEventListener(JSContext *aContext, REFNSIID aListenerTypeIID);
|
||||
NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult);
|
||||
|
||||
nsIScriptContext *mContext;
|
||||
void *mScriptObject;
|
||||
nsIDOMDocument *mDocument;
|
||||
|
|
Загрузка…
Ссылка в новой задаче