Commit 81ce2bd7 authored by Aaron Leventhal's avatar Aaron Leventhal Committed by Commit Bot

Metrics for unique users of key assistive technologies

Accessibility metrics are fired once, 45 seconds after startup.
However, UMA counts unique users on a daily basis.

This means that the metrics system is only counting 1/2 of users who don't
relaunch their browser in a 2 day period. Or 1/3 of users who don't
relaunch for 3 days, etc.

Adding the following *.EveryReport alternate histogram names for
histograms that fire more often. These can be used with the unique
users aggregation option when viewing metrics:
Accessibility.CrosSpokenFeedback.EveryReport
Accessibility.Android.ScreenReader.EveryReport,
Accessibility.Mac.ScreenReader.EveryReport,
Accessibility.WinScreenReader2.EveryReport,
Accessibility.WinJAWS.EveryReport
Accessibility.WinNVDA.EveryReport
Accessibility.WinZoomText.EveryReport

Bug: 988502
Change-Id: I0b29dc35615668aafb7e873e574c1ba7ae280ead
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1724698
Commit-Queue: Aaron Leventhal <aleventhal@chromium.org>
Reviewed-by: default avatarJesse Doherty <jwd@chromium.org>
Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#682971}
parent 95e62b61
include_rules = [ include_rules = [
"+chrome/services/util_win/util_win_impl.h", "+chrome/services/util_win/util_win_impl.h",
"+content/browser/accessibility/accessibility_metrics_provider.h",
] ]
specific_include_rules = { specific_include_rules = {
......
...@@ -95,6 +95,7 @@ ...@@ -95,6 +95,7 @@
#include "components/sync_device_info/device_count_metrics_provider.h" #include "components/sync_device_info/device_count_metrics_provider.h"
#include "components/ukm/ukm_service.h" #include "components/ukm/ukm_service.h"
#include "components/version_info/version_info.h" #include "components/version_info/version_info.h"
#include "content/browser/accessibility/accessibility_metrics_provider.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/histogram_fetcher.h" #include "content/public/browser/histogram_fetcher.h"
...@@ -759,6 +760,9 @@ void ChromeMetricsServiceClient::RegisterMetricsServiceProviders() { ...@@ -759,6 +760,9 @@ void ChromeMetricsServiceClient::RegisterMetricsServiceProviders() {
metrics_service_->RegisterMetricsProvider( metrics_service_->RegisterMetricsProvider(
SigninStatusMetricsProvider::CreateInstance( SigninStatusMetricsProvider::CreateInstance(
std::make_unique<ChromeSigninStatusMetricsProviderDelegate>())); std::make_unique<ChromeSigninStatusMetricsProviderDelegate>()));
// ChromeOS uses ChromeOSMetricsProvider for accessibility metrics provider.
metrics_service_->RegisterMetricsProvider(
std::make_unique<AccessibilityMetricsProvider>());
#endif // !defined(OS_CHROMEOS) #endif // !defined(OS_CHROMEOS)
metrics_service_->RegisterMetricsProvider( metrics_service_->RegisterMetricsProvider(
......
...@@ -189,7 +189,8 @@ TEST_F(ChromeMetricsServiceClientTest, TestRegisterMetricsServiceProviders) { ...@@ -189,7 +189,8 @@ TEST_F(ChromeMetricsServiceClientTest, TestRegisterMetricsServiceProviders) {
#if !defined(OS_CHROMEOS) #if !defined(OS_CHROMEOS)
// ChromeSigninStatusMetricsProvider (for non ChromeOS). // ChromeSigninStatusMetricsProvider (for non ChromeOS).
expected_providers++; // AccessibilityMetricsProvider
expected_providers += 2;
#endif // !defined(OS_CHROMEOS) #endif // !defined(OS_CHROMEOS)
#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "ash/public/cpp/ash_pref_names.h"
#include "base/barrier_closure.h" #include "base/barrier_closure.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/callback_helpers.h" #include "base/callback_helpers.h"
...@@ -251,6 +252,14 @@ void ChromeOSMetricsProvider::ProvideSystemProfileMetrics( ...@@ -251,6 +252,14 @@ void ChromeOSMetricsProvider::ProvideSystemProfileMetrics(
} }
} }
void ChromeOSMetricsProvider::ProvideAccessibilityMetrics() {
PrefService* pref = g_browser_process->local_state();
bool is_spoken_feedback_enabled =
pref->GetBoolean(ash::prefs::kAccessibilitySpokenFeedbackEnabled);
UMA_HISTOGRAM_BOOLEAN("Accessibility.CrosSpokenFeedback.EveryReport",
is_spoken_feedback_enabled);
}
void ChromeOSMetricsProvider::ProvideStabilityMetrics( void ChromeOSMetricsProvider::ProvideStabilityMetrics(
metrics::SystemProfileProto* system_profile_proto) { metrics::SystemProfileProto* system_profile_proto) {
metrics::SystemProfileProto::Stability* stability_proto = metrics::SystemProfileProto::Stability* stability_proto =
...@@ -286,6 +295,7 @@ void ChromeOSMetricsProvider::ProvideStabilityMetrics( ...@@ -286,6 +295,7 @@ void ChromeOSMetricsProvider::ProvideStabilityMetrics(
void ChromeOSMetricsProvider::ProvideCurrentSessionData( void ChromeOSMetricsProvider::ProvideCurrentSessionData(
metrics::ChromeUserMetricsExtension* uma_proto) { metrics::ChromeUserMetricsExtension* uma_proto) {
ProvideAccessibilityMetrics();
ProvideStabilityMetrics(uma_proto->mutable_system_profile()); ProvideStabilityMetrics(uma_proto->mutable_system_profile());
std::vector<SampledProfile> sampled_profiles; std::vector<SampledProfile> sampled_profiles;
if (profile_provider_->GetSampledProfiles(&sampled_profiles)) { if (profile_provider_->GetSampledProfiles(&sampled_profiles)) {
......
...@@ -82,6 +82,8 @@ class ChromeOSMetricsProvider : public metrics::MetricsProvider { ...@@ -82,6 +82,8 @@ class ChromeOSMetricsProvider : public metrics::MetricsProvider {
metrics::ChromeUserMetricsExtension* uma_proto) override; metrics::ChromeUserMetricsExtension* uma_proto) override;
private: private:
void ProvideAccessibilityMetrics();
// Update the number of users logged into a multi-profile session. // Update the number of users logged into a multi-profile session.
// If the number of users change while the log is open, the call invalidates // If the number of users change while the log is open, the call invalidates
// the user count value. // the user count value.
......
...@@ -2550,6 +2550,12 @@ jumbo_source_set("browser") { ...@@ -2550,6 +2550,12 @@ jumbo_source_set("browser") {
"//chromeos/network", "//chromeos/network",
"//components/session_manager/core", "//components/session_manager/core",
] ]
} else {
sources += [
# ChromeOS accessibility metrics provider is in chromeos_metrics_provider.
"accessibility/accessibility_metrics_provider.cc",
"accessibility/accessibility_metrics_provider.h",
]
} }
if (enable_cros_libassistant) { if (enable_cros_libassistant) {
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/accessibility/accessibility_metrics_provider.h"
#include "content/browser/accessibility/browser_accessibility_state_impl.h"
AccessibilityMetricsProvider::AccessibilityMetricsProvider() {}
AccessibilityMetricsProvider::~AccessibilityMetricsProvider() {}
void AccessibilityMetricsProvider::ProvideCurrentSessionData(
metrics::ChromeUserMetricsExtension* uma_proto) {
content::BrowserAccessibilityStateImpl::GetInstance()
->UpdateUniqueUserHistograms();
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_METRICS_PROVIDER_H_
#define CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_METRICS_PROVIDER_H_
#include "components/metrics/metrics_provider.h"
#include "content/common/content_export.h"
////////////////////////////////////////////////////////////////////////////////
//
// AccessibilityMetricsProvider
//
// A class used to provide frequent signals for AT or accessibility usage
// histograms on Win, Mac and Android, enable accurate counting of unique users.
//
////////////////////////////////////////////////////////////////////////////////
class CONTENT_EXPORT AccessibilityMetricsProvider
: public metrics::MetricsProvider {
public:
AccessibilityMetricsProvider();
~AccessibilityMetricsProvider() override;
// MetricsProvider:
void ProvideCurrentSessionData(
metrics::ChromeUserMetricsExtension* uma_proto) override;
private:
DISALLOW_COPY_AND_ASSIGN(AccessibilityMetricsProvider);
};
#endif // CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_METRICS_PROVIDER_H_
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "build/build_config.h" #include "build/build_config.h"
...@@ -195,6 +196,7 @@ void BrowserAccessibilityStateImpl:: ...@@ -195,6 +196,7 @@ void BrowserAccessibilityStateImpl::
UpdatePlatformSpecificHistogramsOnUIThread() {} UpdatePlatformSpecificHistogramsOnUIThread() {}
void BrowserAccessibilityStateImpl:: void BrowserAccessibilityStateImpl::
UpdatePlatformSpecificHistogramsOnOtherThread() {} UpdatePlatformSpecificHistogramsOnOtherThread() {}
void BrowserAccessibilityStateImpl::UpdateUniqueUserHistograms() {}
#endif #endif
void BrowserAccessibilityStateImpl::AddAccessibilityModeFlags(ui::AXMode mode) { void BrowserAccessibilityStateImpl::AddAccessibilityModeFlags(ui::AXMode mode) {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/singleton.h" #include "base/memory/singleton.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "components/metrics/metrics_provider.h"
#include "content/public/browser/browser_accessibility_state.h" #include "content/public/browser/browser_accessibility_state.h"
#include "ui/accessibility/ax_mode.h" #include "ui/accessibility/ax_mode.h"
#include "ui/accessibility/ax_mode_observer.h" #include "ui/accessibility/ax_mode_observer.h"
...@@ -65,6 +66,11 @@ class CONTENT_EXPORT BrowserAccessibilityStateImpl ...@@ -65,6 +66,11 @@ class CONTENT_EXPORT BrowserAccessibilityStateImpl
// AXModeObserver // AXModeObserver
void OnAXModeAdded(ui::AXMode mode) override; void OnAXModeAdded(ui::AXMode mode) override;
// Fire frequent metrics signals to ensure users keeping browser open multiple
// days are counted each day, not only at launch. This is necessary, because
// UMA only aggregates uniques on a daily basis,
void UpdateUniqueUserHistograms();
// Accessibility objects can have the "hot tracked" state set when // Accessibility objects can have the "hot tracked" state set when
// the mouse is hovering over them, but this makes tests flaky because // the mouse is hovering over them, but this makes tests flaky because
// the test behaves differently when the mouse happens to be over an // the test behaves differently when the mouse happens to be over an
......
...@@ -42,6 +42,12 @@ void BrowserAccessibilityStateImpl:: ...@@ -42,6 +42,12 @@ void BrowserAccessibilityStateImpl::
mode.has_mode(ui::AXMode::kScreenReader)); mode.has_mode(ui::AXMode::kScreenReader));
} }
void BrowserAccessibilityStateImpl::UpdateUniqueUserHistograms() {
ui::AXMode mode = GetAccessibilityMode();
UMA_HISTOGRAM_BOOLEAN("Accessibility.Android.ScreenReader.EveryReport",
mode.has_mode(ui::AXMode::kScreenReader));
}
// static // static
void JNI_BrowserAccessibilityState_OnAnimatorDurationScaleChanged(JNIEnv* env) { void JNI_BrowserAccessibilityState_OnAnimatorDurationScaleChanged(JNIEnv* env) {
// We need to call into gfx::Animation and WebContentsImpl on the UI thread, // We need to call into gfx::Animation and WebContentsImpl on the UI thread,
......
...@@ -93,4 +93,10 @@ void BrowserAccessibilityStateImpl:: ...@@ -93,4 +93,10 @@ void BrowserAccessibilityStateImpl::
mode.has_mode(ui::AXMode::kScreenReader)); mode.has_mode(ui::AXMode::kScreenReader));
} }
void BrowserAccessibilityStateImpl::UpdateUniqueUserHistograms() {
ui::AXMode mode = GetAccessibilityMode();
UMA_HISTOGRAM_BOOLEAN("Accessibility.Mac.ScreenReader.EveryReport",
mode.has_mode(ui::AXMode::kScreenReader));
}
} // namespace content } // namespace content
...@@ -23,6 +23,10 @@ namespace content { ...@@ -23,6 +23,10 @@ namespace content {
namespace { namespace {
static bool g_jaws = false;
static bool g_nvda = false;
static bool g_zoomtext = false;
// Enables accessibility based on three possible clues that indicate // Enables accessibility based on three possible clues that indicate
// accessibility API usage. // accessibility API usage.
// //
...@@ -146,31 +150,37 @@ void BrowserAccessibilityStateImpl:: ...@@ -146,31 +150,37 @@ void BrowserAccessibilityStateImpl::
return; return;
// Look for DLLs of assistive technology known to work with Chrome. // Look for DLLs of assistive technology known to work with Chrome.
bool jaws = false;
bool nvda = false;
bool satogo = false;
bool zoomtext = false;
size_t module_count = bytes_required / sizeof(HMODULE); size_t module_count = bytes_required / sizeof(HMODULE);
bool satogo = false; // Very few users -- do not need uniques
for (size_t i = 0; i < module_count; i++) { for (size_t i = 0; i < module_count; i++) {
TCHAR filename[MAX_PATH]; TCHAR filename[MAX_PATH];
GetModuleFileName(modules[i], filename, base::size(filename)); GetModuleFileName(modules[i], filename, base::size(filename));
base::string16 module_name(base::FilePath(filename).BaseName().value()); base::string16 module_name(base::FilePath(filename).BaseName().value());
if (base::LowerCaseEqualsASCII(module_name, "fsdomsrv.dll")) if (base::LowerCaseEqualsASCII(module_name, "fsdomsrv.dll"))
jaws = true; g_jaws = true;
if (base::LowerCaseEqualsASCII(module_name, "vbufbackend_gecko_ia2.dll") || if (base::LowerCaseEqualsASCII(module_name, "vbufbackend_gecko_ia2.dll") ||
base::LowerCaseEqualsASCII(module_name, "nvdahelperremote.dll")) base::LowerCaseEqualsASCII(module_name, "nvdahelperremote.dll"))
nvda = true; g_nvda = true;
if (base::LowerCaseEqualsASCII(module_name, "stsaw32.dll")) if (base::LowerCaseEqualsASCII(module_name, "stsaw32.dll"))
satogo = true; satogo = true;
if (base::LowerCaseEqualsASCII(module_name, "zslhook.dll") || if (base::LowerCaseEqualsASCII(module_name, "zslhook.dll") ||
base::LowerCaseEqualsASCII(module_name, "zslhook64.dll")) base::LowerCaseEqualsASCII(module_name, "zslhook64.dll"))
zoomtext = true; g_zoomtext = true;
} }
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinJAWS", jaws); UMA_HISTOGRAM_BOOLEAN("Accessibility.WinJAWS", g_jaws);
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinNVDA", nvda); UMA_HISTOGRAM_BOOLEAN("Accessibility.WinNVDA", g_nvda);
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinSAToGo", satogo); UMA_HISTOGRAM_BOOLEAN("Accessibility.WinSAToGo", satogo);
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinZoomText", zoomtext); UMA_HISTOGRAM_BOOLEAN("Accessibility.WinZoomText", g_zoomtext);
}
void BrowserAccessibilityStateImpl::UpdateUniqueUserHistograms() {
ui::AXMode mode = GetAccessibilityMode();
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinScreenReader2.EveryReport",
mode.has_mode(ui::AXMode::kScreenReader));
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinJAWS.EveryReport", g_jaws);
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinNVDA.EveryReport", g_nvda);
UMA_HISTOGRAM_BOOLEAN("Accessibility.WinZoomText.EveryReport", g_zoomtext);
} }
} // namespace content } // namespace content
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment