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