blob: 5d68c2c58d8558e78570fdf31370466dcca6eae2 [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]1e558fa2014-02-12 23:28:529#include "content/browser/accessibility/accessibility_mode_helper.h"
[email protected]df376972013-05-03 21:45:0310#include "content/browser/renderer_host/render_widget_host_impl.h"
[email protected]95640212014-07-26 18:14:3011#include "content/browser/web_contents/web_contents_impl.h"
[email protected]18df7362012-10-24 01:29:4012#include "content/public/browser/browser_thread.h"
[email protected]3e3c4522012-04-13 21:16:2913#include "content/public/common/content_switches.h"
[email protected]123f0d042012-03-17 04:52:1114#include "ui/gfx/sys_color_change_listener.h"
[email protected]fa4f91682012-02-21 19:53:2615
[email protected]e6b34872012-10-24 20:51:3216namespace content {
17
[email protected]fa4f91682012-02-21 19:53:2618// Update the accessibility histogram 45 seconds after initialization.
19static const int kAccessibilityHistogramDelaySecs = 45;
20
21// static
22BrowserAccessibilityState* BrowserAccessibilityState::GetInstance() {
23 return BrowserAccessibilityStateImpl::GetInstance();
24}
25
26// static
27BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() {
[email protected]b90cad72012-04-10 23:27:5328 return Singleton<BrowserAccessibilityStateImpl,
29 LeakySingletonTraits<BrowserAccessibilityStateImpl> >::get();
[email protected]fa4f91682012-02-21 19:53:2630}
31
32BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl()
33 : BrowserAccessibilityState(),
dmazzonidea5ba62015-02-03 19:27:2434 accessibility_mode_(AccessibilityModeOff),
35 disable_hot_tracking_(false) {
[email protected]1e558fa2014-02-12 23:28:5236 ResetAccessibilityModeValue();
[email protected]882db442012-12-04 16:37:5437#if defined(OS_WIN)
[email protected]30fdb362013-01-09 02:33:2738 // On Windows, UpdateHistograms calls some system functions with unknown
[email protected]882db442012-12-04 16:37:5439 // runtime, so call it on the file thread to ensure there's no jank.
40 // Everything in that method must be safe to call on another thread.
41 BrowserThread::ID update_histogram_thread = BrowserThread::FILE;
42#else
[email protected]30fdb362013-01-09 02:33:2743 // On all other platforms, UpdateHistograms should be called on the main
[email protected]882db442012-12-04 16:37:5444 // thread.
45 BrowserThread::ID update_histogram_thread = BrowserThread::UI;
46#endif
47
48 // We need to AddRef() the leaky singleton so that Bind doesn't
[email protected]3c17ae742012-10-24 17:37:2649 // delete it prematurely.
50 AddRef();
[email protected]e6b34872012-10-24 20:51:3251 BrowserThread::PostDelayedTask(
[email protected]882db442012-12-04 16:37:5452 update_histogram_thread, FROM_HERE,
[email protected]30fdb362013-01-09 02:33:2753 base::Bind(&BrowserAccessibilityStateImpl::UpdateHistograms, this),
[email protected]18df7362012-10-24 01:29:4054 base::TimeDelta::FromSeconds(kAccessibilityHistogramDelaySecs));
[email protected]fa4f91682012-02-21 19:53:2655}
56
57BrowserAccessibilityStateImpl::~BrowserAccessibilityStateImpl() {
58}
59
60void BrowserAccessibilityStateImpl::OnScreenReaderDetected() {
[email protected]479278702014-08-11 20:32:0961 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]bfa71242014-03-27 21:10:2462 switches::kDisableRendererAccessibility)) {
63 return;
64 }
65 EnableAccessibility();
[email protected]fa4f91682012-02-21 19:53:2666}
67
[email protected]df376972013-05-03 21:45:0368void BrowserAccessibilityStateImpl::EnableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5269 AddAccessibilityMode(AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2670}
71
[email protected]df376972013-05-03 21:45:0372void BrowserAccessibilityStateImpl::DisableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5273 ResetAccessibilityMode();
74}
75
76void BrowserAccessibilityStateImpl::ResetAccessibilityModeValue() {
77 accessibility_mode_ = AccessibilityModeOff;
[email protected]479278702014-08-11 20:32:0978 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:5279 switches::kForceRendererAccessibility)) {
80 accessibility_mode_ = AccessibilityModeComplete;
81 }
82}
83
84void BrowserAccessibilityStateImpl::ResetAccessibilityMode() {
85 ResetAccessibilityModeValue();
86
[email protected]95640212014-07-26 18:14:3087 std::vector<WebContentsImpl*> web_contents_vector =
88 WebContentsImpl::GetAllWebContents();
89 for (size_t i = 0; i < web_contents_vector.size(); ++i)
90 web_contents_vector[i]->SetAccessibilityMode(accessibility_mode());
[email protected]df376972013-05-03 21:45:0391}
92
[email protected]fa4f91682012-02-21 19:53:2693bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() {
[email protected]1e558fa2014-02-12 23:28:5294 return ((accessibility_mode_ & AccessibilityModeComplete) ==
95 AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2696}
97
[email protected]89430152012-12-03 19:18:5698void BrowserAccessibilityStateImpl::AddHistogramCallback(
99 base::Closure callback) {
100 histogram_callbacks_.push_back(callback);
101}
102
[email protected]30fdb362013-01-09 02:33:27103void BrowserAccessibilityStateImpl::UpdateHistogramsForTesting() {
104 UpdateHistograms();
105}
106
107void BrowserAccessibilityStateImpl::UpdateHistograms() {
[email protected]18df7362012-10-24 01:29:40108 UpdatePlatformSpecificHistograms();
109
[email protected]89430152012-12-03 19:18:56110 for (size_t i = 0; i < histogram_callbacks_.size(); ++i)
111 histogram_callbacks_[i].Run();
112
[email protected]18df7362012-10-24 01:29:40113 UMA_HISTOGRAM_BOOLEAN("Accessibility.State", IsAccessibleBrowser());
114 UMA_HISTOGRAM_BOOLEAN("Accessibility.InvertedColors",
115 gfx::IsInvertedColorScheme());
116 UMA_HISTOGRAM_BOOLEAN("Accessibility.ManuallyEnabled",
[email protected]479278702014-08-11 20:32:09117 base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]18df7362012-10-24 01:29:40118 switches::kForceRendererAccessibility));
[email protected]fa4f91682012-02-21 19:53:26119}
[email protected]e2fa1cca42012-08-22 14:07:27120
[email protected]18df7362012-10-24 01:29:40121#if !defined(OS_WIN)
122void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
123}
124#endif
125
[email protected]1e558fa2014-02-12 23:28:52126void BrowserAccessibilityStateImpl::AddAccessibilityMode(
[email protected]e2fa1cca42012-08-22 14:07:27127 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09128 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52129 switches::kDisableRendererAccessibility)) {
[email protected]df376972013-05-03 21:45:03130 return;
[email protected]1e558fa2014-02-12 23:28:52131 }
[email protected]df376972013-05-03 21:45:03132
[email protected]1e558fa2014-02-12 23:28:52133 accessibility_mode_ =
134 content::AddAccessibilityModeTo(accessibility_mode_, mode);
135
[email protected]95640212014-07-26 18:14:30136 AddOrRemoveFromAllWebContents(mode, true);
[email protected]1e558fa2014-02-12 23:28:52137}
138
139void BrowserAccessibilityStateImpl::RemoveAccessibilityMode(
140 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09141 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52142 switches::kForceRendererAccessibility) &&
143 mode == AccessibilityModeComplete) {
144 return;
145 }
146
147 accessibility_mode_ =
148 content::RemoveAccessibilityModeFrom(accessibility_mode_, mode);
149
[email protected]95640212014-07-26 18:14:30150 AddOrRemoveFromAllWebContents(mode, false);
[email protected]1e558fa2014-02-12 23:28:52151}
152
[email protected]95640212014-07-26 18:14:30153void BrowserAccessibilityStateImpl::AddOrRemoveFromAllWebContents(
[email protected]1e558fa2014-02-12 23:28:52154 AccessibilityMode mode,
155 bool add) {
[email protected]95640212014-07-26 18:14:30156 std::vector<WebContentsImpl*> web_contents_vector =
157 WebContentsImpl::GetAllWebContents();
158 for (size_t i = 0; i < web_contents_vector.size(); ++i) {
[email protected]1e558fa2014-02-12 23:28:52159 if (add)
[email protected]95640212014-07-26 18:14:30160 web_contents_vector[i]->AddAccessibilityMode(mode);
[email protected]1e558fa2014-02-12 23:28:52161 else
[email protected]95640212014-07-26 18:14:30162 web_contents_vector[i]->RemoveAccessibilityMode(mode);
[email protected]df376972013-05-03 21:45:03163 }
[email protected]e2fa1cca42012-08-22 14:07:27164}
[email protected]e6b34872012-10-24 20:51:32165
166} // namespace content