From bb2b2938de645fa7bdc5c725d8a898f24bc10fea Mon Sep 17 00:00:00 2001 From: George He Date: Wed, 20 Dec 2023 14:50:31 +0800 Subject: [PATCH] fix: utility process is a improper name for the browser window --- ...ess.test.ts => pre-request-script.test.ts} | 21 +++++---- packages/insomnia/.gitignore | 4 +- packages/insomnia/esbuild.main.ts | 20 ++++----- packages/insomnia/src/global.d.ts | 4 +- .../src/main/ipc/hidden-browser-window.ts | 22 ++++++++++ .../insomnia/src/main/ipc/utility-process.ts | 22 ---------- packages/insomnia/src/main/window-utils.ts | 43 ++++++++++--------- packages/insomnia/src/preload.ts | 8 ++-- .../index.html | 6 +-- .../index.ts | 4 +- .../inso-object.ts | 0 .../preload.ts | 0 .../static-modules.ts | 0 .../src/ui/window-message-handlers.ts | 21 ++++----- packages/insomnia/vite.config.ts | 2 +- 15 files changed, 89 insertions(+), 88 deletions(-) rename packages/insomnia-smoke-test/tests/smoke/{utility-process.test.ts => pre-request-script.test.ts} (94%) create mode 100644 packages/insomnia/src/main/ipc/hidden-browser-window.ts delete mode 100644 packages/insomnia/src/main/ipc/utility-process.ts rename packages/insomnia/src/renderers/{utility-process => hidden-browser-window}/index.html (77%) rename packages/insomnia/src/renderers/{utility-process => hidden-browser-window}/index.ts (94%) rename packages/insomnia/src/renderers/{utility-process => hidden-browser-window}/inso-object.ts (100%) rename packages/insomnia/src/renderers/{utility-process => hidden-browser-window}/preload.ts (100%) rename packages/insomnia/src/renderers/{utility-process => hidden-browser-window}/static-modules.ts (100%) diff --git a/packages/insomnia-smoke-test/tests/smoke/utility-process.test.ts b/packages/insomnia-smoke-test/tests/smoke/pre-request-script.test.ts similarity index 94% rename from packages/insomnia-smoke-test/tests/smoke/utility-process.test.ts rename to packages/insomnia-smoke-test/tests/smoke/pre-request-script.test.ts index fbd2fe00bf..9bf8053e27 100644 --- a/packages/insomnia-smoke-test/tests/smoke/utility-process.test.ts +++ b/packages/insomnia-smoke-test/tests/smoke/pre-request-script.test.ts @@ -2,7 +2,7 @@ import { expect } from '@playwright/test'; import { test } from '../../playwright/test';; -test.describe('test utility process', async () => { +test.describe('test pre-request script execution', async () => { const testCases = [ { @@ -315,12 +315,13 @@ test.describe('test utility process', async () => { const originalWindowCount = app.windows().length; - // start the utility process + // start the sandbox await mainWindow?.evaluate( async () => { - const caller = window as unknown as { utilityProcess: { start: () => void } }; - if (caller.utilityProcess) { - caller.utilityProcess.start(); + // it suppresses the type checking error + const caller = window as unknown as { hiddenBrowserWindow: { start: () => void } }; + if (caller.hiddenBrowserWindow) { + caller.hiddenBrowserWindow.start(); } }, ); @@ -331,13 +332,13 @@ test.describe('test utility process', async () => { if (windows.length > originalWindowCount) { for (const page of windows) { const title = await page.title(); - if (title === 'Utility Process') { + if (title === 'Hidden Browser Window') { await page.waitForLoadState(); } } break; } - mainWindow.waitForTimeout(500); + await mainWindow.waitForTimeout(500); } // action @@ -345,7 +346,7 @@ test.describe('test utility process', async () => { async (tc: any) => { window.postMessage( { - action: 'message-event://utility.process/debug', + action: 'message-event://hidden.browser-window/debug', id: tc.id, code: tc.code, context: tc.context, @@ -368,9 +369,11 @@ test.describe('test utility process', async () => { if (localStorage[`test_result:${tc.id}`] || localStorage[`test_error:${tc.id}`]) { break; } - mainWindow.waitForTimeout(500); + await mainWindow.waitForTimeout(500); } + // await mainWindow.waitForTimeout(300000); + if (localStorage) { // just for suppressing ts complaint console.log(localStorage[`test_error:${tc.id}`]); expect(JSON.parse(localStorage[`test_result:${tc.id}`])).toEqual(tc.expectedResult); diff --git a/packages/insomnia/.gitignore b/packages/insomnia/.gitignore index c1f1d865d8..6e8f6ec232 100644 --- a/packages/insomnia/.gitignore +++ b/packages/insomnia/.gitignore @@ -6,5 +6,5 @@ src/main.min.js src/main.min.js.map src/preload.js src/preload.js.map -src/renderers/utility-process/**/*.js -src/renderers/utility-process/**/*.js.map +src/renderers/hidden-browser-window/**/*.js +src/renderers/hidden-browser-window/**/*.js.map diff --git a/packages/insomnia/esbuild.main.ts b/packages/insomnia/esbuild.main.ts index e69f123ae1..9d9e369f4c 100644 --- a/packages/insomnia/esbuild.main.ts +++ b/packages/insomnia/esbuild.main.ts @@ -22,8 +22,8 @@ export default async function build(options: Options) { 'process.env.APP_RENDER_URL': JSON.stringify( `http://localhost:${PORT}/index.html` ), - 'process.env.UTILITY_PROCESS_URL': JSON.stringify( - `http://localhost:${PORT}/renderers/utility-process/index.html` + 'process.env.HIDDEN_BROWSER_WINDOW_URL': JSON.stringify( + `http://localhost:${PORT}/renderers/hidden-browser-window/index.html` ), 'process.env.NODE_ENV': JSON.stringify('development'), 'process.env.INSOMNIA_ENV': JSON.stringify('development'), @@ -44,9 +44,9 @@ export default async function build(options: Options) { format: 'cjs', external: ['electron'], }); - const preloadUtilityProcess = esbuild.build({ - entryPoints: ['./src/renderers/utility-process/preload.ts'], - outfile: path.join(outdir, 'renderers/utility-process/preload-utility-process.js'), + const preloadHiddenBrowserWindow = esbuild.build({ + entryPoints: ['./src/renderers/hidden-browser-window/preload.ts'], + outfile: path.join(outdir, 'renderers/hidden-browser-window/preload-hidden-browser-window.js'), target: 'esnext', bundle: true, platform: 'node', @@ -54,10 +54,10 @@ export default async function build(options: Options) { format: 'cjs', external: ['electron'], }); - const utilityProcess = esbuild.build({ - entryPoints: ['./src/renderers/utility-process/index.ts'], - // utility process is always outputed to 'src' as index.html requires a built bundle - outfile: path.join(__dirname, 'src', 'renderers/utility-process/utility-process.js'), + const hiddenBrowserWindow = esbuild.build({ + entryPoints: ['./src/renderers/hidden-browser-window/index.ts'], + // the hidden browser window script is always outputed to 'src' as index.html requires a built bundle + outfile: path.join(__dirname, 'src', 'renderers/hidden-browser-window/index.js'), target: 'esnext', bundle: true, platform: 'browser', @@ -81,7 +81,7 @@ export default async function build(options: Options) { ], }); - return Promise.all([main, preload, preloadUtilityProcess, utilityProcess]); + return Promise.all([main, preload, preloadHiddenBrowserWindow, hiddenBrowserWindow]); } // Build if ran as a cli script diff --git a/packages/insomnia/src/global.d.ts b/packages/insomnia/src/global.d.ts index e8c57f0905..019b6dcf8a 100644 --- a/packages/insomnia/src/global.d.ts +++ b/packages/insomnia/src/global.d.ts @@ -1,6 +1,6 @@ /// +import type { HiddenBrowserWindowAPI } from './main/ipc/hidden-browser-window'; import type { MainBridgeAPI } from './main/ipc/main'; -import type { UtilityProcessAPI } from './main/ipc/utility-process'; declare global { interface Window { @@ -9,7 +9,7 @@ declare global { app: Pick; shell: Pick; clipboard: Pick; - utilityProcess: UtilityProcessAPI; + hiddenBrowserWindow: HiddenBrowserWindowAPI; } } diff --git a/packages/insomnia/src/main/ipc/hidden-browser-window.ts b/packages/insomnia/src/main/ipc/hidden-browser-window.ts new file mode 100644 index 0000000000..d8d6c308f2 --- /dev/null +++ b/packages/insomnia/src/main/ipc/hidden-browser-window.ts @@ -0,0 +1,22 @@ +import { BrowserWindow, ipcMain } from 'electron'; + +import { createHiddenBrowserWindow } from '../window-utils'; + +export interface HiddenBrowserWindowAPI { + start: () => void; +} + +// registerHiddenBrowserWindowConsumer broadcasts message ports to observer windows +export function registerHiddenBrowserWindowConsumer(consumerWindows: BrowserWindow[]) { + ipcMain.on('ipc://main/publish-port', ev => { + consumerWindows.forEach(win => { + win.webContents.postMessage('ipc://renderers/publish-port', null, ev.ports); + }); + }); +} + +export function registerHiddenBrowserWindowController() { + ipcMain.handle('ipc://main/hidden-browser-window/start', () => { + createHiddenBrowserWindow(); + }); +} diff --git a/packages/insomnia/src/main/ipc/utility-process.ts b/packages/insomnia/src/main/ipc/utility-process.ts deleted file mode 100644 index 6dddb4b2de..0000000000 --- a/packages/insomnia/src/main/ipc/utility-process.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { BrowserWindow, ipcMain } from 'electron'; - -import { createUtilityProcess } from '../window-utils'; - -export interface UtilityProcessAPI { - start: () => void; -} - -// registerUtilityProcessPort broadcasts message ports to observer windows -export function registerUtilityProcessConsumer(consumerWindows: BrowserWindow[]) { - ipcMain.on('ipc://main/publish-port', ev => { - consumerWindows.forEach(win => { - win.webContents.postMessage('ipc://renderers/publish-port', null, ev.ports); - }); - }); -} - -export function registerUtilityProcessController() { - ipcMain.handle('ipc://main/utility-process/start', () => { - createUtilityProcess(); - }); -} diff --git a/packages/insomnia/src/main/window-utils.ts b/packages/insomnia/src/main/window-utils.ts index c942b45ce5..5d08dbc1e0 100644 --- a/packages/insomnia/src/main/window-utils.ts +++ b/packages/insomnia/src/main/window-utils.ts @@ -16,7 +16,7 @@ import { } from '../common/constants'; import { docsBase } from '../common/documentation'; import * as log from '../common/log'; -import { registerUtilityProcessConsumer, registerUtilityProcessController } from './ipc/utility-process'; +import { registerHiddenBrowserWindowConsumer, registerHiddenBrowserWindowController } from './ipc/hidden-browser-window'; import LocalStorage from './local-storage'; const { app, Menu, shell, dialog, clipboard, BrowserWindow } = electron; @@ -27,7 +27,7 @@ const MINIMUM_WIDTH = 500; const MINIMUM_HEIGHT = 400; let newWindow: ElectronBrowserWindow | null = null; -let isolatedUtilityProcess: ElectronBrowserWindow | null = null; +let hiddenBrowserWindow: ElectronBrowserWindow | null = null; const windows = new Set(); const processes = new Set(); let localStorage: LocalStorage | null = null; @@ -43,35 +43,35 @@ export function init() { initLocalStorage(); } -export function createUtilityProcess() { - isolatedUtilityProcess = new BrowserWindow({ +export function createHiddenBrowserWindow() { + hiddenBrowserWindow = new BrowserWindow({ show: false, - title: 'UtilityProcess', + title: 'HiddenBrowserWindow', webPreferences: { sandbox: true, contextIsolation: true, nodeIntegration: false, webSecurity: true, - preload: path.join(__dirname, 'renderers/utility-process/preload-utility-process.js'), + preload: path.join(__dirname, 'renderers/hidden-browser-window/preload-hidden-browser-window.js'), spellcheck: false, }, }); - const utilityProcessPath = path.resolve(__dirname, './renderers/utility-process/index.html'); - const utilityProcessUrl = process.env.UTILITY_PROCESS_URL || pathToFileURL(utilityProcessPath).href; - console.log('[main] loading utility process:', process.env.UTILITY_PROCESS_URL, pathToFileURL(utilityProcessPath).href); - isolatedUtilityProcess.loadURL(utilityProcessUrl); + const hiddenBrowserWindowPath = path.resolve(__dirname, './renderers/hidden-browser-window/index.html'); + const hiddenBrowserWindowUrl = process.env.HIDDEN_BROWSER_WINDOW_URL || pathToFileURL(hiddenBrowserWindowPath).href; + hiddenBrowserWindow.loadURL(hiddenBrowserWindowUrl); + console.log('[main] loading hidden browser window:', process.env.HIDDEN_BROWSER_WINDOW_URL, pathToFileURL(hiddenBrowserWindowPath).href); - isolatedUtilityProcess?.on('closed', () => { - if (isolatedUtilityProcess) { - processes.delete(isolatedUtilityProcess); - isolatedUtilityProcess = processes.values().next().value || null; + hiddenBrowserWindow?.on('closed', () => { + if (hiddenBrowserWindow) { + processes.delete(hiddenBrowserWindow); + hiddenBrowserWindow = processes.values().next().value || null; } }); - processes.add(isolatedUtilityProcess); + processes.add(hiddenBrowserWindow); - return isolatedUtilityProcess; + return hiddenBrowserWindow; } export function createWindow() { @@ -476,9 +476,10 @@ export function createWindow() { ); } else { // @ts-expect-error -- TSCONVERSION type splitting - helpMenu.submenu?.push({ - type: 'separator', - }, + helpMenu.submenu?.push( + { + type: 'separator', + }, { label: `${MNEMONIC_SYM}About`, click: aboutMenuClickHandler, @@ -582,8 +583,8 @@ export function createWindow() { Menu.setApplicationMenu(Menu.buildFromTemplate(template)); windows.add(newWindow); - registerUtilityProcessController(); - registerUtilityProcessConsumer(windows ? Array.from(windows.values()) : []); + registerHiddenBrowserWindowController(); + registerHiddenBrowserWindowConsumer(windows ? Array.from(windows.values()) : []); return newWindow; } diff --git a/packages/insomnia/src/preload.ts b/packages/insomnia/src/preload.ts index a16310924d..762cf04d72 100644 --- a/packages/insomnia/src/preload.ts +++ b/packages/insomnia/src/preload.ts @@ -87,8 +87,8 @@ const clipboard: Window['clipboard'] = { clear: () => ipcRenderer.send('clear'), }; -const utilityProcess: Window['utilityProcess'] = { - start: () => ipcRenderer.invoke('ipc://main/utility-process/start'), +const hiddenBrowserWindow: Window['hiddenBrowserWindow'] = { + start: () => ipcRenderer.invoke('ipc://main/hidden-browser-window/start'), }; if (process.contextIsolated) { @@ -97,14 +97,14 @@ if (process.contextIsolated) { contextBridge.exposeInMainWorld('app', app); contextBridge.exposeInMainWorld('shell', shell); contextBridge.exposeInMainWorld('clipboard', clipboard); - contextBridge.exposeInMainWorld('utilityProcess', utilityProcess); + contextBridge.exposeInMainWorld('hiddenBrowserWindow', hiddenBrowserWindow); } else { window.main = main; window.dialog = dialog; window.app = app; window.shell = shell; window.clipboard = clipboard; - window.utilityProcess = utilityProcess; + window.hiddenBrowserWindow = hiddenBrowserWindow; } // it is different from window.main.on, it requires events to pass ports diff --git a/packages/insomnia/src/renderers/utility-process/index.html b/packages/insomnia/src/renderers/hidden-browser-window/index.html similarity index 77% rename from packages/insomnia/src/renderers/utility-process/index.html rename to packages/insomnia/src/renderers/hidden-browser-window/index.html index 3fc0c003e4..c524f1441c 100644 --- a/packages/insomnia/src/renderers/utility-process/index.html +++ b/packages/insomnia/src/renderers/hidden-browser-window/index.html @@ -6,11 +6,11 @@ http-equiv="Content-Security-Policy" content="font-src 'self' data:; connect-src * data: api: insomnia-event-source:; default-src * insomnia://*; img-src blob: data: * insomnia://*; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src blob: data: mediastream: * insomnia://*;" /> - Utility Process + Hidden Browser Window -

Utility Process

- +

>Hidden Browser Window

+ diff --git a/packages/insomnia/src/renderers/utility-process/index.ts b/packages/insomnia/src/renderers/hidden-browser-window/index.ts similarity index 94% rename from packages/insomnia/src/renderers/utility-process/index.ts rename to packages/insomnia/src/renderers/hidden-browser-window/index.ts index cca0dfadd8..cbbc480ac5 100644 --- a/packages/insomnia/src/renderers/utility-process/index.ts +++ b/packages/insomnia/src/renderers/hidden-browser-window/index.ts @@ -1,6 +1,6 @@ import { initPm } from './inso-object'; -const executeAction = 'message-port://utility.process/execute'; +const executeAction = 'message-port://hidden.browser-window/execute'; async function init() { const channel = new MessageChannel(); @@ -8,7 +8,7 @@ async function init() { channel.port1.onmessage = async (ev: MessageEvent) => { const action = ev.data.action; - if (action === executeAction || action === 'message-port://utility.process/debug') { + if (action === executeAction || action === 'message-port://hidden.browser-window/debug') { try { const getPm = new Function('pm', 'return pm;'); const rawPm = getPm(ev.data.options.context.pm); diff --git a/packages/insomnia/src/renderers/utility-process/inso-object.ts b/packages/insomnia/src/renderers/hidden-browser-window/inso-object.ts similarity index 100% rename from packages/insomnia/src/renderers/utility-process/inso-object.ts rename to packages/insomnia/src/renderers/hidden-browser-window/inso-object.ts diff --git a/packages/insomnia/src/renderers/utility-process/preload.ts b/packages/insomnia/src/renderers/hidden-browser-window/preload.ts similarity index 100% rename from packages/insomnia/src/renderers/utility-process/preload.ts rename to packages/insomnia/src/renderers/hidden-browser-window/preload.ts diff --git a/packages/insomnia/src/renderers/utility-process/static-modules.ts b/packages/insomnia/src/renderers/hidden-browser-window/static-modules.ts similarity index 100% rename from packages/insomnia/src/renderers/utility-process/static-modules.ts rename to packages/insomnia/src/renderers/hidden-browser-window/static-modules.ts diff --git a/packages/insomnia/src/ui/window-message-handlers.ts b/packages/insomnia/src/ui/window-message-handlers.ts index a5e803bd4d..d1ea07d033 100644 --- a/packages/insomnia/src/ui/window-message-handlers.ts +++ b/packages/insomnia/src/ui/window-message-handlers.ts @@ -2,7 +2,7 @@ type MessageHandler = (ev: MessageEvent) => Promise; class WindowMessageHandler { - private utilityProcessPort: MessagePort | undefined; + private hiddenBrowserWindowPort: MessagePort | undefined; private actionHandlers: Map = new Map(); constructor() { } @@ -13,12 +13,12 @@ class WindowMessageHandler { return; } - this.utilityProcessPort = ev.ports[0]; + this.hiddenBrowserWindowPort = ev.ports[0]; - this.utilityProcessPort.onmessage = ev => { + this.hiddenBrowserWindowPort.onmessage = ev => { if (ev.data.action === 'message-port://caller/respond') { // TODO: hook to UI and display result - console.log('[main] result from utility process:', ev.data.result); + console.log('[main] result from hidden browser window:', ev.data.result); } else if (ev.data.action === 'message-port://caller/debug/respond') { if (ev.data.result) { window.localStorage.setItem(`test_result:${ev.data.id}`, JSON.stringify(ev.data.result)); @@ -32,13 +32,13 @@ class WindowMessageHandler { }; debugEventHandler = async (ev: MessageEvent) => { - if (!this.utilityProcessPort) { - console.error('utility process port is not inited'); + if (!this.hiddenBrowserWindowPort) { + console.error('hidden browser window port is not inited'); return; } - this.utilityProcessPort.postMessage({ - action: 'message-port://utility.process/debug', + this.hiddenBrowserWindowPort.postMessage({ + action: 'message-port://hidden.browser-window/debug', options: { id: ev.data.id, code: ev.data.code, @@ -47,16 +47,13 @@ class WindowMessageHandler { }); }; - // startUtilityProcessHandler = async (ev: MessageEvent) => { - // }; - register = (actionName: string, handler: MessageHandler) => { this.actionHandlers.set(actionName, handler); }; start = () => { this.register('message-event://renderers/publish-port', this.publishPortHandler); - this.register('message-event://utility.process/debug', this.debugEventHandler); + this.register('message-event://hidden.browser-window/debug', this.debugEventHandler); window.onmessage = (ev: MessageEvent) => { const action = ev.data.action; diff --git a/packages/insomnia/vite.config.ts b/packages/insomnia/vite.config.ts index 7c88c4a9e7..c236331bb2 100644 --- a/packages/insomnia/vite.config.ts +++ b/packages/insomnia/vite.config.ts @@ -33,7 +33,7 @@ export default defineConfig(({ mode }) => { rollupOptions: { input: { main: path.join(__dirname, 'src/index.html'), - utilityProcess: path.join(__dirname, 'src/renderers/utility-process/index.html'), + hiddenBrowserWindow: path.join(__dirname, 'src/renderers/hidden-browser-window/index.html'), }, external: ['@getinsomnia/node-libcurl'], },