Clean up for autoscrolling menu landing. ScrollBox events need their own type and should not be

on top of menu events.

-r hyatt
This commit is contained in:
evaughan%netscape.com 2000-06-28 00:00:18 +00:00
Родитель 5734dfa3be
Коммит 4db3654be5
29 изменённых файлов: 280 добавлений и 83 удалений

Просмотреть файл

@ -50,7 +50,7 @@ static char* mEventNames[] = {
"submit", "reset", "change", "select", "input", "paint" ,"text",
"create", "close", "destroy", "command", "broadcast", "commandupdate",
"dragenter", "dragover", "dragexit", "dragdrop", "draggesture", "resize",
"scroll","overflow", "underflow"
"scroll","overflow", "underflow", "overflowchanged"
};
nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, const nsString& aEventType) {
@ -1147,6 +1147,8 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType)
return mEventNames[eDOMEvents_overflow];
case NS_SCROLLPORT_UNDERFLOW:
return mEventNames[eDOMEvents_underflow];
case NS_SCROLLPORT_OVERFLOWCHANGED:
return mEventNames[eDOMEvents_overflowchanged];
default:
break;
}

Просмотреть файл

@ -86,7 +86,8 @@ public:
eDOMEvents_resize,
eDOMEvents_scroll,
eDOMEvents_overflow,
eDOMEvents_underflow
eDOMEvents_underflow,
eDOMEvents_overflowchanged
};
nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, const nsString& aEventType);

Просмотреть файл

@ -31,6 +31,7 @@
#include "nsIDOMTextListener.h"
#include "nsIDOMCompositionListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMScrollListener.h"
NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID);
NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID);
@ -43,3 +44,4 @@ NS_DEFINE_IID(kIDOMPaintListenerIID, NS_IDOMPAINTLISTENER_IID);
NS_DEFINE_IID(kIDOMTextListenerIID,NS_IDOMTEXTLISTENER_IID);
NS_DEFINE_IID(kIDOMCompositionListenerIID,NS_IDOMCOMPOSITIONLISTENER_IID);
NS_DEFINE_IID(kIDOMMenuListenerIID, NS_IDOMMENULISTENER_IID);
NS_DEFINE_IID(kIDOMScrollListenerIID, NS_IDOMSCROLLLISTENER_IID);

Просмотреть файл

@ -35,5 +35,6 @@ extern const nsIID kIDOMPaintListenerIID;
extern const nsIID kIDOMTextListenerIID;
extern const nsIID kIDOMCompositionListenerIID;
extern const nsIID kIDOMMenuListenerIID;
extern const nsIID kIDOMScrollListenerIID;
#endif /* nsDOMEVENTSIIDs_h___ */

Просмотреть файл

