Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ui/views/cocoa/bridged_content_view.h" | 5 #import "ui/views/cocoa/bridged_content_view.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #import "base/mac/mac_util.h" | 8 #import "base/mac/mac_util.h" |
| 9 #import "base/mac/scoped_nsobject.h" | 9 #import "base/mac/scoped_nsobject.h" |
| 10 #import "base/mac/sdk_forward_declarations.h" | 10 #import "base/mac/sdk_forward_declarations.h" |
| (...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 753 case ui::TEXT_INPUT_TYPE_NONE: | 753 case ui::TEXT_INPUT_TYPE_NONE: |
| 754 case ui::TEXT_INPUT_TYPE_PASSWORD: | 754 case ui::TEXT_INPUT_TYPE_PASSWORD: |
| 755 return nil; | 755 return nil; |
| 756 default: | 756 default: |
| 757 return [super inputContext]; | 757 return [super inputContext]; |
| 758 } | 758 } |
| 759 } | 759 } |
| 760 | 760 |
| 761 // NSResponder implementation. | 761 // NSResponder implementation. |
| 762 | 762 |
| 763 - (BOOL)performKeyEquivalent:(NSEvent*)theEvent { | |
|
tapted
2016/11/17 08:20:14
I think there's more we have to do here. Have a lo
themblsha
2016/11/17 17:52:16
Good catch!
| |
| 764 // Normally having the keyDown: would be enough for processing accelerator | |
| 765 // events, but some only result in keyUp: calls. The approach is similar to | |
| 766 // what we're doing in keyDown: with the exception that we should not fallback | |
| 767 // to next responder in doCommandBySelector:, as this will result in NSBeep(). | |
| 768 | |
| 769 // Convert the event into an action message, according to OSX key mappings. | |
| 770 performKeyEquivalentEvent_ = theEvent; | |
| 771 performKeyEquivalentEventHandled_.reset(); | |
| 772 [self interpretKeyEvents:@[ theEvent ]]; | |
| 773 if (auto result = performKeyEquivalentEventHandled_) { | |
| 774 DCHECK(!performKeyEquivalentEvent_); | |
| 775 performKeyEquivalentEventHandled_.reset(); | |
| 776 return *result; | |
| 777 } | |
| 778 | |
| 779 DCHECK(performKeyEquivalentEvent_); | |
| 780 ui::KeyEvent event(performKeyEquivalentEvent_); | |
| 781 [self handleKeyEvent:&event]; | |
| 782 performKeyEquivalentEvent_ = nil; | |
| 783 performKeyEquivalentEventHandled_.reset(); | |
| 784 return event.handled() ? YES : NO; | |
| 785 } | |
| 786 | |
| 763 - (void)keyDown:(NSEvent*)theEvent { | 787 - (void)keyDown:(NSEvent*)theEvent { |
| 764 // Convert the event into an action message, according to OSX key mappings. | 788 // Convert the event into an action message, according to OSX key mappings. |
| 765 keyDownEvent_ = theEvent; | 789 keyDownEvent_ = theEvent; |
| 766 [self interpretKeyEvents:@[ theEvent ]]; | 790 [self interpretKeyEvents:@[ theEvent ]]; |
| 791 | |
| 767 keyDownEvent_ = nil; | 792 keyDownEvent_ = nil; |
| 768 } | 793 } |
| 769 | 794 |
| 770 - (void)keyUp:(NSEvent*)theEvent { | 795 - (void)keyUp:(NSEvent*)theEvent { |
| 771 ui::KeyEvent event(theEvent); | 796 ui::KeyEvent event(theEvent); |
| 772 [self handleKeyEvent:&event]; | 797 [self handleKeyEvent:&event]; |
| 773 } | 798 } |
| 774 | 799 |
| 775 - (void)scrollWheel:(NSEvent*)theEvent { | 800 - (void)scrollWheel:(NSEvent*)theEvent { |
| 776 if (!hostedView_) | 801 if (!hostedView_) |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1279 NOTIMPLEMENTED(); | 1304 NOTIMPLEMENTED(); |
| 1280 return 0; | 1305 return 0; |
| 1281 } | 1306 } |
| 1282 | 1307 |
| 1283 - (void)doCommandBySelector:(SEL)selector { | 1308 - (void)doCommandBySelector:(SEL)selector { |
| 1284 // Like the renderer, handle insert action messages as a regular key dispatch. | 1309 // Like the renderer, handle insert action messages as a regular key dispatch. |
| 1285 // This ensures, e.g., insertTab correctly changes focus between fields. | 1310 // This ensures, e.g., insertTab correctly changes focus between fields. |
| 1286 if (keyDownEvent_ && [NSStringFromSelector(selector) hasPrefix:@"insert"]) { | 1311 if (keyDownEvent_ && [NSStringFromSelector(selector) hasPrefix:@"insert"]) { |
| 1287 ui::KeyEvent event(keyDownEvent_); | 1312 ui::KeyEvent event(keyDownEvent_); |
| 1288 [self handleKeyEvent:&event]; | 1313 [self handleKeyEvent:&event]; |
| 1314 performKeyEquivalentEvent_ = nil; | |
| 1315 performKeyEquivalentEventHandled_ = YES; | |
| 1289 return; | 1316 return; |
| 1290 } | 1317 } |
| 1291 | 1318 |
| 1292 if ([self respondsToSelector:selector]) | 1319 if ([self respondsToSelector:selector]) { |
| 1293 [self performSelector:selector withObject:nil]; | 1320 [self performSelector:selector withObject:nil]; |
| 1294 else | 1321 performKeyEquivalentEvent_ = nil; |
| 1295 [[self nextResponder] doCommandBySelector:selector]; | 1322 performKeyEquivalentEventHandled_ = YES; |
| 1323 return; | |
| 1324 } | |
| 1325 | |
| 1326 if (performKeyEquivalentEvent_) { | |
| 1327 ui::KeyEvent event(performKeyEquivalentEvent_); | |
| 1328 [self handleKeyEvent:&event]; | |
| 1329 performKeyEquivalentEvent_ = nil; | |
| 1330 performKeyEquivalentEventHandled_ = event.handled() ? YES : NO; | |
| 1331 // If the event was not handled we must return NO in performKeyEquivalent: | |
| 1332 // so the menu bar could have a chance on handling the event. Regardless of | |
| 1333 // that, we don't want to call doCommandBySelector: on nextResponder, as | |
| 1334 // this will probably result in NSBeep(). | |
| 1335 return; | |
| 1336 } | |
| 1337 | |
| 1338 [[self nextResponder] doCommandBySelector:selector]; | |
| 1296 } | 1339 } |
| 1297 | 1340 |
| 1298 - (NSRect)firstRectForCharacterRange:(NSRange)range | 1341 - (NSRect)firstRectForCharacterRange:(NSRange)range |
| 1299 actualRange:(NSRangePointer)actualNSRange { | 1342 actualRange:(NSRangePointer)actualNSRange { |
| 1300 gfx::Range actualRange; | 1343 gfx::Range actualRange; |
| 1301 gfx::Rect rect = GetFirstRectForRangeHelper(textInputClient_, | 1344 gfx::Rect rect = GetFirstRectForRangeHelper(textInputClient_, |
| 1302 gfx::Range(range), &actualRange); | 1345 gfx::Range(range), &actualRange); |
| 1303 if (actualNSRange) | 1346 if (actualNSRange) |
| 1304 *actualNSRange = actualRange.ToNSRange(); | 1347 *actualNSRange = actualRange.ToNSRange(); |
| 1305 return gfx::ScreenRectToNSRect(rect); | 1348 return gfx::ScreenRectToNSRect(rect); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1432 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point]; | 1475 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point]; |
| 1433 } | 1476 } |
| 1434 | 1477 |
| 1435 - (id)accessibilityFocusedUIElement { | 1478 - (id)accessibilityFocusedUIElement { |
| 1436 if (!hostedView_) | 1479 if (!hostedView_) |
| 1437 return nil; | 1480 return nil; |
| 1438 return [hostedView_->GetNativeViewAccessible() accessibilityFocusedUIElement]; | 1481 return [hostedView_->GetNativeViewAccessible() accessibilityFocusedUIElement]; |
| 1439 } | 1482 } |
| 1440 | 1483 |
| 1441 @end | 1484 @end |
| OLD | NEW |