diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index 9b0d45cd3ce..47bc60108ee 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -2277,6 +2277,7 @@ nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &mDOMEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; } //Capturing stage @@ -2289,7 +2290,8 @@ nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } @@ -2345,13 +2347,12 @@ nsresult nsDocument::RemoveEventListenerByIID(nsIDOMEventListener *aListener, co } nsresult nsDocument::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -2361,11 +2362,10 @@ nsresult nsDocument::AddEventListener(const nsString& aType, nsIDOMEventListener } nsresult nsDocument::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/content/base/src/nsDocument.h b/mozilla/content/base/src/nsDocument.h index 507de23bfd5..78ff0280b44 100644 --- a/mozilla/content/base/src/nsDocument.h +++ b/mozilla/content/base/src/nsDocument.h @@ -370,9 +370,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.cpp b/mozilla/content/base/src/nsGenericDOMDataNode.cpp index 0c78dc46ac1..03554d5e766 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/content/base/src/nsGenericDOMDataNode.cpp @@ -461,13 +461,12 @@ nsGenericDOMDataNode::RemoveEventListenerByIID(nsIDOMEventListener* aListener, nsresult nsGenericDOMDataNode::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -478,11 +477,10 @@ nsGenericDOMDataNode::AddEventListener(const nsString& aType, nsIDOMEventListene nsresult nsGenericDOMDataNode::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; @@ -694,6 +692,7 @@ nsGenericDOMDataNode::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; //Initiate capturing phase. Special case first call to document if (nsnull != mDocument) { @@ -708,7 +707,7 @@ nsGenericDOMDataNode::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (!(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH) && nsnull != mListenerManager) { mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.h b/mozilla/content/base/src/nsGenericDOMDataNode.h index 0f1d205c08b..34a8bbdd6b3 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.h +++ b/mozilla/content/base/src/nsGenericDOMDataNode.h @@ -113,9 +113,9 @@ struct nsGenericDOMDataNode { // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); nsresult RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIScriptObjectOwner interface nsresult GetScriptObject(nsIScriptContext* aContext, void** aScriptObject); @@ -353,15 +353,13 @@ struct nsGenericDOMDataNode { } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.AddEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.AddEventListener(aType, aListener, aUseCapture); \ } \ NS_IMETHOD RemoveEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.RemoveEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.RemoveEventListener(aType, aListener, aUseCapture); \ } /** diff --git a/mozilla/content/base/src/nsGenericElement.cpp b/mozilla/content/base/src/nsGenericElement.cpp index 248536ff420..e764a708150 100644 --- a/mozilla/content/base/src/nsGenericElement.cpp +++ b/mozilla/content/base/src/nsGenericElement.cpp @@ -757,8 +757,8 @@ nsGenericElement::HandleDOMEvent(nsIPresContext& aPresContext, nsIDOMEvent* domEvent = nsnull; if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; - //Initiate capturing phase //Initiate capturing phase. Special case first call to document if (nsnull != mDocument) { mDocument->HandleDOMEvent(aPresContext, aEvent, aDOMEvent, NS_EVENT_FLAG_CAPTURE, aEventStatus); @@ -774,12 +774,14 @@ nsGenericElement::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } //Bubbling stage - if ((NS_EVENT_FLAG_CAPTURE != aFlags) && (mParent != nsnull) && (mDocument != nsnull)) { + if ((NS_EVENT_FLAG_CAPTURE != aFlags) && + (mParent != nsnull) && (mDocument != nsnull)) { ret = mParent->HandleDOMEvent(aPresContext, aEvent, aDOMEvent, NS_EVENT_FLAG_BUBBLE, aEventStatus); } @@ -1004,13 +1006,12 @@ nsGenericElement::RemoveEventListenerByIID(nsIDOMEventListener* aListener, nsresult nsGenericElement::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -1021,11 +1022,10 @@ nsGenericElement::AddEventListener(const nsString& aType, nsIDOMEventListener* a nsresult nsGenericElement::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/content/base/src/nsGenericElement.h b/mozilla/content/base/src/nsGenericElement.h index 65449de1d4e..77b8c853c5a 100644 --- a/mozilla/content/base/src/nsGenericElement.h +++ b/mozilla/content/base/src/nsGenericElement.h @@ -126,9 +126,9 @@ public: // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); nsresult RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIScriptObjectOwner interface nsresult GetScriptObject(nsIScriptContext* aContext, void** aScriptObject); @@ -398,15 +398,13 @@ public: } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.AddEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.AddEventListener(aType, aListener, aUseCapture); \ } \ NS_IMETHOD RemoveEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.RemoveEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.RemoveEventListener(aType, aListener, aUseCapture); \ } #define NS_IMPL_ICONTENT_USING_GENERIC(_g) \ diff --git a/mozilla/content/events/public/nsIEventListenerManager.h b/mozilla/content/events/public/nsIEventListenerManager.h index 72baa9f48d9..6b297cd5793 100644 --- a/mozilla/content/events/public/nsIEventListenerManager.h +++ b/mozilla/content/events/public/nsIEventListenerManager.h @@ -127,6 +127,12 @@ public: virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener) = 0; + /** + * Removes all events listeners registered by this instance of the listener + * manager. + */ + + virtual nsresult RemoveAllListeners() = 0; }; extern NS_HTML nsresult NS_NewEventListenerManager(nsIEventListenerManager** aInstancePtrResult); diff --git a/mozilla/content/events/src/nsDOMEvent.cpp b/mozilla/content/events/src/nsDOMEvent.cpp index 0358cb9229e..78a788a820c 100644 --- a/mozilla/content/events/src/nsDOMEvent.cpp +++ b/mozilla/content/events/src/nsDOMEvent.cpp @@ -175,25 +175,44 @@ nsDOMEvent::GetCurrentNode(nsIDOMNode** aCurrentNode) NS_IMETHODIMP nsDOMEvent::GetEventPhase(PRUint16* aEventPhase) { - *aEventPhase = 0; + if (mEvent->flags & NS_EVENT_FLAG_CAPTURE) { + *aEventPhase = CAPTURING_PHASE; + } + else if (mEvent->flags & NS_EVENT_FLAG_BUBBLE) { + *aEventPhase = BUBBLING_PHASE; + } + else if (mEvent->flags & NS_EVENT_FLAG_INIT) { + *aEventPhase = AT_TARGET; + } + else { + *aEventPhase = 0; + } + return NS_OK; } NS_IMETHODIMP nsDOMEvent::PreventBubble() { + if (mEvent->flags & NS_EVENT_FLAG_BUBBLE || mEvent->flags & NS_EVENT_FLAG_INIT) { + mEvent->flags |= NS_EVENT_FLAG_STOP_DISPATCH; + } return NS_OK; } NS_IMETHODIMP nsDOMEvent::PreventCapture() { + if (mEvent->flags & NS_EVENT_FLAG_CAPTURE) { + mEvent->flags |= NS_EVENT_FLAG_STOP_DISPATCH; + } return NS_OK; } NS_IMETHODIMP nsDOMEvent::PreventDefault() { + mEvent->flags |= NS_EVENT_FLAG_NO_DEFAULT; return NS_OK; } @@ -400,7 +419,7 @@ NS_METHOD nsDOMEvent::GetKeyCode(PRUint32* aKeyCode) return NS_OK; } -NS_METHOD nsDOMEvent::GetButton(PRUint32* aButton) +NS_METHOD nsDOMEvent::GetButton(PRUint16* aButton) { switch (mEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: @@ -427,6 +446,13 @@ NS_METHOD nsDOMEvent::GetButton(PRUint32* aButton) return NS_OK; } +NS_METHOD nsDOMEvent::GetClickcount(PRUint16* aClickcount) +{ + //XXX implement me. + *aClickcount = 1; + return NS_OK; +} + // nsINSEventInterface NS_METHOD nsDOMEvent::GetLayerX(PRInt32* aLayerX) { @@ -460,7 +486,11 @@ NS_METHOD nsDOMEvent::GetWhich(PRUint32* aWhich) case NS_KEY_EVENT: return GetKeyCode(aWhich); case NS_MOUSE_EVENT: - return GetButton(aWhich); + { + PRUint16 button; + nsresult ret = GetButton(&button); + *aWhich = button; + } } return NS_OK; } diff --git a/mozilla/content/events/src/nsDOMEvent.h b/mozilla/content/events/src/nsDOMEvent.h index 1f0193dc1d9..a1a7251dc5b 100644 --- a/mozilla/content/events/src/nsDOMEvent.h +++ b/mozilla/content/events/src/nsDOMEvent.h @@ -81,7 +81,7 @@ public: NS_IMETHOD PreventDefault(); - NS_IMETHOD GetText(nsString& aText); + NS_IMETHOD GetText(nsString& aText); NS_IMETHOD GetInputRange(nsIDOMTextRangeList** aInputRange); @@ -107,8 +107,10 @@ public: NS_IMETHOD GetKeyCode(PRUint32* aKeyCode); - NS_IMETHOD GetButton(PRUint32* aButton); + NS_IMETHOD GetButton(PRUint16* aButton); + NS_IMETHOD GetClickcount(PRUint16* aClickcount); + // nsIDOMNSEvent interface NS_IMETHOD GetLayerX(PRInt32* aLayerX); diff --git a/mozilla/content/events/src/nsEventListenerManager.cpp b/mozilla/content/events/src/nsEventListenerManager.cpp index dd5ce86aa55..dbe7bd608aa 100644 --- a/mozilla/content/events/src/nsEventListenerManager.cpp +++ b/mozilla/content/events/src/nsEventListenerManager.cpp @@ -65,17 +65,17 @@ nsEventListenerManager::nsEventListenerManager() nsEventListenerManager::~nsEventListenerManager() { - ReleaseListeners(mEventListeners); - ReleaseListeners(mMouseListeners); - ReleaseListeners(mMouseMotionListeners); - ReleaseListeners(mKeyListeners); - ReleaseListeners(mLoadListeners); - ReleaseListeners(mFocusListeners); - ReleaseListeners(mFormListeners); - ReleaseListeners(mDragListeners); - ReleaseListeners(mPaintListeners); - ReleaseListeners(mTextListeners); - ReleaseListeners(mCompositionListeners); + ReleaseListeners(&mEventListeners); + ReleaseListeners(&mMouseListeners); + ReleaseListeners(&mMouseMotionListeners); + ReleaseListeners(&mKeyListeners); + ReleaseListeners(&mLoadListeners); + ReleaseListeners(&mFocusListeners); + ReleaseListeners(&mFormListeners); + ReleaseListeners(&mDragListeners); + ReleaseListeners(&mPaintListeners); + ReleaseListeners(&mTextListeners); + ReleaseListeners(&mCompositionListeners); } NS_IMPL_ADDREF(nsEventListenerManager) @@ -131,20 +131,21 @@ nsVoidArray** nsEventListenerManager::GetListenersByIID(const nsIID& aIID) return nsnull; } -void nsEventListenerManager::ReleaseListeners(nsVoidArray* aListeners) +void nsEventListenerManager::ReleaseListeners(nsVoidArray** aListeners) { - if (nsnull != aListeners) { - PRInt32 i, count = aListeners->Count(); + if (nsnull != *aListeners) { + PRInt32 i, count = (*aListeners)->Count(); nsListenerStruct *ls; for (i = 0; i < count; i++) { - ls = (nsListenerStruct*)aListeners->ElementAt(i); + ls = (nsListenerStruct*)(*aListeners)->ElementAt(i); if (ls != nsnull) { NS_IF_RELEASE(ls->mListener); PR_DELETE(ls); } } - delete aListeners; + delete *aListeners; } + *aListeners = nsnull; } nsresult nsEventListenerManager::GetEventListeners(nsVoidArray **aListeners, const nsIID& aIID) @@ -587,7 +588,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -632,65 +632,63 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } break; - case NS_COMPOSITION_START: - case NS_COMPOSITION_END: + case NS_COMPOSITION_START: + case NS_COMPOSITION_END: #if DEBUG_TAGUE - printf("DOM: got composition event\n"); + printf("DOM: got composition event\n"); #endif - if (nsnull != mCompositionListeners) { - if (nsnull == *aDOMEvent) { - ret = NS_NewDOMUIEvent(aDOMEvent,aPresContext,aEvent); - } - if (NS_OK == ret) { - for(int i=0;iCount();i++) { - nsListenerStruct *ls; - nsIDOMCompositionListener* mCompositionListener; - ls =(nsListenerStruct*)mCompositionListeners->ElementAt(i); + if (nsnull != mCompositionListeners) { + if (nsnull == *aDOMEvent) { + ret = NS_NewDOMUIEvent(aDOMEvent,aPresContext,aEvent); + } + if (NS_OK == ret) { + for(int i=0;iCount();i++) { + nsListenerStruct *ls; + nsIDOMCompositionListener* mCompositionListener; + ls =(nsListenerStruct*)mCompositionListeners->ElementAt(i); - if (ls->mFlags & aFlags) { - if (NS_OK == ls->mListener->QueryInterface(kIDOMCompositionListenerIID, (void**)&mCompositionListener)) { - if (aEvent->message==NS_COMPOSITION_START) { - ret = mCompositionListener->HandleStartComposition(*aDOMEvent); + if (ls->mFlags & aFlags) { + if (NS_OK == ls->mListener->QueryInterface(kIDOMCompositionListenerIID, (void**)&mCompositionListener)) { + if (aEvent->message==NS_COMPOSITION_START) { + ret = mCompositionListener->HandleStartComposition(*aDOMEvent); + } + if (aEvent->message==NS_COMPOSITION_END) { + ret = mCompositionListener->HandleEndComposition(*aDOMEvent); + } } - if (aEvent->message==NS_COMPOSITION_END) { - ret = mCompositionListener->HandleEndComposition(*aDOMEvent); - } - } - NS_RELEASE(mCompositionListener); + NS_RELEASE(mCompositionListener); } else { - PRBool correctSubType = PR_FALSE; - switch(aEvent->message) { - case NS_COMPOSITION_START: - if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_START) { - correctSubType = PR_TRUE; - } - break; - case NS_COMPOSITION_END: - if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_END) { - correctSubType = PR_TRUE; - } - break; - default: - break; - } - if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = ls->mListener->HandleEvent(*aDOMEvent); - } + PRBool correctSubType = PR_FALSE; + switch(aEvent->message) { + case NS_COMPOSITION_START: + if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_START) { + correctSubType = PR_TRUE; + } + break; + case NS_COMPOSITION_END: + if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_END) { + correctSubType = PR_TRUE; + } + break; + default: + break; + } + if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { + ret = ls->mListener->HandleEvent(*aDOMEvent); + } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; - } } + } break; - case NS_TEXT_EVENT: + case NS_TEXT_EVENT: #if DEBUG_TAGUE printf("DOM: got text event\n"); #endif @@ -720,11 +718,10 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; - } - } - } - break; + } + } + } + break; case NS_KEY_UP: case NS_KEY_DOWN: @@ -783,7 +780,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -837,7 +833,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -900,7 +895,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -966,7 +960,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -1000,9 +993,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) - ? aEventStatus - : nsEventStatus_eConsumeNoDefault; } } } @@ -1047,9 +1037,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, ret = ls->mListener->HandleEvent(*aDOMEvent); } } - aEventStatus = (NS_OK == ret) - ? aEventStatus - : nsEventStatus_eConsumeNoDefault; } } } @@ -1059,6 +1046,16 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, default: break; } + //XXX This is going away + aEventStatus = (NS_OK == ret) + ? aEventStatus + : nsEventStatus_eConsumeNoDefault; + + // This is correct + aEventStatus = (aEvent->flags & NS_EVENT_FLAG_NO_DEFAULT) + ? nsEventStatus_eConsumeNoDefault + : aEventStatus; + return NS_OK; } @@ -1093,6 +1090,23 @@ nsresult nsEventListenerManager::ReleaseEvent(nsIDOMEventListener *aListener) return NS_OK; } +nsresult nsEventListenerManager::RemoveAllListeners() +{ + ReleaseListeners(&mEventListeners); + ReleaseListeners(&mMouseListeners); + ReleaseListeners(&mMouseMotionListeners); + ReleaseListeners(&mKeyListeners); + ReleaseListeners(&mLoadListeners); + ReleaseListeners(&mFocusListeners); + ReleaseListeners(&mFormListeners); + ReleaseListeners(&mDragListeners); + ReleaseListeners(&mPaintListeners); + ReleaseListeners(&mTextListeners); + ReleaseListeners(&mCompositionListeners); + + return NS_OK; +} + NS_HTML nsresult NS_NewEventListenerManager(nsIEventListenerManager** aInstancePtrResult) { nsIEventListenerManager* l = new nsEventListenerManager(); diff --git a/mozilla/content/events/src/nsEventListenerManager.h b/mozilla/content/events/src/nsEventListenerManager.h index bbb95144265..35bb2254aac 100644 --- a/mozilla/content/events/src/nsEventListenerManager.h +++ b/mozilla/content/events/src/nsEventListenerManager.h @@ -47,7 +47,7 @@ public: nsVoidArray** GetListenersByIID(const nsIID& aIID); - void ReleaseListeners(nsVoidArray* aListeners); + void ReleaseListeners(nsVoidArray** aListeners); /** * Retrieves events listeners of all types. @@ -89,6 +89,8 @@ public: nsEvent* aEvent, nsIDOMEvent** aDOMEvent); + virtual nsresult RemoveAllListeners(); + protected: nsresult SetJSEventListener(nsIScriptContext *aContext, JSObject *aObject, REFNSIID aIID); nsresult GetIdentifiersForType(const nsString& aType, nsIID& aIID, PRInt32* aSubType); diff --git a/mozilla/content/xul/content/src/nsXULElement.cpp b/mozilla/content/xul/content/src/nsXULElement.cpp index b8934aeb437..18a73cddd1e 100644 --- a/mozilla/content/xul/content/src/nsXULElement.cpp +++ b/mozilla/content/xul/content/src/nsXULElement.cpp @@ -241,9 +241,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIJSScriptObject @@ -1204,13 +1204,12 @@ RDFElementImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const n NS_IMETHODIMP RDFElementImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -1221,11 +1220,10 @@ RDFElementImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aLi NS_IMETHODIMP RDFElementImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; @@ -1902,7 +1900,7 @@ RDFElementImpl::SetAttribute(PRInt32 aNameSpaceID, // Add the popup as a listener on this element. nsCOMPtr eventListener = do_QueryInterface(popupListener); - AddEventListener("mousedown", eventListener, PR_FALSE, PR_FALSE); + AddEventListener("mousedown", eventListener, PR_FALSE); NS_IF_RELEASE(popupListener); } @@ -2332,6 +2330,7 @@ RDFElementImpl::HandleDOMEvent(nsIPresContext& aPresContext, nsIDOMEvent* domEvent = nsnull; if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; // In order for the event to have a proper target for menus (which have no corresponding // frame target in the visual model), we have to explicitly set the target of the // event to prevent it from trying to retrieve the target from a frame. @@ -2371,7 +2370,8 @@ RDFElementImpl::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } diff --git a/mozilla/content/xul/content/src/nsXULPopupListener.cpp b/mozilla/content/xul/content/src/nsXULPopupListener.cpp index 7c453d48221..f3001970446 100644 --- a/mozilla/content/xul/content/src/nsXULPopupListener.cpp +++ b/mozilla/content/xul/content/src/nsXULPopupListener.cpp @@ -179,7 +179,7 @@ XULPopupListenerImpl::Init(nsIDOMElement* aElement, const XULPopupType& popup) nsresult XULPopupListenerImpl::MouseDown(nsIDOMEvent* aMouseEvent) { - PRUint32 button; + PRUint16 button; nsCOMPtruiEvent; uiEvent = do_QueryInterface(aMouseEvent); diff --git a/mozilla/content/xul/document/src/nsXULDocument.cpp b/mozilla/content/xul/document/src/nsXULDocument.cpp index e5c8cdf6bd1..d6cb2172312 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.cpp +++ b/mozilla/content/xul/document/src/nsXULDocument.cpp @@ -619,9 +619,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIDOMDocument interface NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDoctype); @@ -2325,6 +2325,7 @@ XULDocumentImpl::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; } //Capturing stage @@ -2337,7 +2338,8 @@ XULDocumentImpl::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } @@ -3933,8 +3935,8 @@ XULDocumentImpl::Init(void) nsCOMPtr focusTracker = do_QueryInterface(mFocusTracker); if (focusTracker) { // Take the focus tracker and add it as an event listener for focus and blur events. - AddEventListener("focus", focusTracker, PR_FALSE, PR_TRUE); - AddEventListener("blur", focusTracker, PR_FALSE, PR_TRUE); + AddEventListener("focus", focusTracker, PR_TRUE); + AddEventListener("blur", focusTracker, PR_TRUE); } return NS_OK; @@ -4273,13 +4275,12 @@ XULDocumentImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const NS_IMETHODIMP XULDocumentImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -4290,11 +4291,10 @@ XULDocumentImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aL NS_IMETHODIMP XULDocumentImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/dom/public/coreEvents/nsIDOMEventTarget.h b/mozilla/dom/public/coreEvents/nsIDOMEventTarget.h index bd2eee6dead..ba45feddda8 100644 --- a/mozilla/dom/public/coreEvents/nsIDOMEventTarget.h +++ b/mozilla/dom/public/coreEvents/nsIDOMEventTarget.h @@ -34,21 +34,21 @@ class nsIDOMEventTarget : public nsISupports { public: static const nsIID& GetIID() { static nsIID iid = NS_IDOMEVENTTARGET_IID; return iid; } - NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aPostProcess, PRBool aUseCapture)=0; + NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aUseCapture)=0; - NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aPostProcess, PRBool aUseCapture)=0; + NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aUseCapture)=0; }; #define NS_DECL_IDOMEVENTTARGET \ - NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aPostProcess, PRBool aUseCapture); \ - NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aPostProcess, PRBool aUseCapture); \ + NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aUseCapture); \ + NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aUseCapture); \ #define NS_FORWARD_IDOMEVENTTARGET(_to) \ - NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aPostProcess, PRBool aUseCapture) { return _to AddEventListener(aType, aListener, aPostProcess, aUseCapture); } \ - NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aPostProcess, PRBool aUseCapture) { return _to RemoveEventListener(aType, aListener, aPostProcess, aUseCapture); } \ + NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aUseCapture) { return _to AddEventListener(aType, aListener, aUseCapture); } \ + NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, PRBool aUseCapture) { return _to RemoveEventListener(aType, aListener, aUseCapture); } \ #endif // nsIDOMEventTarget_h__ diff --git a/mozilla/dom/public/coreEvents/nsIDOMUIEvent.h b/mozilla/dom/public/coreEvents/nsIDOMUIEvent.h index 1d23a12383d..68130b0b4fc 100644 --- a/mozilla/dom/public/coreEvents/nsIDOMUIEvent.h +++ b/mozilla/dom/public/coreEvents/nsIDOMUIEvent.h @@ -174,7 +174,9 @@ public: NS_IMETHOD GetKeyCode(PRUint32* aKeyCode)=0; - NS_IMETHOD GetButton(PRUint32* aButton)=0; + NS_IMETHOD GetButton(PRUint16* aButton)=0; + + NS_IMETHOD GetClickcount(PRUint16* aClickcount)=0; }; @@ -192,7 +194,8 @@ public: NS_IMETHOD GetMetaKey(PRBool* aMetaKey); \ NS_IMETHOD GetCharCode(PRUint32* aCharCode); \ NS_IMETHOD GetKeyCode(PRUint32* aKeyCode); \ - NS_IMETHOD GetButton(PRUint32* aButton); \ + NS_IMETHOD GetButton(PRUint16* aButton); \ + NS_IMETHOD GetClickcount(PRUint16* aClickcount); \ @@ -210,7 +213,8 @@ public: NS_IMETHOD GetMetaKey(PRBool* aMetaKey) { return _to GetMetaKey(aMetaKey); } \ NS_IMETHOD GetCharCode(PRUint32* aCharCode) { return _to GetCharCode(aCharCode); } \ NS_IMETHOD GetKeyCode(PRUint32* aKeyCode) { return _to GetKeyCode(aKeyCode); } \ - NS_IMETHOD GetButton(PRUint32* aButton) { return _to GetButton(aButton); } \ + NS_IMETHOD GetButton(PRUint16* aButton) { return _to GetButton(aButton); } \ + NS_IMETHOD GetClickcount(PRUint16* aClickcount) { return _to GetClickcount(aClickcount); } \ extern "C" NS_DOM nsresult NS_InitUIEventClass(nsIScriptContext *aContext, void **aPrototype); diff --git a/mozilla/dom/public/idl/base/Window.idl b/mozilla/dom/public/idl/base/Window.idl index 41dff8e9ade..420f65f9d42 100644 --- a/mozilla/dom/public/idl/base/Window.idl +++ b/mozilla/dom/public/idl/base/Window.idl @@ -78,6 +78,6 @@ /* IID: { 0x1c773b30, 0xd1cf, 0x11d2, \ { 0xbd, 0x95, 0x00, 0x80, 0x5f, 0x8a, 0xe3, 0xf4 } } */ - void addEventListener(in DOMString type, in function EventListener listener, in boolean postProcess, in boolean useCapture); - void removeEventListener(in DOMString type, in function EventListener listener, in boolean postProcess, in boolean useCapture); + void addEventListener(in DOMString type, in function EventListener listener, in boolean useCapture); + void removeEventListener(in DOMString type, in function EventListener listener, in boolean useCapture); }; diff --git a/mozilla/dom/public/idl/coreDom/Node.idl b/mozilla/dom/public/idl/coreDom/Node.idl index 6ffd7609028..269ed2c7a38 100644 --- a/mozilla/dom/public/idl/coreDom/Node.idl +++ b/mozilla/dom/public/idl/coreDom/Node.idl @@ -46,6 +46,6 @@ /* IID: { 0x1c773b30, 0xd1cf, 0x11d2, \ { 0xbd, 0x95, 0x00, 0x80, 0x5f, 0x8a, 0xe3, 0xf4 } } */ - void addEventListener(in DOMString type, in function EventListener listener, in boolean postProcess, in boolean useCapture); - void removeEventListener(in DOMString type, in function EventListener listener, in boolean postProcess, in boolean useCapture); + void addEventListener(in DOMString type, in function EventListener listener, in boolean useCapture); + void removeEventListener(in DOMString type, in function EventListener listener, in boolean useCapture); }; \ No newline at end of file diff --git a/mozilla/dom/public/idl/events/UIEvent.idl b/mozilla/dom/public/idl/events/UIEvent.idl index 09d94bcc2c9..6959d1ede53 100644 --- a/mozilla/dom/public/idl/events/UIEvent.idl +++ b/mozilla/dom/public/idl/events/UIEvent.idl @@ -140,7 +140,8 @@ readonly attribute unsigned long charCode; readonly attribute unsigned long keyCode; - readonly attribute unsigned long button; + readonly attribute unsigned short button; + readonly attribute unsigned short clickcount; }; interface NSUIEvent { diff --git a/mozilla/dom/src/base/nsGlobalWindow.cpp b/mozilla/dom/src/base/nsGlobalWindow.cpp index 5fe66026bfd..ee8c335bf5a 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.cpp +++ b/mozilla/dom/src/base/nsGlobalWindow.cpp @@ -283,6 +283,10 @@ GlobalWindowImpl::SetNewDocument(nsIDOMDocument *aDocument) ClearAllTimeouts(); + if (mListenerManager) { + mListenerManager->RemoveAllListeners(); + } + if (mPrincipals && mContext) { JSPRINCIPALS_DROP((JSContext *)mContext->GetNativeContext(), mPrincipals); mPrincipals = nsnull; @@ -2651,6 +2655,7 @@ GlobalWindowImpl::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &mDOMEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; } //Capturing stage @@ -2660,7 +2665,8 @@ GlobalWindowImpl::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } @@ -2719,13 +2725,12 @@ GlobalWindowImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsresult GlobalWindowImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -2736,11 +2741,10 @@ GlobalWindowImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* a nsresult GlobalWindowImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/dom/src/base/nsGlobalWindow.h b/mozilla/dom/src/base/nsGlobalWindow.h index d86bc9d9933..09a22ecb9e8 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.h +++ b/mozilla/dom/src/base/nsGlobalWindow.h @@ -181,9 +181,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); diff --git a/mozilla/dom/src/base/nsJSWindow.cpp b/mozilla/dom/src/base/nsJSWindow.cpp index 4877d0aa719..95d5a2527c5 100644 --- a/mozilla/dom/src/base/nsJSWindow.cpp +++ b/mozilla/dom/src/base/nsJSWindow.cpp @@ -2364,7 +2364,6 @@ EventTargetAddEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval *arg nsAutoString b0; nsIDOMEventListener* b1; PRBool b2; - PRBool b3; *rval = JSVAL_NULL; @@ -2388,7 +2387,7 @@ EventTargetAddEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval *arg return JS_TRUE; } - if (argc >= 4) { + if (argc >= 3) { nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); @@ -2403,18 +2402,14 @@ EventTargetAddEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval *arg return JS_FALSE; } - if (!nsJSUtils::nsConvertJSValToBool(&b3, cx, argv[3])) { - return JS_FALSE; - } - - if (NS_OK != nativeThis->AddEventListener(b0, b1, b2, b3)) { + if (NS_OK != nativeThis->AddEventListener(b0, b1, b2)) { return JS_FALSE; } *rval = JSVAL_VOID; } else { - JS_ReportError(cx, "Function addEventListener requires 4 parameters"); + JS_ReportError(cx, "Function addEventListener requires 3 parameters"); return JS_FALSE; } @@ -2438,7 +2433,6 @@ EventTargetRemoveEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval * nsAutoString b0; nsIDOMEventListener* b1; PRBool b2; - PRBool b3; *rval = JSVAL_NULL; @@ -2462,7 +2456,7 @@ EventTargetRemoveEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval * return JS_TRUE; } - if (argc >= 4) { + if (argc >= 3) { nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); @@ -2477,18 +2471,14 @@ EventTargetRemoveEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval * return JS_FALSE; } - if (!nsJSUtils::nsConvertJSValToBool(&b3, cx, argv[3])) { - return JS_FALSE; - } - - if (NS_OK != nativeThis->RemoveEventListener(b0, b1, b2, b3)) { + if (NS_OK != nativeThis->RemoveEventListener(b0, b1, b2)) { return JS_FALSE; } *rval = JSVAL_VOID; } else { - JS_ReportError(cx, "Function removeEventListener requires 4 parameters"); + JS_ReportError(cx, "Function removeEventListener requires 3 parameters"); return JS_FALSE; } @@ -2585,8 +2575,8 @@ static JSFunctionSpec WindowMethods[] = {"openDialog", WindowOpenDialog, 0}, {"captureEvent", EventCapturerCaptureEvent, 1}, {"releaseEvent", EventCapturerReleaseEvent, 1}, - {"addEventListener", EventTargetAddEventListener, 4}, - {"removeEventListener", EventTargetRemoveEventListener, 4}, + {"addEventListener", EventTargetAddEventListener, 3}, + {"removeEventListener", EventTargetRemoveEventListener, 3}, {0} }; diff --git a/mozilla/dom/src/coreDOM/nsJSNode.cpp b/mozilla/dom/src/coreDOM/nsJSNode.cpp index 43a911c08a6..97895d143ef 100644 --- a/mozilla/dom/src/coreDOM/nsJSNode.cpp +++ b/mozilla/dom/src/coreDOM/nsJSNode.cpp @@ -729,7 +729,6 @@ EventTargetAddEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval *arg nsAutoString b0; nsIDOMEventListener* b1; PRBool b2; - PRBool b3; *rval = JSVAL_NULL; @@ -753,7 +752,7 @@ EventTargetAddEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval *arg return JS_TRUE; } - if (argc >= 4) { + if (argc >= 3) { nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); @@ -768,18 +767,14 @@ EventTargetAddEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval *arg return JS_FALSE; } - if (!nsJSUtils::nsConvertJSValToBool(&b3, cx, argv[3])) { - return JS_FALSE; - } - - if (NS_OK != nativeThis->AddEventListener(b0, b1, b2, b3)) { + if (NS_OK != nativeThis->AddEventListener(b0, b1, b2)) { return JS_FALSE; } *rval = JSVAL_VOID; } else { - JS_ReportError(cx, "Function addEventListener requires 4 parameters"); + JS_ReportError(cx, "Function addEventListener requires 3 parameters"); return JS_FALSE; } @@ -803,7 +798,6 @@ EventTargetRemoveEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval * nsAutoString b0; nsIDOMEventListener* b1; PRBool b2; - PRBool b3; *rval = JSVAL_NULL; @@ -827,7 +821,7 @@ EventTargetRemoveEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval * return JS_TRUE; } - if (argc >= 4) { + if (argc >= 3) { nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); @@ -842,18 +836,14 @@ EventTargetRemoveEventListener(JSContext *cx, JSObject *obj, uintN argc, jsval * return JS_FALSE; } - if (!nsJSUtils::nsConvertJSValToBool(&b3, cx, argv[3])) { - return JS_FALSE; - } - - if (NS_OK != nativeThis->RemoveEventListener(b0, b1, b2, b3)) { + if (NS_OK != nativeThis->RemoveEventListener(b0, b1, b2)) { return JS_FALSE; } *rval = JSVAL_VOID; } else { - JS_ReportError(cx, "Function removeEventListener requires 4 parameters"); + JS_ReportError(cx, "Function removeEventListener requires 3 parameters"); return JS_FALSE; } @@ -910,8 +900,8 @@ static JSFunctionSpec NodeMethods[] = {"appendChild", NodeAppendChild, 1}, {"hasChildNodes", NodeHasChildNodes, 0}, {"cloneNode", NodeCloneNode, 1}, - {"addEventListener", EventTargetAddEventListener, 4}, - {"removeEventListener", EventTargetRemoveEventListener, 4}, + {"addEventListener", EventTargetAddEventListener, 3}, + {"removeEventListener", EventTargetRemoveEventListener, 3}, {0} }; diff --git a/mozilla/dom/src/events/nsJSEventListener.cpp b/mozilla/dom/src/events/nsJSEventListener.cpp index f046c97d3e5..25f639a6846 100644 --- a/mozilla/dom/src/events/nsJSEventListener.cpp +++ b/mozilla/dom/src/events/nsJSEventListener.cpp @@ -97,7 +97,7 @@ nsresult nsJSEventListener::HandleEvent(nsIDOMEvent* aEvent) if (PR_TRUE == JS_CallFunctionValue(mContext, mJSObj, funval, 1, argv, &result)) { mScriptCX->ScriptEvaluated(); if (JSVAL_IS_BOOLEAN(result) && JSVAL_TO_BOOLEAN(result) == JS_FALSE) { - return NS_ERROR_FAILURE; + aEvent->PreventDefault(); } return NS_OK; } diff --git a/mozilla/dom/src/events/nsJSUIEvent.cpp b/mozilla/dom/src/events/nsJSUIEvent.cpp index a24abb77b21..8f7d3eb4366 100644 --- a/mozilla/dom/src/events/nsJSUIEvent.cpp +++ b/mozilla/dom/src/events/nsJSUIEvent.cpp @@ -66,14 +66,15 @@ enum UIEvent_slots { UIEVENT_CHARCODE = -11, UIEVENT_KEYCODE = -12, UIEVENT_BUTTON = -13, - NSUIEVENT_LAYERX = -14, - NSUIEVENT_LAYERY = -15, - NSUIEVENT_PAGEX = -16, - NSUIEVENT_PAGEY = -17, - NSUIEVENT_WHICH = -18, - NSUIEVENT_RANGEPARENT = -19, - NSUIEVENT_RANGEOFFSET = -20, - NSUIEVENT_RC = -21 + UIEVENT_CLICKCOUNT = -14, + NSUIEVENT_LAYERX = -15, + NSUIEVENT_LAYERY = -16, + NSUIEVENT_PAGEX = -17, + NSUIEVENT_PAGEY = -18, + NSUIEVENT_WHICH = -19, + NSUIEVENT_RANGEPARENT = -20, + NSUIEVENT_RANGEOFFSET = -21, + NSUIEVENT_RC = -22 }; /***********************************************************************/ @@ -298,7 +299,7 @@ GetUIEventProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) //Need to throw error here return JS_FALSE; } - PRUint32 prop; + PRUint16 prop; if (NS_OK == a->GetButton(&prop)) { *vp = INT_TO_JSVAL(prop); } @@ -307,6 +308,22 @@ GetUIEventProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) } break; } + case UIEVENT_CLICKCOUNT: + { + secMan->CheckScriptAccess(scriptCX, obj, "uievent.clickcount", &ok); + if (!ok) { + //Need to throw error here + return JS_FALSE; + } + PRUint16 prop; + if (NS_OK == a->GetClickcount(&prop)) { + *vp = INT_TO_JSVAL(prop); + } + else { + return JS_FALSE; + } + break; + } case NSUIEVENT_LAYERX: { secMan->CheckScriptAccess(scriptCX, obj, "nsuievent.layerx", &ok); @@ -640,6 +657,7 @@ static JSPropertySpec UIEventProperties[] = {"charCode", UIEVENT_CHARCODE, JSPROP_ENUMERATE | JSPROP_READONLY}, {"keyCode", UIEVENT_KEYCODE, JSPROP_ENUMERATE | JSPROP_READONLY}, {"button", UIEVENT_BUTTON, JSPROP_ENUMERATE | JSPROP_READONLY}, + {"clickcount", UIEVENT_CLICKCOUNT, JSPROP_ENUMERATE | JSPROP_READONLY}, {"layerX", NSUIEVENT_LAYERX, JSPROP_ENUMERATE | JSPROP_READONLY}, {"layerY", NSUIEVENT_LAYERY, JSPROP_ENUMERATE | JSPROP_READONLY}, {"pageX", NSUIEVENT_PAGEX, JSPROP_ENUMERATE | JSPROP_READONLY}, diff --git a/mozilla/editor/base/nsEditorEventListeners.cpp b/mozilla/editor/base/nsEditorEventListeners.cpp index 5c1eef4c120..bb2157f240a 100644 --- a/mozilla/editor/base/nsEditorEventListeners.cpp +++ b/mozilla/editor/base/nsEditorEventListeners.cpp @@ -842,7 +842,7 @@ nsTextEditorMouseListener::MouseDown(nsIDOMEvent* aMouseEvent) // We only do anything special for middle-mouse click (paste); // ignore all other events. - PRUint32 button = 0; + PRUint16 button = 0; uiEvent->GetButton(&button); if (button != 2) return NS_OK; diff --git a/mozilla/editor/libeditor/text/nsEditorEventListeners.cpp b/mozilla/editor/libeditor/text/nsEditorEventListeners.cpp index 5c1eef4c120..bb2157f240a 100644 --- a/mozilla/editor/libeditor/text/nsEditorEventListeners.cpp +++ b/mozilla/editor/libeditor/text/nsEditorEventListeners.cpp @@ -842,7 +842,7 @@ nsTextEditorMouseListener::MouseDown(nsIDOMEvent* aMouseEvent) // We only do anything special for middle-mouse click (paste); // ignore all other events. - PRUint32 button = 0; + PRUint16 button = 0; uiEvent->GetButton(&button); if (button != 2) return NS_OK; diff --git a/mozilla/layout/base/src/nsDocument.cpp b/mozilla/layout/base/src/nsDocument.cpp index 9b0d45cd3ce..47bc60108ee 100644 --- a/mozilla/layout/base/src/nsDocument.cpp +++ b/mozilla/layout/base/src/nsDocument.cpp @@ -2277,6 +2277,7 @@ nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &mDOMEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; } //Capturing stage @@ -2289,7 +2290,8 @@ nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } @@ -2345,13 +2347,12 @@ nsresult nsDocument::RemoveEventListenerByIID(nsIDOMEventListener *aListener, co } nsresult nsDocument::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -2361,11 +2362,10 @@ nsresult nsDocument::AddEventListener(const nsString& aType, nsIDOMEventListener } nsresult nsDocument::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/layout/base/src/nsDocument.h b/mozilla/layout/base/src/nsDocument.h index 507de23bfd5..78ff0280b44 100644 --- a/mozilla/layout/base/src/nsDocument.h +++ b/mozilla/layout/base/src/nsDocument.h @@ -370,9 +370,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, diff --git a/mozilla/layout/base/src/nsGenericDOMDataNode.cpp b/mozilla/layout/base/src/nsGenericDOMDataNode.cpp index 0c78dc46ac1..03554d5e766 100644 --- a/mozilla/layout/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/layout/base/src/nsGenericDOMDataNode.cpp @@ -461,13 +461,12 @@ nsGenericDOMDataNode::RemoveEventListenerByIID(nsIDOMEventListener* aListener, nsresult nsGenericDOMDataNode::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -478,11 +477,10 @@ nsGenericDOMDataNode::AddEventListener(const nsString& aType, nsIDOMEventListene nsresult nsGenericDOMDataNode::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; @@ -694,6 +692,7 @@ nsGenericDOMDataNode::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; //Initiate capturing phase. Special case first call to document if (nsnull != mDocument) { @@ -708,7 +707,7 @@ nsGenericDOMDataNode::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (!(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH) && nsnull != mListenerManager) { mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } diff --git a/mozilla/layout/base/src/nsGenericDOMDataNode.h b/mozilla/layout/base/src/nsGenericDOMDataNode.h index 0f1d205c08b..34a8bbdd6b3 100644 --- a/mozilla/layout/base/src/nsGenericDOMDataNode.h +++ b/mozilla/layout/base/src/nsGenericDOMDataNode.h @@ -113,9 +113,9 @@ struct nsGenericDOMDataNode { // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); nsresult RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIScriptObjectOwner interface nsresult GetScriptObject(nsIScriptContext* aContext, void** aScriptObject); @@ -353,15 +353,13 @@ struct nsGenericDOMDataNode { } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.AddEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.AddEventListener(aType, aListener, aUseCapture); \ } \ NS_IMETHOD RemoveEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.RemoveEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.RemoveEventListener(aType, aListener, aUseCapture); \ } /** diff --git a/mozilla/layout/base/src/nsGenericElement.cpp b/mozilla/layout/base/src/nsGenericElement.cpp index 248536ff420..e764a708150 100644 --- a/mozilla/layout/base/src/nsGenericElement.cpp +++ b/mozilla/layout/base/src/nsGenericElement.cpp @@ -757,8 +757,8 @@ nsGenericElement::HandleDOMEvent(nsIPresContext& aPresContext, nsIDOMEvent* domEvent = nsnull; if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; - //Initiate capturing phase //Initiate capturing phase. Special case first call to document if (nsnull != mDocument) { mDocument->HandleDOMEvent(aPresContext, aEvent, aDOMEvent, NS_EVENT_FLAG_CAPTURE, aEventStatus); @@ -774,12 +774,14 @@ nsGenericElement::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } //Bubbling stage - if ((NS_EVENT_FLAG_CAPTURE != aFlags) && (mParent != nsnull) && (mDocument != nsnull)) { + if ((NS_EVENT_FLAG_CAPTURE != aFlags) && + (mParent != nsnull) && (mDocument != nsnull)) { ret = mParent->HandleDOMEvent(aPresContext, aEvent, aDOMEvent, NS_EVENT_FLAG_BUBBLE, aEventStatus); } @@ -1004,13 +1006,12 @@ nsGenericElement::RemoveEventListenerByIID(nsIDOMEventListener* aListener, nsresult nsGenericElement::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -1021,11 +1022,10 @@ nsGenericElement::AddEventListener(const nsString& aType, nsIDOMEventListener* a nsresult nsGenericElement::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/layout/base/src/nsGenericElement.h b/mozilla/layout/base/src/nsGenericElement.h index 65449de1d4e..77b8c853c5a 100644 --- a/mozilla/layout/base/src/nsGenericElement.h +++ b/mozilla/layout/base/src/nsGenericElement.h @@ -126,9 +126,9 @@ public: // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); nsresult RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIScriptObjectOwner interface nsresult GetScriptObject(nsIScriptContext* aContext, void** aScriptObject); @@ -398,15 +398,13 @@ public: } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.AddEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.AddEventListener(aType, aListener, aUseCapture); \ } \ NS_IMETHOD RemoveEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ - PRBool aPostProcess, \ PRBool aUseCapture) { \ - return _g.RemoveEventListener(aType, aListener, aPostProcess, aUseCapture); \ + return _g.RemoveEventListener(aType, aListener, aUseCapture); \ } #define NS_IMPL_ICONTENT_USING_GENERIC(_g) \ diff --git a/mozilla/layout/events/public/nsIEventListenerManager.h b/mozilla/layout/events/public/nsIEventListenerManager.h index 72baa9f48d9..6b297cd5793 100644 --- a/mozilla/layout/events/public/nsIEventListenerManager.h +++ b/mozilla/layout/events/public/nsIEventListenerManager.h @@ -127,6 +127,12 @@ public: virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener) = 0; + /** + * Removes all events listeners registered by this instance of the listener + * manager. + */ + + virtual nsresult RemoveAllListeners() = 0; }; extern NS_HTML nsresult NS_NewEventListenerManager(nsIEventListenerManager** aInstancePtrResult); diff --git a/mozilla/layout/events/src/nsDOMEvent.cpp b/mozilla/layout/events/src/nsDOMEvent.cpp index 0358cb9229e..78a788a820c 100644 --- a/mozilla/layout/events/src/nsDOMEvent.cpp +++ b/mozilla/layout/events/src/nsDOMEvent.cpp @@ -175,25 +175,44 @@ nsDOMEvent::GetCurrentNode(nsIDOMNode** aCurrentNode) NS_IMETHODIMP nsDOMEvent::GetEventPhase(PRUint16* aEventPhase) { - *aEventPhase = 0; + if (mEvent->flags & NS_EVENT_FLAG_CAPTURE) { + *aEventPhase = CAPTURING_PHASE; + } + else if (mEvent->flags & NS_EVENT_FLAG_BUBBLE) { + *aEventPhase = BUBBLING_PHASE; + } + else if (mEvent->flags & NS_EVENT_FLAG_INIT) { + *aEventPhase = AT_TARGET; + } + else { + *aEventPhase = 0; + } + return NS_OK; } NS_IMETHODIMP nsDOMEvent::PreventBubble() { + if (mEvent->flags & NS_EVENT_FLAG_BUBBLE || mEvent->flags & NS_EVENT_FLAG_INIT) { + mEvent->flags |= NS_EVENT_FLAG_STOP_DISPATCH; + } return NS_OK; } NS_IMETHODIMP nsDOMEvent::PreventCapture() { + if (mEvent->flags & NS_EVENT_FLAG_CAPTURE) { + mEvent->flags |= NS_EVENT_FLAG_STOP_DISPATCH; + } return NS_OK; } NS_IMETHODIMP nsDOMEvent::PreventDefault() { + mEvent->flags |= NS_EVENT_FLAG_NO_DEFAULT; return NS_OK; } @@ -400,7 +419,7 @@ NS_METHOD nsDOMEvent::GetKeyCode(PRUint32* aKeyCode) return NS_OK; } -NS_METHOD nsDOMEvent::GetButton(PRUint32* aButton) +NS_METHOD nsDOMEvent::GetButton(PRUint16* aButton) { switch (mEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: @@ -427,6 +446,13 @@ NS_METHOD nsDOMEvent::GetButton(PRUint32* aButton) return NS_OK; } +NS_METHOD nsDOMEvent::GetClickcount(PRUint16* aClickcount) +{ + //XXX implement me. + *aClickcount = 1; + return NS_OK; +} + // nsINSEventInterface NS_METHOD nsDOMEvent::GetLayerX(PRInt32* aLayerX) { @@ -460,7 +486,11 @@ NS_METHOD nsDOMEvent::GetWhich(PRUint32* aWhich) case NS_KEY_EVENT: return GetKeyCode(aWhich); case NS_MOUSE_EVENT: - return GetButton(aWhich); + { + PRUint16 button; + nsresult ret = GetButton(&button); + *aWhich = button; + } } return NS_OK; } diff --git a/mozilla/layout/events/src/nsDOMEvent.h b/mozilla/layout/events/src/nsDOMEvent.h index 1f0193dc1d9..a1a7251dc5b 100644 --- a/mozilla/layout/events/src/nsDOMEvent.h +++ b/mozilla/layout/events/src/nsDOMEvent.h @@ -81,7 +81,7 @@ public: NS_IMETHOD PreventDefault(); - NS_IMETHOD GetText(nsString& aText); + NS_IMETHOD GetText(nsString& aText); NS_IMETHOD GetInputRange(nsIDOMTextRangeList** aInputRange); @@ -107,8 +107,10 @@ public: NS_IMETHOD GetKeyCode(PRUint32* aKeyCode); - NS_IMETHOD GetButton(PRUint32* aButton); + NS_IMETHOD GetButton(PRUint16* aButton); + NS_IMETHOD GetClickcount(PRUint16* aClickcount); + // nsIDOMNSEvent interface NS_IMETHOD GetLayerX(PRInt32* aLayerX); diff --git a/mozilla/layout/events/src/nsEventListenerManager.cpp b/mozilla/layout/events/src/nsEventListenerManager.cpp index dd5ce86aa55..dbe7bd608aa 100644 --- a/mozilla/layout/events/src/nsEventListenerManager.cpp +++ b/mozilla/layout/events/src/nsEventListenerManager.cpp @@ -65,17 +65,17 @@ nsEventListenerManager::nsEventListenerManager() nsEventListenerManager::~nsEventListenerManager() { - ReleaseListeners(mEventListeners); - ReleaseListeners(mMouseListeners); - ReleaseListeners(mMouseMotionListeners); - ReleaseListeners(mKeyListeners); - ReleaseListeners(mLoadListeners); - ReleaseListeners(mFocusListeners); - ReleaseListeners(mFormListeners); - ReleaseListeners(mDragListeners); - ReleaseListeners(mPaintListeners); - ReleaseListeners(mTextListeners); - ReleaseListeners(mCompositionListeners); + ReleaseListeners(&mEventListeners); + ReleaseListeners(&mMouseListeners); + ReleaseListeners(&mMouseMotionListeners); + ReleaseListeners(&mKeyListeners); + ReleaseListeners(&mLoadListeners); + ReleaseListeners(&mFocusListeners); + ReleaseListeners(&mFormListeners); + ReleaseListeners(&mDragListeners); + ReleaseListeners(&mPaintListeners); + ReleaseListeners(&mTextListeners); + ReleaseListeners(&mCompositionListeners); } NS_IMPL_ADDREF(nsEventListenerManager) @@ -131,20 +131,21 @@ nsVoidArray** nsEventListenerManager::GetListenersByIID(const nsIID& aIID) return nsnull; } -void nsEventListenerManager::ReleaseListeners(nsVoidArray* aListeners) +void nsEventListenerManager::ReleaseListeners(nsVoidArray** aListeners) { - if (nsnull != aListeners) { - PRInt32 i, count = aListeners->Count(); + if (nsnull != *aListeners) { + PRInt32 i, count = (*aListeners)->Count(); nsListenerStruct *ls; for (i = 0; i < count; i++) { - ls = (nsListenerStruct*)aListeners->ElementAt(i); + ls = (nsListenerStruct*)(*aListeners)->ElementAt(i); if (ls != nsnull) { NS_IF_RELEASE(ls->mListener); PR_DELETE(ls); } } - delete aListeners; + delete *aListeners; } + *aListeners = nsnull; } nsresult nsEventListenerManager::GetEventListeners(nsVoidArray **aListeners, const nsIID& aIID) @@ -587,7 +588,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -632,65 +632,63 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } break; - case NS_COMPOSITION_START: - case NS_COMPOSITION_END: + case NS_COMPOSITION_START: + case NS_COMPOSITION_END: #if DEBUG_TAGUE - printf("DOM: got composition event\n"); + printf("DOM: got composition event\n"); #endif - if (nsnull != mCompositionListeners) { - if (nsnull == *aDOMEvent) { - ret = NS_NewDOMUIEvent(aDOMEvent,aPresContext,aEvent); - } - if (NS_OK == ret) { - for(int i=0;iCount();i++) { - nsListenerStruct *ls; - nsIDOMCompositionListener* mCompositionListener; - ls =(nsListenerStruct*)mCompositionListeners->ElementAt(i); + if (nsnull != mCompositionListeners) { + if (nsnull == *aDOMEvent) { + ret = NS_NewDOMUIEvent(aDOMEvent,aPresContext,aEvent); + } + if (NS_OK == ret) { + for(int i=0;iCount();i++) { + nsListenerStruct *ls; + nsIDOMCompositionListener* mCompositionListener; + ls =(nsListenerStruct*)mCompositionListeners->ElementAt(i); - if (ls->mFlags & aFlags) { - if (NS_OK == ls->mListener->QueryInterface(kIDOMCompositionListenerIID, (void**)&mCompositionListener)) { - if (aEvent->message==NS_COMPOSITION_START) { - ret = mCompositionListener->HandleStartComposition(*aDOMEvent); + if (ls->mFlags & aFlags) { + if (NS_OK == ls->mListener->QueryInterface(kIDOMCompositionListenerIID, (void**)&mCompositionListener)) { + if (aEvent->message==NS_COMPOSITION_START) { + ret = mCompositionListener->HandleStartComposition(*aDOMEvent); + } + if (aEvent->message==NS_COMPOSITION_END) { + ret = mCompositionListener->HandleEndComposition(*aDOMEvent); + } } - if (aEvent->message==NS_COMPOSITION_END) { - ret = mCompositionListener->HandleEndComposition(*aDOMEvent); - } - } - NS_RELEASE(mCompositionListener); + NS_RELEASE(mCompositionListener); } else { - PRBool correctSubType = PR_FALSE; - switch(aEvent->message) { - case NS_COMPOSITION_START: - if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_START) { - correctSubType = PR_TRUE; - } - break; - case NS_COMPOSITION_END: - if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_END) { - correctSubType = PR_TRUE; - } - break; - default: - break; - } - if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = ls->mListener->HandleEvent(*aDOMEvent); - } + PRBool correctSubType = PR_FALSE; + switch(aEvent->message) { + case NS_COMPOSITION_START: + if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_START) { + correctSubType = PR_TRUE; + } + break; + case NS_COMPOSITION_END: + if (ls->mSubType & NS_EVENT_BITS_COMPOSITION_END) { + correctSubType = PR_TRUE; + } + break; + default: + break; + } + if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { + ret = ls->mListener->HandleEvent(*aDOMEvent); + } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; - } } + } break; - case NS_TEXT_EVENT: + case NS_TEXT_EVENT: #if DEBUG_TAGUE printf("DOM: got text event\n"); #endif @@ -720,11 +718,10 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; - } - } - } - break; + } + } + } + break; case NS_KEY_UP: case NS_KEY_DOWN: @@ -783,7 +780,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -837,7 +833,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -900,7 +895,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -966,7 +960,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) ? aEventStatus : nsEventStatus_eConsumeNoDefault; } } } @@ -1000,9 +993,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, } } } - aEventStatus = (NS_OK == ret) - ? aEventStatus - : nsEventStatus_eConsumeNoDefault; } } } @@ -1047,9 +1037,6 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, ret = ls->mListener->HandleEvent(*aDOMEvent); } } - aEventStatus = (NS_OK == ret) - ? aEventStatus - : nsEventStatus_eConsumeNoDefault; } } } @@ -1059,6 +1046,16 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, default: break; } + //XXX This is going away + aEventStatus = (NS_OK == ret) + ? aEventStatus + : nsEventStatus_eConsumeNoDefault; + + // This is correct + aEventStatus = (aEvent->flags & NS_EVENT_FLAG_NO_DEFAULT) + ? nsEventStatus_eConsumeNoDefault + : aEventStatus; + return NS_OK; } @@ -1093,6 +1090,23 @@ nsresult nsEventListenerManager::ReleaseEvent(nsIDOMEventListener *aListener) return NS_OK; } +nsresult nsEventListenerManager::RemoveAllListeners() +{ + ReleaseListeners(&mEventListeners); + ReleaseListeners(&mMouseListeners); + ReleaseListeners(&mMouseMotionListeners); + ReleaseListeners(&mKeyListeners); + ReleaseListeners(&mLoadListeners); + ReleaseListeners(&mFocusListeners); + ReleaseListeners(&mFormListeners); + ReleaseListeners(&mDragListeners); + ReleaseListeners(&mPaintListeners); + ReleaseListeners(&mTextListeners); + ReleaseListeners(&mCompositionListeners); + + return NS_OK; +} + NS_HTML nsresult NS_NewEventListenerManager(nsIEventListenerManager** aInstancePtrResult) { nsIEventListenerManager* l = new nsEventListenerManager(); diff --git a/mozilla/layout/events/src/nsEventListenerManager.h b/mozilla/layout/events/src/nsEventListenerManager.h index bbb95144265..35bb2254aac 100644 --- a/mozilla/layout/events/src/nsEventListenerManager.h +++ b/mozilla/layout/events/src/nsEventListenerManager.h @@ -47,7 +47,7 @@ public: nsVoidArray** GetListenersByIID(const nsIID& aIID); - void ReleaseListeners(nsVoidArray* aListeners); + void ReleaseListeners(nsVoidArray** aListeners); /** * Retrieves events listeners of all types. @@ -89,6 +89,8 @@ public: nsEvent* aEvent, nsIDOMEvent** aDOMEvent); + virtual nsresult RemoveAllListeners(); + protected: nsresult SetJSEventListener(nsIScriptContext *aContext, JSObject *aObject, REFNSIID aIID); nsresult GetIdentifiersForType(const nsString& aType, nsIID& aIID, PRInt32* aSubType); diff --git a/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp b/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp index 88c0023a65d..aad25f64112 100644 --- a/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp +++ b/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp @@ -86,9 +86,9 @@ nsMenuBarFrame::Init(nsIPresContext& aPresContext, nsCOMPtr target = do_QueryInterface(doc); nsIDOMEventListener* domEventListener = (nsIDOMKeyListener*)mMenuBarListener; - target->AddEventListener("keypress", domEventListener, PR_FALSE, PR_TRUE); - target->AddEventListener("keydown", domEventListener, PR_FALSE, PR_TRUE); - target->AddEventListener("keyup", domEventListener, PR_FALSE, PR_TRUE); + target->AddEventListener("keypress", domEventListener, PR_TRUE); + target->AddEventListener("keydown", domEventListener, PR_TRUE); + target->AddEventListener("keyup", domEventListener, PR_TRUE); // The menu bar should also observe all mouse events that happen within it // (which it can do using bubbling). diff --git a/mozilla/layout/xul/base/src/nsToolbarFrame.cpp b/mozilla/layout/xul/base/src/nsToolbarFrame.cpp index ffad599f744..f08ca1e12af 100644 --- a/mozilla/layout/xul/base/src/nsToolbarFrame.cpp +++ b/mozilla/layout/xul/base/src/nsToolbarFrame.cpp @@ -114,7 +114,7 @@ nsToolbarFrame::Init(nsIPresContext& aPresContext, } // nsCOMPtr eventListener = do_QueryInterface(popupListener); - // AddEventListener("mousedown", eventListener, PR_FALSE, PR_FALSE); + // AddEventListener("mousedown", eventListener, PR_FALSE); #endif return rv; diff --git a/mozilla/rdf/content/src/nsRDFElement.cpp b/mozilla/rdf/content/src/nsRDFElement.cpp index b8934aeb437..18a73cddd1e 100644 --- a/mozilla/rdf/content/src/nsRDFElement.cpp +++ b/mozilla/rdf/content/src/nsRDFElement.cpp @@ -241,9 +241,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIJSScriptObject @@ -1204,13 +1204,12 @@ RDFElementImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const n NS_IMETHODIMP RDFElementImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -1221,11 +1220,10 @@ RDFElementImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aLi NS_IMETHODIMP RDFElementImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; @@ -1902,7 +1900,7 @@ RDFElementImpl::SetAttribute(PRInt32 aNameSpaceID, // Add the popup as a listener on this element. nsCOMPtr eventListener = do_QueryInterface(popupListener); - AddEventListener("mousedown", eventListener, PR_FALSE, PR_FALSE); + AddEventListener("mousedown", eventListener, PR_FALSE); NS_IF_RELEASE(popupListener); } @@ -2332,6 +2330,7 @@ RDFElementImpl::HandleDOMEvent(nsIPresContext& aPresContext, nsIDOMEvent* domEvent = nsnull; if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; // In order for the event to have a proper target for menus (which have no corresponding // frame target in the visual model), we have to explicitly set the target of the // event to prevent it from trying to retrieve the target from a frame. @@ -2371,7 +2370,8 @@ RDFElementImpl::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } diff --git a/mozilla/rdf/content/src/nsRDFXULBuilder.cpp b/mozilla/rdf/content/src/nsRDFXULBuilder.cpp index 5e72d6a0000..4fc45056235 100644 --- a/mozilla/rdf/content/src/nsRDFXULBuilder.cpp +++ b/mozilla/rdf/content/src/nsRDFXULBuilder.cpp @@ -2683,9 +2683,9 @@ RDFXULBuilderImpl::CreateXULElement(nsINameSpace* aContainingNameSpace, nsIDOMEventTarget* target; document->QueryInterface(kIDOMEventReceiverIID, (void**) &target); if(target) { - target->AddEventListener("keypress", domEventListener, PR_FALSE, PR_TRUE); - target->AddEventListener("keydown", domEventListener, PR_FALSE, PR_TRUE); - target->AddEventListener("keyup", domEventListener, PR_FALSE, PR_TRUE); + target->AddEventListener("keypress", domEventListener, PR_TRUE); + target->AddEventListener("keydown", domEventListener, PR_TRUE); + target->AddEventListener("keyup", domEventListener, PR_TRUE); } NS_RELEASE(target); } diff --git a/mozilla/rdf/content/src/nsXULDocument.cpp b/mozilla/rdf/content/src/nsXULDocument.cpp index e5c8cdf6bd1..d6cb2172312 100644 --- a/mozilla/rdf/content/src/nsXULDocument.cpp +++ b/mozilla/rdf/content/src/nsXULDocument.cpp @@ -619,9 +619,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIDOMDocument interface NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDoctype); @@ -2325,6 +2325,7 @@ XULDocumentImpl::HandleDOMEvent(nsIPresContext& aPresContext, if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; } //Capturing stage @@ -2337,7 +2338,8 @@ XULDocumentImpl::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } @@ -3933,8 +3935,8 @@ XULDocumentImpl::Init(void) nsCOMPtr focusTracker = do_QueryInterface(mFocusTracker); if (focusTracker) { // Take the focus tracker and add it as an event listener for focus and blur events. - AddEventListener("focus", focusTracker, PR_FALSE, PR_TRUE); - AddEventListener("blur", focusTracker, PR_FALSE, PR_TRUE); + AddEventListener("focus", focusTracker, PR_TRUE); + AddEventListener("blur", focusTracker, PR_TRUE); } return NS_OK; @@ -4273,13 +4275,12 @@ XULDocumentImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const NS_IMETHODIMP XULDocumentImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -4290,11 +4291,10 @@ XULDocumentImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aL NS_IMETHODIMP XULDocumentImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; diff --git a/mozilla/rdf/content/src/nsXULElement.cpp b/mozilla/rdf/content/src/nsXULElement.cpp index b8934aeb437..18a73cddd1e 100644 --- a/mozilla/rdf/content/src/nsXULElement.cpp +++ b/mozilla/rdf/content/src/nsXULElement.cpp @@ -241,9 +241,9 @@ public: // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture); + PRBool aUseCapture); // nsIJSScriptObject @@ -1204,13 +1204,12 @@ RDFElementImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const n NS_IMETHODIMP RDFElementImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; manager->AddEventListenerByType(aListener, aType, flags); NS_RELEASE(manager); @@ -1221,11 +1220,10 @@ RDFElementImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aLi NS_IMETHODIMP RDFElementImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener, - PRBool aPostProcess, PRBool aUseCapture) + PRBool aUseCapture) { if (nsnull != mListenerManager) { - PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) | - (aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE); + PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; mListenerManager->RemoveEventListenerByType(aListener, aType, flags); return NS_OK; @@ -1902,7 +1900,7 @@ RDFElementImpl::SetAttribute(PRInt32 aNameSpaceID, // Add the popup as a listener on this element. nsCOMPtr eventListener = do_QueryInterface(popupListener); - AddEventListener("mousedown", eventListener, PR_FALSE, PR_FALSE); + AddEventListener("mousedown", eventListener, PR_FALSE); NS_IF_RELEASE(popupListener); } @@ -2332,6 +2330,7 @@ RDFElementImpl::HandleDOMEvent(nsIPresContext& aPresContext, nsIDOMEvent* domEvent = nsnull; if (NS_EVENT_FLAG_INIT == aFlags) { aDOMEvent = &domEvent; + aEvent->flags = NS_EVENT_FLAG_NONE; // In order for the event to have a proper target for menus (which have no corresponding // frame target in the visual model), we have to explicitly set the target of the // event to prevent it from trying to retrieve the target from a frame. @@ -2371,7 +2370,8 @@ RDFElementImpl::HandleDOMEvent(nsIPresContext& aPresContext, } //Local handling stage - if (nsnull != mListenerManager) { + if (mListenerManager && !(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH)) { + aEvent->flags = aFlags; mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus); } diff --git a/mozilla/rdf/content/src/nsXULPopupListener.cpp b/mozilla/rdf/content/src/nsXULPopupListener.cpp index 7c453d48221..f3001970446 100644 --- a/mozilla/rdf/content/src/nsXULPopupListener.cpp +++ b/mozilla/rdf/content/src/nsXULPopupListener.cpp @@ -179,7 +179,7 @@ XULPopupListenerImpl::Init(nsIDOMElement* aElement, const XULPopupType& popup) nsresult XULPopupListenerImpl::MouseDown(nsIDOMEvent* aMouseEvent) { - PRUint32 button; + PRUint16 button; nsCOMPtruiEvent; uiEvent = do_QueryInterface(aMouseEvent); diff --git a/mozilla/widget/public/nsGUIEvent.h b/mozilla/widget/public/nsGUIEvent.h index aa22921ae63..e7b96978606 100644 --- a/mozilla/widget/public/nsGUIEvent.h +++ b/mozilla/widget/public/nsGUIEvent.h @@ -53,7 +53,9 @@ struct nsEvent { // in widget relative coordinates, not modified by layout code. nsPoint refPoint; /// elapsed time, in milliseconds, from the time the system was started to the time the message was created - PRUint32 time; + PRUint32 time; + // flags to hold event flow stage and capture/bubble cancellation status + PRUint32 flags; }; /** @@ -463,7 +465,8 @@ enum nsDragDropEventStatus { #define NS_EVENT_FLAG_INIT 0x0001 #define NS_EVENT_FLAG_BUBBLE 0x0002 #define NS_EVENT_FLAG_CAPTURE 0x0004 -#define NS_EVENT_FLAG_POST_PROCESS 0x0008 +#define NS_EVENT_FLAG_STOP_DISPATCH 0x0008 +#define NS_EVENT_FLAG_NO_DEFAULT 0x0010 // IME Constants -- keep in synch with nsIDOMTextRange.h #define NS_TEXTRANGE_CARETPOSITION 0x01 diff --git a/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp b/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp index a7452a3629b..037873ee3ba 100644 --- a/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp +++ b/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp @@ -1336,7 +1336,7 @@ nsWebShellWindow::CreatePopup(nsIDOMElement* aElement, nsIDOMElement* aPopupCont NS_IF_RELEASE(popupRoot); nsCOMPtr blurListener = do_QueryInterface(popupListener); nsCOMPtr targetWindow = do_QueryInterface(domWindow); - targetWindow->AddEventListener("blur", blurListener, PR_FALSE, PR_FALSE); + targetWindow->AddEventListener("blur", blurListener, PR_FALSE); // (8) Set up the opener property domWindow->SetOpener(aWindow);