Bug 324011, initMouseEvent does not set relatedTarget property, r+sr=jst

This commit is contained in:
Olli.Pettay%helsinki.fi 2006-07-13 07:51:54 +00:00
parent 2edae8c88c
commit 0a6715fc94
7 changed files with 59 additions and 34 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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)

View File

@ -51,6 +51,7 @@ class nsDOMMouseEvent : public nsIDOMMouseEvent,
{
public:
nsDOMMouseEvent(nsPresContext* aPresContext, nsInputEvent* aEvent);
virtual ~nsDOMMouseEvent();
NS_DECL_ISUPPORTS_INHERITED

View File

@ -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)
{

View File

@ -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;

View File

@ -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 {