@ -36,6 +36,7 @@
#include "nsIDOMTextListener.h"
#include "nsIDOMCompositionListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMScrollListener.h"
#include "nsIEventStateManager.h"
#include "nsIPrivateDOMEvent.h"
#include "nsIScriptObjectOwner.h"
@ -75,6 +76,7 @@ nsEventListenerManager::nsEventListenerManager()
mTextListeners = nsnull;
mCompositionListeners = nsnull;
mMenuListeners = nsnull;
mScrollListeners = nsnull;
mDestroyed = PR_FALSE;
mTarget = nsnull;
NS_INIT_REFCNT();
@ -94,6 +96,7 @@ nsEventListenerManager::~nsEventListenerManager()
ReleaseListeners(&mTextListeners, PR_FALSE);
ReleaseListeners(&mCompositionListeners, PR_FALSE);
ReleaseListeners(&mMenuListeners, PR_FALSE);
ReleaseListeners(&mScrollListeners, PR_FALSE);
}
NS_IMPL_ADDREF(nsEventListenerManager)
@ -178,6 +181,9 @@ nsVoidArray** nsEventListenerManager::GetListenersByIID(const nsIID& aIID)
else if (aIID.Equals(kIDOMMenuListenerIID)) {
return &mMenuListeners;
}
else if (aIID.Equals(kIDOMScrollListenerIID)) {
return &mScrollListeners;
}
return nsnull;
}
@ -451,13 +457,17 @@ nsresult nsEventListenerManager::GetIdentifiersForType(nsIAtom* aType, nsIID& aI
*aFlags = NS_EVENT_BITS_XUL_COMMAND_UPDATE;
}
else if (aType == nsLayoutAtoms::onoverflow) {
aIID = kIDOMMenuListenerIID;
aIID = kIDOMScrollListenerIID;
*aFlags = NS_EVENT_BITS_SCROLLPORT_OVERFLOW;
}
else if (aType == nsLayoutAtoms::onunderflow) {
aIID = kIDOMMenuListenerIID;
aIID = kIDOMScrollListenerIID;
*aFlags = NS_EVENT_BITS_SCROLLPORT_UNDERFLOW;
}
else if (aType == nsLayoutAtoms::onoverflowchanged) {
aIID = kIDOMScrollListenerIID;
*aFlags = NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED;
}
else if (aType == nsLayoutAtoms::ondragenter) {
aIID = NS_GET_IID(nsIDOMDragListener);
*aFlags = NS_EVENT_BITS_DRAG_ENTER;
@ -1481,14 +1491,76 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext,
}
}
break;
case NS_SCROLLPORT_OVERFLOW:
case NS_SCROLLPORT_UNDERFLOW:
case NS_SCROLLPORT_OVERFLOWCHANGED:
if (nsnull != mScrollListeners) {
if (nsnull == *aDOMEvent) {
ret = NS_NewDOMUIEvent(aDOMEvent, aPresContext, empty, aEvent);
}
if (NS_OK == ret) {
for (int i=0; mScrollListeners && i<mScrollListeners->Count(); i++) {
nsListenerStruct* ls;
nsIDOMScrollListener* scrollListener;
ls = (nsListenerStruct*)mScrollListeners->ElementAt(i);
if (ls->mFlags & aFlags) {
if (NS_OK == ls->mListener->QueryInterface(kIDOMScrollListenerIID, (void**)&scrollListener)) {
switch(aEvent->message) {
case NS_SCROLLPORT_OVERFLOW:
ret = scrollListener->Overflow(*aDOMEvent);
break;
case NS_SCROLLPORT_UNDERFLOW:
ret = scrollListener->Underflow(*aDOMEvent);
break;
case NS_SCROLLPORT_OVERFLOWCHANGED:
ret = scrollListener->OverflowChanged(*aDOMEvent);
break;
default:
break;
}
NS_RELEASE(scrollListener);
}
else {
PRBool correctSubType = PR_FALSE;
PRUint32 subType = 0;
switch(aEvent->message) {
case NS_SCROLLPORT_OVERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_OVERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_OVERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_UNDERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_UNDERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_UNDERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_OVERFLOWCHANGED:
subType = NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED) {
correctSubType = PR_TRUE;
}
break;
default:
break;
}
if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) {
ret = HandleEventSubType(ls, *aDOMEvent, aCurrentTarget, subType, aFlags);
}
}
}
}
}
}
break;
case NS_MENU_CREATE:
case NS_XUL_CLOSE:
case NS_MENU_DESTROY:
case NS_MENU_ACTION:
case NS_XUL_BROADCAST:
case NS_SCROLLPORT_OVERFLOW:
case NS_SCROLLPORT_UNDERFLOW:
case NS_XUL_COMMAND_UPDATE:
if (nsnull != mMenuListeners) {
if (nsnull == *aDOMEvent) {
@ -1519,12 +1591,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext,
case NS_XUL_BROADCAST:
ret = mMenuListener->Broadcast(*aDOMEvent);
break;
case NS_SCROLLPORT_OVERFLOW:
ret = mMenuListener->Overflow(*aDOMEvent);
break;
case NS_SCROLLPORT_UNDERFLOW:
ret = mMenuListener->Underflow(*aDOMEvent);
break;
case NS_XUL_COMMAND_UPDATE:
ret = mMenuListener->CommandUpdate(*aDOMEvent);
break;
@ -1567,18 +1633,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext,
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_OVERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_OVERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_OVERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_UNDERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_UNDERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_UNDERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_XUL_COMMAND_UPDATE:
subType = NS_EVENT_BITS_XUL_COMMAND_UPDATE;
if (ls->mSubType & NS_EVENT_BITS_XUL_COMMAND_UPDATE) {

Просмотреть файл

@ -150,6 +150,7 @@ protected:
nsVoidArray* mTextListeners;
nsVoidArray* mCompositionListeners;
nsVoidArray* mMenuListeners;
nsVoidArray* mScrollListeners;
nsCOMPtr<nsIPrincipal> mPrincipal;
PRBool mDestroyed;
@ -220,8 +221,12 @@ protected:
#define NS_EVENT_BITS_MENU_ACTION 0x08
#define NS_EVENT_BITS_XUL_BROADCAST 0x10
#define NS_EVENT_BITS_XUL_COMMAND_UPDATE 0x20
#define NS_EVENT_BITS_SCROLLPORT_OVERFLOW 0x40
#define NS_EVENT_BITS_SCROLLPORT_UNDERFLOW 0x80
//nsIScrollListener
#define NS_EVENT_BITS_SCROLLPORT_NONE 0x00
#define NS_EVENT_BITS_SCROLLPORT_OVERFLOW 0x01
#define NS_EVENT_BITS_SCROLLPORT_UNDERFLOW 0x02
#define NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED 0x04
//nsIDOMDragListener
#define NS_EVENT_BITS_DRAG_NONE 0x00

Просмотреть файл

@ -162,7 +162,7 @@ LAYOUT_ATOM(onunload, "onunload")
// scrolling
LAYOUT_ATOM(onoverflow, "onoverflow")
LAYOUT_ATOM(onunderflow, "onunderflow")
LAYOUT_ATOM(onoverflowchanged, "onoverflowchanged")
#ifdef DEBUG
// Alphabetical list of atoms used by debugging code

Просмотреть файл

@ -184,8 +184,10 @@ nsXBLBinding::kEventHandlerMap[] = {
{ "command", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "broadcast", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "commandupdate", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "overflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "underflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "overflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "underflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "overflowchanged", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "focus", nsnull, &NS_GET_IID(nsIDOMFocusListener) },
{ "blur", nsnull, &NS_GET_IID(nsIDOMFocusListener) },
@ -513,10 +515,11 @@ nsXBLBinding::InstallEventHandlers(nsIContent* aBoundElement)
GetEventHandlerIID(eventAtom, &iid, &found);
if (found) {
// Add an event listener for mouse and key events only.
PRBool mouse = IsMouseHandler(type);
PRBool key = IsKeyHandler(type);
PRBool focus = IsFocusHandler(type);
PRBool xul = IsXULHandler(type);
PRBool mouse = IsMouseHandler(type);
PRBool key = IsKeyHandler(type);
PRBool focus = IsFocusHandler(type);
PRBool xul = IsXULHandler(type);
PRBool scroll = IsScrollHandler(type);
nsCOMPtr<nsIDOMEventReceiver> receiver = do_QueryInterface(mBoundElement);
nsAutoString attachType;
@ -562,6 +565,8 @@ nsXBLBinding::InstallEventHandlers(nsIContent* aBoundElement)
receiver->AddEventListener(type, (nsIDOMKeyListener*)handler, useCapture);
else if(focus)
receiver->AddEventListener(type, (nsIDOMFocusListener*)handler, useCapture);
else if (scroll)
receiver->AddEventListener(type, (nsIDOMScrollListener*)handler, useCapture);
else
receiver->AddEventListener(type, (nsIDOMMenuListener*)handler, useCapture);
@ -1430,9 +1435,15 @@ PRBool
nsXBLBinding::IsXULHandler(const nsString& aName)
{
return ((aName.EqualsWithConversion("create")) || (aName.EqualsWithConversion("destroy")) || (aName.EqualsWithConversion("broadcast")) ||
(aName.EqualsWithConversion("command")) || (aName.EqualsWithConversion("commandupdate")) || (aName.EqualsWithConversion("close")) ||
(aName.EqualsWithConversion("overflow")) ||
(aName.EqualsWithConversion("underflow")) );
(aName.EqualsWithConversion("command")) || (aName.EqualsWithConversion("commandupdate")) || (aName.EqualsWithConversion("close")));
}
PRBool
nsXBLBinding::IsScrollHandler(const nsString& aName)
{
return (aName.EqualsWithConversion("overflow") ||
aName.EqualsWithConversion("underflow") ||
aName.EqualsWithConversion("overflowchanged"));
}
NS_IMETHODIMP

Просмотреть файл

@ -125,6 +125,7 @@ public:
static PRBool IsKeyHandler(const nsString& aName);
static PRBool IsFocusHandler(const nsString& aName);
static PRBool IsXULHandler(const nsString& aName);
static PRBool IsScrollHandler(const nsString& aName);
// Internal member functions
protected:

Просмотреть файл

@ -103,7 +103,7 @@ nsXBLEventHandler::~nsXBLEventHandler()
}
}
NS_IMPL_ISUPPORTS4(nsXBLEventHandler, nsIDOMKeyListener, nsIDOMMouseListener, nsIDOMMenuListener, nsIDOMFocusListener)
NS_IMPL_ISUPPORTS5(nsXBLEventHandler, nsIDOMKeyListener, nsIDOMMouseListener, nsIDOMMenuListener, nsIDOMFocusListener, nsIDOMScrollListener)
nsresult nsXBLEventHandler::HandleEvent(nsIDOMEvent* aEvent)
{
@ -293,6 +293,15 @@ nsresult nsXBLEventHandler::Underflow(nsIDOMEvent* aEvent)
return NS_OK;
}
nsresult nsXBLEventHandler::OverflowChanged(nsIDOMEvent* aEvent)
{
if (!mEventName.EqualsWithConversion("underflowchanged"))
return NS_OK;
ExecuteHandler(NS_ConvertASCIItoUCS2("underflowchanged"), aEvent);
return NS_OK;
}
nsresult nsXBLEventHandler::Destroy(nsIDOMEvent* aEvent)
{
if (!mEventName.EqualsWithConversion("destroy"))
@ -666,6 +675,7 @@ nsXBLEventHandler::RemoveEventHandlers()
PRBool key = nsXBLBinding::IsKeyHandler(type);
PRBool focus = nsXBLBinding::IsFocusHandler(type);
PRBool xul = nsXBLBinding::IsXULHandler(type);
PRBool scroll = nsXBLBinding::IsScrollHandler(type);
// Remove the event listener.
if (mouse)
@ -674,6 +684,8 @@ nsXBLEventHandler::RemoveEventHandlers()
receiver->RemoveEventListener(type, (nsIDOMKeyListener*)this, useCapture);
else if(focus)
receiver->RemoveEventListener(type, (nsIDOMFocusListener*)this, useCapture);
else if(scroll)
receiver->RemoveEventListener(type, (nsIDOMScrollListener*)this, useCapture);
else
receiver->RemoveEventListener(type, (nsIDOMMenuListener*)this, useCapture);
}

Просмотреть файл

@ -29,6 +29,7 @@
#include "nsIDOMKeyListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMFocusListener.h"
#include "nsIDOMScrollListener.h"
class nsIXBLBinding;
class nsIDOMEvent;
@ -42,7 +43,8 @@ class nsIController;
class nsXBLEventHandler : public nsIDOMKeyListener,
public nsIDOMMouseListener,
public nsIDOMMenuListener,
public nsIDOMFocusListener
public nsIDOMFocusListener,
public nsIDOMScrollListener
{
public:
nsXBLEventHandler(nsIContent* aBoundElement, nsIContent* aHandlerElement, const nsString& aEventName);
@ -64,14 +66,18 @@ public:
virtual nsresult Focus(nsIDOMEvent* aMouseEvent);
virtual nsresult Blur(nsIDOMEvent* aMouseEvent);
// menu
NS_IMETHOD Create(nsIDOMEvent* aEvent);
NS_IMETHOD Close(nsIDOMEvent* aEvent);
NS_IMETHOD Destroy(nsIDOMEvent* aEvent);
NS_IMETHOD Action(nsIDOMEvent* aEvent);
NS_IMETHOD Broadcast(nsIDOMEvent* aEvent);
NS_IMETHOD CommandUpdate(nsIDOMEvent* aEvent);
// scroll
NS_IMETHOD Overflow(nsIDOMEvent* aEvent);
NS_IMETHOD Underflow(nsIDOMEvent* aEvent);
NS_IMETHOD OverflowChanged(nsIDOMEvent* aEvent);
NS_DECL_ISUPPORTS

Просмотреть файл

@ -55,6 +55,7 @@
#include "nsIDOMKeyListener.h"
#include "nsIDOMFormListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMScrollListener.h"
#include "nsIDOMDragListener.h"
#include "nsIRDFNode.h"
#include "nsINameSpace.h"
@ -218,8 +219,10 @@ nsXULContentUtils::kEventHandlerMap[] = {
{ "oncommand", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onbroadcast", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "oncommandupdate", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onoverflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onunderflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onoverflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "onunderflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "onoverflowchanged",nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "onfocus", nsnull, &NS_GET_IID(nsIDOMFocusListener) },
{ "onblur", nsnull, &NS_GET_IID(nsIDOMFocusListener) },

Просмотреть файл

@ -49,6 +49,7 @@ EXPORTS = \
nsIDOMTextListener.h \
nsIDOMCompositionListener.h \
nsIDOMMenuListener.h \
nsIDOMScrollListener.h \
$(NULL)
EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))

Просмотреть файл

@ -45,6 +45,7 @@ EXPORTS = \
nsIDOMTextListener.h \
nsIDOMCompositionListener.h \
nsIDOMMenuListener.h \
nsIDOMScrollListener.h \
$(NULL)
MODULE=dom

Просмотреть файл

@ -42,8 +42,6 @@ public:
NS_IMETHOD Action(nsIDOMEvent* aEvent) = 0;
NS_IMETHOD Broadcast(nsIDOMEvent* aEvent) = 0;
NS_IMETHOD CommandUpdate(nsIDOMEvent* aEvent) = 0;
NS_IMETHOD Overflow(nsIDOMEvent* aEvent) = 0;
NS_IMETHOD Underflow(nsIDOMEvent* aEvent) = 0;
};
#endif // nsIDOMMenuListener_h__

Просмотреть файл

@ -162,7 +162,7 @@ LAYOUT_ATOM(onunload, "onunload")
// scrolling
LAYOUT_ATOM(onoverflow, "onoverflow")
LAYOUT_ATOM(onunderflow, "onunderflow")
LAYOUT_ATOM(onoverflowchanged, "onoverflowchanged")
#ifdef DEBUG
// Alphabetical list of atoms used by debugging code

Просмотреть файл

@ -162,7 +162,7 @@ LAYOUT_ATOM(onunload, "onunload")
// scrolling
LAYOUT_ATOM(onoverflow, "onoverflow")
LAYOUT_ATOM(onunderflow, "onunderflow")
LAYOUT_ATOM(onoverflowchanged, "onoverflowchanged")
#ifdef DEBUG
// Alphabetical list of atoms used by debugging code

Просмотреть файл

@ -50,7 +50,7 @@ static char* mEventNames[] = {
"submit", "reset", "change", "select", "input", "paint" ,"text",
"create", "close", "destroy", "command", "broadcast", "commandupdate",
"dragenter", "dragover", "dragexit", "dragdrop", "draggesture", "resize",
"scroll","overflow", "underflow"
"scroll","overflow", "underflow", "overflowchanged"
};
nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, const nsString& aEventType) {
@ -1147,6 +1147,8 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType)
return mEventNames[eDOMEvents_overflow];
case NS_SCROLLPORT_UNDERFLOW:
return mEventNames[eDOMEvents_underflow];
case NS_SCROLLPORT_OVERFLOWCHANGED:
return mEventNames[eDOMEvents_overflowchanged];
default:
break;
}

