blob: 1e3063e19de30e2991bed0c13320c1ee7c9a6d6f [file] [log] [blame]
[email protected]fa4f91682012-02-21 19:53:261// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/accessibility/browser_accessibility_state_impl.h"
6
[email protected]3e3c4522012-04-13 21:16:297#include "base/command_line.h"
[email protected]fa4f91682012-02-21 19:53:268#include "base/metrics/histogram.h"
[email protected]a43858f2013-06-28 15:18:379#include "base/timer/timer.h"
[email protected]1e558fa2014-02-12 23:28:5210#include "content/browser/accessibility/accessibility_mode_helper.h"
[email protected]df376972013-05-03 21:45:0311#include "content/browser/renderer_host/render_widget_host_impl.h"
[email protected]95640212014-07-26 18:14:3012#include "content/browser/web_contents/web_contents_impl.h"
[email protected]18df7362012-10-24 01:29:4013#include "content/public/browser/browser_thread.h"
[email protected]3e3c4522012-04-13 21:16:2914#include "content/public/common/content_switches.h"
[email protected]123f0d042012-03-17 04:52:1115#include "ui/gfx/sys_color_change_listener.h"
[email protected]fa4f91682012-02-21 19:53:2616
[email protected]e2fa1cca42012-08-22 14:07:2717#if defined(OS_WIN)
18#include "base/win/windows_version.h"
19#endif
20
[email protected]e6b34872012-10-24 20:51:3221namespace content {
22
[email protected]fa4f91682012-02-21 19:53:2623// Update the accessibility histogram 45 seconds after initialization.
24static const int kAccessibilityHistogramDelaySecs = 45;
25
26// static
27BrowserAccessibilityState* BrowserAccessibilityState::GetInstance() {
28 return BrowserAccessibilityStateImpl::GetInstance();
29}
30
31// static
32BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() {
[email protected]b90cad72012-04-10 23:27:5333 return Singleton<BrowserAccessibilityStateImpl,
34 LeakySingletonTraits<BrowserAccessibilityStateImpl> >::get();
[email protected]fa4f91682012-02-21 19:53:2635}
36
37BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl()
38 : BrowserAccessibilityState(),
[email protected]e2fa1cca42012-08-22 14:07:2739 accessibility_mode_(AccessibilityModeOff) {
[email protected]1e558fa2014-02-12 23:28:5240 ResetAccessibilityModeValue();
[email protected]882db442012-12-04 16:37:5441#if defined(OS_WIN)
[email protected]30fdb362013-01-09 02:33:2742 // On Windows, UpdateHistograms calls some system functions with unknown
[email protected]882db442012-12-04 16:37:5443 // runtime, so call it on the file thread to ensure there's no jank.
44 // Everything in that method must be safe to call on another thread.
45 BrowserThread::ID update_histogram_thread = BrowserThread::FILE;
46#else
[email protected]30fdb362013-01-09 02:33:2747 // On all other platforms, UpdateHistograms should be called on the main
[email protected]882db442012-12-04 16:37:5448 // thread.
49 BrowserThread::ID update_histogram_thread = BrowserThread::UI;
50#endif
51
52 // We need to AddRef() the leaky singleton so that Bind doesn't
[email protected]3c17ae742012-10-24 17:37:2653 // delete it prematurely.
54 AddRef();
[email protected]e6b34872012-10-24 20:51:3255 BrowserThread::PostDelayedTask(
[email protected]882db442012-12-04 16:37:5456 update_histogram_thread, FROM_HERE,
[email protected]30fdb362013-01-09 02:33:2757 base::Bind(&BrowserAccessibilityStateImpl::UpdateHistograms, this),
[email protected]18df7362012-10-24 01:29:4058 base::TimeDelta::FromSeconds(kAccessibilityHistogramDelaySecs));
[email protected]fa4f91682012-02-21 19:53:2659}
60
61BrowserAccessibilityStateImpl::~BrowserAccessibilityStateImpl() {
62}
63
64void BrowserAccessibilityStateImpl::OnScreenReaderDetected() {
[email protected]479278702014-08-11 20:32:0965 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]bfa71242014-03-27 21:10:2466 switches::kDisableRendererAccessibility)) {
67 return;
68 }
69 EnableAccessibility();
[email protected]fa4f91682012-02-21 19:53:2670}
71
[email protected]df376972013-05-03 21:45:0372void BrowserAccessibilityStateImpl::EnableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5273 AddAccessibilityMode(AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2674}
75
[email protected]df376972013-05-03 21:45:0376void BrowserAccessibilityStateImpl::DisableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5277 ResetAccessibilityMode();
78}
79
80void BrowserAccessibilityStateImpl::ResetAccessibilityModeValue() {
81 accessibility_mode_ = AccessibilityModeOff;
82#if defined(OS_WIN)
83 // On Windows 8, always enable accessibility for editable text controls
84 // so we can show the virtual keyboard when one is enabled.
85 if (base::win::GetVersion() >= base::win::VERSION_WIN8 &&
[email protected]479278702014-08-11 20:32:0986 !base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:5287 switches::kDisableRendererAccessibility)) {
88 accessibility_mode_ = AccessibilityModeEditableTextOnly;
89 }
90#endif // defined(OS_WIN)
91
[email protected]479278702014-08-11 20:32:0992 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:5293 switches::kForceRendererAccessibility)) {
94 accessibility_mode_ = AccessibilityModeComplete;
95 }
96}
97
98void BrowserAccessibilityStateImpl::ResetAccessibilityMode() {
99 ResetAccessibilityModeValue();
100
[email protected]95640212014-07-26 18:14:30101 std::vector<WebContentsImpl*> web_contents_vector =
102 WebContentsImpl::GetAllWebContents();
103 for (size_t i = 0; i < web_contents_vector.size(); ++i)
104 web_contents_vector[i]->SetAccessibilityMode(accessibility_mode());
[email protected]df376972013-05-03 21:45:03105}
106
[email protected]fa4f91682012-02-21 19:53:26107bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() {
[email protected]1e558fa2014-02-12 23:28:52108 return ((accessibility_mode_ & AccessibilityModeComplete) ==
109 AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:26110}
111
[email protected]89430152012-12-03 19:18:56112void BrowserAccessibilityStateImpl::AddHistogramCallback(
113 base::Closure callback) {
114 histogram_callbacks_.push_back(callback);
115}
116
[email protected]30fdb362013-01-09 02:33:27117void BrowserAccessibilityStateImpl::UpdateHistogramsForTesting() {
118 UpdateHistograms();
119}
120
121void BrowserAccessibilityStateImpl::UpdateHistograms() {
[email protected]18df7362012-10-24 01:29:40122 UpdatePlatformSpecificHistograms();
123
[email protected]89430152012-12-03 19:18:56124 for (size_t i = 0; i < histogram_callbacks_.size(); ++i)
125 histogram_callbacks_[i].Run();
126
[email protected]18df7362012-10-24 01:29:40127 UMA_HISTOGRAM_BOOLEAN("Accessibility.State", IsAccessibleBrowser());
128 UMA_HISTOGRAM_BOOLEAN("Accessibility.InvertedColors",
129 gfx::IsInvertedColorScheme());
130 UMA_HISTOGRAM_BOOLEAN("Accessibility.ManuallyEnabled",
[email protected]479278702014-08-11 20:32:09131 base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]18df7362012-10-24 01:29:40132 switches::kForceRendererAccessibility));
[email protected]fa4f91682012-02-21 19:53:26133}
[email protected]e2fa1cca42012-08-22 14:07:27134
[email protected]18df7362012-10-24 01:29:40135#if !defined(OS_WIN)
136void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
137}
138#endif
139
[email protected]1e558fa2014-02-12 23:28:52140void BrowserAccessibilityStateImpl::AddAccessibilityMode(
[email protected]e2fa1cca42012-08-22 14:07:27141 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09142 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52143 switches::kDisableRendererAccessibility)) {
[email protected]df376972013-05-03 21:45:03144 return;
[email protected]1e558fa2014-02-12 23:28:52145 }
[email protected]df376972013-05-03 21:45:03146
[email protected]1e558fa2014-02-12 23:28:52147 accessibility_mode_ =
148 content::AddAccessibilityModeTo(accessibility_mode_, mode);
149
[email protected]95640212014-07-26 18:14:30150 AddOrRemoveFromAllWebContents(mode, true);
[email protected]1e558fa2014-02-12 23:28:52151}
152
153void BrowserAccessibilityStateImpl::RemoveAccessibilityMode(
154 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09155 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52156 switches::kForceRendererAccessibility) &&
157 mode == AccessibilityModeComplete) {
158 return;
159 }
160
161 accessibility_mode_ =
162 content::RemoveAccessibilityModeFrom(accessibility_mode_, mode);
163
[email protected]95640212014-07-26 18:14:30164 AddOrRemoveFromAllWebContents(mode, false);
[email protected]1e558fa2014-02-12 23:28:52165}
166
[email protected]95640212014-07-26 18:14:30167void BrowserAccessibilityStateImpl::AddOrRemoveFromAllWebContents(
[email protected]1e558fa2014-02-12 23:28:52168 AccessibilityMode mode,
169 bool add) {
[email protected]95640212014-07-26 18:14:30170 std::vector<WebContentsImpl*> web_contents_vector =
171 WebContentsImpl::GetAllWebContents();
172 for (size_t i = 0; i < web_contents_vector.size(); ++i) {
[email protected]1e558fa2014-02-12 23:28:52173 if (add)
[email protected]95640212014-07-26 18:14:30174 web_contents_vector[i]->AddAccessibilityMode(mode);
[email protected]1e558fa2014-02-12 23:28:52175 else
[email protected]95640212014-07-26 18:14:30176 web_contents_vector[i]->RemoveAccessibilityMode(mode);
[email protected]df376972013-05-03 21:45:03177 }
[email protected]e2fa1cca42012-08-22 14:07:27178}
[email protected]e6b34872012-10-24 20:51:32179
180} // namespace content