Chromium Code Reviews| Index: chrome/browser/chromeos/accessibility/accessibility_manager.cc |
| diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc |
| index 95ce0f271dcda852654e20af63be0e5cda4d6928..c08f07f8203d8918c5892efe4dda1b7e12420485 100644 |
| --- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc |
| +++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc |
| @@ -9,6 +9,7 @@ |
| #include "ash/high_contrast/high_contrast_controller.h" |
| #include "ash/metrics/user_metrics_recorder.h" |
| #include "ash/session/session_state_delegate.h" |
| +#include "ash/shelf/shelf_layout_manager.h" |
| #include "ash/shell.h" |
| #include "ash/sticky_keys/sticky_keys_controller.h" |
| #include "ash/system/tray/system_tray_notifier.h" |
| @@ -270,6 +271,27 @@ void UnloadChromeVoxExtension(Profile* profile) { |
| } // namespace |
| +class ChromeVoxPanelWidgetObserver : public views::WidgetObserver { |
| + public: |
| + ChromeVoxPanelWidgetObserver(views::Widget* widget, |
| + AccessibilityManager* manager) |
| + : widget_(widget), manager_(manager) { |
| + widget_->AddObserver(this); |
| + } |
| + |
| + void OnWidgetClosing(views::Widget* widget) override { |
| + CHECK_EQ(widget_, widget); |
| + 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.
|
| + manager_->OnChromeVoxPanelClosing(); |
| + } |
| + |
| + private: |
| + views::Widget* widget_; |
| + AccessibilityManager* manager_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ChromeVoxPanelWidgetObserver); |
| +}; |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| // AccessibilityStatusEventDetails |
| @@ -377,6 +399,7 @@ AccessibilityManager::AccessibilityManager() |
| braille_display_connected_(false), |
| scoped_braille_observer_(this), |
| braille_ime_current_(false), |
| + chromevox_panel_(nullptr), |
| weak_ptr_factory_(this) { |
| notification_registrar_.Add(this, |
| chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
| @@ -636,6 +659,11 @@ void AccessibilityManager::LoadChromeVoxToLockScreen( |
| } |
| void AccessibilityManager::UnloadChromeVox() { |
| + if (chromevox_panel_) { |
| + chromevox_panel_->Close(); |
| + chromevox_panel_ = nullptr; |
| + } |
| + |
| if (chrome_vox_loaded_on_lock_screen_) |
| UnloadChromeVoxFromLockScreen(); |
| @@ -1138,6 +1166,10 @@ void AccessibilityManager::PostLoadChromeVox(Profile* profile) { |
| should_speak_chrome_vox_announcements_on_user_screen_ = |
| chrome_vox_loaded_on_lock_screen_; |
| + |
| + chromevox_panel_ = new ChromeVoxPanel(profile_); |
| + chromevox_panel_widget_observer_.reset( |
| + new ChromeVoxPanelWidgetObserver(chromevox_panel_->GetWidget(), this)); |
| } |
| void AccessibilityManager::PostUnloadChromeVox(Profile* profile) { |
| @@ -1148,4 +1180,11 @@ void AccessibilityManager::PostUnloadChromeVox(Profile* profile) { |
| std::vector<gfx::Rect>()); |
| } |
| +void AccessibilityManager::OnChromeVoxPanelClosing() { |
| + aura::Window* root_window = chromevox_panel_->GetRootWindow(); |
| + chromevox_panel_widget_observer_.reset(nullptr); |
| + chromevox_panel_ = nullptr; |
| + ash::ShelfLayoutManager::ForShelf(root_window)->SetChromeVoxPanelHeight(0); |
| +} |
| + |
| } // namespace chromeos |