Commit 45edf801 authored by Xinghui Lu's avatar Xinghui Lu Committed by Commit Bot

Log user action sequence on Safe Browsing settings page.

Log SafeBrowsing.Settings.* user action sequence on both desktop and
Android. Break "Showed" into different entry points so we can analyze
users's behavior based on different entry points.

Bug: 1124491
Change-Id: I6a30765ae8754b88eb8cb4a6f9fcd89be0d7d78e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2416564
Commit-Queue: Xinghui Lu <xinghuilu@chromium.org>
Reviewed-by: default avatarVarun Khaneja <vakh@chromium.org>
Reviewed-by: default avatarAlexei Svitkine <asvitkine@chromium.org>
Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#810035}
parent 6191b211
...@@ -336,7 +336,8 @@ Polymer({ ...@@ -336,7 +336,8 @@ Polymer({
/** @private */ /** @private */
onSecurityPageClick_() { onSecurityPageClick_() {
this.tryShowHatsSurvey_(); this.tryShowHatsSurvey_();
this.metricsBrowserProxy_.recordAction(
'SafeBrowsing.Settings.ShowedFromParentSettings');
Router.getInstance().navigateTo(routes.SECURITY); Router.getInstance().navigateTo(routes.SECURITY);
}, },
......
...@@ -189,6 +189,8 @@ Polymer({ ...@@ -189,6 +189,8 @@ Polymer({
if (prefValue !== selected) { if (prefValue !== selected) {
this.recordInteractionHistogramOnRadioChange_( this.recordInteractionHistogramOnRadioChange_(
/** @type {!SafeBrowsingSetting} */ (selected)); /** @type {!SafeBrowsingSetting} */ (selected));
this.recordActionOnRadioChange_(
/** @type {!SafeBrowsingSetting} */ (selected));
} }
if (selected === SafeBrowsingSetting.DISABLED) { if (selected === SafeBrowsingSetting.DISABLED) {
this.showDisableSafebrowsingDialog_ = true; this.showDisableSafebrowsingDialog_ = true;
...@@ -263,6 +265,7 @@ Polymer({ ...@@ -263,6 +265,7 @@ Polymer({
this.$$('settings-disable-safebrowsing-dialog')) this.$$('settings-disable-safebrowsing-dialog'))
.wasConfirmed(); .wasConfirmed();
this.recordInteractionHistogramOnSafeBrowsingDialogClose_(confirmed); this.recordInteractionHistogramOnSafeBrowsingDialogClose_(confirmed);
this.recordActionOnSafeBrowsingDialogClose_(confirmed);
// Check if the dialog was confirmed before closing it. // Check if the dialog was confirmed before closing it.
if (confirmed) { if (confirmed) {
this.$.safeBrowsingRadioGroup.sendPrefChange(); this.$.safeBrowsingRadioGroup.sendPrefChange();
...@@ -282,12 +285,14 @@ Polymer({ ...@@ -282,12 +285,14 @@ Polymer({
onEnhancedProtectionExpandButtonClicked_() { onEnhancedProtectionExpandButtonClicked_() {
this.recordInteractionHistogramOnExpandButtonClicked_( this.recordInteractionHistogramOnExpandButtonClicked_(
SafeBrowsingSetting.ENHANCED); SafeBrowsingSetting.ENHANCED);
this.recordActionOnExpandButtonClicked_(SafeBrowsingSetting.ENHANCED);
}, },
/** @private */ /** @private */
onStandardProtectionExpandButtonClicked_() { onStandardProtectionExpandButtonClicked_() {
this.recordInteractionHistogramOnExpandButtonClicked_( this.recordInteractionHistogramOnExpandButtonClicked_(
SafeBrowsingSetting.STANDARD); SafeBrowsingSetting.STANDARD);
this.recordActionOnExpandButtonClicked_(SafeBrowsingSetting.STANDARD);
}, },
/** /**
...@@ -323,7 +328,7 @@ Polymer({ ...@@ -323,7 +328,7 @@ Polymer({
}, },
/** /**
* @param {!boolean} confirmed * @param {boolean} confirmed
* @private * @private
*/ */
recordInteractionHistogramOnSafeBrowsingDialogClose_(confirmed) { recordInteractionHistogramOnSafeBrowsingDialogClose_(confirmed) {
...@@ -333,4 +338,41 @@ Polymer({ ...@@ -333,4 +338,41 @@ Polymer({
SafeBrowsingInteractions SafeBrowsingInteractions
.SAFE_BROWSING_DISABLE_SAFE_BROWSING_DIALOG_DENIED); .SAFE_BROWSING_DISABLE_SAFE_BROWSING_DIALOG_DENIED);
}, },
/**
* @param {!SafeBrowsingSetting} safeBrowsingSetting
* @private
*/
recordActionOnRadioChange_(safeBrowsingSetting) {
let actionName;
if (safeBrowsingSetting === SafeBrowsingSetting.ENHANCED) {
actionName = 'SafeBrowsing.Settings.EnhancedProtectionClicked';
} else if (safeBrowsingSetting === SafeBrowsingSetting.STANDARD) {
actionName = 'SafeBrowsing.Settings.StandardProtectionClicked';
} else {
actionName = 'SafeBrowsing.Settings.DisableSafeBrowsingClicked';
}
this.metricsBrowserProxy_.recordAction(actionName);
},
/**
* @param {!SafeBrowsingSetting} safeBrowsingSetting
* @private
*/
recordActionOnExpandButtonClicked_(safeBrowsingSetting) {
this.metricsBrowserProxy_.recordAction(
safeBrowsingSetting === SafeBrowsingSetting.ENHANCED ?
'SafeBrowsing.Settings.EnhancedProtectionExpandArrowClicked' :
'SafeBrowsing.Settings.StandardProtectionExpandArrowClicked');
},
/**
* @param {boolean} confirmed
* @private
*/
recordActionOnSafeBrowsingDialogClose_(confirmed) {
this.metricsBrowserProxy_.recordAction(
confirmed ? 'SafeBrowsing.Settings.DisableSafeBrowsingDialogConfirmed' :
'SafeBrowsing.Settings.DisableSafeBrowsingDialogDenied');
},
}); });
...@@ -176,6 +176,8 @@ Polymer({ ...@@ -176,6 +176,8 @@ Polymer({
/** @private */ /** @private */
openSecurityPage_: function() { openSecurityPage_: function() {
this.metricsBrowserProxy_.recordAction(
'SafeBrowsing.Settings.ShowedFromSafetyCheck');
Router.getInstance().navigateTo( Router.getInstance().navigateTo(
routes.SECURITY, /* dynamicParams= */ null, routes.SECURITY, /* dynamicParams= */ null,
/* removeSearch= */ true); /* removeSearch= */ true);
......
...@@ -12,6 +12,7 @@ import androidx.preference.Preference; ...@@ -12,6 +12,7 @@ import androidx.preference.Preference;
import org.chromium.base.IntentUtils; import org.chromium.base.IntentUtils;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.safe_browsing.SafeBrowsingBridge; import org.chromium.chrome.browser.safe_browsing.SafeBrowsingBridge;
import org.chromium.chrome.browser.safe_browsing.SafeBrowsingState; import org.chromium.chrome.browser.safe_browsing.SafeBrowsingState;
...@@ -226,5 +227,37 @@ public class SecuritySettingsFragment extends SafeBrowsingSettingsFragmentBase ...@@ -226,5 +227,37 @@ public class SecuritySettingsFragment extends SafeBrowsingSettingsFragmentBase
RecordHistogram.recordEnumeratedHistogram( RecordHistogram.recordEnumeratedHistogram(
"SafeBrowsing.Settings.UserAction." + metricsSuffix, userAction, "SafeBrowsing.Settings.UserAction." + metricsSuffix, userAction,
UserAction.MAX_VALUE + 1); UserAction.MAX_VALUE + 1);
String userActionSuffix;
switch (userAction) {
case UserAction.SHOWED:
userActionSuffix = "ShowedFrom" + metricsSuffix;
break;
case UserAction.ENHANCED_PROTECTION_CLICKED:
userActionSuffix = "EnhancedProtectionClicked";
break;
case UserAction.STANDARD_PROTECTION_CLICKED:
userActionSuffix = "StandardProtectionClicked";
break;
case UserAction.DISABLE_SAFE_BROWSING_CLICKED:
userActionSuffix = "DisableSafeBrowsingClicked";
break;
case UserAction.ENHANCED_PROTECTION_EXPAND_ARROW_CLICKED:
userActionSuffix = "EnhancedProtectionExpandArrowClicked";
break;
case UserAction.STANDARD_PROTECTION_EXPAND_ARROW_CLICKED:
userActionSuffix = "StandardProtectionExpandArrowClicked";
break;
case UserAction.DISABLE_SAFE_BROWSING_DIALOG_CONFIRMED:
userActionSuffix = "DisableSafeBrowsingDialogConfirmed";
break;
case UserAction.DISABLE_SAFE_BROWSING_DIALOG_DENIED:
userActionSuffix = "DisableSafeBrowsingDialogDenied";
break;
default:
assert false : "Should not be reached.";
userActionSuffix = "";
}
RecordUserAction.record("SafeBrowsing.Settings." + userActionSuffix);
} }
} }
...@@ -422,58 +422,93 @@ suite('CrSettingsSecurityPageTest', function() { ...@@ -422,58 +422,93 @@ suite('CrSettingsSecurityPageTest', function() {
testMetricsBrowserProxy.resetResolver( testMetricsBrowserProxy.resetResolver(
'recordSafeBrowsingInteractionHistogram'); 'recordSafeBrowsingInteractionHistogram');
testMetricsBrowserProxy.resetResolver('recordAction');
page.$$('#safeBrowsingEnhanced').click(); page.$$('#safeBrowsingEnhanced').click();
flush(); flush();
const enhancedClickedResult = await testMetricsBrowserProxy.whenCalled( const [enhancedClickedResult, enhancedClickedAction] = await Promise.all([
'recordSafeBrowsingInteractionHistogram'); testMetricsBrowserProxy.whenCalled(
'recordSafeBrowsingInteractionHistogram'),
testMetricsBrowserProxy.whenCalled('recordAction')
]);
assertEquals( assertEquals(
SafeBrowsingInteractions.SAFE_BROWSING_ENHANCED_PROTECTION_CLICKED, SafeBrowsingInteractions.SAFE_BROWSING_ENHANCED_PROTECTION_CLICKED,
enhancedClickedResult); enhancedClickedResult);
assertEquals(
'SafeBrowsing.Settings.EnhancedProtectionClicked',
enhancedClickedAction);
testMetricsBrowserProxy.resetResolver( testMetricsBrowserProxy.resetResolver(
'recordSafeBrowsingInteractionHistogram'); 'recordSafeBrowsingInteractionHistogram');
testMetricsBrowserProxy.resetResolver('recordAction');
page.$$('#safeBrowsingEnhanced').$$('cr-expand-button').click(); page.$$('#safeBrowsingEnhanced').$$('cr-expand-button').click();
flush(); flush();
const enhancedExpandedResult = await testMetricsBrowserProxy.whenCalled( const [enhancedExpandedResult, enhancedExpandedAction] = await Promise.all([
'recordSafeBrowsingInteractionHistogram'); testMetricsBrowserProxy.whenCalled(
'recordSafeBrowsingInteractionHistogram'),
testMetricsBrowserProxy.whenCalled('recordAction')
]);
assertEquals( assertEquals(
SafeBrowsingInteractions SafeBrowsingInteractions
.SAFE_BROWSING_ENHANCED_PROTECTION_EXPAND_ARROW_CLICKED, .SAFE_BROWSING_ENHANCED_PROTECTION_EXPAND_ARROW_CLICKED,
enhancedExpandedResult); enhancedExpandedResult);
assertEquals(
'SafeBrowsing.Settings.EnhancedProtectionExpandArrowClicked',
enhancedExpandedAction);
testMetricsBrowserProxy.resetResolver( testMetricsBrowserProxy.resetResolver(
'recordSafeBrowsingInteractionHistogram'); 'recordSafeBrowsingInteractionHistogram');
testMetricsBrowserProxy.resetResolver('recordAction');
page.$$('#safeBrowsingStandard').$$('cr-expand-button').click(); page.$$('#safeBrowsingStandard').$$('cr-expand-button').click();
flush(); flush();
const standardExpandedResult = await testMetricsBrowserProxy.whenCalled( const [standardExpandedResult, standardExpandedAction] = await Promise.all([
'recordSafeBrowsingInteractionHistogram'); testMetricsBrowserProxy.whenCalled(
'recordSafeBrowsingInteractionHistogram'),
testMetricsBrowserProxy.whenCalled('recordAction')
]);
assertEquals( assertEquals(
SafeBrowsingInteractions SafeBrowsingInteractions
.SAFE_BROWSING_STANDARD_PROTECTION_EXPAND_ARROW_CLICKED, .SAFE_BROWSING_STANDARD_PROTECTION_EXPAND_ARROW_CLICKED,
standardExpandedResult); standardExpandedResult);
assertEquals(
'SafeBrowsing.Settings.StandardProtectionExpandArrowClicked',
standardExpandedAction);
testMetricsBrowserProxy.resetResolver( testMetricsBrowserProxy.resetResolver(
'recordSafeBrowsingInteractionHistogram'); 'recordSafeBrowsingInteractionHistogram');
testMetricsBrowserProxy.resetResolver('recordAction');
page.$$('#safeBrowsingDisabled').click(); page.$$('#safeBrowsingDisabled').click();
flush(); flush();
const disableClickedResult = await testMetricsBrowserProxy.whenCalled( const [disableClickedResult, disableClickedAction] = await Promise.all([
'recordSafeBrowsingInteractionHistogram'); testMetricsBrowserProxy.whenCalled(
'recordSafeBrowsingInteractionHistogram'),
testMetricsBrowserProxy.whenCalled('recordAction')
]);
assertEquals( assertEquals(
SafeBrowsingInteractions.SAFE_BROWSING_DISABLE_SAFE_BROWSING_CLICKED, SafeBrowsingInteractions.SAFE_BROWSING_DISABLE_SAFE_BROWSING_CLICKED,
disableClickedResult); disableClickedResult);
assertEquals(
'SafeBrowsing.Settings.DisableSafeBrowsingClicked',
disableClickedAction);
testMetricsBrowserProxy.resetResolver( testMetricsBrowserProxy.resetResolver(
'recordSafeBrowsingInteractionHistogram'); 'recordSafeBrowsingInteractionHistogram');
testMetricsBrowserProxy.resetResolver('recordAction');
page.$$('settings-disable-safebrowsing-dialog') page.$$('settings-disable-safebrowsing-dialog')
.$$('.cancel-button') .$$('.cancel-button')
.click(); .click();
flush(); flush();
const disableDeniedResult = await testMetricsBrowserProxy.whenCalled( const [disableDeniedResult, disableDeniedAction] = await Promise.all([
'recordSafeBrowsingInteractionHistogram'); testMetricsBrowserProxy.whenCalled(
'recordSafeBrowsingInteractionHistogram'),
testMetricsBrowserProxy.whenCalled('recordAction')
]);
assertEquals( assertEquals(
SafeBrowsingInteractions SafeBrowsingInteractions
.SAFE_BROWSING_DISABLE_SAFE_BROWSING_DIALOG_DENIED, .SAFE_BROWSING_DISABLE_SAFE_BROWSING_DIALOG_DENIED,
disableDeniedResult); disableDeniedResult);
assertEquals(
'SafeBrowsing.Settings.DisableSafeBrowsingDialogDenied',
disableDeniedAction);
await flushTasks(); await flushTasks();
...@@ -481,16 +516,23 @@ suite('CrSettingsSecurityPageTest', function() { ...@@ -481,16 +516,23 @@ suite('CrSettingsSecurityPageTest', function() {
flush(); flush();
testMetricsBrowserProxy.resetResolver( testMetricsBrowserProxy.resetResolver(
'recordSafeBrowsingInteractionHistogram'); 'recordSafeBrowsingInteractionHistogram');
testMetricsBrowserProxy.resetResolver('recordAction');
page.$$('settings-disable-safebrowsing-dialog') page.$$('settings-disable-safebrowsing-dialog')
.$$('.action-button') .$$('.action-button')
.click(); .click();
flush(); flush();
const disableConfirmedResult = await testMetricsBrowserProxy.whenCalled( const [disableConfirmedResult, disableConfirmedAction] = await Promise.all([
'recordSafeBrowsingInteractionHistogram'); testMetricsBrowserProxy.whenCalled(
'recordSafeBrowsingInteractionHistogram'),
testMetricsBrowserProxy.whenCalled('recordAction')
]);
assertEquals( assertEquals(
SafeBrowsingInteractions SafeBrowsingInteractions
.SAFE_BROWSING_DISABLE_SAFE_BROWSING_DIALOG_CONFIRMED, .SAFE_BROWSING_DISABLE_SAFE_BROWSING_DIALOG_CONFIRMED,
disableConfirmedResult); disableConfirmedResult);
assertEquals(
'SafeBrowsing.Settings.DisableSafeBrowsingDialogConfirmed',
disableConfirmedAction);
}); });
test('securityPageShowedRecorded', async function() { test('securityPageShowedRecorded', async function() {
......
...@@ -20043,6 +20043,96 @@ should be able to be added at any place in this file. ...@@ -20043,6 +20043,96 @@ should be able to be added at any place in this file.
</description> </description>
</action> </action>
<action name="SafeBrowsing.Settings.DisableSafeBrowsingClicked">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the disable Safe Browsing button in the Safe Browsing setting
page.
</description>
</action>
<action name="SafeBrowsing.Settings.DisableSafeBrowsingDialogConfirmed">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the confirmed button on the disable Safe Browsing dialog in the
Safe Browsing setting page.
</description>
</action>
<action name="SafeBrowsing.Settings.DisableSafeBrowsingDialogDenied">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the denied button on the disable Safe Browsing dialog in the
Safe Browsing setting page.
</description>
</action>
<action name="SafeBrowsing.Settings.EnhancedProtectionClicked">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the exhanced protection button in the Safe Browsing setting
page.
</description>
</action>
<action name="SafeBrowsing.Settings.EnhancedProtectionExpandArrowClicked">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the enhanced protection expand arrow in the Safe Browsing
setting page.
</description>
</action>
<action name="SafeBrowsing.Settings.ShowedFromDefault">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
The Safe Browsing setting page is shown to the user. The user reaches the
page from the default route.
</description>
</action>
<action name="SafeBrowsing.Settings.ShowedFromParentSettings">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
The Safe Browsing setting page is shown to the user. The user reaches the
page from the parent settings.
</description>
</action>
<action name="SafeBrowsing.Settings.ShowedFromSafetyCheck">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
The Safe Browsing setting page is shown to the user. The user reaches the
page from SafetyCheck.
</description>
</action>
<action name="SafeBrowsing.Settings.StandardProtectionClicked">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the standard protection button in the Safe Browsing setting
page.
</description>
</action>
<action name="SafeBrowsing.Settings.StandardProtectionExpandArrowClicked">
<owner>xinghuilu@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<description>
User clicks the standard protection expand arrow in the Safe Browsing
setting page.
</description>
</action>
<action name="Save"> <action name="Save">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner> <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description> <description>Please enter the description of this user action.</description>
......
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