From b12c09342ccc1e7a182a158de1ee001a178a8aef Mon Sep 17 00:00:00 2001 From: "Olli.Pettay@helsinki.fi" Date: Tue, 18 Sep 2007 00:25:49 -0700 Subject: [PATCH] Bug 395426, Contextmenu opened using keyboard should have .button == 0, r=enndeakin,sr+a=jst --- content/events/src/nsDOMEvent.cpp | 1 + dom/src/base/nsDOMWindowUtils.cpp | 10 +++++++--- widget/public/nsGUIEvent.h | 6 ++++-- widget/src/gtk2/nsWindow.cpp | 2 +- widget/src/os2/nsWindow.cpp | 2 +- widget/src/windows/nsWindow.cpp | 4 +++- 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/content/events/src/nsDOMEvent.cpp b/content/events/src/nsDOMEvent.cpp index 17dddcee413d..bebc12932a70 100644 --- a/content/events/src/nsDOMEvent.cpp +++ b/content/events/src/nsDOMEvent.cpp @@ -708,6 +708,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData() isInputEvent = PR_TRUE; mouseEvent->clickCount = oldMouseEvent->clickCount; mouseEvent->acceptActivation = oldMouseEvent->acceptActivation; + mouseEvent->context = oldMouseEvent->context; mouseEvent->relatedTarget = oldMouseEvent->relatedTarget; mouseEvent->button = oldMouseEvent->button; newEvent = mouseEvent; diff --git a/dom/src/base/nsDOMWindowUtils.cpp b/dom/src/base/nsDOMWindowUtils.cpp index 0124bd1c6440..0139eeb31093 100644 --- a/dom/src/base/nsDOMWindowUtils.cpp +++ b/dom/src/base/nsDOMWindowUtils.cpp @@ -198,6 +198,7 @@ nsDOMWindowUtils::SendMouseEvent(const nsAString& aType, return NS_ERROR_FAILURE; PRInt32 msg; + PRBool contextMenuKey = PR_FALSE; if (aType.EqualsLiteral("mousedown")) msg = NS_MOUSE_BUTTON_DOWN; else if (aType.EqualsLiteral("mouseup")) @@ -208,12 +209,15 @@ nsDOMWindowUtils::SendMouseEvent(const nsAString& aType, msg = NS_MOUSE_ENTER; else if (aType.EqualsLiteral("mouseout")) msg = NS_MOUSE_EXIT; - else if (aType.EqualsLiteral("contextmenu")) + else if (aType.EqualsLiteral("contextmenu")) { msg = NS_CONTEXTMENU; - else + contextMenuKey = (aButton == 0); + } else return NS_ERROR_FAILURE; - nsMouseEvent event(PR_TRUE, msg, widget, nsMouseEvent::eReal); + nsMouseEvent event(PR_TRUE, msg, widget, nsMouseEvent::eReal, + contextMenuKey ? + nsMouseEvent::eContextMenuKey : nsMouseEvent::eNormal); event.isShift = (aModifiers & nsIDOMNSEvent::SHIFT_MASK) ? PR_TRUE : PR_FALSE; event.isControl = (aModifiers & nsIDOMNSEvent::CONTROL_MASK) ? PR_TRUE : PR_FALSE; event.isAlt = (aModifiers & nsIDOMNSEvent::ALT_MASK) ? PR_TRUE : PR_FALSE; diff --git a/widget/public/nsGUIEvent.h b/widget/public/nsGUIEvent.h index b07ddce368eb..25b912d40441 100644 --- a/widget/public/nsGUIEvent.h +++ b/widget/public/nsGUIEvent.h @@ -645,12 +645,14 @@ public: if (msg == NS_MOUSE_MOVE) { flags |= NS_EVENT_FLAG_CANT_CANCEL; } else if (msg == NS_CONTEXTMENU) { - button = eRightButton; + button = (context == eNormal) ? eRightButton : eLeftButton; } } #ifdef NS_DEBUG ~nsMouseEvent() { - NS_WARN_IF_FALSE(message != NS_CONTEXTMENU || button == eRightButton, + NS_WARN_IF_FALSE(message != NS_CONTEXTMENU || + button == + ((context == eNormal) ? eRightButton : eLeftButton), "Wrong button set to NS_CONTEXTMENU event?"); } #endif diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp index 42f360b0acb9..6558a192bfb1 100644 --- a/widget/src/gtk2/nsWindow.cpp +++ b/widget/src/gtk2/nsWindow.cpp @@ -4902,7 +4902,7 @@ key_event_to_context_menu_event(const nsKeyEvent* aKeyEvent, aCMEvent->eventStructType = NS_MOUSE_EVENT; aCMEvent->message = NS_CONTEXTMENU; aCMEvent->context = nsMouseEvent::eContextMenuKey; - aCMEvent->button = nsMouseEvent::eRightButton; + aCMEvent->button = nsMouseEvent::eLeftButton; aCMEvent->isShift = aCMEvent->isControl = PR_FALSE; aCMEvent->isAlt = aCMEvent->isMeta = PR_FALSE; aCMEvent->clickCount = 0; diff --git a/widget/src/os2/nsWindow.cpp b/widget/src/os2/nsWindow.cpp index d65d659505b1..c00905ca6a10 100644 --- a/widget/src/os2/nsWindow.cpp +++ b/widget/src/os2/nsWindow.cpp @@ -2755,7 +2755,7 @@ PRBool nsWindow::ProcessMessage( ULONG msg, MPARAM mp1, MPARAM mp2, MRESULT &rc) WinSendMsg(hwndCurrFocus, msg, mp1, mp2); } else { result = DispatchMouseEvent(NS_CONTEXTMENU, mp1, mp2, PR_TRUE, - nsMouseEvent::eRightButton); + nsMouseEvent::eLeftButton); } } else { result = DispatchMouseEvent(NS_CONTEXTMENU, mp1, mp2, PR_FALSE, diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp index 6100e0672ddd..7cc1d9755413 100644 --- a/widget/src/windows/nsWindow.cpp +++ b/widget/src/windows/nsWindow.cpp @@ -4510,7 +4510,9 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT pos = lParamToClient(lParam); } result = DispatchMouseEvent(NS_CONTEXTMENU, wParam, pos, contextMenukey, - nsMouseEvent::eRightButton); + contextMenukey ? + nsMouseEvent::eLeftButton : + nsMouseEvent::eRightButton); } break;