Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Unified Diff: ui/views/controls/menu/menu_runner_impl_cocoa.mm

Issue 2944083004: MacViews a11y: Support the "Show menu" action in Textfield and Combobox. (Closed)
Patch Set: base off crrev/2946783003 Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/controls/menu/menu_runner_impl_cocoa.mm
diff --git a/ui/views/controls/menu/menu_runner_impl_cocoa.mm b/ui/views/controls/menu/menu_runner_impl_cocoa.mm
index 02d6a95faedd333d822d5c28abb0ab1d9982a5e3..316de4df23b08e63b160b9e8c1a0004a6b445022 100644
--- a/ui/views/controls/menu/menu_runner_impl_cocoa.mm
+++ b/ui/views/controls/menu/menu_runner_impl_cocoa.mm
@@ -5,6 +5,7 @@
#import "ui/views/controls/menu/menu_runner_impl_cocoa.h"
#include "base/mac/sdk_forward_declarations.h"
+#import "ui/base/cocoa/cocoa_base_utils.h"
#import "ui/base/cocoa/menu_controller.h"
#include "ui/base/models/menu_model.h"
#include "ui/events/base_event_utils.h"
@@ -79,6 +80,36 @@ base::scoped_nsobject<NSView> CreateMenuAnchorView(
return anchor_view;
}
+// Returns an appropriate event (with a location) suitable for showing a context
+// menu. Uses [NSApp currentEvent] if it's a non-nil mouse click event,
+// otherwise creates an autoreleased dummy event located at |anchor|.
+NSEvent* EventForPositioningContextMenu(const gfx::Rect& anchor,
+ NSWindow* window) {
+ NSEvent* event = [NSApp currentEvent];
+ switch ([event type]) {
+ case NSLeftMouseDown:
+ case NSLeftMouseUp:
+ case NSRightMouseDown:
+ case NSRightMouseUp:
+ case NSOtherMouseDown:
+ case NSOtherMouseUp:
+ return event;
+ default:
+ break;
+ }
+ NSPoint location_in_window = ui::ConvertPointFromScreenToWindow(
+ window, gfx::ScreenPointToNSPoint(anchor.CenterPoint()));
+ return [NSEvent mouseEventWithType:NSRightMouseDown
+ location:location_in_window
+ modifierFlags:0
+ timestamp:0
+ windowNumber:[window windowNumber]
+ context:nil
+ eventNumber:0
+ clickCount:1
+ pressure:0];
+}
+
} // namespace
// static
@@ -133,14 +164,15 @@ void MenuRunnerImplCocoa::RunMenuAt(Widget* parent,
closing_event_time_ = base::TimeTicks();
running_ = true;
+ NSWindow* window = parent->GetNativeWindow();
if (run_types & MenuRunner::CONTEXT_MENU) {
[NSMenu popUpContextMenu:[menu_controller_ menu]
- withEvent:[NSApp currentEvent]
+ withEvent:EventForPositioningContextMenu(bounds, window)
forView:parent->GetNativeView()];
} else if (run_types & MenuRunner::COMBOBOX) {
NSMenuItem* checked_item = FirstCheckedItem(menu_controller_);
base::scoped_nsobject<NSView> anchor_view(
- CreateMenuAnchorView(parent->GetNativeWindow(), bounds, checked_item));
+ CreateMenuAnchorView(window, bounds, checked_item));
NSMenu* menu = [menu_controller_ menu];
[menu setMinimumWidth:bounds.width() + kNativeCheckmarkWidth];
[menu popUpMenuPositioningItem:checked_item

Powered by Google App Engine
This is Rietveld 408576698