blob: 308fe44ee491a664abae17af578cc2f797031828 [file] [log] [blame]
// Copyright 2018 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.
suite('RuntimeHostPermissions', function() {
/** @type {extensions.RuntimeHostPermissionsElement} */ let element;
/** @type {extensions.TestService} */ let delegate;
const HostAccess = chrome.developerPrivate.HostAccess;
const ITEM_ID = 'a'.repeat(32);
setup(function() {
PolymerTest.clearBody();
element = document.createElement('extensions-runtime-host-permissions');
delegate = new extensions.TestService();
element.delegate = delegate;
element.itemId = ITEM_ID;
document.body.appendChild(element);
});
teardown(function() {
element.remove();
});
test('permissions display', function() {
const permissions = {
simplePermissions: ['permission 1', 'permission 2'],
hostAccess: HostAccess.ON_CLICK,
runtimeHostPermissions: [],
};
element.set('permissions', permissions);
Polymer.dom.flush();
const testIsVisible = extension_test_util.isVisible.bind(null, element);
expectTrue(testIsVisible('#host-access'));
const selectHostAccess = element.$$('#host-access');
expectEquals(HostAccess.ON_CLICK, selectHostAccess.value);
// For on-click mode, there should be no runtime hosts listed.
expectFalse(testIsVisible('#hosts'));
expectFalse(testIsVisible('#add-hosts-section'));
// Changing the data's access should change the UI appropriately.
element.set('permissions.hostAccess', HostAccess.ON_ALL_SITES);
Polymer.dom.flush();
expectEquals(HostAccess.ON_ALL_SITES, selectHostAccess.value);
expectFalse(testIsVisible('#hosts'));
expectFalse(testIsVisible('#add-hosts-section'));
// Setting the mode to on specific sites should display the runtime hosts
// list.
element.set('permissions.hostAccess', HostAccess.ON_SPECIFIC_SITES);
element.set(
'permissions.runtimeHostPermissions',
['https://example.com', 'https://chromium.org']);
Polymer.dom.flush();
expectEquals(HostAccess.ON_SPECIFIC_SITES, selectHostAccess.value);
expectTrue(testIsVisible('#hosts'));
expectTrue(testIsVisible('#add-hosts-section'));
expectEquals(2, element.$$('#hosts').getElementsByTagName('li').length);
});
test('permissions selection', function() {
const permissions = {
simplePermissions: ['permission 1', 'permission 2'],
hostAccess: HostAccess.ON_CLICK,
runtimeHostPermissions: [],
};
element.set('permissions', permissions);
Polymer.dom.flush();
const selectHostAccess = element.$$('#host-access');
assertTrue(!!selectHostAccess);
// Changes the value of the selectHostAccess menu and fires the change
// event, then verifies that the delegate was called with the correct
// value.
function expectDelegateCallOnAccessChange(newValue) {
selectHostAccess.value = newValue;
selectHostAccess.dispatchEvent(
new CustomEvent('change', {target: selectHostAccess}));
return delegate.whenCalled('setItemHostAccess').then((args) => {
expectEquals(ITEM_ID, args[0] /* id */);
expectEquals(newValue, args[1] /* access */);
delegate.resetResolver('setItemHostAccess');
});
}
// Check that selecting different values correctly notifies the delegate.
return expectDelegateCallOnAccessChange(HostAccess.ON_ALL_SITES)
.then(() => {
return expectDelegateCallOnAccessChange(HostAccess.ON_CLICK);
});
});
test('on select sites cancel', function() {
const permissions = {
simplePermissions: ['permission 1', 'permission 2'],
hostAccess: HostAccess.ON_CLICK,
runtimeHostPermissions: [],
};
element.permissions = permissions;
Polymer.dom.flush();
const selectHostAccess = element.$$('#host-access');
assertTrue(!!selectHostAccess);
selectHostAccess.value = HostAccess.ON_SPECIFIC_SITES;
selectHostAccess.dispatchEvent(new CustomEvent('change'));
Polymer.dom.flush();
const dialog = element.$$('extensions-runtime-hosts-dialog');
assertTrue(!!dialog);
expectTrue(dialog.updateHostAccess);
// Canceling the dialog should reset the selectHostAccess value to ON_CLICK,
// since no host was added.
assertTrue(dialog.isOpen());
let whenClosed = test_util.eventToPromise('close', dialog);
dialog.$$('.cancel-button').click();
return whenClosed.then(() => {
Polymer.dom.flush();
expectEquals(HostAccess.ON_CLICK, selectHostAccess.value);
});
});
test('on select sites accept', function() {
const permissions = {
simplePermissions: ['permission 1', 'permission 2'],
hostAccess: HostAccess.ON_CLICK,
runtimeHostPermissions: [],
};
element.set('permissions', permissions);
Polymer.dom.flush();
const selectHostAccess = element.$$('#host-access');
assertTrue(!!selectHostAccess);
selectHostAccess.value = HostAccess.ON_SPECIFIC_SITES;
selectHostAccess.dispatchEvent(
new CustomEvent('change', {target: selectHostAccess}));
Polymer.dom.flush();
const dialog = element.$$('extensions-runtime-hosts-dialog');
assertTrue(!!dialog);
expectTrue(dialog.updateHostAccess);
// Make the add button clickable by entering valid input.
const input = dialog.$$('cr-input');
input.value = 'https://example.com';
input.fire('input');
// Closing the dialog (as opposed to canceling) should keep the
// selectHostAccess value at ON_SPECIFIC_SITES.
assertTrue(dialog.isOpen());
let whenClosed = test_util.eventToPromise('close', dialog);
dialog.$$('.action-button').click();
return whenClosed.then(() => {
Polymer.dom.flush();
expectEquals(HostAccess.ON_SPECIFIC_SITES, selectHostAccess.value);
});
});
test('clicking add host triggers dialog', function() {
const permissions = {
simplePermissions: [],
hostAccess: HostAccess.ON_SPECIFIC_SITES,
runtimeHostPermissions: ['http://www.example.com'],
};
element.set('permissions', permissions);
Polymer.dom.flush();
const addHostButton = element.$$('#add-host');
assertTrue(!!addHostButton);
expectTrue(extension_test_util.isVisible(element, '#add-host'));
addHostButton.click();
Polymer.dom.flush();
const dialog = element.$$('extensions-runtime-hosts-dialog');
assertTrue(!!dialog);
expectTrue(dialog.$.dialog.open);
expectEquals(null, dialog.currentSite);
expectFalse(dialog.updateHostAccess);
});
test('removing runtime host permissions', function() {
const permissions = {
simplePermissions: [],
hostAccess: HostAccess.ON_SPECIFIC_SITES,
runtimeHostPermissions: ['https://example.com', 'https://chromium.org'],
};
element.set('permissions', permissions);
Polymer.dom.flush();
const editHost = element.$$('.edit-host');
assertTrue(!!editHost);
editHost.click();
const actionMenu = element.$$('cr-action-menu');
assertTrue(!!actionMenu);
expectTrue(actionMenu.open);
const remove = actionMenu.querySelector('#action-menu-remove');
assertTrue(!!remove);
remove.click();
return delegate.whenCalled('removeRuntimeHostPermission').then((args) => {
expectEquals(ITEM_ID, args[0] /* id */);
expectEquals('https://example.com', args[1] /* site */);
expectFalse(actionMenu.open);
});
});
test('clicking edit host triggers dialog', function() {
const permissions = {
simplePermissions: [],
hostAccess: HostAccess.ON_SPECIFIC_SITES,
runtimeHostPermissions: ['https://example.com', 'https://chromium.org'],
};
element.set('permissions', permissions);
Polymer.dom.flush();
const editHost = element.$$('.edit-host');
editHost.click();
const actionMenu = element.$$('cr-action-menu');
const actionMenuEdit = actionMenu.querySelector('#action-menu-edit');
assertTrue(!!actionMenuEdit);
actionMenuEdit.click();
Polymer.dom.flush();
const dialog = element.$$('extensions-runtime-hosts-dialog');
assertTrue(!!dialog);
expectTrue(dialog.$.dialog.open);
expectFalse(dialog.updateHostAccess);
expectEquals('https://example.com', dialog.currentSite);
});
});