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

Unified Diff: ui/views/focus/focus_manager.cc

Issue 1894383002: MacViews: Implement Full Keyboard Access. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@SetFocusBehavior
Patch Set: Rebased Created 4 years, 7 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/focus/focus_manager.cc
diff --git a/ui/views/focus/focus_manager.cc b/ui/views/focus/focus_manager.cc
index 1cff9694be64d5eb5ab81dfa081a5530b2a9addf..436daf0c04f11bf7ec761fead33d15356acec9ff 100644
--- a/ui/views/focus/focus_manager.cc
+++ b/ui/views/focus/focus_manager.cc
@@ -35,7 +35,8 @@ FocusManager::FocusManager(Widget* widget, FocusManagerDelegate* delegate)
accelerator_manager_(new ui::AcceleratorManager),
shortcut_handling_suspended_(false),
focus_change_reason_(kReasonDirectFocusChange),
- is_changing_focus_(false) {
+ is_changing_focus_(false),
+ keyboard_accessible_(false) {
DCHECK(widget_);
stored_focused_view_storage_id_ =
ViewStorage::GetInstance()->CreateStorageID();
@@ -297,6 +298,16 @@ View* FocusManager::GetNextFocusableView(View* original_starting_view,
return NULL;
}
+void FocusManager::SetKeyboardAccessible(bool keyboard_accessible) {
+ if (keyboard_accessible == keyboard_accessible_)
+ return;
+
+ keyboard_accessible_ = keyboard_accessible;
+ // Disabling keyboard accessibility may cause the focused view to become not
+ // focusable. Hence advance focus if necessary.
+ AdvanceFocusIfNecessary();
+}
+
void FocusManager::SetFocusedViewWithReason(
View* view, FocusChangeReason reason) {
if (focused_view_ == view)
@@ -341,9 +352,9 @@ void FocusManager::AdvanceFocusIfNecessary() {
// If widget is active and focused view is not focusable, advance focus or,
// if not possible, clear focus.
- if (focused_view_ && !focused_view_->IsAccessibilityFocusable()) {
+ if (focused_view_ && !IsFocusable(focused_view_)) {
AdvanceFocus(false);
- if (focused_view_ && !focused_view_->IsAccessibilityFocusable())
+ if (focused_view_ && !IsFocusable(focused_view_))
ClearFocus();
}
}
@@ -376,26 +387,21 @@ void FocusManager::StoreFocusedView(bool clear_native_focus) {
bool FocusManager::RestoreFocusedView() {
View* view = GetStoredFocusView();
- if (view) {
- if (ContainsView(view)) {
- if (!view->IsFocusable() && view->IsAccessibilityFocusable()) {
- // RequestFocus would fail, but we want to restore focus to controls
- // that had focus in accessibility mode.
- SetFocusedViewWithReason(view, kReasonFocusRestore);
- } else {
- // This usually just sets the focus if this view is focusable, but
- // let the view override RequestFocus if necessary.
- view->RequestFocus();
-
- // If it succeeded, the reason would be incorrect; set it to
- // focus restore.
- if (focused_view_ == view)
- focus_change_reason_ = kReasonFocusRestore;
- }
- }
- return true;
+ if (view && ContainsView(view)) {
+ // This usually just sets the focus if this view is accessibility
+ // focusable, but let the view override RequestFocus if necessary.
+ view->RequestFocus();
+
+ // If it succeeded, the reason would be incorrect; set it to
+ // focus restore.
+ if (focused_view_ == view)
+ focus_change_reason_ = kReasonFocusRestore;
+
+ // The |keyboard_accessible_| mode may have changed while the widget was
+ // inactive.
+ AdvanceFocusIfNecessary();
}
- return false;
+ return view && view == focused_view_;
}
void FocusManager::SetStoredFocusView(View* focus_view) {
@@ -533,4 +539,16 @@ bool FocusManager::ProcessArrowKeyTraversal(const ui::KeyEvent& event) {
return false;
}
+bool FocusManager::IsFocusable(View* view) const {
+ DCHECK(view);
+
+// |keyboard_accessible_| is only used on Mac.
+#if defined(OS_MACOSX)
+ return keyboard_accessible_ ? view->IsAccessibilityFocusable()
+ : view->IsFocusable();
+#else
+ return view->IsAccessibilityFocusable();
+#endif
+}
+
} // namespace views

Powered by Google App Engine
This is Rietveld 408576698