Skip to content

Commit

Permalink
Printer settings: Add histogram for tracking user actions
Browse files Browse the repository at this point in the history
- Create an enum histogram to track the most likely actions in Printer
  settings
- The "Click help link" enum value will be implemented when the new
  help section is updated

Bug: b:278621575
Tests: browser_tests --gtest_filter=*CupsPrinterEntry*, *CupsPrinterPage*, *CupsPrinterLandingPage*
Change-Id: I743750583929a97d378378d3f4104aa44f7cfcd6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4575749
Reviewed-by: Xiangdong Kong <xiangdongkong@google.com>
Commit-Queue: Gavin Williams <gavinwill@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1152119}
  • Loading branch information
Gavin Williams authored and Chromium LUCI CQ committed Jun 1, 2023
1 parent 28cae41 commit 4872353
Show file tree
Hide file tree
Showing 9 changed files with 162 additions and 4 deletions.
1 change: 1 addition & 0 deletions chrome/browser/resources/settings/chromeos/lazy_load.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ export {SettingsLockScreenElement} from './os_people_page/lock_screen_subpage.js
export {OsSyncBrowserProxy, OsSyncBrowserProxyImpl, OsSyncPrefs} from './os_people_page/os_sync_browser_proxy.js';
export {FingerprintSetupStep, SettingsSetupFingerprintDialogElement} from './os_people_page/setup_fingerprint_dialog.js';
export {PrinterListEntry, PrinterType} from './os_printing_page/cups_printer_types.js';
export {PrinterSettingsUserAction} from './os_printing_page/cups_printers.js';
export {CupsPrintersBrowserProxy, CupsPrintersBrowserProxyImpl, PrinterSetupResult, PrintServerResult} from './os_printing_page/cups_printers_browser_proxy.js';
export {SettingsCupsPrintersEntryElement} from './os_printing_page/cups_printers_entry.js';
export {CupsPrintersEntryManager} from './os_printing_page/cups_printers_entry_manager.js';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,31 @@ import {CupsPrinterInfo, CupsPrintersBrowserProxyImpl, CupsPrintersList, Printer
import {CupsPrintersEntryManager} from './cups_printers_entry_manager.js';
import {SettingsCupsAddPrinterDialogElement} from './cups_settings_add_printer_dialog.js';

/**
* Enumeration of the user actions that can be taken on the Printer settings
* page.
* This enum is tied directly to a UMA enum defined in
* //tools/metrics/histograms/enums.xml, and should always reflect it (do not
* change one without changing the other).
* These values are persisted to logs. Entries should not be renumbered and
* numeric values should never be reused.
* @enum {number}
*/
export enum PrinterSettingsUserAction {
ADD_PRINTER_MANUALLY = 0,
SAVE_PRINTER = 1,
EDIT_PRINTER = 2,
REMOVE_PRINTER = 3,
CLICK_HELP_LINK = 4,
}

export function recordPrinterSettingsUserAction(
userAction: PrinterSettingsUserAction) {
chrome.metricsPrivate.recordEnumerationValue(
'Printing.CUPS.SettingsUserAction', userAction,
Object.keys(PrinterSettingsUserAction).length);
}

const SettingsCupsPrintersElementBase =
mixinBehaviors(
[
Expand Down Expand Up @@ -429,6 +454,8 @@ class SettingsCupsPrintersElement extends SettingsCupsPrintersElementBase {

private onAddPrinterClick_(): void {
this.$.addPrinterDialog.open();
recordPrinterSettingsUserAction(
PrinterSettingsUserAction.ADD_PRINTER_MANUALLY);
}

private onAddPrinterDialogClose_(): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';

import {PrinterListEntry, PrinterType} from './cups_printer_types.js';
import {PrinterSettingsUserAction, recordPrinterSettingsUserAction} from './cups_printers.js';
import {getTemplate} from './cups_printers_entry.html.js';
import {computePrinterState, PrinterState, PrinterStatusReason, STATUS_REASON_STRING_KEY_MAP} from './printer_status.js';

Expand Down Expand Up @@ -123,6 +124,7 @@ export class SettingsCupsPrintersEntryElement extends
detail: {item: this.printerEntry},
});
this.dispatchEvent(queryDiscoveredPrinterEvent);
recordPrinterSettingsUserAction(PrinterSettingsUserAction.SAVE_PRINTER);
}

private onAddAutomaticPrinterClick_(): void {
Expand All @@ -132,6 +134,7 @@ export class SettingsCupsPrintersEntryElement extends
detail: {item: this.printerEntry},
});
this.dispatchEvent(addAutomaticPrinterEvent);
recordPrinterSettingsUserAction(PrinterSettingsUserAction.SAVE_PRINTER);
}

private onAddServerPrinterClick_(): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {recordSettingChange} from '../metrics_recorder.js';

