Commit 4cf696f5 authored by Kyle Horimoto's avatar Kyle Horimoto Committed by Commit Bot

[CrOS Settings] Provide access to UserActionRecorder in settings UI

This CL adds a Mojo interface used by the settings page JS to access
metrics recording.

Bug: 1047062
Change-Id: I434c5ba14f8271d82d539bac68dfa42ee889fc16
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2042926
Commit-Queue: Kyle Horimoto <khorimoto@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarJames Cook <jamescook@chromium.org>
Cr-Commit-Position: refs/heads/master@{#740437}
parent 3e26661c
......@@ -231,6 +231,7 @@ source_set("chrome_content_browser_overlay_manifest") {
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
"//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings",
"//chromeos/services/cellular_setup/public/mojom",
"//chromeos/services/ime/public/mojom",
"//chromeos/services/media_perception/public/mojom",
......
......@@ -5576,6 +5576,7 @@ grit("resources") {
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings_js",
"//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js",
]
}
......
......@@ -434,6 +434,9 @@
<include name="IDR_ADD_SUPERVISION_POST_MESSAGE_API_JS" file="resources\chromeos\add_supervision\post_message_api.js" compress="gzip" type="BINDATA" />
<include name="IDR_ADD_SUPERVISION_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\ui\webui\chromeos\add_supervision\add_supervision.mojom-lite.js" compress="gzip" use_base_dir="false" type="BINDATA" />
</if>
<if expr="chromeos">
<include name="IDR_OS_SETTINGS_SEARCH_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\search\search.mojom-lite.js" compress="gzip" use_base_dir="false" type="BINDATA" />
</if>
<if expr="chromeos">
<include name="IDR_ASSISTANT_LOGO_PNG" file="resources\chromeos\assistant_optin\assistant_logo.png" type="BINDATA" />
<include name="IDR_SUPERVISION_ICON_PNG" file="resources\chromeos\supervision\supervision_icon.png" type="BINDATA" />
......
......@@ -121,6 +121,7 @@
#include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h"
#include "chrome/browser/ui/webui/chromeos/network_ui.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom.h"
#include "chromeos/components/media_app_ui/media_app_ui.h"
#include "chromeos/components/media_app_ui/media_app_ui.mojom.h"
#include "chromeos/components/multidevice/debug_webui/proximity_auth_ui.h"
......@@ -445,6 +446,10 @@ void PopulateChromeWebUIFrameBinders(
app_management::mojom::PageHandlerFactory,
chromeos::settings::OSSettingsUI>(map);
RegisterWebUIControllerInterfaceBinder<
chromeos::settings::mojom::UserActionRecorder,
chromeos::settings::OSSettingsUI>(map);
RegisterWebUIControllerInterfaceBinder<
chromeos::cellular_setup::mojom::CellularSetup,
chromeos::cellular_setup::CellularSetupDialogUI>(map);
......
......@@ -35,6 +35,7 @@ if (optimize_webui) {
"chrome://os-settings/app-management/image_info.mojom-lite.js",
"chrome://os-settings/app-management/image.mojom-lite.js",
"chrome://os-settings/app-management/types.mojom-lite.js",
"chrome://os-settings/search/search.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom.html",
"chrome://resources/mojo/mojo/public/mojom/base/time.mojom.html",
]
......
......@@ -64,6 +64,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/pref_names.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/settings_user_action_tracker.h"
#include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
#include "chrome/browser/ui/webui/settings/downloads_handler.h"
#include "chrome/browser/ui/webui/settings/extension_control_handler.h"
......@@ -218,6 +219,9 @@ OSSettingsUI::OSSettingsUI(content::WebUI* web_ui)
html_source->AddResourcePath("app-management/image_info.mojom-lite.js",
IDR_APP_MANAGEMENT_IMAGE_INFO_MOJO_LITE_JS);
html_source->AddResourcePath("search/search.mojom-lite.js",
IDR_OS_SETTINGS_SEARCH_MOJOM_LITE_JS);
// AddOsLocalizedStrings must be added after AddBrowserLocalizedStrings
// as repeated keys used by the OS strings should override the same keys
// that may be used in the Browser string provider.
......@@ -441,6 +445,14 @@ void OSSettingsUI::BindInterface(
ash::GetNetworkConfigService(std::move(receiver));
}
void OSSettingsUI::BindInterface(
mojo::PendingReceiver<mojom::UserActionRecorder> receiver) {
DCHECK(!user_action_recorder_)
<< "Should only be bound once per settings session.";
user_action_recorder_ =
std::make_unique<SettingsUserActionTracker>(std::move(receiver));
}
void OSSettingsUI::BindInterface(
mojo::PendingReceiver<app_management::mojom::PageHandlerFactory> receiver) {
if (!app_management_page_handler_factory_) {
......
......@@ -11,6 +11,7 @@
#include "base/time/time.h"
#include "chrome/browser/ui/webui/app_management/app_management.mojom-forward.h"
#include "chrome/browser/ui/webui/settings/chromeos/app_management/app_management_page_handler_factory.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom-forward.h"
#include "chrome/browser/ui/webui/webui_load_timer.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
......@@ -43,6 +44,11 @@ class OSSettingsUI : public ui::MojoWebUIController {
// passing the pending receiver that will be internally bound.
void BindInterface(
mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver);
// Instantiates implementor of the mojom::UserActionRecorder mojo interface
// passing the pending receiver that will be internally bound.
void BindInterface(mojo::PendingReceiver<mojom::UserActionRecorder> receiver);
// Instantiates implementor of the mojom::PageHandlerFactory mojo interface
// passing the pending receiver that will be internally bound.
void BindInterface(
......@@ -57,6 +63,7 @@ class OSSettingsUI : public ui::MojoWebUIController {
WebuiLoadTimer webui_load_timer_;
std::unique_ptr<mojom::UserActionRecorder> user_action_recorder_;
std::unique_ptr<AppManagementPageHandlerFactory>
app_management_page_handler_factory_;
......
......@@ -10,3 +10,25 @@ enum SettingsPageVisibility {
kVisibleAndUnfocused,
kHidden
};
// Records user actions within OS settings.
interface UserActionRecorder {
// Records that the settings window has been focused.
RecordPageFocus();
// Records that the settings window has been blurred (i.e., no longer
// focused).
RecordPageBlur();
// Records that the user has clicked within the settings page.
RecordClick();
// Records that the user has navigated to a settings subpage.
RecordNavigation();
// Records that the user has completed a search attempt.
RecordSearch();
// Records that the user has changed a setting.
RecordSettingChange();
};
......@@ -29,6 +29,12 @@ void LogDurationMetric(const char* metric_name, base::TimeDelta duration) {
} // namespace
SettingsUserActionTracker::SettingsUserActionTracker(
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver)
: SettingsUserActionTracker() {
receiver_.Bind(std::move(pending_receiver));
}
SettingsUserActionTracker::SettingsUserActionTracker()
: metric_start_time_(base::TimeTicks::Now()) {}
......
......@@ -6,6 +6,9 @@
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SETTINGS_USER_ACTION_TRACKER_H_
#include "base/time/time.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
namespace chromeos {
namespace settings {
......@@ -14,22 +17,29 @@ namespace settings {
// This class is only meant to track actions from an individual settings
// session; if the settings window is closed and reopened again, a new instance
// should be created for that new session.
class SettingsUserActionTracker {
class SettingsUserActionTracker : public mojom::UserActionRecorder {
public:
SettingsUserActionTracker();
explicit SettingsUserActionTracker(
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver);
SettingsUserActionTracker(const SettingsUserActionTracker& other) = delete;
SettingsUserActionTracker& operator=(const SettingsUserActionTracker& other) =
delete;
~SettingsUserActionTracker();
~SettingsUserActionTracker() override;
void RecordPageFocus();
void RecordPageBlur();
void RecordClick();
void RecordNavigation();
void RecordSearch();
void RecordSettingChange();
// mojom::UserActionRecorder:
void RecordPageFocus() override;
void RecordPageBlur() override;
void RecordClick() override;
void RecordNavigation() override;
void RecordSearch() override;
void RecordSettingChange() override;
private:
friend class SettingsUserActionTrackerTest;
// For unit tests.
SettingsUserActionTracker();
void ResetMetricsCountersAndTimestamp();
// Whether a setting has been changed since the window has been focused. Note
......@@ -52,6 +62,8 @@ class SettingsUserActionTracker {
// The last time at which a page blur event was received; if no blur events
// have been received, this field is_null().
base::TimeTicks last_blur_timestamp_;
mojo::Receiver<mojom::UserActionRecorder> receiver_{this};
};
} // namespace settings
......
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