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

Side by Side Diff: chrome/browser/chromeos/accessibility/accessibility_manager.cc

Issue 1274563004: Show ChromeVox caption panel when spoken feedback is enabled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@chromevox_panel_html
Patch Set: Keep responsibility for insets in ShelfLayoutManager Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 5 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
6 6
7 #include "ash/audio/sounds.h" 7 #include "ash/audio/sounds.h"
8 #include "ash/autoclick/autoclick_controller.h" 8 #include "ash/autoclick/autoclick_controller.h"
9 #include "ash/high_contrast/high_contrast_controller.h" 9 #include "ash/high_contrast/high_contrast_controller.h"
10 #include "ash/metrics/user_metrics_recorder.h" 10 #include "ash/metrics/user_metrics_recorder.h"
11 #include "ash/session/session_state_delegate.h" 11 #include "ash/session/session_state_delegate.h"
12 #include "ash/shelf/shelf_layout_manager.h"
12 #include "ash/shell.h" 13 #include "ash/shell.h"
13 #include "ash/sticky_keys/sticky_keys_controller.h" 14 #include "ash/sticky_keys/sticky_keys_controller.h"
14 #include "ash/system/tray/system_tray_notifier.h" 15 #include "ash/system/tray/system_tray_notifier.h"
15 #include "base/callback.h" 16 #include "base/callback.h"
16 #include "base/callback_helpers.h" 17 #include "base/callback_helpers.h"
17 #include "base/command_line.h" 18 #include "base/command_line.h"
18 #include "base/memory/scoped_ptr.h" 19 #include "base/memory/scoped_ptr.h"
19 #include "base/memory/singleton.h" 20 #include "base/memory/singleton.h"
20 #include "base/metrics/histogram.h" 21 #include "base/metrics/histogram.h"
21 #include "base/path_service.h" 22 #include "base/path_service.h"
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 264
264 void UnloadChromeVoxExtension(Profile* profile) { 265 void UnloadChromeVoxExtension(Profile* profile) {
265 base::FilePath path = GetChromeVoxPath(); 266 base::FilePath path = GetChromeVoxPath();
266 ExtensionService* extension_service = 267 ExtensionService* extension_service =
267 extensions::ExtensionSystem::Get(profile)->extension_service(); 268 extensions::ExtensionSystem::Get(profile)->extension_service();
268 extension_service->component_loader()->Remove(path); 269 extension_service->component_loader()->Remove(path);
269 } 270 }
270 271
271 } // namespace 272 } // namespace
272 273
274 class ChromeVoxPanelWidgetObserver : public views::WidgetObserver {
275 public:
276 ChromeVoxPanelWidgetObserver(views::Widget* widget,
277 AccessibilityManager* manager)
278 : widget_(widget), manager_(manager) {
279 widget_->AddObserver(this);
280 }
281
282 void OnWidgetClosing(views::Widget* widget) override {
283 CHECK_EQ(widget_, widget);
284 widget_->RemoveObserver(this);
oshima 2015/11/10 19:47:51 nit: you can just use the widget passed instead?
dmazzoni 2015/11/10 21:55:51 Done.
285 manager_->OnChromeVoxPanelClosing();
286 }
287
288 private:
289 views::Widget* widget_;
290 AccessibilityManager* manager_;
291
292 DISALLOW_COPY_AND_ASSIGN(ChromeVoxPanelWidgetObserver);
293 };
294
273 /////////////////////////////////////////////////////////////////////////////// 295 ///////////////////////////////////////////////////////////////////////////////
274 // AccessibilityStatusEventDetails 296 // AccessibilityStatusEventDetails
275 297
276 AccessibilityStatusEventDetails::AccessibilityStatusEventDetails( 298 AccessibilityStatusEventDetails::AccessibilityStatusEventDetails(
277 AccessibilityNotificationType notification_type, 299 AccessibilityNotificationType notification_type,
278 bool enabled, 300 bool enabled,
279 ui::AccessibilityNotificationVisibility notify) 301 ui::AccessibilityNotificationVisibility notify)
280 : notification_type(notification_type), 302 : notification_type(notification_type),
281 enabled(enabled), 303 enabled(enabled),
282 magnifier_type(ui::kDefaultMagnifierType), 304 magnifier_type(ui::kDefaultMagnifierType),
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 high_contrast_enabled_(false), 392 high_contrast_enabled_(false),
371 autoclick_enabled_(false), 393 autoclick_enabled_(false),
372 autoclick_delay_ms_(ash::AutoclickController::kDefaultAutoclickDelayMs), 394 autoclick_delay_ms_(ash::AutoclickController::kDefaultAutoclickDelayMs),
373 virtual_keyboard_enabled_(false), 395 virtual_keyboard_enabled_(false),
374 spoken_feedback_notification_(ui::A11Y_NOTIFICATION_NONE), 396 spoken_feedback_notification_(ui::A11Y_NOTIFICATION_NONE),
375 should_speak_chrome_vox_announcements_on_user_screen_(true), 397 should_speak_chrome_vox_announcements_on_user_screen_(true),
376 system_sounds_enabled_(false), 398 system_sounds_enabled_(false),
377 braille_display_connected_(false), 399 braille_display_connected_(false),
378 scoped_braille_observer_(this), 400 scoped_braille_observer_(this),
379 braille_ime_current_(false), 401 braille_ime_current_(false),
402 chromevox_panel_(nullptr),
380 weak_ptr_factory_(this) { 403 weak_ptr_factory_(this) {
381 notification_registrar_.Add(this, 404 notification_registrar_.Add(this,
382 chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, 405 chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
383 content::NotificationService::AllSources()); 406 content::NotificationService::AllSources());
384 notification_registrar_.Add(this, 407 notification_registrar_.Add(this,
385 chrome::NOTIFICATION_SESSION_STARTED, 408 chrome::NOTIFICATION_SESSION_STARTED,
386 content::NotificationService::AllSources()); 409 content::NotificationService::AllSources());
387 notification_registrar_.Add(this, 410 notification_registrar_.Add(this,
388 chrome::NOTIFICATION_PROFILE_DESTROYED, 411 chrome::NOTIFICATION_PROFILE_DESTROYED,
389 content::NotificationService::AllSources()); 412 content::NotificationService::AllSources());
(...skipping 21 matching lines...) Expand all
411 bundle.GetRawDataResource(IDR_SOUND_ENTER_SCREEN_WAV)); 434 bundle.GetRawDataResource(IDR_SOUND_ENTER_SCREEN_WAV));
412 } 435 }
413 436
414 AccessibilityManager::~AccessibilityManager() { 437 AccessibilityManager::~AccessibilityManager() {
415 CHECK(this == g_accessibility_manager); 438 CHECK(this == g_accessibility_manager);
416 AccessibilityStatusEventDetails details( 439 AccessibilityStatusEventDetails details(
417 ACCESSIBILITY_MANAGER_SHUTDOWN, 440 ACCESSIBILITY_MANAGER_SHUTDOWN,
418 false, 441 false,
419 ui::A11Y_NOTIFICATION_NONE); 442 ui::A11Y_NOTIFICATION_NONE);
420 NotifyAccessibilityStatusChanged(details); 443 NotifyAccessibilityStatusChanged(details);
421 input_method::InputMethodManager::Get()->RemoveObserver(this); 444 input_method::InputMethodManager::Get()->RemoveObserver(this);
oshima 2015/11/10 19:47:51 DCHECK(!chromevox_panel_)?
dmazzoni 2015/11/10 21:55:50 Done.
422 } 445 }
423 446
424 bool AccessibilityManager::ShouldShowAccessibilityMenu() { 447 bool AccessibilityManager::ShouldShowAccessibilityMenu() {
425 // If any of the loaded profiles has an accessibility feature turned on - or 448 // If any of the loaded profiles has an accessibility feature turned on - or
426 // enforced to always show the menu - we return true to show the menu. 449 // enforced to always show the menu - we return true to show the menu.
427 std::vector<Profile*> profiles = 450 std::vector<Profile*> profiles =
428 g_browser_process->profile_manager()->GetLoadedProfiles(); 451 g_browser_process->profile_manager()->GetLoadedProfiles();
429 for (std::vector<Profile*>::iterator it = profiles.begin(); 452 for (std::vector<Profile*>::iterator it = profiles.begin();
430 it != profiles.end(); 453 it != profiles.end();
431 ++it) { 454 ++it) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 chrome_vox_loaded_on_lock_screen_ = true; 652 chrome_vox_loaded_on_lock_screen_ = true;
630 LoadChromeVoxExtension( 653 LoadChromeVoxExtension(
631 profile, 654 profile,
632 lock_web_ui->GetWebContents()->GetRenderViewHost(), 655 lock_web_ui->GetWebContents()->GetRenderViewHost(),
633 done_cb); 656 done_cb);
634 } 657 }
635 } 658 }
636 } 659 }
637 660
638 void AccessibilityManager::UnloadChromeVox() { 661 void AccessibilityManager::UnloadChromeVox() {
662 if (chromevox_panel_) {
663 chromevox_panel_->Close();
664 chromevox_panel_ = nullptr;
665 }
666
639 if (chrome_vox_loaded_on_lock_screen_) 667 if (chrome_vox_loaded_on_lock_screen_)
640 UnloadChromeVoxFromLockScreen(); 668 UnloadChromeVoxFromLockScreen();
641 669
642 if (chrome_vox_loaded_on_user_screen_) { 670 if (chrome_vox_loaded_on_user_screen_) {
643 UnloadChromeVoxExtension(profile_); 671 UnloadChromeVoxExtension(profile_);
644 chrome_vox_loaded_on_user_screen_ = false; 672 chrome_vox_loaded_on_user_screen_ = false;
645 } 673 }
646 674
647 PostUnloadChromeVox(profile_); 675 PostUnloadChromeVox(profile_);
648 } 676 }
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 extensions::events::ACCESSIBILITY_PRIVATE_ON_INTRODUCE_CHROME_VOX, 1159 extensions::events::ACCESSIBILITY_PRIVATE_ON_INTRODUCE_CHROME_VOX,
1132 extensions::api::accessibility_private::OnIntroduceChromeVox:: 1160 extensions::api::accessibility_private::OnIntroduceChromeVox::
1133 kEventName, 1161 kEventName,
1134 event_args.Pass())); 1162 event_args.Pass()));
1135 event_router->DispatchEventWithLazyListener( 1163 event_router->DispatchEventWithLazyListener(
1136 extension_misc::kChromeVoxExtensionId, event.Pass()); 1164 extension_misc::kChromeVoxExtensionId, event.Pass());
1137 } 1165 }
1138 1166
1139 should_speak_chrome_vox_announcements_on_user_screen_ = 1167 should_speak_chrome_vox_announcements_on_user_screen_ =
1140 chrome_vox_loaded_on_lock_screen_; 1168 chrome_vox_loaded_on_lock_screen_;
1169
1170 chromevox_panel_ = new ChromeVoxPanel(profile_);
1171 chromevox_panel_widget_observer_.reset(
1172 new ChromeVoxPanelWidgetObserver(chromevox_panel_->GetWidget(), this));
1141 } 1173 }
1142 1174
1143 void AccessibilityManager::PostUnloadChromeVox(Profile* profile) { 1175 void AccessibilityManager::PostUnloadChromeVox(Profile* profile) {
1144 // Do any teardown work needed immediately after ChromeVox actually unloads. 1176 // Do any teardown work needed immediately after ChromeVox actually unloads.
1145 ash::PlaySystemSoundAlways(SOUND_SPOKEN_FEEDBACK_DISABLED); 1177 ash::PlaySystemSoundAlways(SOUND_SPOKEN_FEEDBACK_DISABLED);
1146 // Clear the accessibility focus ring. 1178 // Clear the accessibility focus ring.
1147 AccessibilityFocusRingController::GetInstance()->SetFocusRing( 1179 AccessibilityFocusRingController::GetInstance()->SetFocusRing(
1148 std::vector<gfx::Rect>()); 1180 std::vector<gfx::Rect>());
1149 } 1181 }
1150 1182
1183 void AccessibilityManager::OnChromeVoxPanelClosing() {
1184 aura::Window* root_window = chromevox_panel_->GetRootWindow();
1185 chromevox_panel_widget_observer_.reset(nullptr);
1186 chromevox_panel_ = nullptr;
1187 ash::ShelfLayoutManager::ForShelf(root_window)->SetChromeVoxPanelHeight(0);
1188 }
1189
1151 } // namespace chromeos 1190 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698