From 131186b3edb9ca786f0f71bd8a258307ddbe2da6 Mon Sep 17 00:00:00 2001 From: "neil%parkwaycc.co.uk" Date: Fri, 18 Feb 2005 09:36:29 +0000 Subject: [PATCH] Removing an event handler should not disturb firing of other event handlers b=174320 based on a patch by Silver r+sr=jst --- content/events/src/nsEventListenerManager.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/content/events/src/nsEventListenerManager.cpp b/content/events/src/nsEventListenerManager.cpp index 3158f687323d..b048f066d2d1 100644 --- a/content/events/src/nsEventListenerManager.cpp +++ b/content/events/src/nsEventListenerManager.cpp @@ -1593,11 +1593,16 @@ nsresult nsEventListenerManager::HandleEvent(nsPresContext* aPresContext, } if (NS_SUCCEEDED(ret)) { + PRInt32 count = listeners->Count(); + nsVoidArray originalListeners(count); + originalListeners = *listeners; + nsAutoPopupStatePusher popupStatePusher(nsDOMEvent::GetEventPopupControlState(aEvent)); - for (int k = 0; !mListenersRemoved && listeners && k < listeners->Count(); ++k) { - nsListenerStruct* ls = NS_STATIC_CAST(nsListenerStruct*, listeners->ElementAt(k)); - if (ls->mFlags & aFlags && ls->mGroupFlags == currentGroup) { + for (int k = 0; !mListenersRemoved && listeners && k < count; ++k) { + nsListenerStruct* ls = NS_STATIC_CAST(nsListenerStruct*, originalListeners.FastElementAt(k)); + // Don't fire the listener if it's been removed + if (listeners->IndexOf(ls) != -1 && ls->mFlags & aFlags && ls->mGroupFlags == currentGroup) { // Try the type-specific listener interface PRBool hasInterface = PR_FALSE; if (typeData)