import {matchesSearchTerm, sortPrinters} from './cups_printer_dialog_util.js';
import {PrinterListEntry} from './cups_printer_types.js';
import {PrinterSettingsUserAction, recordPrinterSettingsUserAction} from './cups_printers.js';
import {CupsPrinterInfo, CupsPrintersBrowserProxy, CupsPrintersBrowserProxyImpl} from './cups_printers_browser_proxy.js';
import {CupsPrintersEntryListMixin} from './cups_printers_entry_list_mixin.js';
import {getTemplate} from './cups_saved_printers.html.js';
Expand Down Expand Up @@ -271,6 +272,7 @@ export class SettingsCupsSavedPrintersElement extends
});
this.dispatchEvent(editCupsPrinterDetailsEvent);
this.closeActionMenu_();
recordPrinterSettingsUserAction(PrinterSettingsUserAction.EDIT_PRINTER);
}

private onRemoveClick_(): void {
Expand All @@ -280,6 +282,7 @@ export class SettingsCupsSavedPrintersElement extends
this.activePrinter = null;
this.activePrinterListEntryIndex_ = -1;
this.closeActionMenu_();
recordPrinterSettingsUserAction(PrinterSettingsUserAction.REMOVE_PRINTER);
}

private onShowMoreClick_(): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {CupsPrintersBrowserProxyImpl, PRINTER_STATUS_QUERY_SHORT_DELAY_RANGE_MS, PrinterStatusReason, PrinterStatusSeverity, PrinterType} from 'chrome://os-settings/lazy_load.js';
import {CupsPrintersBrowserProxyImpl, PRINTER_STATUS_QUERY_SHORT_DELAY_RANGE_MS, PrinterSettingsUserAction, PrinterStatusReason, PrinterStatusSeverity, PrinterType} from 'chrome://os-settings/lazy_load.js';
import {Router, routes} from 'chrome://os-settings/os_settings.js';
import {webUIListenerCallback} from 'chrome://resources/ash/common/cr.m.js';
import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
import {getDeepActiveElement} from 'chrome://resources/ash/common/util.js';
import {NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {assertFalse, assertGE, assertNotReached, assertTrue} from 'chrome://webui-test/chai_assert.js';
import {assertEquals, assertFalse, assertGE, assertNotReached, assertTrue} from 'chrome://webui-test/chai_assert.js';
import {MockTimer} from 'chrome://webui-test/mock_timer.js';
import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';

import {createCupsPrinterInfo, createPrinterListEntry, getPrinterEntries} from './cups_printer_test_utils.js';
import {FakeMetricsPrivate} from './fake_metrics_private.js';
import {TestCupsPrintersBrowserProxy} from './test_cups_printers_browser_proxy.js';

const arrowUpEvent = new KeyboardEvent(
Expand Down Expand Up @@ -1100,6 +1101,49 @@ suite('CupsSavedPrintersTests', function() {
'#show-more-container'));
});
});

test('RecordUserActionMetric', function() {
const fakeMetricsPrivate = new FakeMetricsPrivate();
chrome.metricsPrivate = fakeMetricsPrivate;

createCupsPrinterPage([
createCupsPrinterInfo('test1', '1', 'id1'),
createCupsPrinterInfo('test2', '2', 'id2'),
]);
return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
.then(() => {
// Wait for saved printers to populate.
flush();

savedPrintersElement =
page.shadowRoot.querySelector('settings-cups-saved-printers');
assertTrue(!!savedPrintersElement);

// Remove the first saved printer then verify the action is recorded.
return removePrinter(
cupsPrintersBrowserProxy, savedPrintersElement, /*index=*/ 0);
})
.then(() => {
assertEquals(
1,
fakeMetricsPrivate.countMetricValue(
'Printing.CUPS.SettingsUserAction',
PrinterSettingsUserAction.REMOVE_PRINTER));

// Click the next printer's Edit button then verify the action is
// recorded.
const savedPrinterEntries = getPrinterEntries(savedPrintersElement);
clickButton(savedPrinterEntries[0].shadowRoot.querySelector(
'.icon-more-vert'));
clickButton(
savedPrintersElement.shadowRoot.querySelector('#editButton'));
assertEquals(
1,
fakeMetricsPrivate.countMetricValue(
'Printing.CUPS.SettingsUserAction',
PrinterSettingsUserAction.EDIT_PRINTER));
});
});
});

