diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index 4c97c602d17..7a8bc481075 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -2443,6 +2443,11 @@ nsresult nsDocument::GetNewListenerManager(nsIEventListenerManager **aInstancePt return NS_NewEventListenerManager(aInstancePtrResult); } +nsresult nsDocument::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsDocument::HandleDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, nsIDOMEvent** aDOMEvent, diff --git a/mozilla/content/base/src/nsDocument.h b/mozilla/content/base/src/nsDocument.h index fa249f6b108..6989505fe31 100644 --- a/mozilla/content/base/src/nsDocument.h +++ b/mozilla/content/base/src/nsDocument.h @@ -371,6 +371,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsIDiskDocument inteface NS_IMETHOD InitDiskDocument(nsFileSpec *aFileSpec); diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.cpp b/mozilla/content/base/src/nsGenericDOMDataNode.cpp index 0ef88b7f33f..c1d1c249fe0 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/content/base/src/nsGenericDOMDataNode.cpp @@ -518,6 +518,12 @@ nsGenericDOMDataNode::GetNewListenerManager(nsIEventListenerManager** aResult) return NS_NewEventListenerManager(aResult); } +nsresult +nsGenericDOMDataNode::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsGenericDOMDataNode::AddEventListenerByIID(nsIDOMEventListener* aListener, const nsIID& aIID) diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.h b/mozilla/content/base/src/nsGenericDOMDataNode.h index 68d50b952f0..ca4cb2ca651 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.h +++ b/mozilla/content/base/src/nsGenericDOMDataNode.h @@ -111,6 +111,7 @@ struct nsGenericDOMDataNode { const nsIID& aIID); nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult); nsresult GetNewListenerManager(nsIEventListenerManager** aInstancePtrResult); + nsresult HandleEvent(nsIDOMEvent *aEvent); // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, @@ -355,6 +356,9 @@ struct nsGenericDOMDataNode { NS_IMETHOD GetNewListenerManager(nsIEventListenerManager** aResult) { \ return _g.GetNewListenerManager(aResult); \ } \ + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent) { \ + return _g.HandleEvent(aEvent); \ + } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ PRBool aUseCapture) { \ diff --git a/mozilla/content/base/src/nsGenericElement.cpp b/mozilla/content/base/src/nsGenericElement.cpp index 340e9ac57b2..212e804b7b8 100644 --- a/mozilla/content/base/src/nsGenericElement.cpp +++ b/mozilla/content/base/src/nsGenericElement.cpp @@ -1254,6 +1254,12 @@ nsGenericElement::GetNewListenerManager(nsIEventListenerManager** aResult) return NS_NewEventListenerManager(aResult); } +nsresult +nsGenericElement::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsGenericElement::AddEventListenerByIID(nsIDOMEventListener* aListener, const nsIID& aIID) diff --git a/mozilla/content/base/src/nsGenericElement.h b/mozilla/content/base/src/nsGenericElement.h index 32065749371..17b1d662c05 100644 --- a/mozilla/content/base/src/nsGenericElement.h +++ b/mozilla/content/base/src/nsGenericElement.h @@ -157,6 +157,7 @@ public: const nsIID& aIID); nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult); nsresult GetNewListenerManager(nsIEventListenerManager** aInstancePtrResult); + nsresult HandleEvent(nsIDOMEvent *aEvent); // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, @@ -449,6 +450,9 @@ public: NS_IMETHOD GetNewListenerManager(nsIEventListenerManager** aResult) { \ return _g.GetNewListenerManager(aResult); \ } \ + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent) { \ + return _g.HandleEvent(aEvent); \ + } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ PRBool aUseCapture) { \ diff --git a/mozilla/content/events/public/nsIEventListenerManager.h b/mozilla/content/events/public/nsIEventListenerManager.h index b40f2cb03bc..0b717c5bcde 100644 --- a/mozilla/content/events/public/nsIEventListenerManager.h +++ b/mozilla/content/events/public/nsIEventListenerManager.h @@ -117,23 +117,22 @@ public: nsIDOMEvent** aDOMEvent) = 0; /** - * Captures all events designated for descendant objects at the current level. - * @param an event listener + * Changes script listener of specified event types from bubbling listeners to capturing listeners. + * @param event types */ - virtual nsresult CaptureEvent(nsIDOMEventListener *aListener) = 0; + virtual nsresult CaptureEvent(PRInt32 aEventTypes) = 0; /** - * Releases all events designated for descendant objects at the current level. - * @param an event listener + * Changes script listener of specified event types from capturing listeners to bubbling listeners. + * @param event types */ - virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener) = 0; + virtual nsresult ReleaseEvent(PRInt32 aEventTypes) = 0; /** * Removes all event listeners registered by this instance of the listener * manager. */ virtual nsresult RemoveAllListeners(PRBool aScriptOnly) = 0; - }; extern NS_HTML nsresult NS_NewEventListenerManager(nsIEventListenerManager** aInstancePtrResult); diff --git a/mozilla/content/events/src/nsEventListenerManager.cpp b/mozilla/content/events/src/nsEventListenerManager.cpp index 25bad5963b7..8af436004ac 100644 --- a/mozilla/content/events/src/nsEventListenerManager.cpp +++ b/mozilla/content/events/src/nsEventListenerManager.cpp @@ -201,8 +201,7 @@ nsresult nsEventListenerManager::AddEventListener(nsIDOMEventListener *aListener for (int i=0; i<(*listeners)->Count(); i++) { ls = (nsListenerStruct*)(*listeners)->ElementAt(i); - if (ls->mListener == aListener) { - ls->mFlags |= aFlags; + if (ls->mListener == aListener && ls->mFlags == aFlags) { ls->mSubType |= aSubType; found = PR_TRUE; break; @@ -229,6 +228,7 @@ nsresult nsEventListenerManager::AddEventListener(nsIDOMEventListener *aListener ls->mListener = aListener; ls->mFlags = aFlags; ls->mSubType = aSubType; + ls->mSubTypeCapture = NS_EVENT_BITS_NONE; ls->mHandlerIsString = 0; (*listeners)->InsertElementAt((void*)ls, (*listeners)->Count()); NS_ADDREF(aListener); @@ -253,7 +253,7 @@ nsresult nsEventListenerManager::RemoveEventListener(nsIDOMEventListener *aListe for (int i=0; i<(*listeners)->Count(); i++) { ls = (nsListenerStruct*)(*listeners)->ElementAt(i); - if (ls->mListener == aListener) { + if (ls->mListener == aListener && ls->mFlags == aFlags) { ls->mFlags &= ~aFlags; ls->mSubType &= ~aSubType; if (ls->mFlags == NS_EVENT_FLAG_NONE && ls->mSubType == NS_EVENT_BITS_NONE) { @@ -512,12 +512,16 @@ nsresult nsEventListenerManager::SetJSEventListener(nsIScriptContext *aContext, nsIID iid; result = GetIdentifiersForType(aName, iid, &flags); if (NS_SUCCEEDED(result)) { + //Set flag to indicate possible need for compilation later if (aIsString) { ls->mHandlerIsString |= flags; } else { ls->mHandlerIsString &= ~flags; } + + //Set subtype flags based on event + ls->mSubType |= flags; } } @@ -606,64 +610,80 @@ nsresult nsEventListenerManager::RegisterScriptEventListener(nsIScriptContext *a nsresult nsEventListenerManager::HandleEventSubType(nsListenerStruct* aListenerStruct, nsIDOMEvent* aDOMEvent, - PRUint32 aSubType) + PRUint32 aSubType, + PRUint32 aPhaseFlags) { nsresult result = NS_OK; // If this is a script handler and we haven't yet // compiled the event handler itself - if ((aListenerStruct->mFlags & NS_PRIV_EVENT_FLAG_SCRIPT) && - (aListenerStruct->mHandlerIsString & aSubType)) { - nsCOMPtr jslistener = do_QueryInterface(aListenerStruct->mListener); - if (jslistener) { - nsCOMPtr owner; - nsCOMPtr scriptCX; - result = jslistener->GetEventTarget(getter_AddRefs(scriptCX), getter_AddRefs(owner)); + if (aListenerStruct->mFlags & NS_PRIV_EVENT_FLAG_SCRIPT) { + // If we're not in the capture phase we must *NOT* have capture flags + // set. Compiled script handlers are one or the other, not both. + if (aPhaseFlags & NS_EVENT_FLAG_BUBBLE && !aPhaseFlags & NS_EVENT_FLAG_INIT) { + if (aListenerStruct->mSubTypeCapture & aSubType) { + return result; + } + } + // If we're in the capture phase we must have capture flags set. + else if (aPhaseFlags & NS_EVENT_FLAG_CAPTURE && !aPhaseFlags & NS_EVENT_FLAG_INIT) { + if (!(aListenerStruct->mSubTypeCapture & aSubType)) { + return result; + } + } + + if (aListenerStruct->mHandlerIsString & aSubType) { + nsCOMPtr jslistener = do_QueryInterface(aListenerStruct->mListener); + if (jslistener) { + nsCOMPtr owner; + nsCOMPtr scriptCX; + result = jslistener->GetEventTarget(getter_AddRefs(scriptCX), getter_AddRefs(owner)); - if (NS_SUCCEEDED(result)) { - JSObject* jsobj; - result = owner->GetScriptObject(scriptCX, (void**)&jsobj); if (NS_SUCCEEDED(result)) { - nsAutoString eventString; - if (NS_SUCCEEDED(aDOMEvent->GetType(eventString))) { - eventString.Insert("on", 0, 2); - nsCOMPtr atom = getter_AddRefs(NS_NewAtom(eventString)); + JSObject* jsobj; + result = owner->GetScriptObject(scriptCX, (void**)&jsobj); + if (NS_SUCCEEDED(result)) { + nsAutoString eventString; + if (NS_SUCCEEDED(aDOMEvent->GetType(eventString))) { + eventString.Insert("on", 0, 2); + nsCOMPtr atom = getter_AddRefs(NS_NewAtom(eventString)); - nsCOMPtr handlerOwner = do_QueryInterface(owner); - void* handler = nsnull; + nsCOMPtr handlerOwner = do_QueryInterface(owner); + void* handler = nsnull; - if (handlerOwner) { - result = handlerOwner->GetCompiledEventHandler(atom, &handler); - if (NS_SUCCEEDED(result) && handler) { - result = scriptCX->BindCompiledEventHandler(jsobj, atom, handler); - aListenerStruct->mHandlerIsString &= ~aSubType; + if (handlerOwner) { + result = handlerOwner->GetCompiledEventHandler(atom, &handler); + if (NS_SUCCEEDED(result) && handler) { + result = scriptCX->BindCompiledEventHandler(jsobj, atom, handler); + aListenerStruct->mHandlerIsString &= ~aSubType; + } } - } - if (aListenerStruct->mHandlerIsString & aSubType) { - // This should never happen for anything but content - // XXX I don't like that we have to reference content - // from here. The alternative is to store the event handler - // string on the JS object itself. - nsCOMPtr content = do_QueryInterface(owner); - NS_ASSERTION(content, "only content should have event handler attributes"); - if (content) { - nsAutoString handlerBody; - result = content->GetAttribute(kNameSpaceID_None, atom, handlerBody); - if (NS_SUCCEEDED(result)) { - if (handlerOwner) { - // Always let the handler owner compile the event - // handler, as it may want to use a special - // context or scope object. - result = handlerOwner->CompileEventHandler(scriptCX, jsobj, atom, handlerBody, &handler); + if (aListenerStruct->mHandlerIsString & aSubType) { + // This should never happen for anything but content + // XXX I don't like that we have to reference content + // from here. The alternative is to store the event handler + // string on the JS object itself. + nsCOMPtr content = do_QueryInterface(owner); + NS_ASSERTION(content, "only content should have event handler attributes"); + if (content) { + nsAutoString handlerBody; + result = content->GetAttribute(kNameSpaceID_None, atom, handlerBody); + if (NS_SUCCEEDED(result)) { + if (handlerOwner) { + // Always let the handler owner compile the event + // handler, as it may want to use a special + // context or scope object. + result = handlerOwner->CompileEventHandler(scriptCX, jsobj, atom, handlerBody, &handler); + } + else { + result = scriptCX->CompileEventHandler(jsobj, atom, handlerBody, + (handlerOwner != nsnull), + &handler); + } + if (NS_SUCCEEDED(result)) + aListenerStruct->mHandlerIsString &= ~aSubType; } - else { - result = scriptCX->CompileEventHandler(jsobj, atom, handlerBody, - (handlerOwner != nsnull), - &handler); - } - if (NS_SUCCEEDED(result)) - aListenerStruct->mHandlerIsString &= ~aSubType; } } } @@ -814,7 +834,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -860,7 +880,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -925,7 +945,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -960,7 +980,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, correctSubType = PR_TRUE; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1026,7 +1046,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1082,7 +1102,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1168,7 +1188,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1225,7 +1245,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1259,7 +1279,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, correctSubType = PR_TRUE; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1338,7 +1358,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || dragStruct->mSubType == NS_EVENT_BITS_DRAG_NONE) - ret = HandleEventSubType(dragStruct, *aDOMEvent, subType); + ret = HandleEventSubType(dragStruct, *aDOMEvent, subType, aFlags); } } } @@ -1433,7 +1453,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1474,9 +1494,9 @@ nsresult nsEventListenerManager::CreateEvent(nsIPresContext* aPresContext, * @param an event listener */ -nsresult nsEventListenerManager::CaptureEvent(nsIDOMEventListener *aListener) +nsresult nsEventListenerManager::CaptureEvent(PRInt32 aEventTypes) { - return NS_OK; + return FlipCaptureBit(aEventTypes, PR_TRUE); } /** @@ -1484,8 +1504,214 @@ nsresult nsEventListenerManager::CaptureEvent(nsIDOMEventListener *aListener) * @param an event listener */ -nsresult nsEventListenerManager::ReleaseEvent(nsIDOMEventListener *aListener) +nsresult nsEventListenerManager::ReleaseEvent(PRInt32 aEventTypes) { + return FlipCaptureBit(aEventTypes, PR_FALSE); +} + +nsresult nsEventListenerManager::FlipCaptureBit(PRInt32 aEventTypes, PRBool aInitCapture) +{ + nsIID iid; + nsListenerStruct *ls; + + if (aEventTypes & nsIDOMEvent::MOUSEDOWN) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEUP) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEUP; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEUP; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEOVER) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEOVER; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEOVER; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEOUT) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEOUT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEOUT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEMOVE) { + iid = kIDOMMouseMotionListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSEMOTION_MOUSEMOVE; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSEMOTION_MOUSEMOVE; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::CLICK) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_CLICK; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_CLICK; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::DBLCLICK) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_DBLCLICK; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_DBLCLICK; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::KEYDOWN) { + iid = kIDOMKeyListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_KEY_KEYDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_KEY_KEYDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::KEYUP) { + iid = kIDOMKeyListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_KEY_KEYUP; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_KEY_KEYUP; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::KEYPRESS) { + iid = kIDOMKeyListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_KEY_KEYPRESS; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_KEY_KEYPRESS; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + /*if (aEventTypes & nsIDOMEvent::DRAGDROP) { + iid = NS_GET_IID(nsIDOMDragListener); + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEDRAG) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + }*/ + if (aEventTypes & nsIDOMEvent::FOCUS) { + iid = kIDOMFocusListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FOCUS_FOCUS; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FOCUS_FOCUS; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::BLUR) { + iid = kIDOMFocusListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FOCUS_BLUR; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FOCUS_BLUR; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::SELECT) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_SELECT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_SELECT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::CHANGE) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_CHANGE; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_CHANGE; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::RESET) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_RESET; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_RESET; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::SUBMIT) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_SUBMIT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_SUBMIT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::LOAD) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_LOAD; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_LOAD; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::UNLOAD) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_UNLOAD; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_UNLOAD; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::ABORT) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_ABORT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_ABORT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::ERROR) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_ERROR; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_ERROR; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } return NS_OK; } diff --git a/mozilla/content/events/src/nsEventListenerManager.h b/mozilla/content/events/src/nsEventListenerManager.h index 0f953735406..d3af8cbbd25 100644 --- a/mozilla/content/events/src/nsEventListenerManager.h +++ b/mozilla/content/events/src/nsEventListenerManager.h @@ -35,11 +35,12 @@ typedef struct { nsIDOMEventListener* mListener; PRUint8 mFlags; PRUint8 mSubType; - PRUint32 mHandlerIsString; + PRUint8 mHandlerIsString; + PRUint8 mSubTypeCapture; } nsListenerStruct; //Flag must live higher than all event flags in nsGUIEvent.h -#define NS_PRIV_EVENT_FLAG_SCRIPT 0x10 +#define NS_PRIV_EVENT_FLAG_SCRIPT 0x20 /* * Event listener manager @@ -84,8 +85,8 @@ public: const nsIID& aIID); - virtual nsresult CaptureEvent(nsIDOMEventListener *aListener); - virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener); + virtual nsresult CaptureEvent(PRInt32 aEventTypes); + virtual nsresult ReleaseEvent(PRInt32 aEventTypes); virtual nsresult HandleEvent(nsIPresContext* aPresContext, nsEvent* aEvent, @@ -104,12 +105,14 @@ public: protected: nsresult HandleEventSubType(nsListenerStruct* aListenerStruct, nsIDOMEvent* aDOMEvent, - PRUint32 aSubType); + PRUint32 aSubType, + PRUint32 aPhaseFlags); nsListenerStruct* FindJSEventListener(REFNSIID aIID); nsresult SetJSEventListener(nsIScriptContext *aContext, nsIScriptObjectOwner *aOwner, nsIAtom* aName, REFNSIID aIID, PRBool aIsString); nsresult AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID, PRInt32 aFlags, PRInt32 aSubType); nsresult RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID, PRInt32 aFlags, PRInt32 aSubType); void ReleaseListeners(nsVoidArray** aListeners, PRBool aScriptOnly); + nsresult FlipCaptureBit(PRInt32 aEventTypes, PRBool aInitCapture); nsVoidArray* mEventListeners; nsVoidArray* mMouseListeners; diff --git a/mozilla/content/html/document/src/nsHTMLDocument.cpp b/mozilla/content/html/document/src/nsHTMLDocument.cpp index dc9b05b3459..948686baa25 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/content/html/document/src/nsHTMLDocument.cpp @@ -2358,20 +2358,25 @@ nsHTMLDocument::CaptureEvents(PRInt32 aEventFlags) nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - //mManager->CaptureEvent(aListener); + manager->CaptureEvent(aEventFlags); NS_RELEASE(manager); return NS_OK; } + return NS_ERROR_FAILURE; } NS_IMETHODIMP nsHTMLDocument::ReleaseEvents(PRInt32 aEventFlags) { - if (nsnull != mListenerManager) { - //mListenerManager->ReleaseEvent(aListener); + nsIEventListenerManager *manager; + + if (NS_OK == GetListenerManager(&manager)) { + manager->ReleaseEvent(aEventFlags); + NS_RELEASE(manager); return NS_OK; } + return NS_ERROR_FAILURE; } diff --git a/mozilla/content/xul/content/src/nsXULElement.cpp b/mozilla/content/xul/content/src/nsXULElement.cpp index 0c17803f0b8..f82cb0e92eb 100644 --- a/mozilla/content/xul/content/src/nsXULElement.cpp +++ b/mozilla/content/xul/content/src/nsXULElement.cpp @@ -1657,6 +1657,12 @@ nsXULElement::GetNewListenerManager(nsIEventListenerManager **aResult) (void**) aResult); } +NS_IMETHODIMP +nsXULElement::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + //---------------------------------------------------------------------- diff --git a/mozilla/content/xul/content/src/nsXULElement.h b/mozilla/content/xul/content/src/nsXULElement.h index 52170e01dda..6490b9cd882 100644 --- a/mozilla/content/xul/content/src/nsXULElement.h +++ b/mozilla/content/xul/content/src/nsXULElement.h @@ -461,6 +461,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsIScriptObjectOwner NS_IMETHOD GetScriptObject(nsIScriptContext* aContext, void** aScriptObject); diff --git a/mozilla/content/xul/document/src/nsXULDocument.cpp b/mozilla/content/xul/document/src/nsXULDocument.cpp index c919a6fc680..d1eaabc5e9d 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.cpp +++ b/mozilla/content/xul/document/src/nsXULDocument.cpp @@ -3794,6 +3794,12 @@ nsXULDocument::GetNewListenerManager(nsIEventListenerManager **aResult) (void**) aResult); } +NS_IMETHODIMP +nsXULDocument::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsXULDocument::CaptureEvent(const nsString& aType) { diff --git a/mozilla/content/xul/document/src/nsXULDocument.h b/mozilla/content/xul/document/src/nsXULDocument.h index 2cdbf130c82..aa418452b72 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.h +++ b/mozilla/content/xul/document/src/nsXULDocument.h @@ -310,6 +310,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, diff --git a/mozilla/dom/public/coreEvents/nsIDOMEvent.h b/mozilla/dom/public/coreEvents/nsIDOMEvent.h index b0d1c421dc8..e1f5eeb1f74 100644 --- a/mozilla/dom/public/coreEvents/nsIDOMEvent.h +++ b/mozilla/dom/public/coreEvents/nsIDOMEvent.h @@ -40,7 +40,42 @@ public: enum { BUBBLING_PHASE = 1, CAPTURING_PHASE = 2, - AT_TARGET = 3 + AT_TARGET = 3, + MOUSEDOWN = 1, + MOUSEUP = 2, + MOUSEOVER = 4, + MOUSEOUT = 8, + MOUSEMOVE = 16, + MOUSEDRAG = 32, + CLICK = 64, + DBLCLICK = 128, + KEYDOWN = 256, + KEYUP = 512, + KEYPRESS = 1024, + DRAGDROP = 2048, + FOCUS = 4096, + BLUR = 8192, + SELECT = 16384, + CHANGE = 32768, + RESET = 65536, + SUBMIT = 131072, + SCROLL = 262144, + LOAD = 524288, + UNLOAD = 1048576, + XFER_DONE = 2097152, + ABORT = 4194304, + ERROR = 8388608, + LOCATE = 16777216, + MOVE = 33554432, + RESIZE = 67108864, + FORWARD = 134217728, + HELP = 268435456, + BACK = 536870912, + TEXT = 1073741824, + ALT_MASK = 1, + CONTROL_MASK = 2, + SHIFT_MASK = 4, + META_MASK = 8 }; NS_IMETHOD GetType(nsString& aType)=0; diff --git a/mozilla/dom/public/coreEvents/nsIDOMEventReceiver.h b/mozilla/dom/public/coreEvents/nsIDOMEventReceiver.h index 7e1c70c2b2f..eb652f33c37 100644 --- a/mozilla/dom/public/coreEvents/nsIDOMEventReceiver.h +++ b/mozilla/dom/public/coreEvents/nsIDOMEventReceiver.h @@ -33,6 +33,7 @@ class nsIDOMFocusListener; class nsIDOMLoadListener; class nsIDOMDragListener; class nsIEventListenerManager; +class nsIDOMEvent; /* * DOM event source class. Object that allow event registration and distribution @@ -52,6 +53,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID) = 0; NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult) = 0; NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult) = 0; + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent) = 0; }; #endif // nsIDOMEventReceiver_h__ diff --git a/mozilla/dom/public/coreEvents/nsIDOMNSUIEvent.h b/mozilla/dom/public/coreEvents/nsIDOMNSUIEvent.h index fb908904013..9d26afa9db2 100644 --- a/mozilla/dom/public/coreEvents/nsIDOMNSUIEvent.h +++ b/mozilla/dom/public/coreEvents/nsIDOMNSUIEvent.h @@ -37,43 +37,6 @@ class nsIDOMNode; class nsIDOMNSUIEvent : public nsISupports { public: static const nsIID& GetIID() { static nsIID iid = NS_IDOMNSUIEVENT_IID; return iid; } - enum { - MOUSEDOWN = 1, - MOUSEUP = 2, - MOUSEOVER = 4, - MOUSEOUT = 8, - MOUSEMOVE = 16, - MOUSEDRAG = 32, - CLICK = 64, - DBLCLICK = 128, - KEYDOWN = 256, - KEYUP = 512, - KEYPRESS = 1024, - DRAGDROP = 2048, - FOCUS = 4096, - BLUR = 8192, - SELECT = 16384, - CHANGE = 32768, - RESET = 65536, - SUBMIT = 131072, - SCROLL = 262144, - LOAD = 524288, - UNLOAD = 1048576, - XFER_DONE = 2097152, - ABORT = 4194304, - ERROR = 8388608, - LOCATE = 16777216, - MOVE = 33554432, - RESIZE = 67108864, - FORWARD = 134217728, - HELP = 268435456, - BACK = 536870912, - TEXT = 1073741824, - ALT_MASK = 1, - CONTROL_MASK = 2, - SHIFT_MASK = 4, - META_MASK = 8 - }; NS_IMETHOD GetLayerX(PRInt32* aLayerX)=0; diff --git a/mozilla/dom/public/idl/events/Event.idl b/mozilla/dom/public/idl/events/Event.idl index 3df9f89622c..5a67f0703b3 100644 --- a/mozilla/dom/public/idl/events/Event.idl +++ b/mozilla/dom/public/idl/events/Event.idl @@ -7,6 +7,44 @@ const unsigned short CAPTURING_PHASE = 2; const unsigned short AT_TARGET = 3; + const int MOUSEDOWN = 0x00000001; + const int MOUSEUP = 0x00000002; + const int MOUSEOVER = 0x00000004; + const int MOUSEOUT = 0x00000008; + const int MOUSEMOVE = 0x00000010; + const int MOUSEDRAG = 0x00000020; + const int CLICK = 0x00000040; + const int DBLCLICK = 0x00000080; + const int KEYDOWN = 0x00000100; + const int KEYUP = 0x00000200; + const int KEYPRESS = 0x00000400; + const int DRAGDROP = 0x00000800; + const int FOCUS = 0x00001000; + const int BLUR = 0x00002000; + const int SELECT = 0x00004000; + const int CHANGE = 0x00008000; + const int RESET = 0x00010000; + const int SUBMIT = 0x00020000; + const int SCROLL = 0x00040000; + const int LOAD = 0x00080000; + const int UNLOAD = 0x00100000; + const int XFER_DONE = 0x00200000; + const int ABORT = 0x00400000; + const int ERROR = 0x00800000; + const int LOCATE = 0x01000000; + const int MOVE = 0x02000000; + const int RESIZE = 0x04000000; + const int FORWARD = 0x08000000; + const int HELP = 0x10000000; + const int BACK = 0x20000000; + const int TEXT = 0x40000000; + + const int ALT_MASK = 0x00000001; + const int CONTROL_MASK = 0x00000002; + const int SHIFT_MASK = 0x00000004; + const int META_MASK = 0x00000008; + + readonly attribute wstring type; readonly attribute Node target; readonly attribute Node currentNode; diff --git a/mozilla/dom/public/idl/events/UIEvent.idl b/mozilla/dom/public/idl/events/UIEvent.idl index 140f7f3e243..e20a8b18d09 100644 --- a/mozilla/dom/public/idl/events/UIEvent.idl +++ b/mozilla/dom/public/idl/events/UIEvent.idl @@ -14,43 +14,6 @@ /* IID: { 0xa6cf90c4, 0x15b3, 0x11d2, \ { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } } */ - const int MOUSEDOWN = 0x00000001; - const int MOUSEUP = 0x00000002; - const int MOUSEOVER = 0x00000004; - const int MOUSEOUT = 0x00000008; - const int MOUSEMOVE = 0x00000010; - const int MOUSEDRAG = 0x00000020; - const int CLICK = 0x00000040; - const int DBLCLICK = 0x00000080; - const int KEYDOWN = 0x00000100; - const int KEYUP = 0x00000200; - const int KEYPRESS = 0x00000400; - const int DRAGDROP = 0x00000800; - const int FOCUS = 0x00001000; - const int BLUR = 0x00002000; - const int SELECT = 0x00004000; - const int CHANGE = 0x00008000; - const int RESET = 0x00010000; - const int SUBMIT = 0x00020000; - const int SCROLL = 0x00040000; - const int LOAD = 0x00080000; - const int UNLOAD = 0x00100000; - const int XFER_DONE = 0x00200000; - const int ABORT = 0x00400000; - const int ERROR = 0x00800000; - const int LOCATE = 0x01000000; - const int MOVE = 0x02000000; - const int RESIZE = 0x04000000; - const int FORWARD = 0x08000000; - const int HELP = 0x10000000; - const int BACK = 0x20000000; - const int TEXT = 0x40000000; - - const int ALT_MASK = 0x00000001; - const int CONTROL_MASK = 0x00000002; - const int SHIFT_MASK = 0x00000004; - const int META_MASK = 0x00000008; - boolean getPreventDefault(); readonly attribute int layerX; diff --git a/mozilla/dom/src/base/nsGlobalWindow.cpp b/mozilla/dom/src/base/nsGlobalWindow.cpp index 90b6079cab7..cdf0e3e4705 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.cpp +++ b/mozilla/dom/src/base/nsGlobalWindow.cpp @@ -1437,23 +1437,23 @@ NS_IMETHODIMP GlobalWindowImpl::CaptureEvents(PRInt32 aEventFlags) { nsCOMPtr manager; - GetListenerManager(getter_AddRefs(manager)); - if(manager) - { - // manager->CaptureEvent(aListener); + if (NS_SUCCEEDED(GetListenerManager(getter_AddRefs(manager)))) { + manager->CaptureEvent(aEventFlags); return NS_OK; - } + } return NS_ERROR_FAILURE; } NS_IMETHODIMP GlobalWindowImpl::ReleaseEvents(PRInt32 aEventFlags) { - if(mListenerManager) - { - //mListenerManager->ReleaseEvent(aListener); + nsCOMPtr manager; + + if (NS_SUCCEEDED(GetListenerManager(getter_AddRefs(manager)))) { + manager->ReleaseEvent(aEventFlags); return NS_OK; - } + } + return NS_ERROR_FAILURE; } @@ -2024,6 +2024,11 @@ NS_IMETHODIMP GlobalWindowImpl::GetNewListenerManager(nsIEventListenerManager ** return NS_ERROR_FAILURE; } +NS_IMETHODIMP GlobalWindowImpl::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + //***************************************************************************** // GlobalWindowImpl::nsPIDOMWindow //***************************************************************************** diff --git a/mozilla/dom/src/base/nsGlobalWindow.h b/mozilla/dom/src/base/nsGlobalWindow.h index f73f620c207..e6d3e1e1cd9 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.h +++ b/mozilla/dom/src/base/nsGlobalWindow.h @@ -132,6 +132,7 @@ public: const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsPIDOMWindow NS_IMETHOD GetPrivateParent(nsPIDOMWindow** aResult); diff --git a/mozilla/dom/src/base/nsJSEnvironment.cpp b/mozilla/dom/src/base/nsJSEnvironment.cpp index 724ee27b11c..631c58b676b 100644 --- a/mozilla/dom/src/base/nsJSEnvironment.cpp +++ b/mozilla/dom/src/base/nsJSEnvironment.cpp @@ -33,7 +33,7 @@ #include "nsIDOMAttr.h" #include "nsIDOMNamedNodeMap.h" #include "nsIDOMNodeList.h" -#include "nsIDOMEvent.h" +#include "nsIDOMKeyEvent.h" #include "nsIDOMHTMLImageElement.h" #include "nsIDOMHTMLOptionElement.h" #include "nsIScriptSecurityManager.h" @@ -700,7 +700,7 @@ nsJSContext::InitClasses() NS_OK == NS_InitAttrClass(this, nsnull) && NS_OK == NS_InitNamedNodeMapClass(this, nsnull) && NS_OK == NS_InitNodeListClass(this, nsnull) && - NS_OK == NS_InitEventClass(this, nsnull) && + NS_OK == NS_InitKeyEventClass(this, nsnull) && NS_OK == InitializeLiveConnectClasses() && NS_OK == InitializeExternalClasses() && // XXX Temporarily here. These shouldn't be hardcoded. diff --git a/mozilla/dom/src/events/nsJSEvent.cpp b/mozilla/dom/src/events/nsJSEvent.cpp index 4a6c4300959..d823a409145 100644 --- a/mozilla/dom/src/events/nsJSEvent.cpp +++ b/mozilla/dom/src/events/nsJSEvent.cpp @@ -542,6 +542,111 @@ extern "C" NS_DOM nsresult NS_InitEventClass(nsIScriptContext *aContext, void ** vp = INT_TO_JSVAL(nsIDOMEvent::AT_TARGET); JS_SetProperty(jscontext, constructor, "AT_TARGET", &vp); + vp = INT_TO_JSVAL(nsIDOMEvent::MOUSEDOWN); + JS_SetProperty(jscontext, constructor, "MOUSEDOWN", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::MOUSEUP); + JS_SetProperty(jscontext, constructor, "MOUSEUP", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::MOUSEOVER); + JS_SetProperty(jscontext, constructor, "MOUSEOVER", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::MOUSEOUT); + JS_SetProperty(jscontext, constructor, "MOUSEOUT", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::MOUSEMOVE); + JS_SetProperty(jscontext, constructor, "MOUSEMOVE", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::MOUSEDRAG); + JS_SetProperty(jscontext, constructor, "MOUSEDRAG", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::CLICK); + JS_SetProperty(jscontext, constructor, "CLICK", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::DBLCLICK); + JS_SetProperty(jscontext, constructor, "DBLCLICK", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::KEYDOWN); + JS_SetProperty(jscontext, constructor, "KEYDOWN", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::KEYUP); + JS_SetProperty(jscontext, constructor, "KEYUP", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::KEYPRESS); + JS_SetProperty(jscontext, constructor, "KEYPRESS", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::DRAGDROP); + JS_SetProperty(jscontext, constructor, "DRAGDROP", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::FOCUS); + JS_SetProperty(jscontext, constructor, "FOCUS", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::BLUR); + JS_SetProperty(jscontext, constructor, "BLUR", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::SELECT); + JS_SetProperty(jscontext, constructor, "SELECT", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::CHANGE); + JS_SetProperty(jscontext, constructor, "CHANGE", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::RESET); + JS_SetProperty(jscontext, constructor, "RESET", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::SUBMIT); + JS_SetProperty(jscontext, constructor, "SUBMIT", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::SCROLL); + JS_SetProperty(jscontext, constructor, "SCROLL", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::LOAD); + JS_SetProperty(jscontext, constructor, "LOAD", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::UNLOAD); + JS_SetProperty(jscontext, constructor, "UNLOAD", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::XFER_DONE); + JS_SetProperty(jscontext, constructor, "XFER_DONE", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::ABORT); + JS_SetProperty(jscontext, constructor, "ABORT", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::ERROR); + JS_SetProperty(jscontext, constructor, "ERROR", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::LOCATE); + JS_SetProperty(jscontext, constructor, "LOCATE", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::MOVE); + JS_SetProperty(jscontext, constructor, "MOVE", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::RESIZE); + JS_SetProperty(jscontext, constructor, "RESIZE", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::FORWARD); + JS_SetProperty(jscontext, constructor, "FORWARD", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::HELP); + JS_SetProperty(jscontext, constructor, "HELP", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::BACK); + JS_SetProperty(jscontext, constructor, "BACK", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::TEXT); + JS_SetProperty(jscontext, constructor, "TEXT", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::ALT_MASK); + JS_SetProperty(jscontext, constructor, "ALT_MASK", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::CONTROL_MASK); + JS_SetProperty(jscontext, constructor, "CONTROL_MASK", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::SHIFT_MASK); + JS_SetProperty(jscontext, constructor, "SHIFT_MASK", &vp); + + vp = INT_TO_JSVAL(nsIDOMEvent::META_MASK); + JS_SetProperty(jscontext, constructor, "META_MASK", &vp); + } } diff --git a/mozilla/layout/base/src/nsDocument.cpp b/mozilla/layout/base/src/nsDocument.cpp index 4c97c602d17..7a8bc481075 100644 --- a/mozilla/layout/base/src/nsDocument.cpp +++ b/mozilla/layout/base/src/nsDocument.cpp @@ -2443,6 +2443,11 @@ nsresult nsDocument::GetNewListenerManager(nsIEventListenerManager **aInstancePt return NS_NewEventListenerManager(aInstancePtrResult); } +nsresult nsDocument::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsDocument::HandleDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, nsIDOMEvent** aDOMEvent, diff --git a/mozilla/layout/base/src/nsDocument.h b/mozilla/layout/base/src/nsDocument.h index fa249f6b108..6989505fe31 100644 --- a/mozilla/layout/base/src/nsDocument.h +++ b/mozilla/layout/base/src/nsDocument.h @@ -371,6 +371,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsIDiskDocument inteface NS_IMETHOD InitDiskDocument(nsFileSpec *aFileSpec); diff --git a/mozilla/layout/base/src/nsGenericDOMDataNode.cpp b/mozilla/layout/base/src/nsGenericDOMDataNode.cpp index 0ef88b7f33f..c1d1c249fe0 100644 --- a/mozilla/layout/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/layout/base/src/nsGenericDOMDataNode.cpp @@ -518,6 +518,12 @@ nsGenericDOMDataNode::GetNewListenerManager(nsIEventListenerManager** aResult) return NS_NewEventListenerManager(aResult); } +nsresult +nsGenericDOMDataNode::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsGenericDOMDataNode::AddEventListenerByIID(nsIDOMEventListener* aListener, const nsIID& aIID) diff --git a/mozilla/layout/base/src/nsGenericDOMDataNode.h b/mozilla/layout/base/src/nsGenericDOMDataNode.h index 68d50b952f0..ca4cb2ca651 100644 --- a/mozilla/layout/base/src/nsGenericDOMDataNode.h +++ b/mozilla/layout/base/src/nsGenericDOMDataNode.h @@ -111,6 +111,7 @@ struct nsGenericDOMDataNode { const nsIID& aIID); nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult); nsresult GetNewListenerManager(nsIEventListenerManager** aInstancePtrResult); + nsresult HandleEvent(nsIDOMEvent *aEvent); // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, @@ -355,6 +356,9 @@ struct nsGenericDOMDataNode { NS_IMETHOD GetNewListenerManager(nsIEventListenerManager** aResult) { \ return _g.GetNewListenerManager(aResult); \ } \ + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent) { \ + return _g.HandleEvent(aEvent); \ + } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ PRBool aUseCapture) { \ diff --git a/mozilla/layout/base/src/nsGenericElement.cpp b/mozilla/layout/base/src/nsGenericElement.cpp index 340e9ac57b2..212e804b7b8 100644 --- a/mozilla/layout/base/src/nsGenericElement.cpp +++ b/mozilla/layout/base/src/nsGenericElement.cpp @@ -1254,6 +1254,12 @@ nsGenericElement::GetNewListenerManager(nsIEventListenerManager** aResult) return NS_NewEventListenerManager(aResult); } +nsresult +nsGenericElement::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsGenericElement::AddEventListenerByIID(nsIDOMEventListener* aListener, const nsIID& aIID) diff --git a/mozilla/layout/base/src/nsGenericElement.h b/mozilla/layout/base/src/nsGenericElement.h index 32065749371..17b1d662c05 100644 --- a/mozilla/layout/base/src/nsGenericElement.h +++ b/mozilla/layout/base/src/nsGenericElement.h @@ -157,6 +157,7 @@ public: const nsIID& aIID); nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult); nsresult GetNewListenerManager(nsIEventListenerManager** aInstancePtrResult); + nsresult HandleEvent(nsIDOMEvent *aEvent); // nsIDOMEventTarget interface nsresult AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, @@ -449,6 +450,9 @@ public: NS_IMETHOD GetNewListenerManager(nsIEventListenerManager** aResult) { \ return _g.GetNewListenerManager(aResult); \ } \ + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent) { \ + return _g.HandleEvent(aEvent); \ + } \ NS_IMETHOD AddEventListener(const nsString& aType, \ nsIDOMEventListener* aListener, \ PRBool aUseCapture) { \ diff --git a/mozilla/layout/events/public/nsIEventListenerManager.h b/mozilla/layout/events/public/nsIEventListenerManager.h index b40f2cb03bc..0b717c5bcde 100644 --- a/mozilla/layout/events/public/nsIEventListenerManager.h +++ b/mozilla/layout/events/public/nsIEventListenerManager.h @@ -117,23 +117,22 @@ public: nsIDOMEvent** aDOMEvent) = 0; /** - * Captures all events designated for descendant objects at the current level. - * @param an event listener + * Changes script listener of specified event types from bubbling listeners to capturing listeners. + * @param event types */ - virtual nsresult CaptureEvent(nsIDOMEventListener *aListener) = 0; + virtual nsresult CaptureEvent(PRInt32 aEventTypes) = 0; /** - * Releases all events designated for descendant objects at the current level. - * @param an event listener + * Changes script listener of specified event types from capturing listeners to bubbling listeners. + * @param event types */ - virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener) = 0; + virtual nsresult ReleaseEvent(PRInt32 aEventTypes) = 0; /** * Removes all event listeners registered by this instance of the listener * manager. */ virtual nsresult RemoveAllListeners(PRBool aScriptOnly) = 0; - }; extern NS_HTML nsresult NS_NewEventListenerManager(nsIEventListenerManager** aInstancePtrResult); diff --git a/mozilla/layout/events/src/nsEventListenerManager.cpp b/mozilla/layout/events/src/nsEventListenerManager.cpp index 25bad5963b7..8af436004ac 100644 --- a/mozilla/layout/events/src/nsEventListenerManager.cpp +++ b/mozilla/layout/events/src/nsEventListenerManager.cpp @@ -201,8 +201,7 @@ nsresult nsEventListenerManager::AddEventListener(nsIDOMEventListener *aListener for (int i=0; i<(*listeners)->Count(); i++) { ls = (nsListenerStruct*)(*listeners)->ElementAt(i); - if (ls->mListener == aListener) { - ls->mFlags |= aFlags; + if (ls->mListener == aListener && ls->mFlags == aFlags) { ls->mSubType |= aSubType; found = PR_TRUE; break; @@ -229,6 +228,7 @@ nsresult nsEventListenerManager::AddEventListener(nsIDOMEventListener *aListener ls->mListener = aListener; ls->mFlags = aFlags; ls->mSubType = aSubType; + ls->mSubTypeCapture = NS_EVENT_BITS_NONE; ls->mHandlerIsString = 0; (*listeners)->InsertElementAt((void*)ls, (*listeners)->Count()); NS_ADDREF(aListener); @@ -253,7 +253,7 @@ nsresult nsEventListenerManager::RemoveEventListener(nsIDOMEventListener *aListe for (int i=0; i<(*listeners)->Count(); i++) { ls = (nsListenerStruct*)(*listeners)->ElementAt(i); - if (ls->mListener == aListener) { + if (ls->mListener == aListener && ls->mFlags == aFlags) { ls->mFlags &= ~aFlags; ls->mSubType &= ~aSubType; if (ls->mFlags == NS_EVENT_FLAG_NONE && ls->mSubType == NS_EVENT_BITS_NONE) { @@ -512,12 +512,16 @@ nsresult nsEventListenerManager::SetJSEventListener(nsIScriptContext *aContext, nsIID iid; result = GetIdentifiersForType(aName, iid, &flags); if (NS_SUCCEEDED(result)) { + //Set flag to indicate possible need for compilation later if (aIsString) { ls->mHandlerIsString |= flags; } else { ls->mHandlerIsString &= ~flags; } + + //Set subtype flags based on event + ls->mSubType |= flags; } } @@ -606,64 +610,80 @@ nsresult nsEventListenerManager::RegisterScriptEventListener(nsIScriptContext *a nsresult nsEventListenerManager::HandleEventSubType(nsListenerStruct* aListenerStruct, nsIDOMEvent* aDOMEvent, - PRUint32 aSubType) + PRUint32 aSubType, + PRUint32 aPhaseFlags) { nsresult result = NS_OK; // If this is a script handler and we haven't yet // compiled the event handler itself - if ((aListenerStruct->mFlags & NS_PRIV_EVENT_FLAG_SCRIPT) && - (aListenerStruct->mHandlerIsString & aSubType)) { - nsCOMPtr jslistener = do_QueryInterface(aListenerStruct->mListener); - if (jslistener) { - nsCOMPtr owner; - nsCOMPtr scriptCX; - result = jslistener->GetEventTarget(getter_AddRefs(scriptCX), getter_AddRefs(owner)); + if (aListenerStruct->mFlags & NS_PRIV_EVENT_FLAG_SCRIPT) { + // If we're not in the capture phase we must *NOT* have capture flags + // set. Compiled script handlers are one or the other, not both. + if (aPhaseFlags & NS_EVENT_FLAG_BUBBLE && !aPhaseFlags & NS_EVENT_FLAG_INIT) { + if (aListenerStruct->mSubTypeCapture & aSubType) { + return result; + } + } + // If we're in the capture phase we must have capture flags set. + else if (aPhaseFlags & NS_EVENT_FLAG_CAPTURE && !aPhaseFlags & NS_EVENT_FLAG_INIT) { + if (!(aListenerStruct->mSubTypeCapture & aSubType)) { + return result; + } + } + + if (aListenerStruct->mHandlerIsString & aSubType) { + nsCOMPtr jslistener = do_QueryInterface(aListenerStruct->mListener); + if (jslistener) { + nsCOMPtr owner; + nsCOMPtr scriptCX; + result = jslistener->GetEventTarget(getter_AddRefs(scriptCX), getter_AddRefs(owner)); - if (NS_SUCCEEDED(result)) { - JSObject* jsobj; - result = owner->GetScriptObject(scriptCX, (void**)&jsobj); if (NS_SUCCEEDED(result)) { - nsAutoString eventString; - if (NS_SUCCEEDED(aDOMEvent->GetType(eventString))) { - eventString.Insert("on", 0, 2); - nsCOMPtr atom = getter_AddRefs(NS_NewAtom(eventString)); + JSObject* jsobj; + result = owner->GetScriptObject(scriptCX, (void**)&jsobj); + if (NS_SUCCEEDED(result)) { + nsAutoString eventString; + if (NS_SUCCEEDED(aDOMEvent->GetType(eventString))) { + eventString.Insert("on", 0, 2); + nsCOMPtr atom = getter_AddRefs(NS_NewAtom(eventString)); - nsCOMPtr handlerOwner = do_QueryInterface(owner); - void* handler = nsnull; + nsCOMPtr handlerOwner = do_QueryInterface(owner); + void* handler = nsnull; - if (handlerOwner) { - result = handlerOwner->GetCompiledEventHandler(atom, &handler); - if (NS_SUCCEEDED(result) && handler) { - result = scriptCX->BindCompiledEventHandler(jsobj, atom, handler); - aListenerStruct->mHandlerIsString &= ~aSubType; + if (handlerOwner) { + result = handlerOwner->GetCompiledEventHandler(atom, &handler); + if (NS_SUCCEEDED(result) && handler) { + result = scriptCX->BindCompiledEventHandler(jsobj, atom, handler); + aListenerStruct->mHandlerIsString &= ~aSubType; + } } - } - if (aListenerStruct->mHandlerIsString & aSubType) { - // This should never happen for anything but content - // XXX I don't like that we have to reference content - // from here. The alternative is to store the event handler - // string on the JS object itself. - nsCOMPtr content = do_QueryInterface(owner); - NS_ASSERTION(content, "only content should have event handler attributes"); - if (content) { - nsAutoString handlerBody; - result = content->GetAttribute(kNameSpaceID_None, atom, handlerBody); - if (NS_SUCCEEDED(result)) { - if (handlerOwner) { - // Always let the handler owner compile the event - // handler, as it may want to use a special - // context or scope object. - result = handlerOwner->CompileEventHandler(scriptCX, jsobj, atom, handlerBody, &handler); + if (aListenerStruct->mHandlerIsString & aSubType) { + // This should never happen for anything but content + // XXX I don't like that we have to reference content + // from here. The alternative is to store the event handler + // string on the JS object itself. + nsCOMPtr content = do_QueryInterface(owner); + NS_ASSERTION(content, "only content should have event handler attributes"); + if (content) { + nsAutoString handlerBody; + result = content->GetAttribute(kNameSpaceID_None, atom, handlerBody); + if (NS_SUCCEEDED(result)) { + if (handlerOwner) { + // Always let the handler owner compile the event + // handler, as it may want to use a special + // context or scope object. + result = handlerOwner->CompileEventHandler(scriptCX, jsobj, atom, handlerBody, &handler); + } + else { + result = scriptCX->CompileEventHandler(jsobj, atom, handlerBody, + (handlerOwner != nsnull), + &handler); + } + if (NS_SUCCEEDED(result)) + aListenerStruct->mHandlerIsString &= ~aSubType; } - else { - result = scriptCX->CompileEventHandler(jsobj, atom, handlerBody, - (handlerOwner != nsnull), - &handler); - } - if (NS_SUCCEEDED(result)) - aListenerStruct->mHandlerIsString &= ~aSubType; } } } @@ -814,7 +834,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -860,7 +880,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -925,7 +945,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -960,7 +980,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, correctSubType = PR_TRUE; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1026,7 +1046,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1082,7 +1102,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1168,7 +1188,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1225,7 +1245,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1259,7 +1279,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, correctSubType = PR_TRUE; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1338,7 +1358,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || dragStruct->mSubType == NS_EVENT_BITS_DRAG_NONE) - ret = HandleEventSubType(dragStruct, *aDOMEvent, subType); + ret = HandleEventSubType(dragStruct, *aDOMEvent, subType, aFlags); } } } @@ -1433,7 +1453,7 @@ nsresult nsEventListenerManager::HandleEvent(nsIPresContext* aPresContext, break; } if (correctSubType || ls->mSubType == NS_EVENT_BITS_NONE) { - ret = HandleEventSubType(ls, *aDOMEvent, subType); + ret = HandleEventSubType(ls, *aDOMEvent, subType, aFlags); } } } @@ -1474,9 +1494,9 @@ nsresult nsEventListenerManager::CreateEvent(nsIPresContext* aPresContext, * @param an event listener */ -nsresult nsEventListenerManager::CaptureEvent(nsIDOMEventListener *aListener) +nsresult nsEventListenerManager::CaptureEvent(PRInt32 aEventTypes) { - return NS_OK; + return FlipCaptureBit(aEventTypes, PR_TRUE); } /** @@ -1484,8 +1504,214 @@ nsresult nsEventListenerManager::CaptureEvent(nsIDOMEventListener *aListener) * @param an event listener */ -nsresult nsEventListenerManager::ReleaseEvent(nsIDOMEventListener *aListener) +nsresult nsEventListenerManager::ReleaseEvent(PRInt32 aEventTypes) { + return FlipCaptureBit(aEventTypes, PR_FALSE); +} + +nsresult nsEventListenerManager::FlipCaptureBit(PRInt32 aEventTypes, PRBool aInitCapture) +{ + nsIID iid; + nsListenerStruct *ls; + + if (aEventTypes & nsIDOMEvent::MOUSEDOWN) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEUP) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEUP; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEUP; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEOVER) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEOVER; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEOVER; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEOUT) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEOUT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEOUT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEMOVE) { + iid = kIDOMMouseMotionListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSEMOTION_MOUSEMOVE; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSEMOTION_MOUSEMOVE; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::CLICK) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_CLICK; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_CLICK; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::DBLCLICK) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_DBLCLICK; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_DBLCLICK; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::KEYDOWN) { + iid = kIDOMKeyListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_KEY_KEYDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_KEY_KEYDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::KEYUP) { + iid = kIDOMKeyListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_KEY_KEYUP; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_KEY_KEYUP; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::KEYPRESS) { + iid = kIDOMKeyListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_KEY_KEYPRESS; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_KEY_KEYPRESS; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + /*if (aEventTypes & nsIDOMEvent::DRAGDROP) { + iid = NS_GET_IID(nsIDOMDragListener); + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::MOUSEDRAG) { + iid = kIDOMMouseListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_MOUSE_MOUSEDOWN; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_MOUSE_MOUSEDOWN; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + }*/ + if (aEventTypes & nsIDOMEvent::FOCUS) { + iid = kIDOMFocusListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FOCUS_FOCUS; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FOCUS_FOCUS; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::BLUR) { + iid = kIDOMFocusListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FOCUS_BLUR; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FOCUS_BLUR; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::SELECT) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_SELECT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_SELECT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::CHANGE) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_CHANGE; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_CHANGE; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::RESET) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_RESET; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_RESET; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::SUBMIT) { + iid = kIDOMFormListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_FORM_SUBMIT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_FORM_SUBMIT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::LOAD) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_LOAD; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_LOAD; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::UNLOAD) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_UNLOAD; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_UNLOAD; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::ABORT) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_ABORT; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_ABORT; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } + if (aEventTypes & nsIDOMEvent::ERROR) { + iid = kIDOMLoadListenerIID; + ls = FindJSEventListener(iid); + if (ls) { + if (aInitCapture) ls->mSubTypeCapture |= NS_EVENT_BITS_LOAD_ERROR; + else ls->mSubTypeCapture &= ~NS_EVENT_BITS_LOAD_ERROR; + ls->mFlags |= NS_EVENT_FLAG_CAPTURE; + } + } return NS_OK; } diff --git a/mozilla/layout/events/src/nsEventListenerManager.h b/mozilla/layout/events/src/nsEventListenerManager.h index 0f953735406..d3af8cbbd25 100644 --- a/mozilla/layout/events/src/nsEventListenerManager.h +++ b/mozilla/layout/events/src/nsEventListenerManager.h @@ -35,11 +35,12 @@ typedef struct { nsIDOMEventListener* mListener; PRUint8 mFlags; PRUint8 mSubType; - PRUint32 mHandlerIsString; + PRUint8 mHandlerIsString; + PRUint8 mSubTypeCapture; } nsListenerStruct; //Flag must live higher than all event flags in nsGUIEvent.h -#define NS_PRIV_EVENT_FLAG_SCRIPT 0x10 +#define NS_PRIV_EVENT_FLAG_SCRIPT 0x20 /* * Event listener manager @@ -84,8 +85,8 @@ public: const nsIID& aIID); - virtual nsresult CaptureEvent(nsIDOMEventListener *aListener); - virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener); + virtual nsresult CaptureEvent(PRInt32 aEventTypes); + virtual nsresult ReleaseEvent(PRInt32 aEventTypes); virtual nsresult HandleEvent(nsIPresContext* aPresContext, nsEvent* aEvent, @@ -104,12 +105,14 @@ public: protected: nsresult HandleEventSubType(nsListenerStruct* aListenerStruct, nsIDOMEvent* aDOMEvent, - PRUint32 aSubType); + PRUint32 aSubType, + PRUint32 aPhaseFlags); nsListenerStruct* FindJSEventListener(REFNSIID aIID); nsresult SetJSEventListener(nsIScriptContext *aContext, nsIScriptObjectOwner *aOwner, nsIAtom* aName, REFNSIID aIID, PRBool aIsString); nsresult AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID, PRInt32 aFlags, PRInt32 aSubType); nsresult RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID, PRInt32 aFlags, PRInt32 aSubType); void ReleaseListeners(nsVoidArray** aListeners, PRBool aScriptOnly); + nsresult FlipCaptureBit(PRInt32 aEventTypes, PRBool aInitCapture); nsVoidArray* mEventListeners; nsVoidArray* mMouseListeners; diff --git a/mozilla/layout/html/document/src/nsHTMLDocument.cpp b/mozilla/layout/html/document/src/nsHTMLDocument.cpp index dc9b05b3459..948686baa25 100644 --- a/mozilla/layout/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/layout/html/document/src/nsHTMLDocument.cpp @@ -2358,20 +2358,25 @@ nsHTMLDocument::CaptureEvents(PRInt32 aEventFlags) nsIEventListenerManager *manager; if (NS_OK == GetListenerManager(&manager)) { - //mManager->CaptureEvent(aListener); + manager->CaptureEvent(aEventFlags); NS_RELEASE(manager); return NS_OK; } + return NS_ERROR_FAILURE; } NS_IMETHODIMP nsHTMLDocument::ReleaseEvents(PRInt32 aEventFlags) { - if (nsnull != mListenerManager) { - //mListenerManager->ReleaseEvent(aListener); + nsIEventListenerManager *manager; + + if (NS_OK == GetListenerManager(&manager)) { + manager->ReleaseEvent(aEventFlags); + NS_RELEASE(manager); return NS_OK; } + return NS_ERROR_FAILURE; } diff --git a/mozilla/rdf/content/src/nsXULDocument.cpp b/mozilla/rdf/content/src/nsXULDocument.cpp index c919a6fc680..d1eaabc5e9d 100644 --- a/mozilla/rdf/content/src/nsXULDocument.cpp +++ b/mozilla/rdf/content/src/nsXULDocument.cpp @@ -3794,6 +3794,12 @@ nsXULDocument::GetNewListenerManager(nsIEventListenerManager **aResult) (void**) aResult); } +NS_IMETHODIMP +nsXULDocument::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + nsresult nsXULDocument::CaptureEvent(const nsString& aType) { diff --git a/mozilla/rdf/content/src/nsXULDocument.h b/mozilla/rdf/content/src/nsXULDocument.h index 2cdbf130c82..aa418452b72 100644 --- a/mozilla/rdf/content/src/nsXULDocument.h +++ b/mozilla/rdf/content/src/nsXULDocument.h @@ -310,6 +310,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsIDOMEventTarget interface NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener, diff --git a/mozilla/rdf/content/src/nsXULElement.cpp b/mozilla/rdf/content/src/nsXULElement.cpp index 0c17803f0b8..f82cb0e92eb 100644 --- a/mozilla/rdf/content/src/nsXULElement.cpp +++ b/mozilla/rdf/content/src/nsXULElement.cpp @@ -1657,6 +1657,12 @@ nsXULElement::GetNewListenerManager(nsIEventListenerManager **aResult) (void**) aResult); } +NS_IMETHODIMP +nsXULElement::HandleEvent(nsIDOMEvent *aEvent) +{ + return NS_ERROR_FAILURE; +} + //---------------------------------------------------------------------- diff --git a/mozilla/rdf/content/src/nsXULElement.h b/mozilla/rdf/content/src/nsXULElement.h index 52170e01dda..6490b9cd882 100644 --- a/mozilla/rdf/content/src/nsXULElement.h +++ b/mozilla/rdf/content/src/nsXULElement.h @@ -461,6 +461,7 @@ public: NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID); NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult); + NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent); // nsIScriptObjectOwner NS_IMETHOD GetScriptObject(nsIScriptContext* aContext, void** aScriptObject);