blob: 4038d66d0635d783e44de9fe38a3125841d509f8 [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
avib7348942015-12-25 20:57:107#include <stddef.h>
8
[email protected]3e3c4522012-04-13 21:16:299#include "base/command_line.h"
[email protected]fa4f91682012-02-21 19:53:2610#include "base/metrics/histogram.h"
avib7348942015-12-25 20:57:1011#include "build/build_config.h"
[email protected]1e558fa2014-02-12 23:28:5212#include "content/browser/accessibility/accessibility_mode_helper.h"
[email protected]df376972013-05-03 21:45:0313#include "content/browser/renderer_host/render_widget_host_impl.h"
[email protected]95640212014-07-26 18:14:3014#include "content/browser/web_contents/web_contents_impl.h"
[email protected]18df7362012-10-24 01:29:4015#include "content/public/browser/browser_thread.h"
[email protected]3e3c4522012-04-13 21:16:2916#include "content/public/common/content_switches.h"
mlamouri20bb4c4a2015-07-08 14:30:2217#include "ui/gfx/color_utils.h"
[email protected]fa4f91682012-02-21 19:53:2618
[email protected]e6b34872012-10-24 20:51:3219namespace content {
20
[email protected]fa4f91682012-02-21 19:53:2621// Update the accessibility histogram 45 seconds after initialization.
22static const int kAccessibilityHistogramDelaySecs = 45;
23
24// static
25BrowserAccessibilityState* BrowserAccessibilityState::GetInstance() {
26 return BrowserAccessibilityStateImpl::GetInstance();
27}
28
29// static
30BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() {
olli.raula36aa8be2015-09-10 11:14:2231 return base::Singleton<
32 BrowserAccessibilityStateImpl,
33 base::LeakySingletonTraits<BrowserAccessibilityStateImpl>>::get();
[email protected]fa4f91682012-02-21 19:53:2634}
35
36BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl()
37 : BrowserAccessibilityState(),
dmazzonidea5ba62015-02-03 19:27:2438 accessibility_mode_(AccessibilityModeOff),
39 disable_hot_tracking_(false) {
[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;
[email protected]479278702014-08-11 20:32:0982 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:5283 switches::kForceRendererAccessibility)) {
84 accessibility_mode_ = AccessibilityModeComplete;
85 }
86}
87
88void BrowserAccessibilityStateImpl::ResetAccessibilityMode() {
89 ResetAccessibilityModeValue();
90
[email protected]95640212014-07-26 18:14:3091 std::vector<WebContentsImpl*> web_contents_vector =
92 WebContentsImpl::GetAllWebContents();
93 for (size_t i = 0; i < web_contents_vector.size(); ++i)
94 web_contents_vector[i]->SetAccessibilityMode(accessibility_mode());
[email protected]df376972013-05-03 21:45:0395}
96
[email protected]fa4f91682012-02-21 19:53:2697bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() {
[email protected]1e558fa2014-02-12 23:28:5298 return ((accessibility_mode_ & AccessibilityModeComplete) ==
99 AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:26100}
101
[email protected]89430152012-12-03 19:18:56102void BrowserAccessibilityStateImpl::AddHistogramCallback(
103 base::Closure callback) {
104 histogram_callbacks_.push_back(callback);
105}
106
[email protected]30fdb362013-01-09 02:33:27107void BrowserAccessibilityStateImpl::UpdateHistogramsForTesting() {
108 UpdateHistograms();
109}
110
111void BrowserAccessibilityStateImpl::UpdateHistograms() {
[email protected]18df7362012-10-24 01:29:40112 UpdatePlatformSpecificHistograms();
113
[email protected]89430152012-12-03 19:18:56114 for (size_t i = 0; i < histogram_callbacks_.size(); ++i)
115 histogram_callbacks_[i].Run();
116
[email protected]18df7362012-10-24 01:29:40117 UMA_HISTOGRAM_BOOLEAN("Accessibility.State", IsAccessibleBrowser());
118 UMA_HISTOGRAM_BOOLEAN("Accessibility.InvertedColors",
mlamouri20bb4c4a2015-07-08 14:30:22119 color_utils::IsInvertedColorScheme());
[email protected]18df7362012-10-24 01:29:40120 UMA_HISTOGRAM_BOOLEAN("Accessibility.ManuallyEnabled",
[email protected]479278702014-08-11 20:32:09121 base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]18df7362012-10-24 01:29:40122 switches::kForceRendererAccessibility));
[email protected]fa4f91682012-02-21 19:53:26123}
[email protected]e2fa1cca42012-08-22 14:07:27124
ellyjonesa577c6cb2016-04-01 22:31:03125#if !defined(OS_WIN) && !defined(OS_MACOSX)
[email protected]18df7362012-10-24 01:29:40126void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
127}
128#endif
129
[email protected]1e558fa2014-02-12 23:28:52130void BrowserAccessibilityStateImpl::AddAccessibilityMode(
[email protected]e2fa1cca42012-08-22 14:07:27131 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09132 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52133 switches::kDisableRendererAccessibility)) {
[email protected]df376972013-05-03 21:45:03134 return;
[email protected]1e558fa2014-02-12 23:28:52135 }
[email protected]df376972013-05-03 21:45:03136
[email protected]1e558fa2014-02-12 23:28:52137 accessibility_mode_ =
138 content::AddAccessibilityModeTo(accessibility_mode_, mode);
139
[email protected]95640212014-07-26 18:14:30140 AddOrRemoveFromAllWebContents(mode, true);
[email protected]1e558fa2014-02-12 23:28:52141}
142
143void BrowserAccessibilityStateImpl::RemoveAccessibilityMode(
144 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09145 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52146 switches::kForceRendererAccessibility) &&
147 mode == AccessibilityModeComplete) {
148 return;
149 }
150
151 accessibility_mode_ =
152 content::RemoveAccessibilityModeFrom(accessibility_mode_, mode);
153
[email protected]95640212014-07-26 18:14:30154 AddOrRemoveFromAllWebContents(mode, false);
[email protected]1e558fa2014-02-12 23:28:52155}
156
[email protected]95640212014-07-26 18:14:30157void BrowserAccessibilityStateImpl::AddOrRemoveFromAllWebContents(
[email protected]1e558fa2014-02-12 23:28:52158 AccessibilityMode mode,
159 bool add) {
[email protected]95640212014-07-26 18:14:30160 std::vector<WebContentsImpl*> web_contents_vector =
161 WebContentsImpl::GetAllWebContents();
162 for (size_t i = 0; i < web_contents_vector.size(); ++i) {
[email protected]1e558fa2014-02-12 23:28:52163 if (add)
[email protected]95640212014-07-26 18:14:30164 web_contents_vector[i]->AddAccessibilityMode(mode);
[email protected]1e558fa2014-02-12 23:28:52165 else
[email protected]95640212014-07-26 18:14:30166 web_contents_vector[i]->RemoveAccessibilityMode(mode);
[email protected]df376972013-05-03 21:45:03167 }
[email protected]e2fa1cca42012-08-22 14:07:27168}
[email protected]e6b34872012-10-24 20:51:32169
170} // namespace content