diff --git a/content/events/src/nsEventListenerManager.cpp b/content/events/src/nsEventListenerManager.cpp index 41ba26d2ac85..e1f4ef5a64b6 100644 --- a/content/events/src/nsEventListenerManager.cpp +++ b/content/events/src/nsEventListenerManager.cpp @@ -1059,7 +1059,7 @@ nsresult nsEventListenerManager::HandleEventSubType(nsListenerStruct* aListenerStruct, nsIDOMEventListener* aListener, nsIDOMEvent* aDOMEvent, - nsISupports* aCurrentTarget, + nsPIDOMEventTarget* aCurrentTarget, PRUint32 aPhaseFlags) { nsresult result = NS_OK; @@ -1083,7 +1083,10 @@ nsEventListenerManager::HandleEventSubType(nsListenerStruct* aListenerStruct, } } - if (NS_SUCCEEDED(result)) { + // nsCxPusher will push and pop (automatically) the current cx onto the + // context stack + nsCxPusher pusher; + if (NS_SUCCEEDED(result) && pusher.Push(aCurrentTarget)) { // nsIDOMEvent::currentTarget is set in nsEventDispatcher. result = aListener->HandleEvent(aDOMEvent); } @@ -1163,10 +1166,6 @@ found: nsAutoTObserverArray::EndLimitedIterator iter(mListeners); nsAutoPopupStatePusher popupStatePusher(nsDOMEvent::GetEventPopupControlState(aEvent)); PRBool hasListener = PR_FALSE; - // nsCxPusher will push and pop (automatically) the current cx onto the - // context stack - nsCxPusher pusher; - PRBool didPush = PR_FALSE; while (iter.HasMore()) { nsListenerStruct* ls = &iter.GetNext(); PRBool useTypeInterface = @@ -1190,14 +1189,9 @@ found: if (*aDOMEvent) { nsRefPtr kungFuDeathGrip = ls->mListener; if (useTypeInterface) { - if (didPush) { - didPush = PR_FALSE; - pusher.Pop(); - } DispatchToInterface(*aDOMEvent, ls->mListener, dispData->method, *typeData->iid); - } else if (useGenericInterface && - (didPush || (didPush = pusher.Push(aCurrentTarget)))) { + } else if (useGenericInterface) { HandleEventSubType(ls, ls->mListener, *aDOMEvent, aCurrentTarget, aFlags); } diff --git a/content/events/src/nsEventListenerManager.h b/content/events/src/nsEventListenerManager.h index 6a5e19806099..2542b1a1ff01 100644 --- a/content/events/src/nsEventListenerManager.h +++ b/content/events/src/nsEventListenerManager.h @@ -151,7 +151,7 @@ protected: nsresult HandleEventSubType(nsListenerStruct* aListenerStruct, nsIDOMEventListener* aListener, nsIDOMEvent* aDOMEvent, - nsISupports* aCurrentTarget, + nsPIDOMEventTarget* aCurrentTarget, PRUint32 aPhaseFlags); nsresult CompileEventHandlerInternal(nsIScriptContext *aContext, void *aScopeObject,