blob: 9a222ea342cdc5fb9afb4daf37ea6cb2baf382ef [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// clang-format off
import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ClearBrowsingDataBrowserProxyImpl, ContentSettingsTypes, CookieControlsMode, SafeBrowsingSetting, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
import {HatsBrowserProxyImpl, MetricsBrowserProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Route, Router, routes, SecureDnsMode, SyncBrowserProxyImpl} from 'chrome://settings/settings.js';
import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js';
import {flushTasks, isChildVisible, isVisible} from '../test_util.m.js';
import {TestClearBrowsingDataBrowserProxy} from './test_clear_browsing_data_browser_proxy.js';
import {TestHatsBrowserProxy} from './test_hats_browser_proxy.js';
import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
import {TestPrivacyPageBrowserProxy} from './test_privacy_page_browser_proxy.js';
import {TestSiteSettingsPrefsBrowserProxy} from './test_site_settings_prefs_browser_proxy.js';
import {TestSyncBrowserProxy} from './test_sync_browser_proxy.m.js';
// clang-format on
/** @type {!Array<!Route>} */
const redesignedPages = [
routes.SITE_SETTINGS_ADS,
routes.SITE_SETTINGS_AR,
routes.SITE_SETTINGS_AUTOMATIC_DOWNLOADS,
routes.SITE_SETTINGS_BACKGROUND_SYNC,
routes.SITE_SETTINGS_CAMERA,
routes.SITE_SETTINGS_CLIPBOARD,
routes.SITE_SETTINGS_IMAGES,
routes.SITE_SETTINGS_JAVASCRIPT,
routes.SITE_SETTINGS_LOCATION,
routes.SITE_SETTINGS_MICROPHONE,
routes.SITE_SETTINGS_MIDI_DEVICES,
routes.SITE_SETTINGS_NOTIFICATIONS,
routes.SITE_SETTINGS_POPUPS,
routes.SITE_SETTINGS_SENSORS,
routes.SITE_SETTINGS_SERIAL_PORTS,
routes.SITE_SETTINGS_SOUND,
routes.SITE_SETTINGS_USB_DEVICES,
routes.SITE_SETTINGS_VR,
// TODO(crbug.com/1128902) After restructure add coverage for elements on
// routes which depend on flags being enabled.
// routes.SITE_SETTINGS_FILE_SYSTEM_WRITE,
// routes.SITE_SETTINGS_PAYMENT_HANDLER,
// Doesn't contain toggle or radio buttons
// routes.SITE_SETTINGS_ZOOM_LEVELS,
];
/** @type {!Array<!Route>} */
const notRedesignedPages = [
routes.SITE_SETTINGS_HID_DEVICES,
// Content settings that depend on flags being enabled.
// routes.SITE_SETTINGS_BLUETOOTH_SCANNING,
// routes.SITE_SETTINGS_BLUETOOTH_DEVICES,
// routes.SITE_SETTINGS_WINDOW_PLACEMENT,
// routes.SITE_SETTINGS_FONT_ACCESS,
];
suite('PrivacyPage', function() {
/** @type {!SettingsPrivacyPageElement} */
let page;
/** @type {!TestClearBrowsingDataBrowserProxy} */
let testClearBrowsingDataBrowserProxy;
/** @type {!TestSiteSettingsPrefsBrowserProxy}*/
let siteSettingsBrowserProxy;
/** @type {!Array<string>} */
const testLabels = ['test label 1', 'test label 2'];
suiteSetup(function() {
loadTimeData.overrideValues({
enableContentSettingsRedesign: false,
privacySandboxSettingsEnabled: false,
});
});
setup(async function() {
testClearBrowsingDataBrowserProxy = new TestClearBrowsingDataBrowserProxy();
ClearBrowsingDataBrowserProxyImpl.instance_ =
testClearBrowsingDataBrowserProxy;
const testBrowserProxy = new TestPrivacyPageBrowserProxy();
PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy;
const testSyncBrowserProxy = new TestSyncBrowserProxy();
SyncBrowserProxyImpl.instance_ = testSyncBrowserProxy;
siteSettingsBrowserProxy = new TestSiteSettingsPrefsBrowserProxy();
SiteSettingsPrefsBrowserProxyImpl.instance_ = siteSettingsBrowserProxy;
siteSettingsBrowserProxy.setCookieSettingDescription(testLabels[0]);
document.body.innerHTML = '';
page = /** @type {!SettingsPrivacyPageElement} */
(document.createElement('settings-privacy-page'));
page.prefs = {
profile: {password_manager_leak_detection: {value: true}},
signin: {
allowed_on_next_startup:
{type: chrome.settingsPrivate.PrefType.BOOLEAN, value: true}
},
safebrowsing: {
enabled: {value: true},
scout_reporting_enabled: {value: true},
enhanced: {value: false}
},
dns_over_https:
{mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}},
};
document.body.appendChild(page);
return testSyncBrowserProxy.whenCalled('getSyncStatus');
});
teardown(function() {
page.remove();
Router.getInstance().navigateTo(routes.BASIC);
});
test('showClearBrowsingDataDialog', function() {
assertFalse(!!page.$$('settings-clear-browsing-data-dialog'));
page.$$('#clearBrowsingData').click();
flush();
const dialog = page.$$('settings-clear-browsing-data-dialog');
assertTrue(!!dialog);
});
test('CookiesLinkRowSublabel', async function() {
await siteSettingsBrowserProxy.whenCalled('getCookieSettingDescription');
flush();
assertEquals(page.$$('#cookiesLinkRow').subLabel, testLabels[0]);
webUIListenerCallback('cookieSettingDescriptionChanged', testLabels[1]);
assertEquals(page.$$('#cookiesLinkRow').subLabel, testLabels[1]);
});
test('ContentSettingsRedesignVisibility', async function() {
// Ensure pages are visited so that HTML components are stamped.
redesignedPages.forEach(route => Router.getInstance().navigateTo(route));
notRedesignedPages.forEach(route => Router.getInstance().navigateTo(route));
await flushTasks();
assertFalse(loadTimeData.getBoolean('enableContentSettingsRedesign'));
assertEquals(
page.root.querySelectorAll('category-default-setting').length,
redesignedPages.length + notRedesignedPages.length);
assertEquals(
page.root.querySelectorAll('settings-category-default-radio-group')
.length,
0);
assertFalse(isChildVisible(page, '#notficationRadioGroup'));
});
test('privacySandboxRowNotVisible', function() {
assertFalse(isChildVisible(page, '#privacySandboxLinkRow'));
});
});
suite('PrivacySandboxSettingsEnabled', function() {
/** @type {!SettingsPrivacyPageElement} */
let page;
setup(function() {
document.body.innerHTML = '';
page = /** @type {!SettingsPrivacyPageElement} */
(document.createElement('settings-privacy-page'));
document.body.appendChild(page);
});
test('privacySandboxRowVisible', function() {
assertTrue(isChildVisible(page, '#privacySandboxLinkRow'));
});
});
suite('ContentSettingsRedesign', function() {
/** @type {!SettingsPrivacyPageElement} */
let page;
suiteSetup(function() {
loadTimeData.overrideValues({
enableContentSettingsRedesign: true,
});
});
setup(async function() {
document.body.innerHTML = '';
page = /** @type {!SettingsPrivacyPageElement} */
(document.createElement('settings-privacy-page'));
document.body.appendChild(page);
flush();
});
teardown(function() {
page.remove();
Router.getInstance().navigateTo(routes.BASIC);
});
test('ContentSettingsRedesignVisibility', async function() {
// Ensure pages are visited so that HTML components are stamped.
redesignedPages.forEach(route => Router.getInstance().navigateTo(route));
notRedesignedPages.forEach(route => Router.getInstance().navigateTo(route));
await flushTasks();
assertTrue(loadTimeData.getBoolean('enableContentSettingsRedesign'));
assertEquals(
page.root.querySelectorAll('category-default-setting').length,
notRedesignedPages.length);
// All redesigned pages, except notifications, will use a
// settings-category-default-radio-group.
assertEquals(
page.root.querySelectorAll('settings-category-default-radio-group')
.length,
redesignedPages.length - 1);
});
test('NotificationPageRedesign', async function() {
Router.getInstance().navigateTo(routes.SITE_SETTINGS_NOTIFICATIONS);
await flushTasks();
assertTrue(isChildVisible(page, '#notificationRadioGroup'));
const categorySettingExceptions =
/** @type {!CategorySettingExceptionsElement} */
(page.$$('category-setting-exceptions'));
assertTrue(isVisible(categorySettingExceptions));
assertEquals(
ContentSettingsTypes.NOTIFICATIONS, categorySettingExceptions.category);
assertFalse(isChildVisible(page, 'category-default-setting'));
});
});
suite('PrivacyPageSound', function() {
/** @type {!TestPrivacyPageBrowserProxy} */
let testBrowserProxy;
/** @type {!SettingsPrivacyPageElement} */
let page;
function flushAsync() {
flush();
return new Promise(resolve => {
page.async(resolve);
});
}
function getToggleElement() {
return page.$$('settings-animated-pages')
.queryEffectiveChildren('settings-subpage')
.queryEffectiveChildren('#block-autoplay-setting');
}
setup(() => {
loadTimeData.overrideValues({enableBlockAutoplayContentSetting: true});
testBrowserProxy = new TestPrivacyPageBrowserProxy();
PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy;
Router.getInstance().navigateTo(routes.SITE_SETTINGS_SOUND);
document.body.innerHTML = '';
page = /** @type {!SettingsPrivacyPageElement} */
(document.createElement('settings-privacy-page'));
document.body.appendChild(page);
return flushAsync();
});
teardown(() => {
page.remove();
});
test('UpdateStatus', () => {
assertTrue(getToggleElement().hasAttribute('disabled'));
assertFalse(getToggleElement().hasAttribute('checked'));
webUIListenerCallback(
'onBlockAutoplayStatusChanged', {pref: {value: true}, enabled: true});
return flushAsync().then(() => {
// Check that we are on and enabled.
assertFalse(getToggleElement().hasAttribute('disabled'));
assertTrue(getToggleElement().hasAttribute('checked'));
// Toggle the pref off.
webUIListenerCallback(
'onBlockAutoplayStatusChanged',
{pref: {value: false}, enabled: true});
return flushAsync().then(() => {
// Check that we are off and enabled.
assertFalse(getToggleElement().hasAttribute('disabled'));
assertFalse(getToggleElement().hasAttribute('checked'));
// Disable the autoplay status toggle.
webUIListenerCallback(
'onBlockAutoplayStatusChanged',
{pref: {value: false}, enabled: false});
return flushAsync().then(() => {
// Check that we are off and disabled.
assertTrue(getToggleElement().hasAttribute('disabled'));
assertFalse(getToggleElement().hasAttribute('checked'));
});
});
});
});
test('Hidden', () => {
assertTrue(loadTimeData.getBoolean('enableBlockAutoplayContentSetting'));
assertFalse(getToggleElement().hidden);
loadTimeData.overrideValues({enableBlockAutoplayContentSetting: false});
page.remove();
page = /** @type {!SettingsPrivacyPageElement} */
(document.createElement('settings-privacy-page'));
document.body.appendChild(page);
return flushAsync().then(() => {
assertFalse(loadTimeData.getBoolean('enableBlockAutoplayContentSetting'));
assertTrue(getToggleElement().hidden);
});
});
test('Click', () => {
assertTrue(getToggleElement().hasAttribute('disabled'));
assertFalse(getToggleElement().hasAttribute('checked'));
webUIListenerCallback(
'onBlockAutoplayStatusChanged', {pref: {value: true}, enabled: true});
return flushAsync().then(() => {
// Check that we are on and enabled.
assertFalse(getToggleElement().hasAttribute('disabled'));
assertTrue(getToggleElement().hasAttribute('checked'));
// Click on the toggle and wait for the proxy to be called.
getToggleElement().click();
return testBrowserProxy.whenCalled('setBlockAutoplayEnabled')
.then((enabled) => {
assertFalse(enabled);
});
});
});
});
suite('HappinessTrackingSurveys', function() {
/** @type {!TestHatsBrowserProxy} */
let testHatsBrowserProxy;
/** @type {!SettingsPrivacyPageElement} */
let page;
setup(function() {
testHatsBrowserProxy = new TestHatsBrowserProxy();
HatsBrowserProxyImpl.instance_ = testHatsBrowserProxy;
document.body.innerHTML = '';
page = /** @type {!SettingsPrivacyPageElement} */
(document.createElement('settings-privacy-page'));
// Initialize the privacy page pref. Security page manually expands
// the initially selected safe browsing option so the pref object
// needs to be defined.
page.prefs = {
generated: {
safe_browsing: {
type: chrome.settingsPrivate.PrefType.NUMBER,
value: SafeBrowsingSetting.STANDARD,
},
cookie_session_only: {value: false},
cookie_primary_setting:
{type: chrome.settingsPrivate.PrefType.NUMBER, value: 0},
password_manager_leak_detection: {value: false},
},
profile: {password_manager_leak_detection: {value: false}},
dns_over_https:
{mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}},
};
document.body.appendChild(page);
return flushTasks();
});
teardown(function() {
page.remove();
});
test('ClearBrowsingDataTrigger', function() {
page.$$('#clearBrowsingData').click();
return testHatsBrowserProxy.whenCalled('tryShowSurvey');
});
test('CookiesTrigger', function() {
page.$$('#cookiesLinkRow').click();
return testHatsBrowserProxy.whenCalled('tryShowSurvey');
});
test('SecurityTrigger', function() {
page.$$('#securityLinkRow').click();
return testHatsBrowserProxy.whenCalled('tryShowSurvey');
});
test('PermissionsTrigger', function() {
page.$$('#permissionsLinkRow').click();
return testHatsBrowserProxy.whenCalled('tryShowSurvey');
});
});