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