accessible_pane_view.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/view_ids.h"
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/accessible_pane_view.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/views/frame/browser_view.h"
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/menu_button.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/native/native_view_host.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/focus/focus_search.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/focus/view_storage.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/tooltip_manager.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessiblePaneView::AccessiblePaneView()
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : pane_has_focus_(false),
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager_(NULL),
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      home_key_(ui::VKEY_HOME, false, false, false),
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      end_key_(ui::VKEY_END, false, false, false),
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      escape_key_(ui::VKEY_ESCAPE, false, false, false),
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      left_key_(ui::VKEY_LEFT, false, false, false),
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      right_key_(ui::VKEY_RIGHT, false, false, false),
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      last_focused_view_storage_id_(-1) {
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  focus_search_.reset(new views::FocusSearch(this, true, true));
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessiblePaneView::~AccessiblePaneView() {
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (pane_has_focus_) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    focus_manager_->RemoveFocusChangeListener(this);
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool AccessiblePaneView::SetPaneFocus(int view_storage_id,
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                      views::View* initial_focus) {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!IsVisible())
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Save the storage id to the last focused view. This would be used to request
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // focus to the view when the traversal is ended.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  last_focused_view_storage_id_ = view_storage_id;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!focus_manager_)
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    focus_manager_ = GetFocusManager();
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use the provided initial focus if it's visible and enabled, otherwise
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // use the first focusable child.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!initial_focus ||
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      !Contains(initial_focus) ||
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !initial_focus->IsVisible() ||
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !initial_focus->IsEnabled()) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    initial_focus = GetFirstFocusableChild();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return false if there are no focusable children.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!initial_focus)
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set focus to the initial view. If it's a location bar, use a special
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // method that tells it to select all, also.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (initial_focus->GetClassName() == LocationBarView::kViewClassName) {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    static_cast<LocationBarView*>(initial_focus)->FocusLocation(true);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    focus_manager_->SetFocusedView(initial_focus);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we already have pane focus, we're done.
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (pane_has_focus_)
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Otherwise, set accelerators and start listening for focus change events.
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  pane_has_focus_ = true;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->RegisterAccelerator(home_key_, this);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->RegisterAccelerator(end_key_, this);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->RegisterAccelerator(escape_key_, this);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->RegisterAccelerator(left_key_, this);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->RegisterAccelerator(right_key_, this);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->AddFocusChangeListener(this);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool AccessiblePaneView::SetPaneFocusAndFocusDefault(
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int view_storage_id) {
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return SetPaneFocus(view_storage_id, GetDefaultFocusableChild());
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid AccessiblePaneView::RemovePaneFocus() {
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->RemoveFocusChangeListener(this);
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  pane_has_focus_ = false;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->UnregisterAccelerator(home_key_, this);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->UnregisterAccelerator(end_key_, this);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->UnregisterAccelerator(escape_key_, this);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->UnregisterAccelerator(left_key_, this);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  focus_manager_->UnregisterAccelerator(right_key_, this);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid AccessiblePaneView::LocationBarSelectAll() {
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  views::View* focused_view = GetFocusManager()->GetFocusedView();
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (focused_view &&
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      focused_view->GetClassName() == LocationBarView::kViewClassName) {
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    static_cast<LocationBarView*>(focused_view)->SelectAll();
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid AccessiblePaneView::RestoreLastFocusedView() {
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  views::ViewStorage* view_storage = views::ViewStorage::GetInstance();
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View* last_focused_view =
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      view_storage->RetrieveView(last_focused_view_storage_id_);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (last_focused_view) {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    focus_manager_->SetFocusedViewWithReason(
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        last_focused_view, views::FocusManager::kReasonFocusRestore);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Focus the location bar
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views::View* view = GetAncestorWithClassName(BrowserView::kViewClassName);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (view) {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      BrowserView* browser_view = static_cast<BrowserView*>(view);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser_view->SetFocusToLocationBar(false);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickviews::View* AccessiblePaneView::GetFirstFocusableChild() {
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FocusTraversable* dummy_focus_traversable;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View* dummy_focus_traversable_view;
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return focus_search_->FindNextFocusableView(
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NULL, false, views::FocusSearch::DOWN, false,
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &dummy_focus_traversable, &dummy_focus_traversable_view);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickviews::View* AccessiblePaneView::GetLastFocusableChild() {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FocusTraversable* dummy_focus_traversable;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View* dummy_focus_traversable_view;
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return focus_search_->FindNextFocusableView(
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      this, true, views::FocusSearch::DOWN, false,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &dummy_focus_traversable, &dummy_focus_traversable_view);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// View overrides:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickviews::FocusTraversable* AccessiblePaneView::GetPaneFocusTraversable() {
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (pane_has_focus_)
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return this;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool AccessiblePaneView::AcceleratorPressed(
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const views::Accelerator& accelerator) {
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Special case: don't handle any accelerators for the location bar,
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // so that it behaves exactly the same whether you focus it with Ctrl+L
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // or F6 or Alt+D or Alt+Shift+T.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View* focused_view = focus_manager_->GetFocusedView();
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if ((focused_view->GetClassName() == LocationBarView::kViewClassName ||
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick       focused_view->GetClassName() == views::NativeViewHost::kViewClassName)) {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (accelerator.GetKeyCode()) {
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::VKEY_ESCAPE:
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      RemovePaneFocus();
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      RestoreLastFocusedView();
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::VKEY_LEFT:
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager_->AdvanceFocus(true);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::VKEY_RIGHT:
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager_->AdvanceFocus(false);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::VKEY_HOME:
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager_->SetFocusedViewWithReason(
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GetFirstFocusableChild(), views::FocusManager::kReasonFocusTraversal);
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::VKEY_END:
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager_->SetFocusedViewWithReason(
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GetLastFocusableChild(), views::FocusManager::kReasonFocusTraversal);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid AccessiblePaneView::SetVisible(bool flag) {
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (IsVisible() && !flag && pane_has_focus_) {
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RemovePaneFocus();
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RestoreLastFocusedView();
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  View::SetVisible(flag);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityTypes::Role AccessiblePaneView::GetAccessibleRole() {
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return AccessibilityTypes::ROLE_PANE;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FocusChangeListener overrides:
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid AccessiblePaneView::FocusWillChange(views::View* focused_before,
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         views::View* focused_now) {
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!focused_now)
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::FocusManager::FocusChangeReason reason =
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager_->focus_change_reason();
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (focused_now->GetClassName() == LocationBarView::kViewClassName &&
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      reason == views::FocusManager::kReasonFocusTraversal) {
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Tabbing to the location bar should select all. Defer so that it happens
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // after the focus.
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MessageLoop::current()->PostTask(
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        FROM_HERE, method_factory_.NewRunnableMethod(
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            &AccessiblePaneView::LocationBarSelectAll));
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!Contains(focused_now) ||
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      reason == views::FocusManager::kReasonDirectFocusChange) {
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // We should remove pane focus (i.e. make most of the controls
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // not focusable again) either because the focus is leaving the pane,
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // or because the focus changed within the pane due to the user
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // directly focusing to a specific view (e.g., clicking on it).
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Defer rather than calling RemovePaneFocus right away, because we can't
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // remove |this| as a focus change listener while FocusManager is in the
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // middle of iterating over the list of listeners.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->PostTask(
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        FROM_HERE, method_factory_.NewRunnableMethod(
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            &AccessiblePaneView::RemovePaneFocus));
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FocusTraversable overrides:
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickviews::FocusSearch* AccessiblePaneView::GetFocusSearch() {
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(pane_has_focus_);
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return focus_search_.get();
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickviews::FocusTraversable* AccessiblePaneView::GetFocusTraversableParent() {
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(pane_has_focus_);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return NULL;
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickviews::View* AccessiblePaneView::GetFocusTraversableParentView() {
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(pane_has_focus_);
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return NULL;
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
252