blob: 31b9aebc034e2e422ca0ad4bc316d801e902f8a3 [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"
mlamouri20bb4c4a2015-07-08 14:30:2214#include "ui/gfx/color_utils.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() {
olli.raula36aa8be2015-09-10 11:14:2228 return base::Singleton<
29 BrowserAccessibilityStateImpl,
30 base::LeakySingletonTraits<BrowserAccessibilityStateImpl>>::get();
[email protected]fa4f91682012-02-21 19:53:2631}
32
33BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl()
34 : BrowserAccessibilityState(),
dmazzonidea5ba62015-02-03 19:27:2435 accessibility_mode_(AccessibilityModeOff),
36 disable_hot_tracking_(false) {
[email protected]1e558fa2014-02-12 23:28:5237 ResetAccessibilityModeValue();
[email protected]882db442012-12-04 16:37:5438#if defined(OS_WIN)
[email protected]30fdb362013-01-09 02:33:2739 // On Windows, UpdateHistograms calls some system functions with unknown
[email protected]882db442012-12-04 16:37:5440 // runtime, so call it on the file thread to ensure there's no jank.
41 // Everything in that method must be safe to call on another thread.
42 BrowserThread::ID update_histogram_thread = BrowserThread::FILE;
43#else
[email protected]30fdb362013-01-09 02:33:2744 // On all other platforms, UpdateHistograms should be called on the main
[email protected]882db442012-12-04 16:37:5445 // thread.
46 BrowserThread::ID update_histogram_thread = BrowserThread::UI;
47#endif
48
49 // We need to AddRef() the leaky singleton so that Bind doesn't
[email protected]3c17ae742012-10-24 17:37:2650 // delete it prematurely.
51 AddRef();
[email protected]e6b34872012-10-24 20:51:3252 BrowserThread::PostDelayedTask(
[email protected]882db442012-12-04 16:37:5453 update_histogram_thread, FROM_HERE,
[email protected]30fdb362013-01-09 02:33:2754 base::Bind(&BrowserAccessibilityStateImpl::UpdateHistograms, this),
[email protected]18df7362012-10-24 01:29:4055 base::TimeDelta::FromSeconds(kAccessibilityHistogramDelaySecs));
[email protected]fa4f91682012-02-21 19:53:2656}
57
58BrowserAccessibilityStateImpl::~BrowserAccessibilityStateImpl() {
59}
60
61void BrowserAccessibilityStateImpl::OnScreenReaderDetected() {
[email protected]479278702014-08-11 20:32:0962 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]bfa71242014-03-27 21:10:2463 switches::kDisableRendererAccessibility)) {
64 return;
65 }
66 EnableAccessibility();
[email protected]fa4f91682012-02-21 19:53:2667}
68
[email protected]df376972013-05-03 21:45:0369void BrowserAccessibilityStateImpl::EnableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5270 AddAccessibilityMode(AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2671}
72
[email protected]df376972013-05-03 21:45:0373void BrowserAccessibilityStateImpl::DisableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5274 ResetAccessibilityMode();
75}
76
77void BrowserAccessibilityStateImpl::ResetAccessibilityModeValue() {
78 accessibility_mode_ = AccessibilityModeOff;
[email protected]479278702014-08-11 20:32:0979 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:5280 switches::kForceRendererAccessibility)) {
81 accessibility_mode_ = AccessibilityModeComplete;
82 }
83}
84
85void BrowserAccessibilityStateImpl::ResetAccessibilityMode() {
86 ResetAccessibilityModeValue();
87
[email protected]95640212014-07-26 18:14:3088 std::vector<WebContentsImpl*> web_contents_vector =
89 WebContentsImpl::GetAllWebContents();
90 for (size_t i = 0; i < web_contents_vector.size(); ++i)
91 web_contents_vector[i]->SetAccessibilityMode(accessibility_mode());
[email protected]df376972013-05-03 21:45:0392}
93
[email protected]fa4f91682012-02-21 19:53:2694bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() {
[email protected]1e558fa2014-02-12 23:28:5295 return ((accessibility_mode_ & AccessibilityModeComplete) ==
96 AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2697}
98
[email protected]89430152012-12-03 19:18:5699void BrowserAccessibilityStateImpl::AddHistogramCallback(
100 base::Closure callback) {
101 histogram_callbacks_.push_back(callback);
102}
103
[email protected]30fdb362013-01-09 02:33:27104void BrowserAccessibilityStateImpl::UpdateHistogramsForTesting() {
105 UpdateHistograms();
106}
107
108void BrowserAccessibilityStateImpl::UpdateHistograms() {
[email protected]18df7362012-10-24 01:29:40109 UpdatePlatformSpecificHistograms();
110
[email protected]89430152012-12-03 19:18:56111 for (size_t i = 0; i < histogram_callbacks_.size(); ++i)
112 histogram_callbacks_[i].Run();
113
[email protected]18df7362012-10-24 01:29:40114 UMA_HISTOGRAM_BOOLEAN("Accessibility.State", IsAccessibleBrowser());
115 UMA_HISTOGRAM_BOOLEAN("Accessibility.InvertedColors",
mlamouri20bb4c4a2015-07-08 14:30:22116 color_utils::IsInvertedColorScheme());
[email protected]18df7362012-10-24 01:29:40117 UMA_HISTOGRAM_BOOLEAN("Accessibility.ManuallyEnabled",
[email protected]479278702014-08-11 20:32:09118 base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]18df7362012-10-24 01:29:40119 switches::kForceRendererAccessibility));
[email protected]fa4f91682012-02-21 19:53:26120}
[email protected]e2fa1cca42012-08-22 14:07:27121
[email protected]18df7362012-10-24 01:29:40122#if !defined(OS_WIN)
123void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
124}
125#endif
126
[email protected]1e558fa2014-02-12 23:28:52127void BrowserAccessibilityStateImpl::AddAccessibilityMode(
[email protected]e2fa1cca42012-08-22 14:07:27128 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09129 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52130 switches::kDisableRendererAccessibility)) {
[email protected]df376972013-05-03 21:45:03131 return;
[email protected]1e558fa2014-02-12 23:28:52132 }
[email protected]df376972013-05-03 21:45:03133
[email protected]1e558fa2014-02-12 23:28:52134 accessibility_mode_ =
135 content::AddAccessibilityModeTo(accessibility_mode_, mode);
136
[email protected]95640212014-07-26 18:14:30137 AddOrRemoveFromAllWebContents(mode, true);
[email protected]1e558fa2014-02-12 23:28:52138}
139
140void BrowserAccessibilityStateImpl::RemoveAccessibilityMode(
141 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09142 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52143 switches::kForceRendererAccessibility) &&
144 mode == AccessibilityModeComplete) {
145 return;
146 }
147
148 accessibility_mode_ =
149 content::RemoveAccessibilityModeFrom(accessibility_mode_, mode);
150
[email protected]95640212014-07-26 18:14:30151 AddOrRemoveFromAllWebContents(mode, false);
[email protected]1e558fa2014-02-12 23:28:52152}
153
[email protected]95640212014-07-26 18:14:30154void BrowserAccessibilityStateImpl::AddOrRemoveFromAllWebContents(
[email protected]1e558fa2014-02-12 23:28:52155 AccessibilityMode mode,
156 bool add) {
[email protected]95640212014-07-26 18:14:30157 std::vector<WebContentsImpl*> web_contents_vector =
158 WebContentsImpl::GetAllWebContents();
159 for (size_t i = 0; i < web_contents_vector.size(); ++i) {
[email protected]1e558fa2014-02-12 23:28:52160 if (add)
[email protected]95640212014-07-26 18:14:30161 web_contents_vector[i]->AddAccessibilityMode(mode);
[email protected]1e558fa2014-02-12 23:28:52162 else
[email protected]95640212014-07-26 18:14:30163 web_contents_vector[i]->RemoveAccessibilityMode(mode);
[email protected]df376972013-05-03 21:45:03164 }
[email protected]e2fa1cca42012-08-22 14:07:27165}
[email protected]e6b34872012-10-24 20:51:32166
167} // namespace content