suite('CupsNearbyPrintersTests', function() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {CupsPrintersBrowserProxyImpl, CupsPrintersEntryManager, PrinterSetupResult, PrinterType, PrintServerResult} from 'chrome://os-settings/lazy_load.js';
import {CupsPrintersBrowserProxyImpl, CupsPrintersEntryManager, PrinterSettingsUserAction, PrinterSetupResult, PrinterType, PrintServerResult} from 'chrome://os-settings/lazy_load.js';
import {Router, routes} from 'chrome://os-settings/os_settings.js';
import {webUIListenerCallback} from 'chrome://resources/ash/common/cr.m.js';
import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
Expand All @@ -15,6 +15,7 @@ import {isVisible} from 'chrome://webui-test/chromeos/test_util.js';
import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';

import {createCupsPrinterInfo, createPrinterListEntry} from './cups_printer_test_utils.js';
import {FakeMetricsPrivate} from './fake_metrics_private.js';
import {TestCupsPrintersBrowserProxy} from './test_cups_printers_browser_proxy.js';

/*
Expand Down Expand Up @@ -154,6 +155,31 @@ suite('CupsPrinterUITests', () => {
});
});
});

// Verify clicking the add printer manually button is recorded to metrics.
test('RecordUserActionMetric', () => {
const fakeMetricsPrivate = new FakeMetricsPrivate();
chrome.metricsPrivate = fakeMetricsPrivate;

// Enable the add printer manually button.
page.prefs = {
native_printing: {
user_native_printers_allowed: {
value: true,
},
},
};
page.canAddPrinter = true;

return flushTasks().then(() => {
page.shadowRoot.querySelector('.add-manual-printer-icon').click();
assertEquals(
1,
fakeMetricsPrivate.countMetricValue(
'Printing.CUPS.SettingsUserAction',
PrinterSettingsUserAction.ADD_PRINTER_MANUALLY));
});
});
});

suite('CupsAddPrinterDialogTests', function() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@

import 'chrome://os-settings/lazy_load.js';

import {PrinterListEntry, PrinterStatusReason, PrinterType, SettingsCupsPrintersEntryElement} from 'chrome://os-settings/lazy_load.js';
import {PrinterListEntry, PrinterSettingsUserAction, PrinterStatusReason, PrinterType, SettingsCupsPrintersEntryElement} from 'chrome://os-settings/lazy_load.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {assertEquals, assertFalse, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js';
import {isVisible} from 'chrome://webui-test/test_util.js';

import {FakeMetricsPrivate} from '../fake_metrics_private.js';

function createPrinterEntry(printerType: PrinterType): PrinterListEntry {
return {
printerInfo: {
Expand Down Expand Up @@ -189,4 +191,39 @@ suite('<settings-cups-printers-entry>', () => {
assertTrue(isVisible(printerEntryTestElement.shadowRoot!.querySelector(
'#printerStatusIcon')));
});

// Verify clicking the setup or save button is recorded to metrics.
test('recordUserActionMetric', () => {
const fakeMetricsPrivate = new FakeMetricsPrivate();
chrome.metricsPrivate =
fakeMetricsPrivate as unknown as typeof chrome.metricsPrivate;

// Enable the save printer buttons.
printerEntryTestElement.savingPrinter = false;
printerEntryTestElement.userPrintersAllowed = true;

// Verify saving an automatic printer is recorded.
printerEntryTestElement.printerEntry =
createPrinterEntry(PrinterType.AUTOMATIC);
flush();
printerEntryTestElement.shadowRoot!
.querySelector<HTMLElement>('#automaticPrinterButton')!.click();
assertEquals(
1,
fakeMetricsPrivate.countMetricValue(
'Printing.CUPS.SettingsUserAction',
PrinterSettingsUserAction.SAVE_PRINTER));

// Verify saving a discovered printer is recorded.
printerEntryTestElement.printerEntry =
createPrinterEntry(PrinterType.DISCOVERED);
flush();
printerEntryTestElement.shadowRoot!
.querySelector<HTMLElement>('#setupPrinterButton')!.click();
assertEquals(
2,
fakeMetricsPrivate.countMetricValue(
'Printing.CUPS.SettingsUserAction',
PrinterSettingsUserAction.SAVE_PRINTER));
});
});
8 changes: 8 additions & 0 deletions tools/metrics/histograms/enums.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86588,6 +86588,14 @@ chromeos/ash/components/peripheral_notification/peripheral_notification_manager.
<int value="4" label="Printer provider Web Store app launched"/>
</enum>

<enum name="PrinterSettingsUserAction">
<int value="0" label="Add printer manually"/>
<int value="1" label="Save printer"/>
<int value="2" label="Edit printer"/>
<int value="3" label="Remove printer"/>
<int value="4" label="Click help link"/>
</enum>

<enum name="PrinterSetupResult">
<int value="0" label="Fatal Error"/>
<int value="1" label="Success"/>
Expand Down
9 changes: 9 additions & 0 deletions tools/metrics/histograms/metadata/printing/histograms.xml
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,15 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>

<histogram name="Printing.CUPS.SettingsUserAction"
enum="PrinterSettingsUserAction" expires_after="2024-05-30">
<owner>gavinwill@chromium.org</owner>
<owner>cros-peripherals@google.com</owner>
<summary>
Records the action a user takes on the OS Printer settings page.
</summary>
</histogram>

<histogram name="Printing.CUPS.TotalNetworkPrintersCount" units="printers"
expires_after="2023-11-12">
<owner>bmgordon@chromium.org</owner>
Expand Down

0 comments on commit 4872353

Please sign in to comment.