blob: 221db0a16e0e85734d6f92dbfab33a14a42aefcb [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// 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.js';
import type {NotificationsPageElement} from 'chrome://settings/lazy_load.js';
import {ContentSetting, ContentSettingsTypes, SiteSettingsBrowserProxyImpl, SettingsState, SafetyHubBrowserProxyImpl, SafetyHubEvent} from 'chrome://settings/lazy_load.js';
import type {SettingsPrefsElement} from 'chrome://settings/settings.js';
import {CrSettingsPrefs, loadTimeData, resetRouterForTesting, resetPageVisibilityForTesting} from 'chrome://settings/settings.js';
import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
import {isChildVisible, isVisible} from 'chrome://webui-test/test_util.js';
import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
import {TestSafetyHubBrowserProxy} from './test_safety_hub_browser_proxy.js';
import {TestSiteSettingsBrowserProxy} from './test_site_settings_browser_proxy.js';
import type {SiteSettingsPref} from './test_util.js';
import {createContentSettingTypeToValuePair, createDefaultContentSetting, createSiteSettingsPrefs} from './test_util.js';
// clang-format on
function createPref(
category: ContentSettingsTypes,
contentSetting: ContentSetting): SiteSettingsPref {
return createSiteSettingsPrefs(
[
createContentSettingTypeToValuePair(
category, createDefaultContentSetting({
setting: contentSetting,
})),
],
[]);
}
suite(`NotificationsPage`, function() {
let page: NotificationsPageElement;
let settingsPrefs: SettingsPrefsElement;
let siteSettingsBrowserProxy: TestSiteSettingsBrowserProxy;
suiteSetup(function() {
settingsPrefs = document.createElement('settings-prefs');
return CrSettingsPrefs.initialized;
});
function createPage() {
page = document.createElement('settings-notifications-page');
page.prefs = settingsPrefs.prefs!;
document.body.appendChild(page);
return flushTasks();
}
setup(function() {
siteSettingsBrowserProxy = new TestSiteSettingsBrowserProxy();
SiteSettingsBrowserProxyImpl.setInstance(siteSettingsBrowserProxy);
document.body.innerHTML = window.trustedTypes!.emptyHTML;
return createPage();
});
teardown(function() {
page.remove();
});
test('NotificationPage', function() {
const notificationRadioGroup =
page.shadowRoot!.querySelector('#notificationRadioGroup');
assertTrue(!!notificationRadioGroup);
const categorySettingExceptions =
page.shadowRoot!.querySelector('category-setting-exceptions');
assertTrue(!!categorySettingExceptions);
assertTrue(isVisible(categorySettingExceptions));
assertEquals(
ContentSettingsTypes.NOTIFICATIONS, categorySettingExceptions.category);
});
test('notificationCPSS', async function() {
siteSettingsBrowserProxy.setPrefs(
createPref(ContentSettingsTypes.NOTIFICATIONS, ContentSetting.ASK));
const cpssRadioGroup =
page.shadowRoot!.querySelector('settings-radio-group');
assertTrue(!!cpssRadioGroup);
const radioGroup = page.shadowRoot!.querySelector<HTMLElement>(
'settings-category-default-radio-group');
assertTrue(!!radioGroup);
assertTrue(isVisible(radioGroup));
assertTrue(isVisible(cpssRadioGroup));
const blockNotification = radioGroup.shadowRoot!.querySelector<HTMLElement>(
'#disabledRadioOption');
assertTrue(!!blockNotification);
blockNotification.click();
await flushTasks();
assertFalse(isVisible(cpssRadioGroup));
assertEquals(
SettingsState.BLOCK, page.get('prefs.generated.notification.value'));
const allowNotification = radioGroup.shadowRoot!.querySelector<HTMLElement>(
'#enabledRadioOption');
assertTrue(!!allowNotification);
allowNotification.click();
await flushTasks();
assertTrue(isVisible(cpssRadioGroup));
assertEquals(
SettingsState.CPSS, page.get('prefs.generated.notification.value'));
});
});
// TODO(crbug.com/340743074): Remove tests after
// `PermissionSiteSettingsRadioButton` launched.
suite(`NotificationsPageWithNestedRadioButton`, function() {
let page: NotificationsPageElement;
let settingsPrefs: SettingsPrefsElement;
let siteSettingsBrowserProxy: TestSiteSettingsBrowserProxy;
suiteSetup(function() {
loadTimeData.overrideValues({
enablePermissionSiteSettingsRadioButton: false,
});
settingsPrefs = document.createElement('settings-prefs');
return CrSettingsPrefs.initialized;
});
function createPage() {
page = document.createElement('settings-notifications-page');
page.prefs = settingsPrefs.prefs!;
document.body.appendChild(page);
return flushTasks();
}
setup(function() {
siteSettingsBrowserProxy = new TestSiteSettingsBrowserProxy();
SiteSettingsBrowserProxyImpl.setInstance(siteSettingsBrowserProxy);
document.body.innerHTML = window.trustedTypes!.emptyHTML;
return createPage();
});
teardown(function() {
page.remove();
});
test('NotificationPage', function() {
const notificationRadioGroup =
page.shadowRoot!.querySelector('#notificationRadioGroup');
assertTrue(!!notificationRadioGroup);
const categorySettingExceptions =
page.shadowRoot!.querySelector('category-setting-exceptions');
assertTrue(!!categorySettingExceptions);
assertTrue(isVisible(categorySettingExceptions));
assertEquals(
ContentSettingsTypes.NOTIFICATIONS, categorySettingExceptions.category);
});
test('notificationCPSS', async function() {
siteSettingsBrowserProxy.setPrefs(
createPref(ContentSettingsTypes.NOTIFICATIONS, ContentSetting.ASK));
assertTrue(isChildVisible(page, '#notificationRadioGroup'));
const cpssRadioGroup =
page.shadowRoot!.querySelector('#notificationCpssRadioGroup');
assertTrue(!!cpssRadioGroup);
assertTrue(isVisible(cpssRadioGroup));
const blockNotification =
page.shadowRoot!.querySelector<HTMLElement>('#notificationBlock');
assertTrue(!!blockNotification);
blockNotification.click();
await flushTasks();
assertFalse(isVisible(cpssRadioGroup));
const allowNotification = page.shadowRoot!.querySelector<HTMLElement>(
'#notificationAskRadioButton');
assertTrue(!!allowNotification);
allowNotification.click();
await flushTasks();
assertTrue(isVisible(cpssRadioGroup));
});
});
suite('NotificationPermissionReview', function() {
let page: NotificationsPageElement;
let siteSettingsBrowserProxy: TestSafetyHubBrowserProxy;
const oneElementMockData = [{
origin: 'www.example.com',
notificationInfoString: 'About 4 notifications a day',
}];
setup(function() {
document.body.innerHTML = window.trustedTypes!.emptyHTML;
siteSettingsBrowserProxy = new TestSafetyHubBrowserProxy();
SafetyHubBrowserProxyImpl.setInstance(siteSettingsBrowserProxy);
// return createPage();
});
teardown(function() {
page.remove();
});
function createPage() {
page = document.createElement('settings-notifications-page');
document.body.appendChild(page);
return flushTasks();
}
test('InvisibleWhenGuestMode', async function() {
loadTimeData.overrideValues({isGuest: true});
resetPageVisibilityForTesting();
resetRouterForTesting();
await createPage();
// The UI should remain invisible even when there's an event that the
// notification permissions may have changed.
webUIListenerCallback(
SafetyHubEvent.NOTIFICATION_PERMISSIONS_MAYBE_CHANGED,
oneElementMockData);
await flushTasks();
assertFalse(isChildVisible(page, '#safetyHubEntryPoint'));
// Set guest mode back to false.
loadTimeData.overrideValues({isGuest: false});
resetPageVisibilityForTesting();
resetRouterForTesting();
});
test('VisibilityWithChangingPermissionList', async function() {
// The element is not visible when there is nothing to review.
await createPage();
assertFalse(isChildVisible(page, '#safetyHubEntryPoint'));
// The element becomes visible if the list of permissions is no longer
// empty.
webUIListenerCallback(
SafetyHubEvent.NOTIFICATION_PERMISSIONS_MAYBE_CHANGED,
oneElementMockData);
await flushTasks();
assertTrue(isChildVisible(page, '#safetyHubEntryPoint'));
// Once visible, it remains visible regardless of list length.
webUIListenerCallback(
SafetyHubEvent.NOTIFICATION_PERMISSIONS_MAYBE_CHANGED, []);
await flushTasks();
assertTrue(isChildVisible(page, '#safetyHubEntryPoint'));
webUIListenerCallback(
SafetyHubEvent.NOTIFICATION_PERMISSIONS_MAYBE_CHANGED,
oneElementMockData);
await flushTasks();
assertTrue(isChildVisible(page, '#safetyHubEntryPoint'));
});
});