blob: ae7b617840c52067fcf28c9c56848c74d0e3a41d [file] [log] [blame]
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank(
`Test that permissions can be changed`);
// Reset all permissions initially.
await dp.Browser.resetPermissions();
await page.navigate('http://devtools.test:8000/inspector-protocol/resources/empty.html');
await session.evaluateAsync(async () => {
window.messages = [];
});
// Test that all three states can be set.
await Promise.all([
setWithName('background-fetch', 'granted'),
setWithName('persistent-storage', 'prompt'),
setWithName('background-sync', 'denied')
]);
await Promise.all([
waitForName('background-fetch', 'granted'),
waitForName('persistent-storage', 'prompt'),
waitForName('background-sync', 'denied')
]);
await dp.Browser.resetPermissions();
// Test bad state.
await Promise.all([
setWithName('background-fetch', 'foo')
]);
await dp.Browser.resetPermissions();
// Test states can be changed for single permission.
await setWithName('background-fetch', 'granted');
await waitForName('background-fetch', 'granted');
await setWithName('background-fetch', 'denied');
await waitForName('background-fetch', 'denied');
await setWithName('background-fetch', 'prompt');
await waitForName('background-fetch', 'prompt');
await dp.Browser.resetPermissions();
// Test MIDI rules are respected.
const midi_with_sysex = {name: 'midi', sysex: true};
const midi_without_sysex = {name: 'midi', sysex: false};
// Granting sysex=true implies granting sysex=false.
await set(midi_with_sysex, 'granted');
await Promise.all([
waitPermission(midi_with_sysex, 'granted'),
waitPermission(midi_without_sysex, 'granted')
]);
// Denying sysex=false implies denying sysex=true.
await set(midi_without_sysex, 'denied');
await Promise.all([
waitPermission(midi_without_sysex, 'denied'),
waitPermission(midi_with_sysex, 'denied')
]);
// Prompt sysex=false implies prompt sysex=true.
await set(midi_without_sysex, 'prompt');
await Promise.all([
waitPermission(midi_without_sysex, 'prompt'),
waitPermission(midi_with_sysex, 'prompt')
]);
await dp.Browser.resetPermissions();
// Test "push" permissions userVisibleOnly=true is supported.
await set({name: 'push', userVisibleOnly: true}, 'granted');
await waitPermission({name: 'push', userVisibleOnly: true}, 'granted');
await dp.Browser.resetPermissions();
// Test "camera" permission panTiltZoom=true is supported.
await set({name: 'camera', panTiltZoom: true}, 'granted');
await waitPermission({name: 'camera', panTiltZoom: true}, 'granted');
await dp.Browser.resetPermissions();
// Cross-origin test.
await setWithName('geolocation', 'granted');
await set({name: 'geolocation'}, 'denied', 'http://devtools.txt:8001');
await waitForName('geolocation', 'granted');
await dp.Browser.resetPermissions()
testRunner.log(await session.evaluate(() => window.messages));
testRunner.completeTest();
async function set(descriptor, state, url) {
const response = await dp.Browser.setPermission({
origin: (url === undefined) ? 'http://devtools.test:8000' : url,
permission: descriptor,
setting: state
});
if (response.error)
testRunner.log('- Failed to set: ' + JSON.stringify(descriptor) + ' error: ' + response.error.message);
else
testRunner.log('- Set: ' + JSON.stringify(descriptor) + ' to ' + state);
}
async function waitPermission(descriptor, state) {
await session.evaluateAsync(async (descriptor, state) => {
const result = await navigator.permissions.query(descriptor);
if (result.state && result.state === state)
window.messages.push(`${JSON.stringify(descriptor)}: ${result.state}`);
else
window.messages.push(`Failed to set ${JSON.stringify(descriptor)} to state: ${state}. Got ${result.state}`);
}, descriptor, state);
}
async function waitForName(name, state) {
await waitPermission({'name': name}, state);
}
async function setWithName(name, state) {
await set({'name': name}, state);
}
})