diff options
Diffstat (limited to 'chrome/browser/chromeos/login/wizard_accessibility_helper.cc')
-rw-r--r-- | chrome/browser/chromeos/login/wizard_accessibility_helper.cc | 68 |
1 files changed, 60 insertions, 8 deletions
diff --git a/chrome/browser/chromeos/login/wizard_accessibility_helper.cc b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc index 5daf0c0..eea0bc2 100644 --- a/chrome/browser/chromeos/login/wizard_accessibility_helper.cc +++ b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc @@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/login/wizard_accessibility_helper.h" #include "base/logging.h" +#include "base/stl_util-inl.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/extension_accessibility_api.h" #include "chrome/browser/prefs/pref_service.h" @@ -13,6 +14,18 @@ #include "chrome/common/notification_registrar.h" #include "chrome/common/notification_service.h" #include "chrome/common/pref_names.h" +#include "views/accelerator.h" +#include "views/view.h" + +scoped_ptr<views::Accelerator> WizardAccessibilityHelper::accelerator_; + +// static +views::Accelerator WizardAccessibilityHelper::GetAccelerator() { + if (!WizardAccessibilityHelper::accelerator_.get()) + WizardAccessibilityHelper::accelerator_.reset( + new views::Accelerator(app::VKEY_Z, false, true, true)); + return *(WizardAccessibilityHelper::accelerator_.get()); +} // static WizardAccessibilityHelper* WizardAccessibilityHelper::GetInstance() { @@ -21,6 +34,7 @@ WizardAccessibilityHelper* WizardAccessibilityHelper::GetInstance() { WizardAccessibilityHelper::WizardAccessibilityHelper() { accessibility_handler_.reset(new WizardAccessibilityHandler()); + profile_ = ProfileManager::GetDefaultProfile(); registrar_.Add(accessibility_handler_.get(), NotificationType::ACCESSIBILITY_CONTROL_FOCUSED, NotificationService::AllSources()); @@ -39,18 +53,28 @@ WizardAccessibilityHelper::WizardAccessibilityHelper() { } void WizardAccessibilityHelper::MaybeEnableAccessibility( - views::View* view_tree, Profile* profile) { - if (g_browser_process != NULL && + views::View* view_tree) { + if (g_browser_process && g_browser_process->local_state()->GetBoolean( prefs::kAccessibilityEnabled)) { - EnableAccessibility(view_tree, profile); + EnableAccessibility(view_tree); + } else { + AddViewToBuffer(view_tree); } } -void WizardAccessibilityHelper::EnableAccessibility( - views::View* view_tree, Profile* profile) { +void WizardAccessibilityHelper::MaybeSpeak(const char* str, bool queue, + bool interruptible) { + if (g_browser_process && + g_browser_process->local_state()->GetBoolean( + prefs::kAccessibilityEnabled)) { + accessibility_handler_->Speak(str, queue, interruptible); + } +} + +void WizardAccessibilityHelper::EnableAccessibility(views::View* view_tree) { LOG(INFO) << "Enabling accessibility."; - if (g_browser_process != NULL) { + if (g_browser_process) { PrefService* prefService = g_browser_process->local_state(); if (!prefService->GetBoolean(prefs::kAccessibilityEnabled)) { prefService->SetBoolean(prefs::kAccessibilityEnabled, true); @@ -59,6 +83,34 @@ void WizardAccessibilityHelper::EnableAccessibility( } ExtensionAccessibilityEventRouter::GetInstance()-> SetAccessibilityEnabled(true); - accessible_view_helper_.reset(new AccessibleViewHelper( - view_tree, profile)); + AddViewToBuffer(view_tree); + // If accessibility pref is set, enable accessibility for all views in + // the buffer for which access is not yet enabled. + for (std::map<views::View*, bool>::iterator iter = + views_buffer_.begin(); + iter != views_buffer_.end(); ++iter) { + if (!(*iter).second) { + AccessibleViewHelper *helper = new AccessibleViewHelper((*iter).first, + profile_); + accessible_view_helpers_.push_back(helper); + (*iter).second = true; + } + } +} + +void WizardAccessibilityHelper::AddViewToBuffer(views::View* view_tree) { + if (!view_tree->GetWidget()) + return; + bool view_exists = false; + // Check if the view is already queued for enabling accessibility. + // Prevent adding the same view in the buffer twice. + for (std::map<views::View*, bool>::iterator iter = views_buffer_.begin(); + iter != views_buffer_.end(); ++iter) { + if ((*iter).first == view_tree) { + view_exists = true; + break; + } + } + if (!view_exists) + views_buffer_[view_tree] = false; } |