blob: 4c50bb32dd2fa96194868c70b952b22f6f582039 [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"
asvitkine30330812016-08-30 04:01:0810#include "base/metrics/histogram_macros.h"
avib7348942015-12-25 20:57:1011#include "build/build_config.h"
[email protected]df376972013-05-03 21:45:0312#include "content/browser/renderer_host/render_widget_host_impl.h"
[email protected]95640212014-07-26 18:14:3013#include "content/browser/web_contents/web_contents_impl.h"
[email protected]18df7362012-10-24 01:29:4014#include "content/public/browser/browser_thread.h"
[email protected]3e3c4522012-04-13 21:16:2915#include "content/public/common/content_switches.h"
mlamouri20bb4c4a2015-07-08 14:30:2216#include "ui/gfx/color_utils.h"
[email protected]fa4f91682012-02-21 19:53:2617
[email protected]e6b34872012-10-24 20:51:3218namespace content {
19
[email protected]fa4f91682012-02-21 19:53:2620// Update the accessibility histogram 45 seconds after initialization.
21static const int kAccessibilityHistogramDelaySecs = 45;
22
23// static
24BrowserAccessibilityState* BrowserAccessibilityState::GetInstance() {
25 return BrowserAccessibilityStateImpl::GetInstance();
26}
27
28// static
29BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() {
olli.raula36aa8be2015-09-10 11:14:2230 return base::Singleton<
31 BrowserAccessibilityStateImpl,
32 base::LeakySingletonTraits<BrowserAccessibilityStateImpl>>::get();
[email protected]fa4f91682012-02-21 19:53:2633}
34
35BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl()
36 : BrowserAccessibilityState(),
dmazzonidea5ba62015-02-03 19:27:2437 accessibility_mode_(AccessibilityModeOff),
38 disable_hot_tracking_(false) {
[email protected]1e558fa2014-02-12 23:28:5239 ResetAccessibilityModeValue();
[email protected]882db442012-12-04 16:37:5440#if defined(OS_WIN)
[email protected]30fdb362013-01-09 02:33:2741 // On Windows, UpdateHistograms calls some system functions with unknown
[email protected]882db442012-12-04 16:37:5442 // runtime, so call it on the file thread to ensure there's no jank.
43 // Everything in that method must be safe to call on another thread.
44 BrowserThread::ID update_histogram_thread = BrowserThread::FILE;
45#else
[email protected]30fdb362013-01-09 02:33:2746 // On all other platforms, UpdateHistograms should be called on the main
[email protected]882db442012-12-04 16:37:5447 // thread.
48 BrowserThread::ID update_histogram_thread = BrowserThread::UI;
49#endif
50
51 // We need to AddRef() the leaky singleton so that Bind doesn't
[email protected]3c17ae742012-10-24 17:37:2652 // delete it prematurely.
53 AddRef();
[email protected]e6b34872012-10-24 20:51:3254 BrowserThread::PostDelayedTask(
[email protected]882db442012-12-04 16:37:5455 update_histogram_thread, FROM_HERE,
[email protected]30fdb362013-01-09 02:33:2756 base::Bind(&BrowserAccessibilityStateImpl::UpdateHistograms, this),
[email protected]18df7362012-10-24 01:29:4057 base::TimeDelta::FromSeconds(kAccessibilityHistogramDelaySecs));
[email protected]fa4f91682012-02-21 19:53:2658}
59
60BrowserAccessibilityStateImpl::~BrowserAccessibilityStateImpl() {
61}
62
63void BrowserAccessibilityStateImpl::OnScreenReaderDetected() {
[email protected]479278702014-08-11 20:32:0964 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]bfa71242014-03-27 21:10:2465 switches::kDisableRendererAccessibility)) {
66 return;
67 }
68 EnableAccessibility();
[email protected]fa4f91682012-02-21 19:53:2669}
70
[email protected]df376972013-05-03 21:45:0371void BrowserAccessibilityStateImpl::EnableAccessibility() {
dmazzonidd3d51a72016-12-14 18:41:0172 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_COMPLETE);
[email protected]fa4f91682012-02-21 19:53:2673}
74
[email protected]df376972013-05-03 21:45:0375void BrowserAccessibilityStateImpl::DisableAccessibility() {
[email protected]1e558fa2014-02-12 23:28:5276 ResetAccessibilityMode();
77}
78
79void BrowserAccessibilityStateImpl::ResetAccessibilityModeValue() {
80 accessibility_mode_ = AccessibilityModeOff;
[email protected]479278702014-08-11 20:32:0981 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:5282 switches::kForceRendererAccessibility)) {
dmazzonidd3d51a72016-12-14 18:41:0183 accessibility_mode_ = ACCESSIBILITY_MODE_COMPLETE;
[email protected]1e558fa2014-02-12 23:28:5284 }
85}
86
87void BrowserAccessibilityStateImpl::ResetAccessibilityMode() {
88 ResetAccessibilityModeValue();
89
[email protected]95640212014-07-26 18:14:3090 std::vector<WebContentsImpl*> web_contents_vector =
91 WebContentsImpl::GetAllWebContents();
92 for (size_t i = 0; i < web_contents_vector.size(); ++i)
93 web_contents_vector[i]->SetAccessibilityMode(accessibility_mode());
[email protected]df376972013-05-03 21:45:0394}
95
[email protected]fa4f91682012-02-21 19:53:2696bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() {
dmazzonidd3d51a72016-12-14 18:41:0197 return ((accessibility_mode_ & ACCESSIBILITY_MODE_COMPLETE) ==
98 ACCESSIBILITY_MODE_COMPLETE);
[email protected]fa4f91682012-02-21 19:53:2699}
100
[email protected]89430152012-12-03 19:18:56101void BrowserAccessibilityStateImpl::AddHistogramCallback(
102 base::Closure callback) {
103 histogram_callbacks_.push_back(callback);
104}
105
[email protected]30fdb362013-01-09 02:33:27106void BrowserAccessibilityStateImpl::UpdateHistogramsForTesting() {
107 UpdateHistograms();
108}
109
110void BrowserAccessibilityStateImpl::UpdateHistograms() {
[email protected]18df7362012-10-24 01:29:40111 UpdatePlatformSpecificHistograms();
112
[email protected]89430152012-12-03 19:18:56113 for (size_t i = 0; i < histogram_callbacks_.size(); ++i)
114 histogram_callbacks_[i].Run();
115
[email protected]18df7362012-10-24 01:29:40116 UMA_HISTOGRAM_BOOLEAN("Accessibility.State", IsAccessibleBrowser());
117 UMA_HISTOGRAM_BOOLEAN("Accessibility.InvertedColors",
mlamouri20bb4c4a2015-07-08 14:30:22118 color_utils::IsInvertedColorScheme());
[email protected]18df7362012-10-24 01:29:40119 UMA_HISTOGRAM_BOOLEAN("Accessibility.ManuallyEnabled",
[email protected]479278702014-08-11 20:32:09120 base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]18df7362012-10-24 01:29:40121 switches::kForceRendererAccessibility));
[email protected]fa4f91682012-02-21 19:53:26122}
[email protected]e2fa1cca42012-08-22 14:07:27123
ellyjonesa577c6cb2016-04-01 22:31:03124#if !defined(OS_WIN) && !defined(OS_MACOSX)
[email protected]18df7362012-10-24 01:29:40125void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
126}
127#endif
128
dmazzonidd3d51a72016-12-14 18:41:01129void BrowserAccessibilityStateImpl::AddAccessibilityModeFlags(
[email protected]e2fa1cca42012-08-22 14:07:27130 AccessibilityMode mode) {
[email protected]479278702014-08-11 20:32:09131 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
[email protected]1e558fa2014-02-12 23:28:52132 switches::kDisableRendererAccessibility)) {
[email protected]df376972013-05-03 21:45:03133 return;
[email protected]1e558fa2014-02-12 23:28:52134 }
[email protected]df376972013-05-03 21:45:03135
dmazzonidd3d51a72016-12-14 18:41:01136 accessibility_mode_ |= mode;
137 std::vector<WebContentsImpl*> web_contents_vector =
138 WebContentsImpl::GetAllWebContents();
139 for (size_t i = 0; i < web_contents_vector.size(); ++i)
140 web_contents_vector[i]->AddAccessibilityMode(accessibility_mode_);
[email protected]1e558fa2014-02-12 23:28:52141}
142
dmazzonidd3d51a72016-12-14 18:41:01143void BrowserAccessibilityStateImpl::RemoveAccessibilityModeFlags(
[email protected]1e558fa2014-02-12 23:28:52144 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) &&
dmazzonidd3d51a72016-12-14 18:41:01147 mode == ACCESSIBILITY_MODE_COMPLETE) {
[email protected]1e558fa2014-02-12 23:28:52148 return;
149 }
150
dmazzonidd3d51a72016-12-14 18:41:01151 accessibility_mode_ = accessibility_mode_ ^ (mode & accessibility_mode_);
[email protected]95640212014-07-26 18:14:30152 std::vector<WebContentsImpl*> web_contents_vector =
153 WebContentsImpl::GetAllWebContents();
dmazzonidd3d51a72016-12-14 18:41:01154 for (size_t i = 0; i < web_contents_vector.size(); ++i)
155 web_contents_vector[i]->SetAccessibilityMode(accessibility_mode());
[email protected]e2fa1cca42012-08-22 14:07:27156}
[email protected]e6b34872012-10-24 20:51:32157
158} // namespace content