Просмотреть файл

@ -86,7 +86,8 @@ public:
eDOMEvents_resize,
eDOMEvents_scroll,
eDOMEvents_overflow,
eDOMEvents_underflow
eDOMEvents_underflow,
eDOMEvents_overflowchanged
};
nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, const nsString& aEventType);

Просмотреть файл

@ -31,6 +31,7 @@
#include "nsIDOMTextListener.h"
#include "nsIDOMCompositionListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMScrollListener.h"
NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID);
NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID);
@ -43,3 +44,4 @@ NS_DEFINE_IID(kIDOMPaintListenerIID, NS_IDOMPAINTLISTENER_IID);
NS_DEFINE_IID(kIDOMTextListenerIID,NS_IDOMTEXTLISTENER_IID);
NS_DEFINE_IID(kIDOMCompositionListenerIID,NS_IDOMCOMPOSITIONLISTENER_IID);
NS_DEFINE_IID(kIDOMMenuListenerIID, NS_IDOMMENULISTENER_IID);
NS_DEFINE_IID(kIDOMScrollListenerIID, NS_IDOMSCROLLLISTENER_IID);

Просмотреть файл

@ -35,5 +35,6 @@ extern const nsIID kIDOMPaintListenerIID;
extern const nsIID kIDOMTextListenerIID;
extern const nsIID kIDOMCompositionListenerIID;
extern const nsIID kIDOMMenuListenerIID;
extern const nsIID kIDOMScrollListenerIID;
#endif /* nsDOMEVENTSIIDs_h___ */

