| (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); |
| } |
| |
| }) |
| |