From e84b922b29bd89bc5e8dc54a94cafc13b96d4013 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 22 Jun 2021 14:12:21 +0200 Subject: [PATCH 1/3] fix: Inspector method overrides when contextIsolation enabled --- lib/renderer/inspector.ts | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/renderer/inspector.ts b/lib/renderer/inspector.ts index fd0e603ee361c..53890fc4850b3 100644 --- a/lib/renderer/inspector.ts +++ b/lib/renderer/inspector.ts @@ -1,16 +1,31 @@ +import { internalContextBridge } from '@electron/internal/renderer/api/context-bridge'; import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'; import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils'; import { IPC_MESSAGES } from '../common/ipc-messages'; -window.onload = function () { - // Use menu API to show context menu. - window.InspectorFrontendHost!.showContextMenuAtPoint = createMenu; - - // correct for Chromium returning undefined for filesystem - window.Persistence!.FileSystemWorkspaceBinding.completeURL = completeURL; +const { contextIsolationEnabled } = internalContextBridge; - // Use dialog API to override file chooser dialog. - window.UI!.createFileSelectorElement = createFileSelectorElement; +/* Corrects for some Inspector adaptations needed in Electron. +* 1) Use menu API to show context menu. +* 2) Correct for Chromium returning undefined for filesystem. +* 3) Use dialog API to override file chooser dialog. +*/ +window.onload = function () { + if (contextIsolationEnabled) { + internalContextBridge.overrideGlobalValueFromIsolatedWorld([ + 'InspectorFrontendHost', 'showContextMenuAtPoint' + ], createMenu); + internalContextBridge.overrideGlobalValueFromIsolatedWorld([ + 'Persistence', 'FileSystemWorkspaceBinding', 'completeURL' + ], completeURL); + internalContextBridge.overrideGlobalValueFromIsolatedWorld([ + 'UI', 'createFileSelectorElement' + ], createFileSelectorElement); + } else { + window.InspectorFrontendHost!.showContextMenuAtPoint = createMenu; + window.Persistence!.FileSystemWorkspaceBinding.completeURL = completeURL; + window.UI!.createFileSelectorElement = createFileSelectorElement; + } }; // Extra / is needed as a result of MacOS requiring absolute paths From 74d5e46b8b93f131a07aa47664b6722cb2017e15 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 22 Jun 2021 18:47:32 +0200 Subject: [PATCH 2/3] fix: handle DevToolsAPI call --- lib/renderer/inspector.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/renderer/inspector.ts b/lib/renderer/inspector.ts index 53890fc4850b3..42dfda0c93ed4 100644 --- a/lib/renderer/inspector.ts +++ b/lib/renderer/inspector.ts @@ -1,6 +1,7 @@ import { internalContextBridge } from '@electron/internal/renderer/api/context-bridge'; import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'; import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils'; +import { webFrame } from 'electron/renderer'; import { IPC_MESSAGES } from '../common/ipc-messages'; const { contextIsolationEnabled } = internalContextBridge; @@ -51,9 +52,18 @@ const createMenu = function (x: number, y: number, items: ContextMenuItem[]) { const isEditMenu = useEditMenuItems(x, y, items); ipcRendererInternal.invoke(IPC_MESSAGES.INSPECTOR_CONTEXT_MENU, items, isEditMenu).then(id => { if (typeof id === 'number') { - window.DevToolsAPI!.contextMenuItemSelected(id); + if (contextIsolationEnabled) { + webFrame.executeJavaScript(`window.DevToolsAPI.contextMenuItemSelected(${JSON.stringify(id)})`); + } else { + window.DevToolsAPI!.contextMenuItemSelected(id); + } + } + + if (contextIsolationEnabled) { + webFrame.executeJavaScript('window.DevToolsAPI.contextMenuCleared()'); + } else { + window.DevToolsAPI!.contextMenuCleared(); } - window.DevToolsAPI!.contextMenuCleared(); }); }; From 6d4f5c7933b2c078f03522bf7833d9bfd0fafed1 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 22 Jun 2021 23:28:13 +0200 Subject: [PATCH 3/3] refactor: always use webFrame.executeJavaScript --- lib/renderer/inspector.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/renderer/inspector.ts b/lib/renderer/inspector.ts index 42dfda0c93ed4..e6dde7ecd8c62 100644 --- a/lib/renderer/inspector.ts +++ b/lib/renderer/inspector.ts @@ -52,18 +52,10 @@ const createMenu = function (x: number, y: number, items: ContextMenuItem[]) { const isEditMenu = useEditMenuItems(x, y, items); ipcRendererInternal.invoke(IPC_MESSAGES.INSPECTOR_CONTEXT_MENU, items, isEditMenu).then(id => { if (typeof id === 'number') { - if (contextIsolationEnabled) { - webFrame.executeJavaScript(`window.DevToolsAPI.contextMenuItemSelected(${JSON.stringify(id)})`); - } else { - window.DevToolsAPI!.contextMenuItemSelected(id); - } + webFrame.executeJavaScript(`window.DevToolsAPI.contextMenuItemSelected(${JSON.stringify(id)})`); } - if (contextIsolationEnabled) { - webFrame.executeJavaScript('window.DevToolsAPI.contextMenuCleared()'); - } else { - window.DevToolsAPI!.contextMenuCleared(); - } + webFrame.executeJavaScript('window.DevToolsAPI.contextMenuCleared()'); }); };