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..d0aca3d8af4aecf58e1f589de2aebaa95de26105 100644 |
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc |
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc |
@@ -270,6 +270,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); |
+ manager_->OnChromeVoxPanelClosing(); |
+ } |
+ |
+ private: |
+ views::Widget* widget_; |
+ AccessibilityManager* manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ChromeVoxPanelWidgetObserver); |
+}; |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// AccessibilityStatusEventDetails |
@@ -377,6 +398,8 @@ AccessibilityManager::AccessibilityManager() |
braille_display_connected_(false), |
scoped_braille_observer_(this), |
braille_ime_current_(false), |
+ chromevox_panel_(nullptr), |
+ chromevox_panel_widget_observer_(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_ = |
+ new ChromeVoxPanelWidgetObserver(chromevox_panel_->GetWidget(), this); |
} |
void AccessibilityManager::PostUnloadChromeVox(Profile* profile) { |
@@ -1148,4 +1180,20 @@ void AccessibilityManager::PostUnloadChromeVox(Profile* profile) { |
std::vector<gfx::Rect>()); |
} |
+gfx::Insets AccessibilityManager::GetWorkAreaInsets( |
+ aura::Window* root_window) const { |
+ if (chromevox_panel_ && chromevox_panel_->GetRootWindow() == root_window) |
+ return gfx::Insets(chromevox_panel_->GetHeight(), 0, 0, 0); |
+ else |
+ return gfx::Insets(); |
+} |
+ |
+void AccessibilityManager::OnChromeVoxPanelClosing() { |
+ aura::Window* root_window = chromevox_panel_->GetRootWindow(); |
+ delete chromevox_panel_widget_observer_; |
+ chromevox_panel_widget_observer_ = nullptr; |
+ chromevox_panel_ = nullptr; |
+ ash::Shell::GetInstance()->UpdateDisplayWorkAreaInsets(root_window); |
+} |
+ |
} // namespace chromeos |