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