diff --git a/content/events/public/nsIEventStateManager.h b/content/events/public/nsIEventStateManager.h index cc511666341e..8e274e494d67 100644 --- a/content/events/public/nsIEventStateManager.h +++ b/content/events/public/nsIEventStateManager.h @@ -52,10 +52,11 @@ class imgIContainer; /* * Event state manager interface. */ -// {14E5E066-E60A-446b-965F-A9ECAA7098F3} +// {9d25327a-7a17-4d19-928c-f7f3ac19b763} #define NS_IEVENTSTATEMANAGER_IID \ -{ 0x14e5e066, 0xe60a, 0x446b, \ - { 0x96, 0x5f, 0xa9, 0xec, 0xaa, 0x70, 0x98, 0xf3 } } +{ 0x9d25327a, 0x7a17, 0x4d19, \ + { 0x92, 0x8c, 0xf7, 0xf3, 0xac, 0x19, 0xb7, 0x63 } } + #define NS_EVENT_NEEDS_FRAME(event) (!NS_IS_FOCUS_EVENT(event)) @@ -92,7 +93,6 @@ public: NS_IMETHOD GetEventTarget(nsIFrame **aFrame) = 0; NS_IMETHOD GetEventTargetContent(nsEvent* aEvent, nsIContent** aContent) = 0; - NS_IMETHOD GetEventRelatedContent(nsIContent** aContent) = 0; NS_IMETHOD GetContentState(nsIContent *aContent, PRInt32& aState) = 0; diff --git a/content/events/src/nsDOMEvent.cpp b/content/events/src/nsDOMEvent.cpp index b2b53c29c389..1dc9d8e65bb8 100644 --- a/content/events/src/nsDOMEvent.cpp +++ b/content/events/src/nsDOMEvent.cpp @@ -623,6 +623,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData() isInputEvent = PR_TRUE; mouseEvent->clickCount = oldMouseEvent->clickCount; mouseEvent->acceptActivation = oldMouseEvent->acceptActivation; + mouseEvent->relatedTarget = oldMouseEvent->relatedTarget; newEvent = mouseEvent; break; } @@ -670,6 +671,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData() NS_STATIC_CAST(nsMouseScrollEvent*, mEvent); mouseScrollEvent->scrollFlags = oldMouseScrollEvent->scrollFlags; mouseScrollEvent->delta = oldMouseScrollEvent->delta; + mouseScrollEvent->relatedTarget = oldMouseScrollEvent->relatedTarget; newEvent = mouseScrollEvent; break; } diff --git a/content/events/src/nsDOMMouseEvent.cpp b/content/events/src/nsDOMMouseEvent.cpp index 752b839e233a..4ee60b9deee2 100644 --- a/content/events/src/nsDOMMouseEvent.cpp +++ b/content/events/src/nsDOMMouseEvent.cpp @@ -76,6 +76,26 @@ nsDOMMouseEvent::nsDOMMouseEvent(nsPresContext* aPresContext, } } +nsDOMMouseEvent::~nsDOMMouseEvent() +{ + if (mEventIsInternal) { + delete mEvent->userType; + switch (mEvent->eventStructType) + { + case NS_MOUSE_EVENT: + delete NS_STATIC_CAST(nsMouseEvent*, mEvent); + break; + case NS_MOUSE_SCROLL_EVENT: + delete NS_STATIC_CAST(nsMouseScrollEvent*, mEvent); + break; + default: + delete mEvent; + break; + } + mEvent = nsnull; + } +} + NS_IMPL_ADDREF_INHERITED(nsDOMMouseEvent, nsDOMUIEvent) NS_IMPL_RELEASE_INHERITED(nsDOMMouseEvent, nsDOMUIEvent) @@ -99,6 +119,12 @@ nsDOMMouseEvent::InitMouseEvent(const nsAString & aType, PRBool aCanBubble, PRBo case NS_MOUSE_EVENT: case NS_MOUSE_SCROLL_EVENT: { + if (mEvent->eventStructType == NS_MOUSE_EVENT) { + NS_STATIC_CAST(nsMouseEvent*, mEvent)->relatedTarget = aRelatedTarget; + } else { + NS_STATIC_CAST(nsMouseScrollEvent*, mEvent)->relatedTarget = + aRelatedTarget; + } nsInputEvent* inputEvent = NS_STATIC_CAST(nsInputEvent*, mEvent); inputEvent->isControl = aCtrlKey; inputEvent->isAlt = aAltKey; @@ -193,19 +219,23 @@ nsDOMMouseEvent::GetRelatedTarget(nsIDOMEventTarget** aRelatedTarget) { NS_ENSURE_ARG_POINTER(aRelatedTarget); *aRelatedTarget = nsnull; - - if (!mPresContext) { - return NS_OK; + nsISupports* relatedTarget = nsnull; + switch(mEvent->eventStructType) + { + case NS_MOUSE_EVENT: + relatedTarget = NS_STATIC_CAST(nsMouseEvent*, mEvent)->relatedTarget; + break; + case NS_MOUSE_SCROLL_EVENT: + relatedTarget = NS_STATIC_CAST(nsMouseScrollEvent*, mEvent)->relatedTarget; + break; + default: + break; } - nsCOMPtr relatedContent; - mPresContext->EventStateManager()-> - GetEventRelatedContent(getter_AddRefs(relatedContent)); - if (!relatedContent) { - return NS_OK; + if (relatedTarget) { + CallQueryInterface(relatedTarget, aRelatedTarget); } - - return CallQueryInterface(relatedContent, aRelatedTarget); + return NS_OK; } NS_METHOD nsDOMMouseEvent::GetScreenX(PRInt32* aScreenX) diff --git a/content/events/src/nsDOMMouseEvent.h b/content/events/src/nsDOMMouseEvent.h index 06311b9dff46..3daf25b029ca 100644 --- a/content/events/src/nsDOMMouseEvent.h +++ b/content/events/src/nsDOMMouseEvent.h @@ -51,6 +51,7 @@ class nsDOMMouseEvent : public nsIDOMMouseEvent, { public: nsDOMMouseEvent(nsPresContext* aPresContext, nsInputEvent* aEvent); + virtual ~nsDOMMouseEvent(); NS_DECL_ISUPPORTS_INHERITED diff --git a/content/events/src/nsEventStateManager.cpp b/content/events/src/nsEventStateManager.cpp index 1eda887c0358..46f6b2abd510 100644 --- a/content/events/src/nsEventStateManager.cpp +++ b/content/events/src/nsEventStateManager.cpp @@ -2735,9 +2735,9 @@ nsEventStateManager::DispatchMouseEvent(nsGUIEvent* aEvent, PRUint32 aMessage, event.isAlt = ((nsMouseEvent*)aEvent)->isAlt; event.isMeta = ((nsMouseEvent*)aEvent)->isMeta; event.nativeMsg = ((nsMouseEvent*)aEvent)->nativeMsg; + event.relatedTarget = aRelatedContent; mCurrentTargetContent = aTargetContent; - mCurrentRelatedContent = aRelatedContent; BeforeDispatchEvent(); nsIFrame* targetFrame = nsnull; @@ -2761,7 +2761,6 @@ nsEventStateManager::DispatchMouseEvent(nsGUIEvent* aEvent, PRUint32 aMessage, AfterDispatchEvent(); mCurrentTargetContent = nsnull; - mCurrentRelatedContent = nsnull; return targetFrame; } @@ -2948,12 +2947,12 @@ nsEventStateManager::GenerateDragDropEnterExit(nsPresContext* aPresContext, event.isControl = ((nsMouseEvent*)aEvent)->isControl; event.isAlt = ((nsMouseEvent*)aEvent)->isAlt; event.isMeta = ((nsMouseEvent*)aEvent)->isMeta; + event.relatedTarget = targetContent; //The frame has change but the content may not have. Check before dispatching to content mLastDragOverFrame->GetContentForEvent(aPresContext, aEvent, getter_AddRefs(lastContent)); mCurrentTargetContent = lastContent; - mCurrentRelatedContent = targetContent; if ( lastContent != targetContent ) { //XXX This event should still go somewhere!! @@ -2982,9 +2981,9 @@ nsEventStateManager::GenerateDragDropEnterExit(nsPresContext* aPresContext, event.isControl = ((nsMouseEvent*)aEvent)->isControl; event.isAlt = ((nsMouseEvent*)aEvent)->isAlt; event.isMeta = ((nsMouseEvent*)aEvent)->isMeta; + event.relatedTarget = lastContent; mCurrentTargetContent = targetContent; - mCurrentRelatedContent = lastContent; //The frame has change but the content may not have. Check before dispatching to content if (lastContent != targetContent) { @@ -3030,7 +3029,6 @@ nsEventStateManager::GenerateDragDropEnterExit(nsPresContext* aPresContext, mLastDragOverFrame->GetContentForEvent(aPresContext, aEvent, getter_AddRefs(lastContent)); mCurrentTargetContent = lastContent; - mCurrentRelatedContent = nsnull; if (lastContent) { nsEventDispatcher::Dispatch(lastContent, aPresContext, &event, nsnull, @@ -3870,14 +3868,6 @@ nsEventStateManager::GetEventTargetContent(nsEvent* aEvent, return NS_OK; } -NS_IMETHODIMP -nsEventStateManager::GetEventRelatedContent(nsIContent** aContent) -{ - *aContent = mCurrentRelatedContent; - NS_IF_ADDREF(*aContent); - return NS_OK; -} - NS_IMETHODIMP nsEventStateManager::GetContentState(nsIContent *aContent, PRInt32& aState) { diff --git a/content/events/src/nsEventStateManager.h b/content/events/src/nsEventStateManager.h index 761578a8b96f..921267b1ae80 100644 --- a/content/events/src/nsEventStateManager.h +++ b/content/events/src/nsEventStateManager.h @@ -112,7 +112,6 @@ public: NS_IMETHOD GetEventTarget(nsIFrame **aFrame); NS_IMETHOD GetEventTargetContent(nsEvent* aEvent, nsIContent** aContent); - NS_IMETHOD GetEventRelatedContent(nsIContent** aContent); NS_IMETHOD GetContentState(nsIContent *aContent, PRInt32& aState); virtual PRBool SetContentState(nsIContent *aContent, PRInt32 aState); @@ -286,7 +285,6 @@ protected: //Any frames here must be checked for validity in ClearFrameRefs nsIFrame* mCurrentTarget; nsCOMPtr mCurrentTargetContent; - nsCOMPtr mCurrentRelatedContent; nsIFrame* mLastMouseOverFrame; nsCOMPtr mLastMouseOverElement; nsIFrame* mLastDragOverFrame; diff --git a/widget/public/nsGUIEvent.h b/widget/public/nsGUIEvent.h index 8b290dace151..189e8377781d 100644 --- a/widget/public/nsGUIEvent.h +++ b/widget/public/nsGUIEvent.h @@ -639,11 +639,13 @@ public: } /// The number of mouse clicks - PRUint32 clickCount; + PRUint32 clickCount; /// Special return code for MOUSE_ACTIVATE to signal /// if the target accepts activation (1), or denies it (0) - PRPackedBool acceptActivation; - reasonType reason : 8; + PRPackedBool acceptActivation; + reasonType reason : 8; + /// The possible related target + nsCOMPtr relatedTarget; }; /** @@ -755,8 +757,10 @@ public: { } - PRInt32 scrollFlags; - PRInt32 delta; + PRInt32 scrollFlags; + PRInt32 delta; + /// The possible related target + nsCOMPtr relatedTarget; }; struct nsReconversionEventReply {