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

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

Issue 1690543004: MacViews: Implement Full Keyboard Access. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix FocusManagerTest.StoreFocusedView Created 4 years, 10 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/cocoa/bridged_native_widget.mm
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm
index 6f5dec0f96864ede56c8a7cf940de5ebf964aa92..3bb293b47cf0aa8c7f3ae373814f56260d6dc4cc 100644
--- a/ui/views/cocoa/bridged_native_widget.mm
+++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -351,6 +351,14 @@ void BridgedNativeWidget::Init(base::scoped_nsobject<NSWindow> window,
name:NSApplicationDidHideNotification
object:nil];
+ // Get notified whenever Full Keyboard Access mode is changed.
+ // Todo(karandeepb): See how to store constant string.
tapted 2016/02/23 03:01:19 You can just declare a NSString* const kFullKeybo
karandeepb 2016/03/15 02:19:50 Done.
+ [[NSDistributedNotificationCenter defaultCenter]
+ addObserver:window_delegate_
+ selector:@selector(onFullKeyboardAccessModeChanged:)
+ name:@"com.apple.KeyboardUIModeDidChange"
+ object:nil];
+
// Validate the window's initial state, otherwise the bridge's initial
// tracking state will be incorrect.
DCHECK(![window_ isVisible]);
@@ -426,8 +434,11 @@ void BridgedNativeWidget::SetFocusManager(FocusManager* focus_manager) {
if (focus_manager_)
focus_manager_->RemoveFocusChangeListener(this);
- if (focus_manager)
+ if (focus_manager) {
focus_manager->AddFocusChangeListener(this);
+ focus_manager->SetKeyboardAccessibility(
+ [NSApp isFullKeyboardAccessEnabled]);
+ }
focus_manager_ = focus_manager;
}
@@ -596,6 +607,8 @@ void BridgedNativeWidget::OnWindowWillClose() {
}
[window_ setDelegate:nil];
[[NSNotificationCenter defaultCenter] removeObserver:window_delegate_];
+ [[NSDistributedNotificationCenter defaultCenter]
+ removeObserver:window_delegate_];
native_widget_mac_->OnWindowWillClose();
}
@@ -758,6 +771,14 @@ void BridgedNativeWidget::OnWindowKeyStatusChangedTo(bool is_key) {
if ([window_ contentView] == [window_ firstResponder]) {
if (is_key) {
widget->OnNativeFocus();
+ // The NSApplication class automatically suspends distributed notification
+ // delivery when the application is not active. For the full keyboard
+ // access mode change notification, the default suspension behavior of
+ // NSNotificationSuspensionBehaviorCoalesce should have worked, but
+ // it doesn't sometimes. Hence explicitly set the keyboard accessibility
+ // state on regaining key window status.
+ widget->GetFocusManager()->SetKeyboardAccessibility(
+ [NSApp isFullKeyboardAccessEnabled]);
widget->GetFocusManager()->RestoreFocusedView();
} else {
widget->OnNativeBlur();

Powered by Google App Engine
This is Rietveld 408576698