blob: 032c74fba563ee928ce8bfb555f72085995ff18f [file] [log] [blame]
// Copyright 2021 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 {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CookiePrimarySetting, PrivacyReviewHistorySyncFragmentElement, PrivacyReviewStep, PrivacyReviewWelcomeFragmentElement, SafeBrowsingSetting, SettingsPrivacyReviewPageElement, SettingsRadioGroupElement} from 'chrome://settings/lazy_load.js';
import {Router, routes, StatusAction, SyncBrowserProxyImpl, SyncPrefs, syncPrefsIndividualDataTypes} from 'chrome://settings/settings.js';
import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
import {eventToPromise, flushTasks, isChildVisible} from 'chrome://webui-test/test_util.js';
import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js';
// clang-format on
/* Maximum number of steps in the privacy review, excluding the welcome and
* completion steps.
*/
const PRIVACY_REVIEW_STEPS = 4;
suite('PrivacyReviewPage', function() {
let page: SettingsPrivacyReviewPageElement;
let syncBrowserProxy: TestSyncBrowserProxy;
let shouldShowCookiesCard: boolean;
let shouldShowSafeBrowsingCard: boolean;
setup(function() {
syncBrowserProxy = new TestSyncBrowserProxy();
syncBrowserProxy.testSyncStatus = null;
SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
document.body.innerHTML = '';
page = document.createElement('settings-privacy-review-page');
page.disableAnimationsForTesting();
page.prefs = {
privacy_guide: {
viewed: {
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
},
generated: {
cookie_primary_setting: {
type: chrome.settingsPrivate.PrefType.NUMBER,
value: CookiePrimarySetting.BLOCK_THIRD_PARTY,
},
safe_browsing: {
type: chrome.settingsPrivate.PrefType.NUMBER,
value: SafeBrowsingSetting.STANDARD,
},
},
};
document.body.appendChild(page);
shouldShowCookiesCard = true;
shouldShowSafeBrowsingCard = true;
// Simulates the route of the user entering the privacy review from the S&P
// settings. This is necessary as tests seem to by default define the
// previous route as Settings "/". On a back navigation, "/" matches the
// criteria for a valid Settings parent no matter how deep the subpage is in
// the Settings tree. This would always navigate to Settings "/" instead of
// to the parent of the current subpage.
Router.getInstance().navigateTo(routes.PRIVACY);
return flushTasks();
});
teardown(function() {
page.remove();
// Reset route to default. The route is updated as we navigate through the
// cards, but the browser instance is shared among the tests, so otherwise
// the next test will be initialized to the same card as the previous test.
Router.getInstance().navigateTo(routes.BASIC);
});
/**
* Returns a new promise that resolves after a window 'popstate' event.
*/
function whenPopState(causeEvent: () => void): Promise<void> {
const promise = eventToPromise('popstate', window);
causeEvent();
return promise;
}
/**
* Equivalent of the user manually navigating to the corresponding step via
* typing the URL and step parameter in the Omnibox.
*/
function navigateToStep(step: PrivacyReviewStep) {
Router.getInstance().navigateTo(
routes.PRIVACY_REVIEW,
/* opt_dynamicParameters */ new URLSearchParams('step=' + step));
flush();
}
function assertQueryParameter(step: PrivacyReviewStep) {
assertEquals(step, Router.getInstance().getQueryParameters().get('step'));
}
/**
* Fire a sync status changed event and flush the UI.
*/
function setSyncEnabled(syncOn: boolean) {
syncBrowserProxy.testSyncStatus = {
signedIn: syncOn,
hasError: false,
statusAction: StatusAction.NO_ACTION,
};
webUIListenerCallback(
'sync-status-changed', syncBrowserProxy.testSyncStatus);
flush();
}
function shouldShowHistorySyncCard(): boolean {
return !syncBrowserProxy.testSyncStatus ||
!!syncBrowserProxy.testSyncStatus.signedIn;
}
/**
* Set the cookies setting for the privacy review.
*/
function setCookieSetting(setting: CookiePrimarySetting) {
page.set('prefs.generated.cookie_primary_setting', {
type: chrome.settingsPrivate.PrefType.NUMBER,
value: setting,
});
shouldShowCookiesCard =
setting === CookiePrimarySetting.BLOCK_THIRD_PARTY ||
setting === CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO;
flush();
}
/**
* Set the safe browsing setting for the privacy review.
*/
function setSafeBrowsingSetting(setting: SafeBrowsingSetting) {
page.set('prefs.generated.safe_browsing', {
type: chrome.settingsPrivate.PrefType.NUMBER,
value: setting,
});
shouldShowSafeBrowsingCard = setting === SafeBrowsingSetting.ENHANCED ||
setting === SafeBrowsingSetting.STANDARD;
flush();
}
/**
* Fire a sign in status change event and flush the UI.
*/
function setSignInState(signedIn: boolean) {
const event = {
signedIn: signedIn,
};
webUIListenerCallback('update-sync-state', event);
flush();
}
type AssertCardComponentsVisibleParams = {
isSettingFooterVisibleExpected?: boolean,
isBackButtonVisibleExpected?: boolean,
isWelcomeFragmentVisibleExpected?: boolean,
isCompletionFragmentVisibleExpected?: boolean,
isMsbbFragmentVisibleExpected?: boolean,
isClearOnExitFragmentVisibleExpected?: boolean,
isHistorySyncFragmentVisibleExpected?: boolean,
isSafeBrowsingFragmentVisibleExpected?: boolean,
isCookiesFragmentVisibleExpected?: boolean,
};
function assertCardComponentsVisible({
isSettingFooterVisibleExpected,
isBackButtonVisibleExpected,
isWelcomeFragmentVisibleExpected,
isCompletionFragmentVisibleExpected,
isMsbbFragmentVisibleExpected,
isClearOnExitFragmentVisibleExpected,
isHistorySyncFragmentVisibleExpected,
isSafeBrowsingFragmentVisibleExpected,
isCookiesFragmentVisibleExpected,
}: AssertCardComponentsVisibleParams) {
assertEquals(
!!isSettingFooterVisibleExpected,
isChildVisible(page, '#settingFooter'));
if (isSettingFooterVisibleExpected) {
const backButtonVisibility =
getComputedStyle(
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!)
.visibility;
assertEquals(
isBackButtonVisibleExpected ? 'visible' : 'hidden',
backButtonVisibility);
}
assertEquals(
!!isWelcomeFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.WELCOME));
assertEquals(
!!isCompletionFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.COMPLETION));
assertEquals(
!!isMsbbFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.MSBB));
assertEquals(
!!isClearOnExitFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.CLEAR_ON_EXIT));
assertEquals(
!!isHistorySyncFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.HISTORY_SYNC));
assertEquals(
!!isSafeBrowsingFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.SAFE_BROWSING));
assertEquals(
!!isCookiesFragmentVisibleExpected,
isChildVisible(page, '#' + PrivacyReviewStep.COOKIES));
}
/**
* @return The expected total number of active cards for the step indicator.
*/
function getExpectedNumberOfActiveCards() {
let numSteps = PRIVACY_REVIEW_STEPS;
if (!shouldShowHistorySyncCard()) {
numSteps -= 1;
}
if (!shouldShowCookiesCard) {
numSteps -= 1;
}
if (!shouldShowSafeBrowsingCard) {
numSteps -= 1;
}
return numSteps;
}
function assertStepIndicatorModel(activeIndex: number) {
const model = page.computeStepIndicatorModel();
assertEquals(activeIndex, model.active);
assertEquals(getExpectedNumberOfActiveCards(), model.total);
}
function assertWelcomeCardVisible() {
assertQueryParameter(PrivacyReviewStep.WELCOME);
assertCardComponentsVisible({
isWelcomeFragmentVisibleExpected: true,
});
}
function assertCompletionCardVisible() {
assertQueryParameter(PrivacyReviewStep.COMPLETION);
assertCardComponentsVisible({
isCompletionFragmentVisibleExpected: true,
});
}
function assertMsbbCardVisible() {
assertQueryParameter(PrivacyReviewStep.MSBB);
assertCardComponentsVisible({
isSettingFooterVisibleExpected: true,
isBackButtonVisibleExpected: true,
isMsbbFragmentVisibleExpected: true,
});
assertStepIndicatorModel(0);
}
function assertHistorySyncCardVisible() {
assertQueryParameter(PrivacyReviewStep.HISTORY_SYNC);
assertCardComponentsVisible({
isSettingFooterVisibleExpected: true,
isBackButtonVisibleExpected: true,
isHistorySyncFragmentVisibleExpected: true,
});
assertStepIndicatorModel(1);
}
function assertSafeBrowsingCardVisible() {
assertQueryParameter(PrivacyReviewStep.SAFE_BROWSING);
assertCardComponentsVisible({
isSettingFooterVisibleExpected: true,
isBackButtonVisibleExpected: true,
isSafeBrowsingFragmentVisibleExpected: true,
});
assertStepIndicatorModel(shouldShowHistorySyncCard() ? 2 : 1);
}
function assertCookiesCardVisible() {
assertQueryParameter(PrivacyReviewStep.COOKIES);
assertCardComponentsVisible({
isSettingFooterVisibleExpected: true,
isBackButtonVisibleExpected: true,
isCookiesFragmentVisibleExpected: true,
});
let activeIndex = 3;
if (!shouldShowHistorySyncCard()) {
activeIndex -= 1;
}
if (!shouldShowSafeBrowsingCard) {
activeIndex -= 1;
}
assertStepIndicatorModel(activeIndex);
}
test('startPrivacyReview', function() {
// Navigating to the privacy review without a step parameter navigates to
// the welcome card.
Router.getInstance().navigateTo(routes.PRIVACY_REVIEW);
flush();
assertWelcomeCardVisible();
assertTrue(page.getPref('privacy_guide.viewed').value);
});
test('welcomeForwardNavigation', function() {
// Navigating to the privacy review without a step parameter navigates to
// the welcome card.
Router.getInstance().navigateTo(routes.PRIVACY_REVIEW);
flush();
assertWelcomeCardVisible();
const welcomeFragment =
page.shadowRoot!.querySelector<PrivacyReviewWelcomeFragmentElement>(
'#' + PrivacyReviewStep.WELCOME)!;
welcomeFragment.$.startButton.click();
flush();
assertMsbbCardVisible();
setSyncEnabled(true);
assertMsbbCardVisible();
});
test('msbbBackNavigation', function() {
navigateToStep(PrivacyReviewStep.MSBB);
assertMsbbCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
flush();
assertWelcomeCardVisible();
});
test('msbbForwardNavigationSyncOn', function() {
navigateToStep(PrivacyReviewStep.MSBB);
setSyncEnabled(true);
assertMsbbCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
assertHistorySyncCardVisible();
});
test('msbbForwardNavigationSyncOff', function() {
navigateToStep(PrivacyReviewStep.MSBB);
setSyncEnabled(false);
assertMsbbCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
assertSafeBrowsingCardVisible();
});
test('historySyncBackNavigation', function() {
navigateToStep(PrivacyReviewStep.HISTORY_SYNC);
setSyncEnabled(true);
assertHistorySyncCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
assertMsbbCardVisible();
});
test('historySyncNavigatesAwayOnSyncOff', function() {
navigateToStep(PrivacyReviewStep.HISTORY_SYNC);
setSyncEnabled(true);
assertHistorySyncCardVisible();
// User disables sync while history sync card is shown.
setSyncEnabled(false);
assertSafeBrowsingCardVisible();
});
test('historySyncNotReachableWhenSyncOff', function() {
navigateToStep(PrivacyReviewStep.HISTORY_SYNC);
setSyncEnabled(false);
assertSafeBrowsingCardVisible();
});
test(
'historySyncCardForwardNavigationShouldShowSafeBrowsingCard', function() {
navigateToStep(PrivacyReviewStep.HISTORY_SYNC);
setSyncEnabled(true);
setSafeBrowsingSetting(SafeBrowsingSetting.ENHANCED);
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY);
assertHistorySyncCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
assertSafeBrowsingCardVisible();
});
test(
'historySyncCardForwardNavigationShouldHideSafeBrowsingCard', function() {
navigateToStep(PrivacyReviewStep.HISTORY_SYNC);
setSyncEnabled(true);
setSafeBrowsingSetting(SafeBrowsingSetting.DISABLED);
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY);
assertHistorySyncCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
assertCookiesCardVisible();
});
test('safeBrowsingCardBackNavigationSyncOn', function() {
navigateToStep(PrivacyReviewStep.SAFE_BROWSING);
setSyncEnabled(true);
assertSafeBrowsingCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
assertHistorySyncCardVisible();
});
test('safeBrowsingCardBackNavigationSyncOff', function() {
navigateToStep(PrivacyReviewStep.SAFE_BROWSING);
setSyncEnabled(false);
assertSafeBrowsingCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
assertMsbbCardVisible();
});
test('safeBrowsingCardGetsUpdated', function() {
navigateToStep(PrivacyReviewStep.SAFE_BROWSING);
setSafeBrowsingSetting(SafeBrowsingSetting.ENHANCED);
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY);
assertSafeBrowsingCardVisible();
const radioButtonGroup =
page.shadowRoot!.querySelector('#' + PrivacyReviewStep.SAFE_BROWSING)!
.shadowRoot!.querySelector<SettingsRadioGroupElement>(
'#safeBrowsingRadioGroup')!;
assertEquals(
Number(radioButtonGroup.selected), SafeBrowsingSetting.ENHANCED);
// Changing the safe browsing setting should automatically change the
// selected radio button.
setSafeBrowsingSetting(SafeBrowsingSetting.STANDARD);
assertEquals(
Number(radioButtonGroup.selected), SafeBrowsingSetting.STANDARD);
// Changing the safe browsing setting to a disabled state while shown should
// navigate away from the safe browsing card.
setSafeBrowsingSetting(SafeBrowsingSetting.DISABLED);
assertCookiesCardVisible();
});
test('safeBrowsingCardForwardNavigationShouldShowCookiesCard', function() {
navigateToStep(PrivacyReviewStep.SAFE_BROWSING);
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY);
assertSafeBrowsingCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
flush();
assertCookiesCardVisible();
});
test('safeBrowsingCardForwardNavigationShouldHideCookiesCard', function() {
navigateToStep(PrivacyReviewStep.SAFE_BROWSING);
setCookieSetting(CookiePrimarySetting.ALLOW_ALL);
assertSafeBrowsingCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
flush();
assertCompletionCardVisible();
});
test('cookiesCardBackNavigationShouldShowSafeBrowsingCard', function() {
navigateToStep(PrivacyReviewStep.COOKIES);
setSyncEnabled(true);
setSafeBrowsingSetting(SafeBrowsingSetting.STANDARD);
assertCookiesCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
flush();
assertSafeBrowsingCardVisible();
});
test('cookiesCardBackNavigationShouldHideSafeBrowsingCard', function() {
navigateToStep(PrivacyReviewStep.COOKIES);
setSyncEnabled(true);
setSafeBrowsingSetting(SafeBrowsingSetting.DISABLED);
assertCookiesCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
flush();
assertHistorySyncCardVisible();
});
test('cookiesCardForwardNavigation', function() {
navigateToStep(PrivacyReviewStep.COOKIES);
assertCookiesCardVisible();
page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
flush();
assertCompletionCardVisible();
});
test('cookiesCardGetsUpdated', function() {
navigateToStep(PrivacyReviewStep.COOKIES);
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY);
assertCookiesCardVisible();
const radioButtonGroup =
page.shadowRoot!.querySelector('#' + PrivacyReviewStep.COOKIES)!
.shadowRoot!.querySelector<SettingsRadioGroupElement>(
'#cookiesRadioGroup')!;
assertEquals(
Number(radioButtonGroup.selected),
CookiePrimarySetting.BLOCK_THIRD_PARTY);
// Changing the cookie setting should automatically change the selected
// radio button.
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO);
assertEquals(
Number(radioButtonGroup.selected),
CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO);
// Changing the cookie setting to a non-third-party state while shown should
// navigate away from the cookies card.
setCookieSetting(CookiePrimarySetting.ALLOW_ALL);
assertCompletionCardVisible();
});
test('completionCardBackNavigation', function() {
navigateToStep(PrivacyReviewStep.COMPLETION);
setCookieSetting(CookiePrimarySetting.BLOCK_THIRD_PARTY);
assertCompletionCardVisible();
const completionFragment =
page.shadowRoot!.querySelector('#' + PrivacyReviewStep.COMPLETION)!;
completionFragment.shadowRoot!.querySelector<HTMLElement>(
'#backButton')!.click();
flush();
assertCookiesCardVisible();
});
test('completionCardBackToSettingsNavigation', function() {
navigateToStep(PrivacyReviewStep.COMPLETION);
assertCompletionCardVisible();
return whenPopState(function() {
const completionFragment = page.shadowRoot!.querySelector(
'#' + PrivacyReviewStep.COMPLETION)!;
completionFragment.shadowRoot!
.querySelector<HTMLElement>('#leaveButton')!.click();
})
.then(function() {
assertEquals(routes.PRIVACY, Router.getInstance().getCurrentRoute());
});
});
test('completionCardGetsUpdated', function() {
navigateToStep(PrivacyReviewStep.COMPLETION);
setSignInState(true);
assertCompletionCardVisible();
const completionFragment =
page.shadowRoot!.querySelector('#' + PrivacyReviewStep.COMPLETION)!;
assertTrue(isChildVisible(completionFragment, '#privacySandboxRow'));
assertTrue(isChildVisible(completionFragment, '#waaRow'));
// Sign the user out and expect the waa row to no longer be visible.
setSignInState(false);
assertTrue(isChildVisible(completionFragment, '#privacySandboxRow'));
assertFalse(isChildVisible(completionFragment, '#waaRow'));
});
});
suite('HistorySyncFragment', function() {
let page: PrivacyReviewHistorySyncFragmentElement;
let syncBrowserProxy: TestSyncBrowserProxy;
setup(function() {
syncBrowserProxy = new TestSyncBrowserProxy();
SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
document.body.innerHTML = '';
page = document.createElement('privacy-review-history-sync-fragment');
document.body.appendChild(page);
return flushTasks();
});
teardown(function() {
page.remove();
});
function setSyncStatus({
syncAllDataTypes,
typedUrlsSynced,
passwordsSynced,
}: {
syncAllDataTypes: boolean,
typedUrlsSynced: boolean,
passwordsSynced: boolean,
}) {
if (syncAllDataTypes) {
assertTrue(typedUrlsSynced);
assertTrue(passwordsSynced);
}
const event: SyncPrefs = {} as unknown as SyncPrefs;
for (const datatype of syncPrefsIndividualDataTypes) {
(event as unknown as {[key: string]: boolean})[datatype] = true;
}
// Overwrite datatypes needed in tests.
event.syncAllDataTypes = syncAllDataTypes;
event.typedUrlsSynced = typedUrlsSynced;
event.passwordsSynced = passwordsSynced;
webUIListenerCallback('sync-prefs-changed', event);
flush();
}
async function assertBrowserProxyCall({
syncAllDatatypesExpected,
typedUrlsSyncedExpected,
}: {
syncAllDatatypesExpected: boolean,
typedUrlsSyncedExpected: boolean,
}) {
const syncPrefs = await syncBrowserProxy.whenCalled('setSyncDatatypes');
assertEquals(syncAllDatatypesExpected, syncPrefs.syncAllDataTypes);
assertEquals(typedUrlsSyncedExpected, syncPrefs.typedUrlsSynced);
syncBrowserProxy.resetResolver('setSyncDatatypes');
}
test('syncAllOnDisableReenableHistorySync', async function() {
setSyncStatus({
syncAllDataTypes: true,
typedUrlsSynced: true,
passwordsSynced: true,
});
page.$.historyToggle.click();
await assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: false,
});
// Re-enabling history sync re-enables sync all if sync all was on before
// and if all sync datatypes are still enabled.
page.$.historyToggle.click();
return assertBrowserProxyCall({
syncAllDatatypesExpected: true,
typedUrlsSyncedExpected: true,
});
});
test('syncAllOnDisableReenableHistorySyncOtherDatatypeOff', async function() {
setSyncStatus({
syncAllDataTypes: true,
typedUrlsSynced: true,
passwordsSynced: true,
});
page.$.historyToggle.click();
await assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: false,
});
// The user disables another datatype in a different tab.
setSyncStatus({
syncAllDataTypes: false,
typedUrlsSynced: false,
passwordsSynced: false,
});
// Re-enabling history sync in the privacy review doesn't re-enable sync
// all.
page.$.historyToggle.click();
return assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: true,
});
});
test('syncAllOnDisableReenableHistorySyncWithNavigation', async function() {
setSyncStatus({
syncAllDataTypes: true,
typedUrlsSynced: true,
passwordsSynced: true,
});
page.$.historyToggle.click();
await assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: false,
});
// The user navigates to another card, then back to the history sync card.
Router.getInstance().navigateTo(
routes.PRIVACY_REVIEW,
/* opt_dynamicParameters */ new URLSearchParams('step=msbb'));
Router.getInstance().navigateTo(
routes.PRIVACY_REVIEW,
/* opt_dynamicParameters */ new URLSearchParams('step=historySync'));
// Re-enabling history sync in the privacy review doesn't re-enable sync
// all.
page.$.historyToggle.click();
return assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: true,
});
});
test('syncAllOffDisableReenableHistorySync', async function() {
setSyncStatus({
syncAllDataTypes: false,
typedUrlsSynced: true,
passwordsSynced: true,
});
page.$.historyToggle.click();
await assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: false,
});
// Re-enabling history sync doesn't re-enable sync all if sync all wasn't on
// originally.
page.$.historyToggle.click();
return assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: true,
});
});
test('syncAllOffEnableHistorySync', function() {
setSyncStatus({
syncAllDataTypes: false,
typedUrlsSynced: false,
passwordsSynced: true,
});
page.$.historyToggle.click();
return assertBrowserProxyCall({
syncAllDatatypesExpected: false,
typedUrlsSyncedExpected: true,
});
});
});