blob: 13be27dfd4449134795c3b2b1b3a9db7e0a3a196 [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.
cr.define('settings_privacy_page', function() {
/**
* @param {!Element} element
* @param {boolean} displayed
*/
function assertVisible(element, displayed) {
assertEquals(
displayed, window.getComputedStyle(element)['display'] != 'none');
}
/** @implements {settings.ClearBrowsingDataBrowserProxy} */
class TestClearBrowsingDataBrowserProxy extends TestBrowserProxy {
constructor() {
super(['initialize', 'clearBrowsingData']);
/**
* The promise to return from |clearBrowsingData|.
* Allows testing code to test what happens after the call is made, and
* before the browser responds.
* @private {?Promise}
*/
this.clearBrowsingDataPromise_ = null;
}
/** @param {!Promise} promise */
setClearBrowsingDataPromise(promise) {
this.clearBrowsingDataPromise_ = promise;
}
/** @override */
clearBrowsingData(dataTypes, timePeriod) {
this.methodCalled('clearBrowsingData', [dataTypes, timePeriod]);
cr.webUIListenerCallback('browsing-data-removing', true);
return this.clearBrowsingDataPromise_ !== null ?
this.clearBrowsingDataPromise_ :
Promise.resolve();
}
/** @override */
initialize() {
this.methodCalled('initialize');
return Promise.resolve(false);
}
}
function getClearBrowsingDataPrefs() {
return {
browser: {
clear_data: {
time_period: {
key: 'browser.clear_data.time_period',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
time_period_basic: {
key: 'browser.clear_data.time_period_basic',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
browsing_history: {
key: 'browser.clear_data.browsing_history',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
cookies: {
key: 'browser.clear_data.cookies',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
cookies_basic: {
key: 'browser.clear_data.cookies_basic',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
cache_basic: {
key: 'browser.clear_data.cache_basic',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
},
last_clear_browsing_data_tab: {
key: 'browser.last_clear_browsing_data_tab',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
}
};
}
function registerNativeCertificateManagerTests() {
suite('NativeCertificateManager', function() {
/** @type {settings.TestPrivacyPageBrowserProxy} */
let testBrowserProxy;
/** @type {SettingsPrivacyPageElement} */
let page;
setup(function() {
testBrowserProxy = new TestPrivacyPageBrowserProxy();
settings.PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy;
PolymerTest.clearBody();
page = document.createElement('settings-privacy-page');
document.body.appendChild(page);
});
teardown(function() {
page.remove();
});
test('NativeCertificateManager', function() {
page.$$('#manageCertificates').click();
return testBrowserProxy.whenCalled('showManageSSLCertificates');
});
});
}
function registerPrivacyPageTests() {
suite('PrivacyPage', function() {
/** @type {SettingsPrivacyPageElement} */
let page;
setup(function() {
page = document.createElement('settings-privacy-page');
page.prefs = {
signin: {
allowed_on_next_startup:
{type: chrome.settingsPrivate.PrefType.BOOLEAN, value: true},
},
};
document.body.appendChild(page);
});
teardown(function() {
page.remove();
});
test('showClearBrowsingDataDialog', function() {
assertFalse(!!page.$$('settings-clear-browsing-data-dialog'));
page.$$('#clearBrowsingData').click();
Polymer.dom.flush();
const dialog = page.$$('settings-clear-browsing-data-dialog');
assertTrue(!!dialog);
// Ensure that the dialog is fully opened before returning from this
// test, otherwise asynchronous code run in attached() can cause flaky
// errors.
return test_util.whenAttributeIs(
dialog.$$('#clearBrowsingDataDialog'), 'open', '');
});
if (!cr.isChromeOS) {
test('signinAllowedToggle', function() {
const toggle = page.$.signinAllowedToggle;
page.syncStatus = {signedIn: false};
// Check initial setup.
assertTrue(toggle.checked);
assertTrue(page.prefs.signin.allowed_on_next_startup.value);
assertFalse(page.$.toast.open);
// When the user is signed out, clicking the toggle should work
// normally and the restart toast should be opened.
toggle.click();
assertFalse(toggle.checked);
assertFalse(page.prefs.signin.allowed_on_next_startup.value);
assertTrue(page.$.toast.open);
// Clicking it again, turns the toggle back on. The toast remains
// open.
toggle.click();
assertTrue(toggle.checked);
assertTrue(page.prefs.signin.allowed_on_next_startup.value);
assertTrue(page.$.toast.open);
// Reset toast.
page.showRestart_ = false;
assertFalse(page.$.toast.open);
page.syncStatus = {signedIn: true};
// When the user is signed in, clicking the toggle should open the
// sign-out dialog.
assertFalse(!!page.$$('settings-signout-dialog'));
toggle.click();
return test_util.eventToPromise('cr-dialog-open', page)
.then(function() {
Polymer.dom.flush();
// The toggle remains on.
assertTrue(toggle.checked);
assertTrue(page.prefs.signin.allowed_on_next_startup.value);
assertFalse(page.$.toast.open);
const signoutDialog = page.$$('settings-signout-dialog');
assertTrue(!!signoutDialog);
assertTrue(signoutDialog.$$('#dialog').open);
// The user clicks cancel.
const cancel = signoutDialog.$$('#disconnectCancel');
cancel.click();
return test_util.eventToPromise('close', signoutDialog);
})
.then(function() {
Polymer.dom.flush();
assertFalse(!!page.$$('settings-signout-dialog'));
// After the dialog is closed, the toggle remains turned on.
assertTrue(toggle.checked);
assertTrue(page.prefs.signin.allowed_on_next_startup.value);
assertFalse(page.$.toast.open);
// The user clicks the toggle again.
toggle.click();
return test_util.eventToPromise('cr-dialog-open', page);
})
.then(function() {
Polymer.dom.flush();
const signoutDialog = page.$$('settings-signout-dialog');
assertTrue(!!signoutDialog);
assertTrue(signoutDialog.$$('#dialog').open);
// The user clicks confirm, which signs them out.
const disconnectConfirm =
signoutDialog.$$('#disconnectConfirm');
disconnectConfirm.click();
return test_util.eventToPromise('close', signoutDialog);
})
.then(function() {
Polymer.dom.flush();
// After the dialog is closed, the toggle is turned off and the
// toast is shown.
assertFalse(toggle.checked);
assertFalse(page.prefs.signin.allowed_on_next_startup.value);
assertTrue(page.$.toast.open);
});
});
}
});
}
function registerClearBrowsingDataTestsDice() {
suite('ClearBrowsingDataDice', function() {
/** @type {settings.TestClearBrowsingDataBrowserProxy} */
let testBrowserProxy;
/** @type {TestSyncBrowserProxy} */
let testSyncBrowserProxy;
/** @type {SettingsClearBrowsingDataDialogElement} */
let element;
suiteSetup(function() {
loadTimeData.overrideValues({
diceEnabled: true,
});
});
setup(function() {
testBrowserProxy = new TestClearBrowsingDataBrowserProxy();
settings.ClearBrowsingDataBrowserProxyImpl.instance_ = testBrowserProxy;
testSyncBrowserProxy = new TestSyncBrowserProxy();
settings.SyncBrowserProxyImpl.instance_ = testSyncBrowserProxy;
PolymerTest.clearBody();
element = document.createElement('settings-clear-browsing-data-dialog');
element.set('prefs', getClearBrowsingDataPrefs());
document.body.appendChild(element);
return testBrowserProxy.whenCalled('initialize').then(() => {
assertTrue(element.$$('#clearBrowsingDataDialog').open);
});
});
teardown(function() {
element.remove();
});
test('ClearBrowsingDataSyncAccountInfoDice', function() {
// Not syncing: the footer is hidden.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: false,
hasError: false,
});
Polymer.dom.flush();
const footer = element.$$('#clearBrowsingDataDialog [slot=footer]');
assertTrue(footer.hidden);
// Syncing: the footer is shown, with the normal sync info.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: false,
});
Polymer.dom.flush();
assertFalse(footer.hidden);
assertVisible(element.$$('#sync-info'), true);
assertVisible(element.$$('#sync-paused-info'), false);
assertVisible(element.$$('#sync-passphrase-error-info'), false);
assertVisible(element.$$('#sync-other-error-info'), false);
// Sync is paused.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.REAUTHENTICATE,
});
Polymer.dom.flush();
assertVisible(element.$$('#sync-info'), false);
assertVisible(element.$$('#sync-paused-info'), true);
assertVisible(element.$$('#sync-passphrase-error-info'), false);
assertVisible(element.$$('#sync-other-error-info'), false);
// Sync passphrase error.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.ENTER_PASSPHRASE,
});
Polymer.dom.flush();
assertVisible(element.$$('#sync-info'), false);
assertVisible(element.$$('#sync-paused-info'), false);
assertVisible(element.$$('#sync-passphrase-error-info'), true);
assertVisible(element.$$('#sync-other-error-info'), false);
// Other sync error.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.NO_ACTION,
});
Polymer.dom.flush();
assertVisible(element.$$('#sync-info'), false);
assertVisible(element.$$('#sync-paused-info'), false);
assertVisible(element.$$('#sync-passphrase-error-info'), false);
assertVisible(element.$$('#sync-other-error-info'), true);
});
test('ClearBrowsingDataPauseSyncDice', function() {
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: false,
});
Polymer.dom.flush();
assertFalse(
element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
const syncInfo = element.$$('#sync-info');
assertVisible(syncInfo, true);
const signoutLink = syncInfo.querySelector('a[href]');
assertTrue(!!signoutLink);
assertEquals(0, testSyncBrowserProxy.getCallCount('pauseSync'));
signoutLink.click();
assertEquals(1, testSyncBrowserProxy.getCallCount('pauseSync'));
});
test('ClearBrowsingDataStartSignInDice', function() {
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.REAUTHENTICATE,
});
Polymer.dom.flush();
assertFalse(
element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
const syncInfo = element.$$('#sync-paused-info');
assertVisible(syncInfo, true);
const signinLink = syncInfo.querySelector('a[href]');
assertTrue(!!signinLink);
assertEquals(0, testSyncBrowserProxy.getCallCount('startSignIn'));
signinLink.click();
assertEquals(1, testSyncBrowserProxy.getCallCount('startSignIn'));
});
test('ClearBrowsingDataHandlePassphraseErrorDice', function() {
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.ENTER_PASSPHRASE,
});
Polymer.dom.flush();
assertFalse(
element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
const syncInfo = element.$$('#sync-passphrase-error-info');
assertVisible(syncInfo, true);
const passphraseLink = syncInfo.querySelector('a[href]');
assertTrue(!!passphraseLink);
passphraseLink.click();
assertEquals(settings.routes.SYNC, settings.getCurrentRoute());
});
});
}
function registerClearBrowsingDataTests() {
suite('ClearBrowsingData', function() {
/** @type {settings.TestClearBrowsingDataBrowserProxy} */
let testBrowserProxy;
/** @type {SettingsClearBrowsingDataDialogElement} */
let element;
suiteSetup(function() {
loadTimeData.overrideValues({
diceEnabled: false,
});
});
setup(function() {
testBrowserProxy = new TestClearBrowsingDataBrowserProxy();
settings.ClearBrowsingDataBrowserProxyImpl.instance_ = testBrowserProxy;
PolymerTest.clearBody();
element = document.createElement('settings-clear-browsing-data-dialog');
element.set('prefs', getClearBrowsingDataPrefs());
document.body.appendChild(element);
return testBrowserProxy.whenCalled('initialize');
});
teardown(function() {
element.remove();
});
test('ClearBrowsingDataTap', function() {
assertTrue(element.$$('#clearBrowsingDataDialog').open);
const cancelButton = element.$$('.cancel-button');
assertTrue(!!cancelButton);
const actionButton = element.$$('.action-button');
assertTrue(!!actionButton);
const spinner = element.$$('paper-spinner-lite');
assertTrue(!!spinner);
// Select a datatype for deletion to enable the clear button.
const cookieCheckbox = element.$$('#cookiesCheckboxBasic');
assertTrue(!!cookieCheckbox);
cookieCheckbox.$.checkbox.click();
assertFalse(cancelButton.disabled);
assertFalse(actionButton.disabled);
assertFalse(spinner.active);
const promiseResolver = new PromiseResolver();
testBrowserProxy.setClearBrowsingDataPromise(promiseResolver.promise);
actionButton.click();
return testBrowserProxy.whenCalled('clearBrowsingData')
.then(function(args) {
const dataTypes = args[0];
const timePeriod = args[1];
assertEquals(1, dataTypes.length);
assertEquals('browser.clear_data.cookies_basic', dataTypes[0]);
assertTrue(element.$$('#clearBrowsingDataDialog').open);
assertTrue(cancelButton.disabled);
assertTrue(actionButton.disabled);
assertTrue(spinner.active);
// Simulate signal from browser indicating that clearing has
// completed.
cr.webUIListenerCallback('browsing-data-removing', false);
promiseResolver.resolve();
// Yields to the message loop to allow the callback chain of the
// Promise that was just resolved to execute before the
// assertions.
})
.then(function() {
assertFalse(element.$$('#clearBrowsingDataDialog').open);
assertFalse(cancelButton.disabled);
assertFalse(actionButton.disabled);
assertFalse(spinner.active);
assertFalse(!!element.$$('#notice'));
});
});
test('ClearBrowsingDataClearButton', function() {
assertTrue(element.$$('#clearBrowsingDataDialog').open);
const actionButton = element.$$('.action-button');
assertTrue(!!actionButton);
const cookieCheckboxBasic = element.$$('#cookiesCheckboxBasic');
assertTrue(!!cookieCheckboxBasic);
const basicTab = element.$$('#basicTabTitle');
assertTrue(!!basicTab);
const advancedTab = element.$$('#advancedTabTitle');
assertTrue(!!advancedTab);
// Initially the button is disabled because all checkboxes are off.
assertTrue(actionButton.disabled);
// The button gets enabled if any checkbox is selected.
cookieCheckboxBasic.$.checkbox.click();
assertTrue(cookieCheckboxBasic.checked);
assertFalse(actionButton.disabled);
// Switching to advanced disables the button.
advancedTab.click();
assertTrue(actionButton.disabled);
// Switching back enables it again.
basicTab.click();
assertFalse(actionButton.disabled);
});
test('showHistoryDeletionDialog', function() {
assertTrue(element.$$('#clearBrowsingDataDialog').open);
const actionButton = element.$$('.action-button');
assertTrue(!!actionButton);
// Select a datatype for deletion to enable the clear button.
const cookieCheckbox = element.$$('#cookiesCheckboxBasic');
assertTrue(!!cookieCheckbox);
cookieCheckbox.$.checkbox.click();
assertFalse(actionButton.disabled);
const promiseResolver = new PromiseResolver();
testBrowserProxy.setClearBrowsingDataPromise(promiseResolver.promise);
actionButton.click();
return testBrowserProxy.whenCalled('clearBrowsingData')
.then(function() {
// Passing showNotice = true should trigger the notice about other
// forms of browsing history to open, and the dialog to stay open.
promiseResolver.resolve(true /* showNotice */);
// Yields to the message loop to allow the callback chain of the
// Promise that was just resolved to execute before the
// assertions.
})
.then(function() {
Polymer.dom.flush();
const notice = element.$$('#notice');
assertTrue(!!notice);
const noticeActionButton = notice.$$('.action-button');
assertTrue(!!noticeActionButton);
assertTrue(element.$$('#clearBrowsingDataDialog').open);
assertTrue(notice.$$('#dialog').open);
noticeActionButton.click();
return new Promise(function(resolve, reject) {
// Tapping the action button will close the notice. Move to the
// end of the message loop to allow the closing event to
// propagate to the parent dialog. The parent dialog should
// subsequently close as well.
setTimeout(function() {
const notice = element.$$('#notice');
assertFalse(!!notice);
assertFalse(element.$$('#clearBrowsingDataDialog').open);
resolve();
}, 0);
});
});
});
test('Counters', function() {
assertTrue(element.$$('#clearBrowsingDataDialog').open);
const checkbox = element.$$('#cacheCheckboxBasic');
assertEquals('browser.clear_data.cache_basic', checkbox.pref.key);
// Simulate a browsing data counter result for history. This checkbox's
// sublabel should be updated.
cr.webUIListenerCallback(
'update-counter-text', checkbox.pref.key, 'result');
assertEquals('result', checkbox.subLabel);
});
test('history rows are hidden for supervised users', function() {
assertFalse(loadTimeData.getBoolean('isSupervised'));
assertFalse(element.$$('#browsingCheckbox').hidden);
assertFalse(element.$$('#browsingCheckboxBasic').hidden);
assertFalse(element.$$('#downloadCheckbox').hidden);
element.remove();
testBrowserProxy.reset();
loadTimeData.overrideValues({isSupervised: true});
element = document.createElement('settings-clear-browsing-data-dialog');
document.body.appendChild(element);
Polymer.dom.flush();
return testBrowserProxy.whenCalled('initialize').then(function() {
assertTrue(element.$$('#browsingCheckbox').hidden);
assertTrue(element.$$('#browsingCheckboxBasic').hidden);
assertTrue(element.$$('#downloadCheckbox').hidden);
});
});
// When Dice is disabled, the footer is never shown.
test('ClearBrowsingDataSyncAccountInfo', function() {
assertTrue(element.$$('#clearBrowsingDataDialog').open);
// Not syncing.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: false,
hasError: false,
});
Polymer.dom.flush();
assertTrue(element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
// Syncing.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: false,
});
Polymer.dom.flush();
assertTrue(element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
// Sync passphrase error.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.ENTER_PASSPHRASE,
});
Polymer.dom.flush();
assertTrue(element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
// Other sync error.
cr.webUIListenerCallback('sync-status-changed', {
signedIn: true,
hasError: true,
statusAction: settings.StatusAction.NO_ACTION,
});
Polymer.dom.flush();
assertTrue(element.$$('#clearBrowsingDataDialog [slot=footer]').hidden);
});
});
}
function registerPrivacyPageSoundTests() {
suite('PrivacyPageSound', function() {
/** @type {settings.TestPrivacyPageBrowserProxy} */
let testBrowserProxy;
/** @type {SettingsPrivacyPageElement} */
let page;
function flushAsync() {
Polymer.dom.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({
enableSoundContentSetting: true,
enableBlockAutoplayContentSetting: true
});
testBrowserProxy = new TestPrivacyPageBrowserProxy();
settings.PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy;
PolymerTest.clearBody();
settings.router.navigateTo(settings.routes.SITE_SETTINGS_SOUND);
page = document.createElement('settings-privacy-page');
document.body.appendChild(page);
return flushAsync();
});
teardown(() => {
page.remove();
});
test('UpdateStatus', () => {
assertTrue(getToggleElement().hasAttribute('disabled'));
assertFalse(getToggleElement().hasAttribute('checked'));
cr.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.
cr.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.
cr.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 = 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'));
cr.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);
});
});
});
});
}
if (cr.isMac || cr.isWindows)
registerNativeCertificateManagerTests();
if (!cr.isChromeOS)
registerClearBrowsingDataTestsDice();
registerClearBrowsingDataTests();
registerPrivacyPageTests();
registerPrivacyPageSoundTests();
});