From 1267b9119528d1b3f23e5322b3d0e4ef725cb2b4 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Mon, 8 Aug 2022 23:38:02 +0900 Subject: [PATCH] fix: undefined details.requestingUrl from setPermissionCheckHandler --- shell/browser/electron_permission_manager.cc | 13 ++- spec-main/api-session-spec.ts | 86 +++++++++++++++++++- 2 files changed, 95 insertions(+), 4 deletions(-) diff --git a/shell/browser/electron_permission_manager.cc b/shell/browser/electron_permission_manager.cc index 74c523b54a3e6..dde2714caec07 100644 --- a/shell/browser/electron_permission_manager.cc +++ b/shell/browser/electron_permission_manager.cc @@ -339,9 +339,16 @@ blink::mojom::PermissionStatus ElectronPermissionManager::GetPermissionStatusForCurrentDocument( blink::PermissionType permission, content::RenderFrameHost* render_frame_host) { - return GetPermissionStatus( - permission, render_frame_host->GetLastCommittedOrigin().GetURL(), - content::PermissionUtil::GetLastCommittedOriginAsURL(render_frame_host)); + base::Value::Dict details; + details.Set("embeddingOrigin", + content::PermissionUtil::GetLastCommittedOriginAsURL( + render_frame_host->GetMainFrame()) + .spec()); + bool granted = CheckPermissionWithDetails( + permission, render_frame_host, + render_frame_host->GetLastCommittedOrigin().GetURL(), std::move(details)); + return granted ? blink::mojom::PermissionStatus::GRANTED + : blink::mojom::PermissionStatus::DENIED; } blink::mojom::PermissionStatus diff --git a/spec-main/api-session-spec.ts b/spec-main/api-session-spec.ts index 3631a532cab67..a1be9cf2db7a7 100644 --- a/spec-main/api-session-spec.ts +++ b/spec-main/api-session-spec.ts @@ -4,7 +4,7 @@ import * as https from 'https'; import * as path from 'path'; import * as fs from 'fs'; import * as ChildProcess from 'child_process'; -import { app, session, BrowserWindow, net, ipcMain, Session } from 'electron/main'; +import { app, session, BrowserWindow, net, ipcMain, Session, webFrameMain, WebFrameMain } from 'electron/main'; import * as send from 'send'; import * as auth from 'basic-auth'; import { closeAllWindows } from './window-helpers'; @@ -1043,6 +1043,90 @@ describe('session module', () => { }); }); + describe('ses.setPermissionCheckHandler(handler)', () => { + afterEach(closeAllWindows); + it('details provides requestingURL for mainFrame', async () => { + const w = new BrowserWindow({ + show: false, + webPreferences: { + partition: 'very-temp-permission-handler' + } + }); + const ses = w.webContents.session; + const loadUrl = 'https://myfakesite/'; + let handlerDetails : Electron.PermissionCheckHandlerHandlerDetails; + + ses.protocol.interceptStringProtocol('https', (req, cb) => { + cb(''); + }); + + ses.setPermissionCheckHandler((wc, permission, requestingOrigin, details) => { + if (permission === 'clipboard-read') { + handlerDetails = details; + return true; + } + return false; + }); + + const readClipboardPermission: any = () => { + return w.webContents.executeJavaScript(` + navigator.permissions.query({name: 'clipboard-read'}) + .then(permission => permission.state).catch(err => err.message); + `, true); + }; + + await w.loadURL(loadUrl); + const state = await readClipboardPermission(); + expect(state).to.equal('granted'); + expect(handlerDetails!.requestingUrl).to.equal(loadUrl); + }); + + it('details provides requestingURL for cross origin subFrame', async () => { + const w = new BrowserWindow({ + show: false, + webPreferences: { + partition: 'very-temp-permission-handler' + } + }); + const ses = w.webContents.session; + const loadUrl = 'https://myfakesite/'; + let handlerDetails : Electron.PermissionCheckHandlerHandlerDetails; + + ses.protocol.interceptStringProtocol('https', (req, cb) => { + cb(''); + }); + + ses.setPermissionCheckHandler((wc, permission, requestingOrigin, details) => { + if (permission === 'clipboard-read') { + handlerDetails = details; + return true; + } + return false; + }); + + const readClipboardPermission: any = (frame: WebFrameMain) => { + return frame.executeJavaScript(` + navigator.permissions.query({name: 'clipboard-read'}) + .then(permission => permission.state).catch(err => err.message); + `, true); + }; + + await w.loadFile(path.join(fixtures, 'api', 'blank.html')); + w.webContents.executeJavaScript(` + var iframe = document.createElement('iframe'); + iframe.src = '${loadUrl}'; + document.body.appendChild(iframe); + null; + `); + const [,, frameProcessId, frameRoutingId] = await emittedOnce(w.webContents, 'did-frame-finish-load'); + const state = await readClipboardPermission(webFrameMain.fromId(frameProcessId, frameRoutingId)); + expect(state).to.equal('granted'); + expect(handlerDetails!.requestingUrl).to.equal(loadUrl); + expect(handlerDetails!.isMainFrame).to.be.false(); + expect(handlerDetails!.embeddingOrigin).to.equal('file:///'); + }); + }); + describe('ses.isPersistent()', () => { afterEach(closeAllWindows);