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

Unified Diff: ui/views/cocoa/bridged_content_view.mm

Issue 2509733005: MacViews: Enable some accelerator tests.
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « ui/views/cocoa/bridged_content_view.h ('k') | ui/views/view_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/cocoa/bridged_content_view.mm
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm
index 041e9c572acb77fc5c1c8ea8d5293eb0f20383fa..716448d1e1bcc1bad413041368981562c7c5bfe2 100644
--- a/ui/views/cocoa/bridged_content_view.mm
+++ b/ui/views/cocoa/bridged_content_view.mm
@@ -761,10 +761,35 @@ NSAttributedString* GetAttributedString(
// NSResponder implementation.
+- (BOOL)performKeyEquivalent:(NSEvent*)theEvent {
+ // Normally having the keyDown: would be enough for processing accelerator
+ // events, but some only result in keyUp: calls. The approach is similar to
+ // what we're doing in keyDown: with the exception that we should not fallback
+ // to next responder in doCommandBySelector:, as this will result in NSBeep().
+
+ // Convert the event into an action message, according to OSX key mappings.
+ performKeyEquivalentEvent_ = theEvent;
+ performKeyEquivalentEventHandled_.reset();
+ [self interpretKeyEvents:@[ theEvent ]];
+ if (auto result = performKeyEquivalentEventHandled_) {
+ DCHECK(!performKeyEquivalentEvent_);
+ performKeyEquivalentEventHandled_.reset();
+ return *result;
+ }
+
+ DCHECK(performKeyEquivalentEvent_);
+ ui::KeyEvent event(performKeyEquivalentEvent_);
+ [self handleKeyEvent:&event];
+ performKeyEquivalentEvent_ = nil;
+ performKeyEquivalentEventHandled_.reset();
+ return event.handled() ? YES : NO;
+}
+
- (void)keyDown:(NSEvent*)theEvent {
// Convert the event into an action message, according to OSX key mappings.
keyDownEvent_ = theEvent;
[self interpretKeyEvents:@[ theEvent ]];
+
keyDownEvent_ = nil;
}
@@ -1287,13 +1312,31 @@ NSAttributedString* GetAttributedString(
if (keyDownEvent_ && [NSStringFromSelector(selector) hasPrefix:@"insert"]) {
ui::KeyEvent event(keyDownEvent_);
[self handleKeyEvent:&event];
+ performKeyEquivalentEvent_ = nil;
+ performKeyEquivalentEventHandled_ = YES;
return;
}
- if ([self respondsToSelector:selector])
+ if ([self respondsToSelector:selector]) {
[self performSelector:selector withObject:nil];
- else
- [[self nextResponder] doCommandBySelector:selector];
+ performKeyEquivalentEvent_ = nil;
+ performKeyEquivalentEventHandled_ = YES;
+ return;
+ }
+
+ if (performKeyEquivalentEvent_) {
+ ui::KeyEvent event(performKeyEquivalentEvent_);
+ [self handleKeyEvent:&event];
+ performKeyEquivalentEvent_ = nil;
+ performKeyEquivalentEventHandled_ = event.handled() ? YES : NO;
+ // If the event was not handled we must return NO in performKeyEquivalent:
+ // so the menu bar could have a chance on handling the event. Regardless of
+ // that, we don't want to call doCommandBySelector: on nextResponder, as
+ // this will probably result in NSBeep().
+ return;
+ }
+
+ [[self nextResponder] doCommandBySelector:selector];
}
- (NSRect)firstRectForCharacterRange:(NSRange)range
« no previous file with comments | « ui/views/cocoa/bridged_content_view.h ('k') | ui/views/view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698