mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 324011, initMouseEvent does not set relatedTarget property, r+sr=jst
This commit is contained in:
parent
2edae8c88c
commit
0a6715fc94
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<nsIContent> 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)
|
||||
|
@ -51,6 +51,7 @@ class nsDOMMouseEvent : public nsIDOMMouseEvent,
|
||||
{
|
||||
public:
|
||||
nsDOMMouseEvent(nsPresContext* aPresContext, nsInputEvent* aEvent);
|
||||
virtual ~nsDOMMouseEvent();
|
||||
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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<nsIContent> mCurrentTargetContent;
|
||||
nsCOMPtr<nsIContent> mCurrentRelatedContent;
|
||||
nsIFrame* mLastMouseOverFrame;
|
||||
nsCOMPtr<nsIContent> mLastMouseOverElement;
|
||||
nsIFrame* mLastDragOverFrame;
|
||||
|
@ -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<nsISupports> relatedTarget;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -755,8 +757,10 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
PRInt32 scrollFlags;
|
||||
PRInt32 delta;
|
||||
PRInt32 scrollFlags;
|
||||
PRInt32 delta;
|
||||
/// The possible related target
|
||||
nsCOMPtr<nsISupports> relatedTarget;
|
||||
};
|
||||
|
||||
struct nsReconversionEventReply {
|
||||
|
Loading…
Reference in New Issue
Block a user