blob: d2f081a1218ad84883d9bf1488997fb8a592725e [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"
9#include "base/timer.h"
[email protected]df376972013-05-03 21:45:0310#include "content/browser/renderer_host/render_widget_host_impl.h"
[email protected]18df7362012-10-24 01:29:4011#include "content/public/browser/browser_thread.h"
[email protected]df376972013-05-03 21:45:0312#include "content/public/browser/render_process_host.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]e2fa1cca42012-08-22 14:07:2716#if defined(OS_WIN)
17#include "base/win/windows_version.h"
18#endif
19
[email protected]e6b34872012-10-24 20:51:3220namespace content {
21
[email protected]fa4f91682012-02-21 19:53:2622// Update the accessibility histogram 45 seconds after initialization.
23static const int kAccessibilityHistogramDelaySecs = 45;
24
25// static
26BrowserAccessibilityState* BrowserAccessibilityState::GetInstance() {
27 return BrowserAccessibilityStateImpl::GetInstance();
28}
29
30// static
31BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() {
[email protected]b90cad72012-04-10 23:27:5332 return Singleton<BrowserAccessibilityStateImpl,
33 LeakySingletonTraits<BrowserAccessibilityStateImpl> >::get();
[email protected]fa4f91682012-02-21 19:53:2634}
35
36BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl()
37 : BrowserAccessibilityState(),
[email protected]e2fa1cca42012-08-22 14:07:2738 accessibility_mode_(AccessibilityModeOff) {
39#if defined(OS_WIN)
40 // On Windows 8, always enable accessibility for editable text controls
41 // so we can show the virtual keyboard when one is enabled.
42 if (base::win::GetVersion() >= base::win::VERSION_WIN8 &&
43 !CommandLine::ForCurrentProcess()->HasSwitch(
44 switches::kDisableRendererAccessibility)) {
45 accessibility_mode_ = AccessibilityModeEditableTextOnly;
46 }
47#endif // defined(OS_WIN)
48
[email protected]3e3c4522012-04-13 21:16:2949 if (CommandLine::ForCurrentProcess()->HasSwitch(
50 switches::kForceRendererAccessibility)) {
[email protected]e2fa1cca42012-08-22 14:07:2751 accessibility_mode_ = AccessibilityModeComplete;
[email protected]3e3c4522012-04-13 21:16:2952 }
[email protected]e2fa1cca42012-08-22 14:07:2753
[email protected]882db442012-12-04 16:37:5454#if defined(OS_WIN)
[email protected]30fdb362013-01-09 02:33:2755 // On Windows, UpdateHistograms calls some system functions with unknown
[email protected]882db442012-12-04 16:37:5456 // runtime, so call it on the file thread to ensure there's no jank.
57 // Everything in that method must be safe to call on another thread.
58 BrowserThread::ID update_histogram_thread = BrowserThread::FILE;
59#else
[email protected]30fdb362013-01-09 02:33:2760 // On all other platforms, UpdateHistograms should be called on the main
[email protected]882db442012-12-04 16:37:5461 // thread.
62 BrowserThread::ID update_histogram_thread = BrowserThread::UI;
63#endif
64
65 // We need to AddRef() the leaky singleton so that Bind doesn't
[email protected]3c17ae742012-10-24 17:37:2666 // delete it prematurely.
67 AddRef();
[email protected]e6b34872012-10-24 20:51:3268 BrowserThread::PostDelayedTask(
[email protected]882db442012-12-04 16:37:5469 update_histogram_thread, FROM_HERE,
[email protected]30fdb362013-01-09 02:33:2770 base::Bind(&BrowserAccessibilityStateImpl::UpdateHistograms, this),
[email protected]18df7362012-10-24 01:29:4071 base::TimeDelta::FromSeconds(kAccessibilityHistogramDelaySecs));
[email protected]fa4f91682012-02-21 19:53:2672}
73
74BrowserAccessibilityStateImpl::~BrowserAccessibilityStateImpl() {
75}
76
77void BrowserAccessibilityStateImpl::OnScreenReaderDetected() {
[email protected]3e3c4522012-04-13 21:16:2978 if (CommandLine::ForCurrentProcess()->HasSwitch(
79 switches::kDisableRendererAccessibility)) {
80 return;
81 }
[email protected]e2fa1cca42012-08-22 14:07:2782 SetAccessibilityMode(AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2683}
84
[email protected]df376972013-05-03 21:45:0385void BrowserAccessibilityStateImpl::EnableAccessibility() {
[email protected]fa4f91682012-02-21 19:53:2686 // We may want to do something different with this later.
[email protected]e2fa1cca42012-08-22 14:07:2787 SetAccessibilityMode(AccessibilityModeComplete);
[email protected]fa4f91682012-02-21 19:53:2688}
89
[email protected]df376972013-05-03 21:45:0390void BrowserAccessibilityStateImpl::DisableAccessibility() {
91 SetAccessibilityMode(AccessibilityModeOff);
92}
93
[email protected]fa4f91682012-02-21 19:53:2694bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() {
[email protected]e2fa1cca42012-08-22 14:07:2795 return (accessibility_mode_ == 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",
117 CommandLine::ForCurrentProcess()->HasSwitch(
118 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]e2fa1cca42012-08-22 14:07:27126void BrowserAccessibilityStateImpl::SetAccessibilityMode(
127 AccessibilityMode mode) {
[email protected]df376972013-05-03 21:45:03128 if (accessibility_mode_ == mode)
129 return;
[email protected]e2fa1cca42012-08-22 14:07:27130 accessibility_mode_ = mode;
[email protected]df376972013-05-03 21:45:03131
[email protected]039b84a42013-06-21 20:23:37132 RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
133 for (size_t i = 0; i < widgets.size(); ++i) {
[email protected]df376972013-05-03 21:45:03134 // Ignore processes that don't have a connection, such as crashed tabs.
[email protected]039b84a42013-06-21 20:23:37135 if (!widgets[i]->GetProcess()->HasConnection())
136 continue;
137 if (!widgets[i]->IsRenderView())
[email protected]df376972013-05-03 21:45:03138 continue;
139
[email protected]039b84a42013-06-21 20:23:37140 RenderWidgetHostImpl::From(widgets[i])->SetAccessibilityMode(mode);
[email protected]df376972013-05-03 21:45:03141 }
[email protected]e2fa1cca42012-08-22 14:07:27142}
[email protected]e6b34872012-10-24 20:51:32143
144} // namespace content