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") { ...@@ -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_installer:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings", "//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/machine_learning: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/cellular_setup/public/mojom",
"//chromeos/services/ime/public/mojom", "//chromeos/services/ime/public/mojom",
"//chromeos/services/media_perception/public/mojom", "//chromeos/services/media_perception/public/mojom",
......
...@@ -5576,6 +5576,7 @@ grit("resources") { ...@@ -5576,6 +5576,7 @@ grit("resources") {
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings_js", "//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/crostini_upgrader:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/machine_learning: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 @@ ...@@ -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_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" /> <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>
<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"> <if expr="chromeos">
<include name="IDR_ASSISTANT_LOGO_PNG" file="resources\chromeos\assistant_optin\assistant_logo.png" type="BINDATA" /> <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" /> <include name="IDR_SUPERVISION_ICON_PNG" file="resources\chromeos\supervision\supervision_icon.png" type="BINDATA" />
......
...@@ -121,6 +121,7 @@ ...@@ -121,6 +121,7 @@
#include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h" #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/chromeos/network_ui.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_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.h"
#include "chromeos/components/media_app_ui/media_app_ui.mojom.h" #include "chromeos/components/media_app_ui/media_app_ui.mojom.h"
#include "chromeos/components/multidevice/debug_webui/proximity_auth_ui.h" #include "chromeos/components/multidevice/debug_webui/proximity_auth_ui.h"
...@@ -445,6 +446,10 @@ void PopulateChromeWebUIFrameBinders( ...@@ -445,6 +446,10 @@ void PopulateChromeWebUIFrameBinders(
app_management::mojom::PageHandlerFactory, app_management::mojom::PageHandlerFactory,
chromeos::settings::OSSettingsUI>(map); chromeos::settings::OSSettingsUI>(map);
RegisterWebUIControllerInterfaceBinder<
chromeos::settings::mojom::UserActionRecorder,
chromeos::settings::OSSettingsUI>(map);
RegisterWebUIControllerInterfaceBinder< RegisterWebUIControllerInterfaceBinder<
chromeos::cellular_setup::mojom::CellularSetup, chromeos::cellular_setup::mojom::CellularSetup,
chromeos::cellular_setup::CellularSetupDialogUI>(map); chromeos::cellular_setup::CellularSetupDialogUI>(map);
......
...@@ -35,6 +35,7 @@ if (optimize_webui) { ...@@ -35,6 +35,7 @@ if (optimize_webui) {
"chrome://os-settings/app-management/image_info.mojom-lite.js", "chrome://os-settings/app-management/image_info.mojom-lite.js",
"chrome://os-settings/app-management/image.mojom-lite.js", "chrome://os-settings/app-management/image.mojom-lite.js",
"chrome://os-settings/app-management/types.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/big_buffer.mojom.html",
"chrome://resources/mojo/mojo/public/mojom/base/time.mojom.html", "chrome://resources/mojo/mojo/public/mojom/base/time.mojom.html",
] ]
......
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h" #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/plugin_vm_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/pref_names.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/chromeos/wallpaper_handler.h"
#include "chrome/browser/ui/webui/settings/downloads_handler.h" #include "chrome/browser/ui/webui/settings/downloads_handler.h"
#include "chrome/browser/ui/webui/settings/extension_control_handler.h" #include "chrome/browser/ui/webui/settings/extension_control_handler.h"
...@@ -218,6 +219,9 @@ OSSettingsUI::OSSettingsUI(content::WebUI* web_ui) ...@@ -218,6 +219,9 @@ OSSettingsUI::OSSettingsUI(content::WebUI* web_ui)
html_source->AddResourcePath("app-management/image_info.mojom-lite.js", html_source->AddResourcePath("app-management/image_info.mojom-lite.js",
IDR_APP_MANAGEMENT_IMAGE_INFO_MOJO_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 // AddOsLocalizedStrings must be added after AddBrowserLocalizedStrings
// as repeated keys used by the OS strings should override the same keys // as repeated keys used by the OS strings should override the same keys
// that may be used in the Browser string provider. // that may be used in the Browser string provider.
...@@ -441,6 +445,14 @@ void OSSettingsUI::BindInterface( ...@@ -441,6 +445,14 @@ void OSSettingsUI::BindInterface(
ash::GetNetworkConfigService(std::move(receiver)); 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( void OSSettingsUI::BindInterface(
mojo::PendingReceiver<app_management::mojom::PageHandlerFactory> receiver) { mojo::PendingReceiver<app_management::mojom::PageHandlerFactory> receiver) {
if (!app_management_page_handler_factory_) { if (!app_management_page_handler_factory_) {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/ui/webui/app_management/app_management.mojom-forward.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/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 "chrome/browser/ui/webui/webui_load_timer.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
...@@ -43,6 +44,11 @@ class OSSettingsUI : public ui::MojoWebUIController { ...@@ -43,6 +44,11 @@ class OSSettingsUI : public ui::MojoWebUIController {
// passing the pending receiver that will be internally bound. // passing the pending receiver that will be internally bound.
void BindInterface( void BindInterface(
mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver); 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 // Instantiates implementor of the mojom::PageHandlerFactory mojo interface
// passing the pending receiver that will be internally bound. // passing the pending receiver that will be internally bound.
void BindInterface( void BindInterface(
...@@ -57,6 +63,7 @@ class OSSettingsUI : public ui::MojoWebUIController { ...@@ -57,6 +63,7 @@ class OSSettingsUI : public ui::MojoWebUIController {
WebuiLoadTimer webui_load_timer_; WebuiLoadTimer webui_load_timer_;
std::unique_ptr<mojom::UserActionRecorder> user_action_recorder_;
std::unique_ptr<AppManagementPageHandlerFactory> std::unique_ptr<AppManagementPageHandlerFactory>
app_management_page_handler_factory_; app_management_page_handler_factory_;
......
...@@ -10,3 +10,25 @@ enum SettingsPageVisibility { ...@@ -10,3 +10,25 @@ enum SettingsPageVisibility {
kVisibleAndUnfocused, kVisibleAndUnfocused,
kHidden 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) { ...@@ -29,6 +29,12 @@ void LogDurationMetric(const char* metric_name, base::TimeDelta duration) {
} // namespace } // namespace
SettingsUserActionTracker::SettingsUserActionTracker(
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver)
: SettingsUserActionTracker() {
receiver_.Bind(std::move(pending_receiver));
}
SettingsUserActionTracker::SettingsUserActionTracker() SettingsUserActionTracker::SettingsUserActionTracker()
: metric_start_time_(base::TimeTicks::Now()) {} : metric_start_time_(base::TimeTicks::Now()) {}
......
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SETTINGS_USER_ACTION_TRACKER_H_ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SETTINGS_USER_ACTION_TRACKER_H_
#include "base/time/time.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 chromeos {
namespace settings { namespace settings {
...@@ -14,22 +17,29 @@ namespace settings { ...@@ -14,22 +17,29 @@ namespace settings {
// This class is only meant to track actions from an individual 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 // session; if the settings window is closed and reopened again, a new instance
// should be created for that new session. // should be created for that new session.
class SettingsUserActionTracker { class SettingsUserActionTracker : public mojom::UserActionRecorder {
public: public:
SettingsUserActionTracker(); explicit SettingsUserActionTracker(
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver);
SettingsUserActionTracker(const SettingsUserActionTracker& other) = delete; SettingsUserActionTracker(const SettingsUserActionTracker& other) = delete;
SettingsUserActionTracker& operator=(const SettingsUserActionTracker& other) = SettingsUserActionTracker& operator=(const SettingsUserActionTracker& other) =
delete; delete;
~SettingsUserActionTracker(); ~SettingsUserActionTracker() override;
void RecordPageFocus(); // mojom::UserActionRecorder:
void RecordPageBlur(); void RecordPageFocus() override;
void RecordClick(); void RecordPageBlur() override;
void RecordNavigation(); void RecordClick() override;
void RecordSearch(); void RecordNavigation() override;
void RecordSettingChange(); void RecordSearch() override;
void RecordSettingChange() override;
private: private:
friend class SettingsUserActionTrackerTest;
// For unit tests.
SettingsUserActionTracker();
void ResetMetricsCountersAndTimestamp(); void ResetMetricsCountersAndTimestamp();
// Whether a setting has been changed since the window has been focused. Note // Whether a setting has been changed since the window has been focused. Note
...@@ -52,6 +62,8 @@ class SettingsUserActionTracker { ...@@ -52,6 +62,8 @@ class SettingsUserActionTracker {
// The last time at which a page blur event was received; if no blur events // The last time at which a page blur event was received; if no blur events
// have been received, this field is_null(). // have been received, this field is_null().
base::TimeTicks last_blur_timestamp_; base::TimeTicks last_blur_timestamp_;
mojo::Receiver<mojom::UserActionRecorder> receiver_{this};
}; };
} // namespace settings } // 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