Просмотреть файл

@ -36,6 +36,7 @@
#include "nsIDOMTextListener.h"
#include "nsIDOMCompositionListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMScrollListener.h"
#include "nsIEventStateManager.h"
#include "nsIPrivateDOMEvent.h"
#include "nsIScriptObjectOwner.h"
@ -75,6 +76,7 @@ nsEventListenerManager::nsEventListenerManager()
mTextListeners = nsnull;
mCompositionListeners = nsnull;
mMenuListeners = nsnull;
mScrollListeners = nsnull;
mDestroyed = PR_FALSE;
mTarget = nsnull;
NS_INIT_REFCNT();
@ -94,6 +96,7 @@ nsEventListenerManager::~nsEventListenerManager()
ReleaseListeners(&mTextListeners, PR_FALSE);
ReleaseListeners(&mCompositionListeners, PR_FALSE);
ReleaseListeners(&mMenuListeners, PR_FALSE);
ReleaseListeners(&mScrollListeners, PR_FALSE);
}
NS_IMPL_ADDREF(nsEventListenerManager)
@ -178,6 +181,9 @@ nsVoidArray** nsEventListenerManager::GetListenersByIID(const nsIID& aIID)
else if (aIID.Equals(kIDOMMenuListenerIID)) {
return &mMenuListeners;
}
else if (aIID.Equals(kIDOMScrollListenerIID)) {
return &mScrollListeners;
}
return nsnull;
}
@ -451,13 +457,17 @@ nsresult nsEventListenerManager::GetIdentifiersForType(nsIAtom* aType, nsIID& aI
*aFlags = NS_EVENT_BITS_XUL_COMMAND_UPDATE;
}
else if (aType == nsLayoutAtoms::onoverflow) {
aIID = kIDOMMenuListenerIID;
aIID = kIDOMScrollListenerIID;
*aFlags = NS_EVENT_BITS_SCROLLPORT_OVERFLOW;
}
else if (aType == nsLayoutAtoms::onunderflow) {
aIID = kIDOMMenuListenerIID;
aIID = kIDOMScrollListenerIID;
*aFlags = NS_EVENT_BITS_SCROLLPORT_UNDERFLOW;
}
else if (aType == nsLayoutAtoms::onoverflowchanged) {
aIID = kIDOMScrollListenerIID;
*aFlags = NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED;
}
else if (aType == nsLayoutAtoms::ondragenter) {
aIID = NS_GET_IID(nsIDOMDragListener);
*aFlags = NS_EVENT_BITS_DRAG_ENTER;
@ -1481,14 +1491,76 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext,
}
}
break;
case NS_SCROLLPORT_OVERFLOW:
case NS_SCROLLPORT_UNDERFLOW:
case NS_SCROLLPORT_OVERFLOWCHANGED:
if (nsnull != mScrollListeners) {
if (nsnull == *aDOMEvent) {
ret = NS_NewDOMUIEvent(aDOMEvent, aPresContext, empty, aEvent);
}
if (NS_OK == ret) {
for (int i=0; mScrollListeners && i<mScrollListeners->Count(); i++) {
nsListenerStruct* ls;
nsIDOMScrollListener* scrollListener;
ls = (nsListenerStruct*)mScrollListeners->ElementAt(i);
if (ls->mFlags & aFlags) {
if (NS_OK == ls->mListener->QueryInterface(kIDOMScrollListenerIID, (void**)&scrollListener)) {
switch(aEvent->message) {
case NS_SCROLLPORT_OVERFLOW:
ret = scrollListener->Overflow(*aDOMEvent);
break;
case NS_SCROLLPORT_UNDERFLOW:
ret = scrollListener->Underflow(*aDOMEvent);
break;
case NS_SCROLLPORT_OVERFLOWCHANGED:
ret = scrollListener->OverflowChanged(*aDOMEvent);
break;
default:
break;
}
NS_RELEASE(scrollListener);
}
else {
PRBool correctSubType = PR_FALSE;
PRUint32 subType = 0;
switch(aEvent->message) {
case NS_SCROLLPORT_OVERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_OVERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_OVERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_UNDERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_UNDERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_UNDERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_OVERFLOWCHANGED:
subType = NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED) {
correctSubType = PR_TRUE;
}
break;
default:
break;
}
if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) {
ret = HandleEventSubType(ls, *aDOMEvent, aCurrentTarget, subType, aFlags);
}
}
}
}
}
}
break;
case NS_MENU_CREATE:
case NS_XUL_CLOSE:
case NS_MENU_DESTROY:
case NS_MENU_ACTION:
case NS_XUL_BROADCAST:
case NS_SCROLLPORT_OVERFLOW:
case NS_SCROLLPORT_UNDERFLOW:
case NS_XUL_COMMAND_UPDATE:
if (nsnull != mMenuListeners) {
if (nsnull == *aDOMEvent) {
@ -1519,12 +1591,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext,
case NS_XUL_BROADCAST:
ret = mMenuListener->Broadcast(*aDOMEvent);
break;
case NS_SCROLLPORT_OVERFLOW:
ret = mMenuListener->Overflow(*aDOMEvent);
break;
case NS_SCROLLPORT_UNDERFLOW:
ret = mMenuListener->Underflow(*aDOMEvent);
break;
case NS_XUL_COMMAND_UPDATE:
ret = mMenuListener->CommandUpdate(*aDOMEvent);
break;
@ -1567,18 +1633,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext,
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_OVERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_OVERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_OVERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_SCROLLPORT_UNDERFLOW:
subType = NS_EVENT_BITS_SCROLLPORT_UNDERFLOW;
if (ls->mSubType & NS_EVENT_BITS_SCROLLPORT_UNDERFLOW) {
correctSubType = PR_TRUE;
}
break;
case NS_XUL_COMMAND_UPDATE:
subType = NS_EVENT_BITS_XUL_COMMAND_UPDATE;
if (ls->mSubType & NS_EVENT_BITS_XUL_COMMAND_UPDATE) {

Просмотреть файл

@ -150,6 +150,7 @@ protected:
nsVoidArray* mTextListeners;
nsVoidArray* mCompositionListeners;
nsVoidArray* mMenuListeners;
nsVoidArray* mScrollListeners;
nsCOMPtr<nsIPrincipal> mPrincipal;
PRBool mDestroyed;
@ -220,8 +221,12 @@ protected:
#define NS_EVENT_BITS_MENU_ACTION 0x08
#define NS_EVENT_BITS_XUL_BROADCAST 0x10
#define NS_EVENT_BITS_XUL_COMMAND_UPDATE 0x20
#define NS_EVENT_BITS_SCROLLPORT_OVERFLOW 0x40
#define NS_EVENT_BITS_SCROLLPORT_UNDERFLOW 0x80
//nsIScrollListener
#define NS_EVENT_BITS_SCROLLPORT_NONE 0x00
#define NS_EVENT_BITS_SCROLLPORT_OVERFLOW 0x01
#define NS_EVENT_BITS_SCROLLPORT_UNDERFLOW 0x02
#define NS_EVENT_BITS_SCROLLPORT_OVERFLOWCHANGED 0x04
//nsIDOMDragListener
#define NS_EVENT_BITS_DRAG_NONE 0x00

Просмотреть файл

@ -184,8 +184,10 @@ nsXBLBinding::kEventHandlerMap[] = {
{ "command", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "broadcast", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "commandupdate", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "overflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "underflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "overflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "underflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "overflowchanged", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "focus", nsnull, &NS_GET_IID(nsIDOMFocusListener) },
{ "blur", nsnull, &NS_GET_IID(nsIDOMFocusListener) },
@ -513,10 +515,11 @@ nsXBLBinding::InstallEventHandlers(nsIContent* aBoundElement)
GetEventHandlerIID(eventAtom, &iid, &found);
if (found) {
// Add an event listener for mouse and key events only.
PRBool mouse = IsMouseHandler(type);
PRBool key = IsKeyHandler(type);
PRBool focus = IsFocusHandler(type);
PRBool xul = IsXULHandler(type);
PRBool mouse = IsMouseHandler(type);
PRBool key = IsKeyHandler(type);
PRBool focus = IsFocusHandler(type);
PRBool xul = IsXULHandler(type);
PRBool scroll = IsScrollHandler(type);
nsCOMPtr<nsIDOMEventReceiver> receiver = do_QueryInterface(mBoundElement);
nsAutoString attachType;
@ -562,6 +565,8 @@ nsXBLBinding::InstallEventHandlers(nsIContent* aBoundElement)
receiver->AddEventListener(type, (nsIDOMKeyListener*)handler, useCapture);
else if(focus)
receiver->AddEventListener(type, (nsIDOMFocusListener*)handler, useCapture);
else if (scroll)
receiver->AddEventListener(type, (nsIDOMScrollListener*)handler, useCapture);
else
receiver->AddEventListener(type, (nsIDOMMenuListener*)handler, useCapture);
@ -1430,9 +1435,15 @@ PRBool
nsXBLBinding::IsXULHandler(const nsString& aName)
{
return ((aName.EqualsWithConversion("create")) || (aName.EqualsWithConversion("destroy")) || (aName.EqualsWithConversion("broadcast")) ||
(aName.EqualsWithConversion("command")) || (aName.EqualsWithConversion("commandupdate")) || (aName.EqualsWithConversion("close")) ||
(aName.EqualsWithConversion("overflow")) ||
(aName.EqualsWithConversion("underflow")) );
(aName.EqualsWithConversion("command")) || (aName.EqualsWithConversion("commandupdate")) || (aName.EqualsWithConversion("close")));
}
PRBool
nsXBLBinding::IsScrollHandler(const nsString& aName)
{
return (aName.EqualsWithConversion("overflow") ||
aName.EqualsWithConversion("underflow") ||
aName.EqualsWithConversion("overflowchanged"));
}
NS_IMETHODIMP

Просмотреть файл

@ -125,6 +125,7 @@ public:
static PRBool IsKeyHandler(const nsString& aName);
static PRBool IsFocusHandler(const nsString& aName);
static PRBool IsXULHandler(const nsString& aName);
static PRBool IsScrollHandler(const nsString& aName);
// Internal member functions
protected:

Просмотреть файл

@ -103,7 +103,7 @@ nsXBLEventHandler::~nsXBLEventHandler()
}
}
NS_IMPL_ISUPPORTS4(nsXBLEventHandler, nsIDOMKeyListener, nsIDOMMouseListener, nsIDOMMenuListener, nsIDOMFocusListener)
NS_IMPL_ISUPPORTS5(nsXBLEventHandler, nsIDOMKeyListener, nsIDOMMouseListener, nsIDOMMenuListener, nsIDOMFocusListener, nsIDOMScrollListener)
nsresult nsXBLEventHandler::HandleEvent(nsIDOMEvent* aEvent)
{
@ -293,6 +293,15 @@ nsresult nsXBLEventHandler::Underflow(nsIDOMEvent* aEvent)
return NS_OK;
}
nsresult nsXBLEventHandler::OverflowChanged(nsIDOMEvent* aEvent)
{
if (!mEventName.EqualsWithConversion("underflowchanged"))
return NS_OK;
ExecuteHandler(NS_ConvertASCIItoUCS2("underflowchanged"), aEvent);
return NS_OK;
}
nsresult nsXBLEventHandler::Destroy(nsIDOMEvent* aEvent)
{
if (!mEventName.EqualsWithConversion("destroy"))
@ -666,6 +675,7 @@ nsXBLEventHandler::RemoveEventHandlers()
PRBool key = nsXBLBinding::IsKeyHandler(type);
PRBool focus = nsXBLBinding::IsFocusHandler(type);
PRBool xul = nsXBLBinding::IsXULHandler(type);
PRBool scroll = nsXBLBinding::IsScrollHandler(type);
// Remove the event listener.
if (mouse)
@ -674,6 +684,8 @@ nsXBLEventHandler::RemoveEventHandlers()
receiver->RemoveEventListener(type, (nsIDOMKeyListener*)this, useCapture);
else if(focus)
receiver->RemoveEventListener(type, (nsIDOMFocusListener*)this, useCapture);
else if(scroll)
receiver->RemoveEventListener(type, (nsIDOMScrollListener*)this, useCapture);
else
receiver->RemoveEventListener(type, (nsIDOMMenuListener*)this, useCapture);
}

Просмотреть файл

@ -29,6 +29,7 @@
#include "nsIDOMKeyListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMFocusListener.h"
#include "nsIDOMScrollListener.h"
class nsIXBLBinding;
class nsIDOMEvent;
@ -42,7 +43,8 @@ class nsIController;
class nsXBLEventHandler : public nsIDOMKeyListener,
public nsIDOMMouseListener,
public nsIDOMMenuListener,
public nsIDOMFocusListener
public nsIDOMFocusListener,
public nsIDOMScrollListener
{
public:
nsXBLEventHandler(nsIContent* aBoundElement, nsIContent* aHandlerElement, const nsString& aEventName);
@ -64,14 +66,18 @@ public:
virtual nsresult Focus(nsIDOMEvent* aMouseEvent);
virtual nsresult Blur(nsIDOMEvent* aMouseEvent);
// menu
NS_IMETHOD Create(nsIDOMEvent* aEvent);
NS_IMETHOD Close(nsIDOMEvent* aEvent);
NS_IMETHOD Destroy(nsIDOMEvent* aEvent);
NS_IMETHOD Action(nsIDOMEvent* aEvent);
NS_IMETHOD Broadcast(nsIDOMEvent* aEvent);
NS_IMETHOD CommandUpdate(nsIDOMEvent* aEvent);
// scroll
NS_IMETHOD Overflow(nsIDOMEvent* aEvent);
NS_IMETHOD Underflow(nsIDOMEvent* aEvent);
NS_IMETHOD OverflowChanged(nsIDOMEvent* aEvent);
NS_DECL_ISUPPORTS

Просмотреть файл

@ -55,6 +55,7 @@
#include "nsIDOMKeyListener.h"
#include "nsIDOMFormListener.h"
#include "nsIDOMMenuListener.h"
#include "nsIDOMScrollListener.h"
#include "nsIDOMDragListener.h"
#include "nsIRDFNode.h"
#include "nsINameSpace.h"
@ -218,8 +219,10 @@ nsXULContentUtils::kEventHandlerMap[] = {
{ "oncommand", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onbroadcast", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "oncommandupdate", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onoverflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onunderflow", nsnull, &NS_GET_IID(nsIDOMMenuListener) },
{ "onoverflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "onunderflow", nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "onoverflowchanged",nsnull, &NS_GET_IID(nsIDOMScrollListener) },
{ "onfocus", nsnull, &NS_GET_IID(nsIDOMFocusListener) },
{ "onblur", nsnull, &NS_GET_IID(nsIDOMFocusListener) },

Просмотреть файл

@ -423,6 +423,7 @@ enum nsDragDropEventStatus {
#define NS_SCROLLPORT_START 1700
#define NS_SCROLLPORT_UNDERFLOW (NS_SCROLLPORT_START)
#define NS_SCROLLPORT_OVERFLOW (NS_SCROLLPORT_START+1)
#define NS_SCROLLPORT_OVERFLOWCHANGED (NS_SCROLLPORT_START+2)
#define NS_IS_MOUSE_EVENT(evnt) \
(((evnt)->message == NS_MOUSE_LEFT_BUTTON_DOWN) || \