Commit 4df73b27 authored by sauski's avatar sauski Committed by Commit Bot

Access Context Auditing: Extend logging for site data user interactions

To provide greater insight into user actions w.r.t. site data, the
PrivacyElementInteractions enum is extended to include user initiated
deletions of site data.

Bug: 1101675
Change-Id: I0d125409985fe01a5a9eeef9c7e363fdabd41714
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2494945
Commit-Queue: Theodore Olsauskas-Warren <sauski@google.com>
Reviewed-by: default avatardpapad <dpapad@chromium.org>
Reviewed-by: default avatarSean Harrison <harrisonsean@chromium.org>
Cr-Commit-Position: refs/heads/master@{#821161}
parent de033244
...@@ -33,8 +33,14 @@ export const PrivacyElementInteractions = { ...@@ -33,8 +33,14 @@ export const PrivacyElementInteractions = {
COOKIES_THIRD: 11, COOKIES_THIRD: 11,
COOKIES_BLOCK: 12, COOKIES_BLOCK: 12,
COOKIES_SESSION: 13, COOKIES_SESSION: 13,
SITE_DATA_REMOVE_ALL: 14,
SITE_DATA_REMOVE_FILTERED: 15,
SITE_DATA_REMOVE_SITE: 16,
COOKIE_DETAILS_REMOVE_ALL: 17,
COOKIE_DETAILS_REMOVE_ITEM: 18,
SITE_DETAILS_CLEAR_DATA: 19,
// Leave this at the end. // Leave this at the end.
COUNT: 14, COUNT: 20,
}; };
/** /**
......
...@@ -189,6 +189,7 @@ js_library("site_data") { ...@@ -189,6 +189,7 @@ js_library("site_data") {
":local_data_browser_proxy", ":local_data_browser_proxy",
":site_settings_behavior", ":site_settings_behavior",
"..:global_scroll_target_behavior.m", "..:global_scroll_target_behavior.m",
"..:metrics_browser_proxy",
"..:route", "..:route",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
...@@ -205,6 +206,7 @@ js_library("site_data") { ...@@ -205,6 +206,7 @@ js_library("site_data") {
js_library("site_data_details_subpage") { js_library("site_data_details_subpage") {
deps = [ deps = [
":local_data_browser_proxy", ":local_data_browser_proxy",
"..:metrics_browser_proxy",
"..:route", "..:route",
"..:router.m", "..:router.m",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
...@@ -217,6 +219,7 @@ js_library("site_data_details_subpage") { ...@@ -217,6 +219,7 @@ js_library("site_data_details_subpage") {
js_library("site_data_entry") { js_library("site_data_entry") {
deps = [ deps = [
":local_data_browser_proxy", ":local_data_browser_proxy",
"..:metrics_browser_proxy",
"//ui/webui/resources/js:i18n_behavior.m", "//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:icon.m", "//ui/webui/resources/js:icon.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m", "//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
...@@ -229,6 +232,7 @@ js_library("site_details") { ...@@ -229,6 +232,7 @@ js_library("site_details") {
":site_details_permission", ":site_details_permission",
":site_settings_behavior", ":site_settings_behavior",
":website_usage_browser_proxy", ":website_usage_browser_proxy",
"..:metrics_browser_proxy",
"..:router.m", "..:router.m",
"//ui/webui/resources/js:assert.m", "//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m", "//ui/webui/resources/js:i18n_behavior.m",
......
...@@ -27,6 +27,7 @@ import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bun ...@@ -27,6 +27,7 @@ import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bun
import {GlobalScrollTargetBehavior, GlobalScrollTargetBehaviorImpl} from '../global_scroll_target_behavior.m.js'; import {GlobalScrollTargetBehavior, GlobalScrollTargetBehaviorImpl} from '../global_scroll_target_behavior.m.js';
import {loadTimeData} from '../i18n_setup.js'; import {loadTimeData} from '../i18n_setup.js';
import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
import {routes} from '../route.js'; import {routes} from '../route.js';
import {Route, RouteObserverBehavior, Router} from '../router.m.js'; import {Route, RouteObserverBehavior, Router} from '../router.m.js';
...@@ -288,10 +289,14 @@ Polymer({ ...@@ -288,10 +289,14 @@ Polymer({
onConfirmDelete_() { onConfirmDelete_() {
this.$.confirmDeleteDialog.close(); this.$.confirmDeleteDialog.close();
if (this.filter.length === 0) { if (this.filter.length === 0) {
MetricsBrowserProxyImpl.getInstance().recordSettingsPageHistogram(
PrivacyElementInteractions.SITE_DATA_REMOVE_ALL);
this.browserProxy_.removeAll().then(() => { this.browserProxy_.removeAll().then(() => {
this.sites = []; this.sites = [];
}); });
} else { } else {
MetricsBrowserProxyImpl.getInstance().recordSettingsPageHistogram(
PrivacyElementInteractions.SITE_DATA_REMOVE_FILTERED);
this.browserProxy_.removeShownItems(); this.browserProxy_.removeShownItems();
// We just deleted all items found by the filter, let's reset the filter. // We just deleted all items found by the filter, let's reset the filter.
this.fire('clear-subpage-search'); this.fire('clear-subpage-search');
......
...@@ -13,6 +13,7 @@ import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behav ...@@ -13,6 +13,7 @@ import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behav
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {loadTimeData} from '../i18n_setup.js'; import {loadTimeData} from '../i18n_setup.js';
import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
import {routes} from '../route.js'; import {routes} from '../route.js';
import {Route, RouteObserverBehavior, Router} from '../router.m.js'; import {Route, RouteObserverBehavior, Router} from '../router.m.js';
...@@ -164,6 +165,8 @@ Polymer({ ...@@ -164,6 +165,8 @@ Polymer({
* @private * @private
*/ */
onRemove_(event) { onRemove_(event) {
MetricsBrowserProxyImpl.getInstance().recordSettingsPageHistogram(
PrivacyElementInteractions.COOKIE_DETAILS_REMOVE_ITEM);
this.browserProxy_.removeCookie( this.browserProxy_.removeCookie(
/** @type {!CookieDetails} */ (event.currentTarget.dataset).idPath); /** @type {!CookieDetails} */ (event.currentTarget.dataset).idPath);
}, },
...@@ -172,6 +175,8 @@ Polymer({ ...@@ -172,6 +175,8 @@ Polymer({
* A handler for when the user opts to remove all cookies. * A handler for when the user opts to remove all cookies.
*/ */
removeAll() { removeAll() {
MetricsBrowserProxyImpl.getInstance().recordSettingsPageHistogram(
PrivacyElementInteractions.COOKIE_DETAILS_REMOVE_ALL);
this.browserProxy_.removeCookie(this.siteId_); this.browserProxy_.removeCookie(this.siteId_);
}, },
}); });
...@@ -19,6 +19,8 @@ import {FocusRowBehavior} from 'chrome://resources/js/cr/ui/focus_row_behavior.m ...@@ -19,6 +19,8 @@ import {FocusRowBehavior} from 'chrome://resources/js/cr/ui/focus_row_behavior.m
import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
import {LocalDataBrowserProxy, LocalDataBrowserProxyImpl, LocalDataItem} from './local_data_browser_proxy.js'; import {LocalDataBrowserProxy, LocalDataBrowserProxyImpl, LocalDataItem} from './local_data_browser_proxy.js';
Polymer({ Polymer({
...@@ -51,6 +53,8 @@ Polymer({ ...@@ -51,6 +53,8 @@ Polymer({
*/ */
onRemove_(e) { onRemove_(e) {
e.stopPropagation(); e.stopPropagation();
MetricsBrowserProxyImpl.getInstance().recordSettingsPageHistogram(
PrivacyElementInteractions.SITE_DATA_REMOVE_SITE);
this.browserProxy_.removeItem(this.model.site); this.browserProxy_.removeItem(this.model.site);
}, },
}); });
...@@ -30,6 +30,7 @@ import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behav ...@@ -30,6 +30,7 @@ import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behav
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {loadTimeData} from '../i18n_setup.js'; import {loadTimeData} from '../i18n_setup.js';
import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
import {routes} from '../route.js'; import {routes} from '../route.js';
import {Route, RouteObserverBehavior, Router} from '../router.m.js'; import {Route, RouteObserverBehavior, Router} from '../router.m.js';
...@@ -304,6 +305,8 @@ Polymer({ ...@@ -304,6 +305,8 @@ Polymer({
* @private * @private
*/ */
onClearStorage_(e) { onClearStorage_(e) {
MetricsBrowserProxyImpl.getInstance().recordSettingsPageHistogram(
PrivacyElementInteractions.SITE_DETAILS_CLEAR_DATA);
if (this.hasUsage_(this.storedData_, this.numCookies_)) { if (this.hasUsage_(this.storedData_, this.numCookies_)) {
this.websiteUsageProxy_.clearUsage(this.toUrl(this.origin_).href); this.websiteUsageProxy_.clearUsage(this.toUrl(this.origin_).href);
this.storedData_ = ''; this.storedData_ = '';
......
...@@ -5,8 +5,13 @@ ...@@ -5,8 +5,13 @@
// clang-format off // clang-format off
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {cookieInfo, LocalDataBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; import {cookieInfo, LocalDataBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
import {Router,routes} from 'chrome://settings/settings.js'; import {MetricsBrowserProxyImpl, PrivacyElementInteractions, Router,routes} from 'chrome://settings/settings.js';
import {TestLocalDataBrowserProxy} from 'chrome://test/settings/test_local_data_browser_proxy.js'; import {TestLocalDataBrowserProxy} from 'chrome://test/settings/test_local_data_browser_proxy.js';
import {flushTasks} from '../test_util.m.js';
import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
// clang-format on // clang-format on
/** @fileoverview Suite of tests for site-data-details-subpage. */ /** @fileoverview Suite of tests for site-data-details-subpage. */
...@@ -17,6 +22,9 @@ suite('SiteDataDetailsSubpage', function() { ...@@ -17,6 +22,9 @@ suite('SiteDataDetailsSubpage', function() {
/** @type {TestLocalDataBrowserProxy} */ /** @type {TestLocalDataBrowserProxy} */
let browserProxy = null; let browserProxy = null;
/** @type {!TestMetricsBrowserProxy} */
let testMetricsBrowserProxy;
/** @type {!CookieDetails} */ /** @type {!CookieDetails} */
const cookieDetails = { const cookieDetails = {
accessibleToScript: 'Yes', accessibleToScript: 'Yes',
...@@ -46,6 +54,8 @@ suite('SiteDataDetailsSubpage', function() { ...@@ -46,6 +54,8 @@ suite('SiteDataDetailsSubpage', function() {
browserProxy = new TestLocalDataBrowserProxy(); browserProxy = new TestLocalDataBrowserProxy();
browserProxy.setCookieDetails(cookieList); browserProxy.setCookieDetails(cookieList);
LocalDataBrowserProxyImpl.instance_ = browserProxy; LocalDataBrowserProxyImpl.instance_ = browserProxy;
testMetricsBrowserProxy = new TestMetricsBrowserProxy();
MetricsBrowserProxyImpl.instance_ = testMetricsBrowserProxy;
PolymerTest.clearBody(); PolymerTest.clearBody();
page = document.createElement('site-data-details-subpage'); page = document.createElement('site-data-details-subpage');
Router.getInstance().navigateTo( Router.getInstance().navigateTo(
...@@ -81,4 +91,24 @@ suite('SiteDataDetailsSubpage', function() { ...@@ -81,4 +91,24 @@ suite('SiteDataDetailsSubpage', function() {
}); });
}); });
}); });
test('InteractionMetrics', async function() {
// Confirm that various page interactions record the appropriate metric.
await flushTasks();
page.$$('.icon-clear').click();
let metric =
await testMetricsBrowserProxy.whenCalled('recordSettingsPageHistogram');
assertEquals(PrivacyElementInteractions.COOKIE_DETAILS_REMOVE_ITEM, metric);
testMetricsBrowserProxy.reset();
// removeAll is public on the element to allow it to be called from a button
// located in the enclosing settings-subpage element. It is not bound to
// interactions with any part of the element under test, and is thus called
// directly from the test.
page.removeAll();
metric =
await testMetricsBrowserProxy.whenCalled('recordSettingsPageHistogram');
assertEquals(PrivacyElementInteractions.COOKIE_DETAILS_REMOVE_ALL, metric);
});
}); });
...@@ -5,10 +5,12 @@ ...@@ -5,10 +5,12 @@
// clang-format off // clang-format off
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {LocalDataBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; import {LocalDataBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
import {Router,routes} from 'chrome://settings/settings.js'; import {MetricsBrowserProxyImpl, PrivacyElementInteractions, Router,routes} from 'chrome://settings/settings.js';
import {TestLocalDataBrowserProxy} from 'chrome://test/settings/test_local_data_browser_proxy.js'; import {TestLocalDataBrowserProxy} from 'chrome://test/settings/test_local_data_browser_proxy.js';
import {eventToPromise} from 'chrome://test/test_util.m.js'; import {eventToPromise} from 'chrome://test/test_util.m.js';
import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
// clang-format on // clang-format on
suite('SiteDataTest', function() { suite('SiteDataTest', function() {
...@@ -18,8 +20,13 @@ suite('SiteDataTest', function() { ...@@ -18,8 +20,13 @@ suite('SiteDataTest', function() {
/** @type {TestLocalDataBrowserProxy} */ /** @type {TestLocalDataBrowserProxy} */
let testBrowserProxy; let testBrowserProxy;
/** @type {!TestMetricsBrowserProxy} */
let testMetricsBrowserProxy;
setup(function() { setup(function() {
Router.getInstance().navigateTo(routes.SITE_SETTINGS); Router.getInstance().navigateTo(routes.SITE_SETTINGS);
testMetricsBrowserProxy = new TestMetricsBrowserProxy();
MetricsBrowserProxyImpl.instance_ = testMetricsBrowserProxy;
testBrowserProxy = new TestLocalDataBrowserProxy(); testBrowserProxy = new TestLocalDataBrowserProxy();
LocalDataBrowserProxyImpl.instance_ = testBrowserProxy; LocalDataBrowserProxyImpl.instance_ = testBrowserProxy;
siteData = document.createElement('site-data'); siteData = document.createElement('site-data');
...@@ -44,6 +51,12 @@ suite('SiteDataTest', function() { ...@@ -44,6 +51,12 @@ suite('SiteDataTest', function() {
}) })
.then(function(path) { .then(function(path) {
assertEquals('Hello', path); assertEquals('Hello', path);
return testMetricsBrowserProxy.whenCalled(
'recordSettingsPageHistogram');
})
.then(metric => {
assertEquals(
PrivacyElementInteractions.SITE_DATA_REMOVE_SITE, metric);
}); });
const sites = [ const sites = [
{site: 'Hello', localData: 'Cookiez!'}, {site: 'Hello', localData: 'Cookiez!'},
...@@ -105,4 +118,28 @@ suite('SiteDataTest', function() { ...@@ -105,4 +118,28 @@ suite('SiteDataTest', function() {
assertEquals('test', filter); assertEquals('test', filter);
assertEquals(0, testBrowserProxy.getCallCount('reloadCookies')); assertEquals(0, testBrowserProxy.getCallCount('reloadCookies'));
}); });
test('remove button records interaction metric', async function() {
// Check that the remove button correctly records an interaction metric
// based on whether the list is filtered or not.
document.body.appendChild(siteData);
siteData.$$('#removeShowingSites').click();
flush();
siteData.$$('.action-button').click();
let metric =
await testMetricsBrowserProxy.whenCalled('recordSettingsPageHistogram');
assertEquals(PrivacyElementInteractions.SITE_DATA_REMOVE_ALL, metric);
testMetricsBrowserProxy.reset();
// Add a filter and repeat.
siteData.filter = 'Test';
siteData.$$('#removeShowingSites').click();
flush();
siteData.$$('.action-button').click();
metric =
await testMetricsBrowserProxy.whenCalled('recordSettingsPageHistogram');
assertEquals(PrivacyElementInteractions.SITE_DATA_REMOVE_FILTERED, metric);
});
}); });
...@@ -8,10 +8,11 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; ...@@ -8,10 +8,11 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {listenOnce} from 'chrome://resources/js/util.m.js'; import {listenOnce} from 'chrome://resources/js/util.m.js';
import {flush,Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {flush,Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ChooserType,ContentSetting,ContentSettingsTypes,SiteSettingSource,SiteSettingsPrefsBrowserProxyImpl,WebsiteUsageBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; import {ChooserType,ContentSetting,ContentSettingsTypes,SiteSettingSource,SiteSettingsPrefsBrowserProxyImpl,WebsiteUsageBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
import {Route,Router,routes} from 'chrome://settings/settings.js'; import {MetricsBrowserProxyImpl, PrivacyElementInteractions, Route,Router,routes} from 'chrome://settings/settings.js';
import {TestSiteSettingsPrefsBrowserProxy} from 'chrome://test/settings/test_site_settings_prefs_browser_proxy.js'; import {TestSiteSettingsPrefsBrowserProxy} from 'chrome://test/settings/test_site_settings_prefs_browser_proxy.js';
import {createContentSettingTypeToValuePair,createRawChooserException,createRawSiteException,createSiteSettingsPrefs} from 'chrome://test/settings/test_util.js'; import {createContentSettingTypeToValuePair,createRawChooserException,createRawSiteException,createSiteSettingsPrefs} from 'chrome://test/settings/test_util.js';
import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js'; import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js';
import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
// clang-format on // clang-format on
...@@ -51,6 +52,9 @@ suite('SiteDetails', function() { ...@@ -51,6 +52,9 @@ suite('SiteDetails', function() {
*/ */
let browserProxy; let browserProxy;
/** @type {!TestMetricsBrowserProxy} */
let testMetricsBrowserProxy;
/** /**
* The mock website usage proxy object to use during test. * The mock website usage proxy object to use during test.
* @type {TestWebsiteUsageBrowserProxy} * @type {TestWebsiteUsageBrowserProxy}
...@@ -175,6 +179,8 @@ suite('SiteDetails', function() { ...@@ -175,6 +179,8 @@ suite('SiteDetails', function() {
browserProxy = new TestSiteSettingsPrefsBrowserProxy(); browserProxy = new TestSiteSettingsPrefsBrowserProxy();
SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy;
testMetricsBrowserProxy = new TestMetricsBrowserProxy();
MetricsBrowserProxyImpl.instance_ = testMetricsBrowserProxy;
websiteUsageProxy = new TestWebsiteUsageBrowserProxy(); websiteUsageProxy = new TestWebsiteUsageBrowserProxy();
WebsiteUsageBrowserProxyImpl.instance_ = websiteUsageProxy; WebsiteUsageBrowserProxyImpl.instance_ = websiteUsageProxy;
...@@ -350,6 +356,12 @@ suite('SiteDetails', function() { ...@@ -350,6 +356,12 @@ suite('SiteDetails', function() {
}) })
.then(originCleared => { .then(originCleared => {
assertEquals('https://foo.com/', originCleared); assertEquals('https://foo.com/', originCleared);
return testMetricsBrowserProxy.whenCalled(
'recordSettingsPageHistogram');
})
.then(metric => {
assertEquals(
PrivacyElementInteractions.SITE_DETAILS_CLEAR_DATA, metric);
}); });
}); });
......
...@@ -66249,6 +66249,12 @@ https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf ...@@ -66249,6 +66249,12 @@ https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf
<int value="11" label="Cookies block third radio"/> <int value="11" label="Cookies block third radio"/>
<int value="12" label="Cookies block all radio"/> <int value="12" label="Cookies block all radio"/>
<int value="13" label="Cookies session only toggle"/> <int value="13" label="Cookies session only toggle"/>
<int value="14" label="Remove all on site data page"/>
<int value="15" label="Remove based on current filter on site data page"/>
<int value="16" label="Remove site on site data page"/>
<int value="17" label="Remove all on cookie details page"/>
<int value="18" label="Remove item on cookie details page"/>
<int value="19" label="Clear data on site details page"/>
</enum> </enum>
<enum name="SettingsResetPromptConfigError"> <enum name="SettingsResetPromptConfigError">
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