diff --git a/docs/api/session.md b/docs/api/session.md index ed5ff247f9f0..df59bf0886a6 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -891,18 +891,19 @@ win.webContents.session.setCertificateVerifyProc((request, callback) => { * `permission` string - The type of requested permission. * `clipboard-read` - Request access to read from the clipboard. * `clipboard-sanitized-write` - Request access to write to the clipboard. + * `display-capture` - Request access to capture the screen via the [Screen Capture API](https://developer.mozilla.org/en-US/docs/Web/API/Screen_Capture_API). + * `fullscreen` - Request control of the app's fullscreen state via the [Fullscreen API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API). + * `geolocation` - Request access to the user's location via the [Geolocation API](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API) + * `idle-detection` - Request access to the user's idle state via the [IdleDetector API](https://developer.mozilla.org/en-US/docs/Web/API/IdleDetector). * `media` - Request access to media devices such as camera, microphone and speakers. - * `display-capture` - Request access to capture the screen. * `mediaKeySystem` - Request access to DRM protected content. - * `geolocation` - Request access to user's current location. - * `notifications` - Request notification creation and the ability to display them in the user's system tray. - * `midi` - Request MIDI access in the `webmidi` API. - * `midiSysex` - Request the use of system exclusive messages in the `webmidi` API. - * `pointerLock` - Request to directly interpret mouse movements as an input method. Click [here](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API) to know more. These requests always appear to originate from the main frame. - * `fullscreen` - Request for the app to enter fullscreen mode. + * `midi` - Request MIDI access in the [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API). + * `midiSysex` - Request the use of system exclusive messages in the [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API). + * `notifications` - Request notification creation and the ability to display them in the user's system tray using the [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/notification) + * `pointerLock` - Request to directly interpret mouse movements as an input method via the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API). These requests always appear to originate from the main frame. * `openExternal` - Request to open links in external applications. * `window-management` - Request access to enumerate screens using the [`getScreenDetails`](https://developer.chrome.com/en/articles/multi-screen-window-placement/) API. - * `unknown` - An unrecognized permission request + * `unknown` - An unrecognized permission request. * `callback` Function * `permissionGranted` boolean - Allow or deny the permission. * `details` Object - Some properties are only available on certain permission types. @@ -934,7 +935,22 @@ session.fromPartition('some-partition').setPermissionRequestHandler((webContents * `handler` Function\ | null * `webContents` ([WebContents](web-contents.md) | null) - WebContents checking the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin. All cross origin sub frames making permission checks will pass a `null` webContents to this handler, while certain other permission checks such as `notifications` checks will always pass `null`. You should use `embeddingOrigin` and `requestingOrigin` to determine what origin the owning frame and the requesting frame are on respectively. - * `permission` string - Type of permission check. Valid values are `midiSysex`, `notifications`, `geolocation`, `media`,`mediaKeySystem`,`midi`, `pointerLock`, `fullscreen`, `openExternal`, `hid`, `serial`, or `usb`. + * `permission` string - Type of permission check. + * `clipboard-read` - Request access to read from the clipboard. + * `clipboard-sanitized-write` - Request access to write to the clipboard. + * `geolocation` - Access the user's geolocation data via the [Geolocation API](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API) + * `fullscreen` - Control of the app's fullscreen state via the [Fullscreen API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API). + * `hid` - Access the HID protocol to manipulate HID devices via the [WebHID API](https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API). + * `idle-detection` - Access the user's idle state via the [IdleDetector API](https://developer.mozilla.org/en-US/docs/Web/API/IdleDetector). + * `media` - Access to media devices such as camera, microphone and speakers. + * `mediaKeySystem` - Access to DRM protected content. + * `midi` - Enable MIDI access in the [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API). + * `midiSysex` - Use system exclusive messages in the [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API). + * `notifications` - Configure and display desktop notifications to the user with the [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/notification). + * `openExternal` - Open links in external applications. + * `pointerLock` - Directly interpret mouse movements as an input method via the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API). These requests always appear to originate from the main frame. + * `serial` - Read from and write to serial devices with the [Web Serial API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API). + * `usb` - Expose non-standard Universal Serial Bus (USB) compatible devices services to the web with the [WebUSB API](https://developer.mozilla.org/en-US/docs/Web/API/WebUSB_API). * `requestingOrigin` string - The origin URL of the permission check * `details` Object - Some properties are only available on certain permission types. * `embeddingOrigin` string (optional) - The origin of the frame embedding the frame that made the permission check. Only set for cross-origin sub frames making permission checks. diff --git a/spec/chromium-spec.ts b/spec/chromium-spec.ts index 1c8c7039e975..f9ebb1f4efa0 100644 --- a/spec/chromium-spec.ts +++ b/spec/chromium-spec.ts @@ -1326,6 +1326,94 @@ describe('chromium features', () => { }); }); + describe('IdleDetection', () => { + afterEach(closeAllWindows); + afterEach(() => { + session.defaultSession.setPermissionCheckHandler(null); + session.defaultSession.setPermissionRequestHandler(null); + }); + + it('can grant a permission request', async () => { + session.defaultSession.setPermissionRequestHandler( + (_wc, permission, callback) => { + callback(permission === 'idle-detection'); + } + ); + + const w = new BrowserWindow({ show: false }); + await w.loadFile(path.join(fixturesPath, 'pages', 'button.html')); + const permission = await w.webContents.executeJavaScript(` + new Promise((resolve, reject) => { + const button = document.getElementById('button'); + button.addEventListener("click", async () => { + const permission = await IdleDetector.requestPermission(); + resolve(permission); + }); + button.click(); + }); + `, true); + + expect(permission).to.eq('granted'); + }); + + it('can deny a permission request', async () => { + session.defaultSession.setPermissionRequestHandler( + (_wc, permission, callback) => { + callback(permission !== 'idle-detection'); + } + ); + + const w = new BrowserWindow({ show: false }); + await w.loadFile(path.join(fixturesPath, 'pages', 'button.html')); + const permission = await w.webContents.executeJavaScript(` + new Promise((resolve, reject) => { + const button = document.getElementById('button'); + button.addEventListener("click", async () => { + const permission = await IdleDetector.requestPermission(); + resolve(permission); + }); + button.click(); + }); + `, true); + + expect(permission).to.eq('denied'); + }); + + it('can allow the IdleDetector to start', async () => { + session.defaultSession.setPermissionCheckHandler((wc, permission) => { + return permission === 'idle-detection'; + }); + + const w = new BrowserWindow({ show: false }); + await w.loadFile(path.join(fixturesPath, 'pages', 'blank.html')); + const result = await w.webContents.executeJavaScript(` + const detector = new IdleDetector({ threshold: 60000 }); + detector.start().then(() => { + return 'success'; + }).catch(e => e.message); + `, true); + + expect(result).to.eq('success'); + }); + + it('can prevent the IdleDetector from starting', async () => { + session.defaultSession.setPermissionCheckHandler((wc, permission) => { + return permission !== 'idle-detection'; + }); + + const w = new BrowserWindow({ show: false }); + await w.loadFile(path.join(fixturesPath, 'pages', 'blank.html')); + const result = await w.webContents.executeJavaScript(` + const detector = new IdleDetector({ threshold: 60000 }); + detector.start().then(() => { + console.log('success') + }).catch(e => e.message); + `, true); + + expect(result).to.eq('Idle detection permission denied'); + }); + }); + describe('navigator.mediaDevices', () => { afterEach(closeAllWindows); afterEach(() => { diff --git a/spec/fixtures/pages/button.html b/spec/fixtures/pages/button.html new file mode 100644 index 000000000000..79e2c06f56f7 --- /dev/null +++ b/spec/fixtures/pages/button.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file