mirror of
https://github.com/electron/electron.git
synced 2026-02-26 03:01:17 -05:00
Compare commits
1 Commits
trash-erro
...
miniak/ipc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ccf25af21 |
@@ -160,7 +160,6 @@ auto_filenames = {
|
|||||||
"lib/renderer/api/web-utils.ts",
|
"lib/renderer/api/web-utils.ts",
|
||||||
"lib/renderer/common-init.ts",
|
"lib/renderer/common-init.ts",
|
||||||
"lib/renderer/inspector.ts",
|
"lib/renderer/inspector.ts",
|
||||||
"lib/renderer/ipc-renderer-internal-utils.ts",
|
|
||||||
"lib/renderer/ipc-renderer-internal.ts",
|
"lib/renderer/ipc-renderer-internal.ts",
|
||||||
"lib/renderer/security-warnings.ts",
|
"lib/renderer/security-warnings.ts",
|
||||||
"lib/renderer/web-frame-init.ts",
|
"lib/renderer/web-frame-init.ts",
|
||||||
@@ -247,7 +246,6 @@ auto_filenames = {
|
|||||||
"lib/browser/guest-window-manager.ts",
|
"lib/browser/guest-window-manager.ts",
|
||||||
"lib/browser/init.ts",
|
"lib/browser/init.ts",
|
||||||
"lib/browser/ipc-main-impl.ts",
|
"lib/browser/ipc-main-impl.ts",
|
||||||
"lib/browser/ipc-main-internal-utils.ts",
|
|
||||||
"lib/browser/ipc-main-internal.ts",
|
"lib/browser/ipc-main-internal.ts",
|
||||||
"lib/browser/message-port-main.ts",
|
"lib/browser/message-port-main.ts",
|
||||||
"lib/browser/parse-features-string.ts",
|
"lib/browser/parse-features-string.ts",
|
||||||
@@ -290,7 +288,6 @@ auto_filenames = {
|
|||||||
"lib/renderer/common-init.ts",
|
"lib/renderer/common-init.ts",
|
||||||
"lib/renderer/init.ts",
|
"lib/renderer/init.ts",
|
||||||
"lib/renderer/inspector.ts",
|
"lib/renderer/inspector.ts",
|
||||||
"lib/renderer/ipc-renderer-internal-utils.ts",
|
|
||||||
"lib/renderer/ipc-renderer-internal.ts",
|
"lib/renderer/ipc-renderer-internal.ts",
|
||||||
"lib/renderer/security-warnings.ts",
|
"lib/renderer/security-warnings.ts",
|
||||||
"lib/renderer/web-frame-init.ts",
|
"lib/renderer/web-frame-init.ts",
|
||||||
@@ -324,7 +321,6 @@ auto_filenames = {
|
|||||||
"lib/renderer/api/module-list.ts",
|
"lib/renderer/api/module-list.ts",
|
||||||
"lib/renderer/api/web-frame.ts",
|
"lib/renderer/api/web-frame.ts",
|
||||||
"lib/renderer/api/web-utils.ts",
|
"lib/renderer/api/web-utils.ts",
|
||||||
"lib/renderer/ipc-renderer-internal-utils.ts",
|
|
||||||
"lib/renderer/ipc-renderer-internal.ts",
|
"lib/renderer/ipc-renderer-internal.ts",
|
||||||
"lib/worker/init.ts",
|
"lib/worker/init.ts",
|
||||||
"package.json",
|
"package.json",
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import * as url from 'url';
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { openGuestWindow, makeWebPreferences, parseContentTypeFormat } from '@electron/internal/browser/guest-window-manager';
|
import { openGuestWindow, makeWebPreferences, parseContentTypeFormat } from '@electron/internal/browser/guest-window-manager';
|
||||||
import { parseFeatures } from '@electron/internal/browser/parse-features-string';
|
import { parseFeatures } from '@electron/internal/browser/parse-features-string';
|
||||||
import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
|
import { ipcMainInternal, invokeInWebContents } from '@electron/internal/browser/ipc-main-internal';
|
||||||
import * as ipcMainUtils from '@electron/internal/browser/ipc-main-internal-utils';
|
|
||||||
import { MessagePortMain } from '@electron/internal/browser/message-port-main';
|
import { MessagePortMain } from '@electron/internal/browser/message-port-main';
|
||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
import { IpcMainImpl } from '@electron/internal/browser/ipc-main-impl';
|
import { IpcMainImpl } from '@electron/internal/browser/ipc-main-impl';
|
||||||
@@ -162,7 +161,7 @@ const webFrameMethods = [
|
|||||||
|
|
||||||
for (const method of webFrameMethods) {
|
for (const method of webFrameMethods) {
|
||||||
WebContents.prototype[method] = function (...args: any[]): Promise<any> {
|
WebContents.prototype[method] = function (...args: any[]): Promise<any> {
|
||||||
return ipcMainUtils.invokeInWebContents(this, IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, method, ...args);
|
return invokeInWebContents(this, IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, method, ...args);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,11 +179,11 @@ const waitTillCanExecuteJavaScript = async (webContents: Electron.WebContents) =
|
|||||||
// WebContents has been loaded.
|
// WebContents has been loaded.
|
||||||
WebContents.prototype.executeJavaScript = async function (code, hasUserGesture) {
|
WebContents.prototype.executeJavaScript = async function (code, hasUserGesture) {
|
||||||
await waitTillCanExecuteJavaScript(this);
|
await waitTillCanExecuteJavaScript(this);
|
||||||
return ipcMainUtils.invokeInWebContents(this, IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, 'executeJavaScript', String(code), !!hasUserGesture);
|
return invokeInWebContents(this, IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, 'executeJavaScript', String(code), !!hasUserGesture);
|
||||||
};
|
};
|
||||||
WebContents.prototype.executeJavaScriptInIsolatedWorld = async function (worldId, code, hasUserGesture) {
|
WebContents.prototype.executeJavaScriptInIsolatedWorld = async function (worldId, code, hasUserGesture) {
|
||||||
await waitTillCanExecuteJavaScript(this);
|
await waitTillCanExecuteJavaScript(this);
|
||||||
return ipcMainUtils.invokeInWebContents(this, IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, 'executeJavaScriptInIsolatedWorld', worldId, code, !!hasUserGesture);
|
return invokeInWebContents(this, IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, 'executeJavaScriptInIsolatedWorld', worldId, code, !!hasUserGesture);
|
||||||
};
|
};
|
||||||
|
|
||||||
function checkType<T> (value: T, type: 'number' | 'boolean' | 'string' | 'object', name: string): T {
|
function checkType<T> (value: T, type: 'number' | 'boolean' | 'string' | 'object', name: string): T {
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import { dialog, Menu } from 'electron/main';
|
import { dialog, Menu } from 'electron/main';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
|
|
||||||
import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
|
import { ipcMainInternal, handleSync } from '@electron/internal/browser/ipc-main-internal';
|
||||||
import * as ipcMainUtils from '@electron/internal/browser/ipc-main-internal-utils';
|
|
||||||
import { IPC_MESSAGES } from '@electron/internal//common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal//common/ipc-messages';
|
||||||
|
|
||||||
const convertToMenuTemplate = function (items: ContextMenuItem[], handler: (id: number) => void) {
|
const convertToMenuTemplate = function (items: ContextMenuItem[], handler: (id: number) => void) {
|
||||||
@@ -84,7 +83,7 @@ ipcMainInternal.handle(IPC_MESSAGES.INSPECTOR_SELECT_FILE, async function (event
|
|||||||
return [path, data];
|
return [path, data];
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMainUtils.handleSync(IPC_MESSAGES.INSPECTOR_CONFIRM, async function (event, message: string = '', title: string = '') {
|
handleSync(IPC_MESSAGES.INSPECTOR_CONFIRM, async function (event, message: string = '', title: string = '') {
|
||||||
assertChromeDevTools(event.sender, 'window.confirm()');
|
assertChromeDevTools(event.sender, 'window.confirm()');
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { webContents } from 'electron/main';
|
import { webContents } from 'electron/main';
|
||||||
import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
|
import { ipcMainInternal, handleSync } from '@electron/internal/browser/ipc-main-internal';
|
||||||
import * as ipcMainUtils from '@electron/internal/browser/ipc-main-internal-utils';
|
|
||||||
import { parseWebViewWebPreferences } from '@electron/internal/browser/parse-features-string';
|
import { parseWebViewWebPreferences } from '@electron/internal/browser/parse-features-string';
|
||||||
import { syncMethods, asyncMethods, properties } from '@electron/internal/common/web-view-methods';
|
import { syncMethods, asyncMethods, properties } from '@electron/internal/common/web-view-methods';
|
||||||
import { webViewEvents } from '@electron/internal/browser/web-view-events';
|
import { webViewEvents } from '@electron/internal/browser/web-view-events';
|
||||||
@@ -281,7 +280,7 @@ const handleMessage = function (channel: string, handler: (event: Electron.IpcMa
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleMessageSync = function (channel: string, handler: (event: ElectronInternal.IpcMainInternalEvent, ...args: any[]) => any) {
|
const handleMessageSync = function (channel: string, handler: (event: ElectronInternal.IpcMainInternalEvent, ...args: any[]) => any) {
|
||||||
ipcMainUtils.handleSync(channel, makeSafeHandler(channel, handler));
|
handleSync(channel, makeSafeHandler(channel, handler));
|
||||||
};
|
};
|
||||||
|
|
||||||
handleMessage(IPC_MESSAGES.GUEST_VIEW_MANAGER_CREATE_AND_ATTACH_GUEST, function (event, embedderFrameId: number, elementInstanceId: number, params) {
|
handleMessage(IPC_MESSAGES.GUEST_VIEW_MANAGER_CREATE_AND_ATTACH_GUEST, function (event, embedderFrameId: number, elementInstanceId: number, params) {
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
|
|
||||||
|
|
||||||
type IPCHandler = (event: ElectronInternal.IpcMainInternalEvent, ...args: any[]) => any
|
|
||||||
|
|
||||||
export const handleSync = function <T extends IPCHandler> (channel: string, handler: T) {
|
|
||||||
ipcMainInternal.on(channel, async (event, ...args) => {
|
|
||||||
try {
|
|
||||||
event.returnValue = [null, await handler(event, ...args)];
|
|
||||||
} catch (error) {
|
|
||||||
event.returnValue = [error];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
let nextId = 0;
|
|
||||||
|
|
||||||
export function invokeInWebContents<T> (sender: Electron.WebContents, command: string, ...args: any[]) {
|
|
||||||
return new Promise<T>((resolve, reject) => {
|
|
||||||
const requestId = ++nextId;
|
|
||||||
const channel = `${command}_RESPONSE_${requestId}`;
|
|
||||||
ipcMainInternal.on(channel, function handler (event, error: Error, result: any) {
|
|
||||||
if (event.sender !== sender) {
|
|
||||||
console.error(`Reply to ${command} sent by unexpected WebContents (${event.sender.id})`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ipcMainInternal.removeListener(channel, handler);
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
reject(error);
|
|
||||||
} else {
|
|
||||||
resolve(result);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
sender._sendInternal(command, requestId, ...args);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,40 @@
|
|||||||
import { IpcMainImpl } from '@electron/internal/browser/ipc-main-impl';
|
import { IpcMainImpl } from '@electron/internal/browser/ipc-main-impl';
|
||||||
|
|
||||||
export const ipcMainInternal = new IpcMainImpl() as ElectronInternal.IpcMainInternal;
|
export const ipcMainInternal = new IpcMainImpl() as ElectronInternal.IpcMainInternal;
|
||||||
|
|
||||||
|
type IPCHandler = (event: ElectronInternal.IpcMainInternalEvent, ...args: any[]) => any
|
||||||
|
|
||||||
|
export const handleSync = function <T extends IPCHandler> (channel: string, handler: T) {
|
||||||
|
ipcMainInternal.on(channel, async (event, ...args) => {
|
||||||
|
try {
|
||||||
|
event.returnValue = [null, await handler(event, ...args)];
|
||||||
|
} catch (error) {
|
||||||
|
event.returnValue = [error];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
let nextId = 0;
|
||||||
|
|
||||||
|
export function invokeInWebContents<T> (sender: Electron.WebContents, command: string, ...args: any[]) {
|
||||||
|
return new Promise<T>((resolve, reject) => {
|
||||||
|
const requestId = ++nextId;
|
||||||
|
const channel = `${command}_RESPONSE_${requestId}`;
|
||||||
|
ipcMainInternal.on(channel, function handler (event, error: Error, result: any) {
|
||||||
|
if (event.sender !== sender) {
|
||||||
|
console.error(`Reply to ${command} sent by unexpected WebContents (${event.sender.id})`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMainInternal.removeListener(channel, handler);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
} else {
|
||||||
|
resolve(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sender._sendInternal(command, requestId, ...args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { clipboard } from 'electron/common';
|
import { clipboard } from 'electron/common';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
|
import { ipcMainInternal, handleSync } from '@electron/internal/browser/ipc-main-internal';
|
||||||
import * as ipcMainUtils from '@electron/internal/browser/ipc-main-internal-utils';
|
|
||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
|
|
||||||
// Implements window.close()
|
// Implements window.close()
|
||||||
@@ -33,7 +32,7 @@ const allowedClipboardMethods = (() => {
|
|||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
ipcMainUtils.handleSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, function (event, method: string, ...args: any[]) {
|
handleSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, function (event, method: string, ...args: any[]) {
|
||||||
if (!allowedClipboardMethods.has(method)) {
|
if (!allowedClipboardMethods.has(method)) {
|
||||||
throw new Error(`Invalid method: ${method}`);
|
throw new Error(`Invalid method: ${method}`);
|
||||||
}
|
}
|
||||||
@@ -52,7 +51,7 @@ const getPreloadScript = async function (preloadPath: string) {
|
|||||||
return { preloadPath, preloadSrc, preloadError };
|
return { preloadPath, preloadSrc, preloadError };
|
||||||
};
|
};
|
||||||
|
|
||||||
ipcMainUtils.handleSync(IPC_MESSAGES.BROWSER_SANDBOX_LOAD, async function (event) {
|
handleSync(IPC_MESSAGES.BROWSER_SANDBOX_LOAD, async function (event) {
|
||||||
const preloadPaths = event.sender._getPreloadPaths();
|
const preloadPaths = event.sender._getPreloadPaths();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -68,7 +67,7 @@ ipcMainUtils.handleSync(IPC_MESSAGES.BROWSER_SANDBOX_LOAD, async function (event
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMainUtils.handleSync(IPC_MESSAGES.BROWSER_NONSANDBOX_LOAD, function (event) {
|
handleSync(IPC_MESSAGES.BROWSER_NONSANDBOX_LOAD, function (event) {
|
||||||
return { preloadPaths: event.sender._getPreloadPaths() };
|
return { preloadPaths: event.sender._getPreloadPaths() };
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils';
|
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
||||||
|
|
||||||
const clipboard = process._linkedBinding('electron_common_clipboard');
|
const clipboard = process._linkedBinding('electron_common_clipboard');
|
||||||
|
|
||||||
const makeRemoteMethod = function (method: keyof Electron.Clipboard): any {
|
const makeRemoteMethod = function (method: keyof Electron.Clipboard): any {
|
||||||
return (...args: any[]) => ipcRendererUtils.invokeSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, method, ...args);
|
return (...args: any[]) => ipcRendererInternal.invokeSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, method, ...args);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux') {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { pathToFileURL } from 'url';
|
|||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
|
|
||||||
import type * as ipcRendererInternalModule from '@electron/internal/renderer/ipc-renderer-internal';
|
import type * as ipcRendererInternalModule from '@electron/internal/renderer/ipc-renderer-internal';
|
||||||
import type * as ipcRendererUtilsModule from '@electron/internal/renderer/ipc-renderer-internal-utils';
|
|
||||||
|
|
||||||
const Module = require('module') as NodeJS.ModuleInternal;
|
const Module = require('module') as NodeJS.ModuleInternal;
|
||||||
|
|
||||||
@@ -47,7 +46,6 @@ process.argv.splice(1, 1);
|
|||||||
require('@electron/internal/common/init');
|
require('@electron/internal/common/init');
|
||||||
|
|
||||||
const { ipcRendererInternal } = require('@electron/internal/renderer/ipc-renderer-internal') as typeof ipcRendererInternalModule;
|
const { ipcRendererInternal } = require('@electron/internal/renderer/ipc-renderer-internal') as typeof ipcRendererInternalModule;
|
||||||
const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils') as typeof ipcRendererUtilsModule;
|
|
||||||
|
|
||||||
process.getProcessMemoryInfo = () => {
|
process.getProcessMemoryInfo = () => {
|
||||||
return ipcRendererInternal.invoke<Electron.ProcessMemoryInfo>(IPC_MESSAGES.BROWSER_GET_PROCESS_MEMORY_INFO);
|
return ipcRendererInternal.invoke<Electron.ProcessMemoryInfo>(IPC_MESSAGES.BROWSER_GET_PROCESS_MEMORY_INFO);
|
||||||
@@ -133,7 +131,7 @@ if (nodeIntegration) {
|
|||||||
const { appCodeLoaded } = process;
|
const { appCodeLoaded } = process;
|
||||||
delete process.appCodeLoaded;
|
delete process.appCodeLoaded;
|
||||||
|
|
||||||
const { preloadPaths } = ipcRendererUtils.invokeSync<{ preloadPaths: string[] }>(IPC_MESSAGES.BROWSER_NONSANDBOX_LOAD);
|
const { preloadPaths } = ipcRendererInternal.invokeSync<{ preloadPaths: string[] }>(IPC_MESSAGES.BROWSER_NONSANDBOX_LOAD);
|
||||||
const cjsPreloads = preloadPaths.filter(p => path.extname(p) !== '.mjs');
|
const cjsPreloads = preloadPaths.filter(p => path.extname(p) !== '.mjs');
|
||||||
const esmPreloads = preloadPaths.filter(p => path.extname(p) === '.mjs');
|
const esmPreloads = preloadPaths.filter(p => path.extname(p) === '.mjs');
|
||||||
if (cjsPreloads.length) {
|
if (cjsPreloads.length) {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { internalContextBridge } from '@electron/internal/renderer/api/context-bridge';
|
import { internalContextBridge } from '@electron/internal/renderer/api/context-bridge';
|
||||||
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
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 { webFrame } from 'electron/renderer';
|
||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
|
|
||||||
@@ -21,7 +20,7 @@ window.onload = function () {
|
|||||||
|
|
||||||
// The DOM implementation expects (message?: string) => boolean
|
// The DOM implementation expects (message?: string) => boolean
|
||||||
window.confirm = function (message?: string, title?: string) {
|
window.confirm = function (message?: string, title?: string) {
|
||||||
return ipcRendererUtils.invokeSync(IPC_MESSAGES.INSPECTOR_CONFIRM, message, title) as boolean;
|
return ipcRendererInternal.invokeSync(IPC_MESSAGES.INSPECTOR_CONFIRM, message, title) as boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const useEditMenuItems = function (x: number, y: number, items: ContextMenuItem[]) {
|
const useEditMenuItems = function (x: number, y: number, items: ContextMenuItem[]) {
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
|
||||||
|
|
||||||
type IPCHandler = (event: Electron.IpcRendererEvent, ...args: any[]) => any
|
|
||||||
|
|
||||||
export const handle = function <T extends IPCHandler> (channel: string, handler: T) {
|
|
||||||
ipcRendererInternal.on(channel, async (event, requestId, ...args) => {
|
|
||||||
const replyChannel = `${channel}_RESPONSE_${requestId}`;
|
|
||||||
try {
|
|
||||||
event.sender.send(replyChannel, null, await handler(event, ...args));
|
|
||||||
} catch (error) {
|
|
||||||
event.sender.send(replyChannel, error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export function invokeSync<T> (command: string, ...args: any[]): T {
|
|
||||||
const [error, result] = ipcRendererInternal.sendSync(command, ...args);
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
throw error;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,9 @@ const { ipc } = process._linkedBinding('electron_renderer_ipc');
|
|||||||
|
|
||||||
const internal = true;
|
const internal = true;
|
||||||
|
|
||||||
class IpcRendererInternal extends EventEmitter implements ElectronInternal.IpcRendererInternal {
|
type IPCHandler = (event: Electron.IpcRendererEvent, ...args: any[]) => any
|
||||||
|
|
||||||
|
class IpcRendererInternal extends EventEmitter {
|
||||||
send (channel: string, ...args: any[]) {
|
send (channel: string, ...args: any[]) {
|
||||||
return ipc.send(internal, channel, args);
|
return ipc.send(internal, channel, args);
|
||||||
}
|
}
|
||||||
@@ -20,6 +22,27 @@ class IpcRendererInternal extends EventEmitter implements ElectronInternal.IpcRe
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
invokeSync<T> (command: string, ...args: any[]): T {
|
||||||
|
const [error, result] = this.sendSync(command, ...args);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handle<T extends IPCHandler> (channel: string, handler: T) {
|
||||||
|
this.on(channel, async (event, requestId, ...args) => {
|
||||||
|
const replyChannel = `${channel}_RESPONSE_${requestId}`;
|
||||||
|
try {
|
||||||
|
event.sender.send(replyChannel, null, await handler(event, ...args));
|
||||||
|
} catch (error) {
|
||||||
|
event.sender.send(replyChannel, error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ipcRendererInternal = new IpcRendererInternal();
|
export const ipcRendererInternal = new IpcRendererInternal();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { webFrame, WebFrame } from 'electron/renderer';
|
import { webFrame, WebFrame } from 'electron/renderer';
|
||||||
import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils';
|
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
|
|
||||||
// All keys of WebFrame that extend Function
|
// All keys of WebFrame that extend Function
|
||||||
@@ -10,7 +10,7 @@ type WebFrameMethod = {
|
|||||||
|
|
||||||
export const webFrameInit = () => {
|
export const webFrameInit = () => {
|
||||||
// Call webFrame method
|
// Call webFrame method
|
||||||
ipcRendererUtils.handle(IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, (
|
ipcRendererInternal.handle(IPC_MESSAGES.RENDERER_WEB_FRAME_METHOD, (
|
||||||
event, method: keyof WebFrameMethod, ...args: any[]
|
event, method: keyof WebFrameMethod, ...args: any[]
|
||||||
) => {
|
) => {
|
||||||
// The TypeScript compiler cannot handle the sheer number of
|
// The TypeScript compiler cannot handle the sheer number of
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
||||||
import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils';
|
|
||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
|
|
||||||
const { mainFrame: webFrame } = process._linkedBinding('electron_renderer_web_frame');
|
const { mainFrame: webFrame } = process._linkedBinding('electron_renderer_web_frame');
|
||||||
@@ -32,7 +31,7 @@ export function createGuest (iframe: HTMLIFrameElement, elementInstanceId: numbe
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function detachGuest (guestInstanceId: number) {
|
export function detachGuest (guestInstanceId: number) {
|
||||||
return ipcRendererUtils.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_DETACH_GUEST, guestInstanceId);
|
return ipcRendererInternal.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_DETACH_GUEST, guestInstanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function invoke (guestInstanceId: number, method: string, args: any[]) {
|
export function invoke (guestInstanceId: number, method: string, args: any[]) {
|
||||||
@@ -40,13 +39,13 @@ export function invoke (guestInstanceId: number, method: string, args: any[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function invokeSync (guestInstanceId: number, method: string, args: any[]) {
|
export function invokeSync (guestInstanceId: number, method: string, args: any[]) {
|
||||||
return ipcRendererUtils.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_CALL, guestInstanceId, method, args);
|
return ipcRendererInternal.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_CALL, guestInstanceId, method, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function propertyGet (guestInstanceId: number, name: string) {
|
export function propertyGet (guestInstanceId: number, name: string) {
|
||||||
return ipcRendererUtils.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_PROPERTY_GET, guestInstanceId, name);
|
return ipcRendererInternal.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_PROPERTY_GET, guestInstanceId, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function propertySet (guestInstanceId: number, name: string, value: any) {
|
export function propertySet (guestInstanceId: number, name: string, value: any) {
|
||||||
return ipcRendererUtils.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_PROPERTY_SET, guestInstanceId, name, value);
|
return ipcRendererInternal.invokeSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_PROPERTY_SET, guestInstanceId, name, value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import * as events from 'events';
|
|||||||
import { setImmediate, clearImmediate } from 'timers';
|
import { setImmediate, clearImmediate } from 'timers';
|
||||||
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
|
||||||
|
|
||||||
import type * as ipcRendererUtilsModule from '@electron/internal/renderer/ipc-renderer-internal-utils';
|
|
||||||
import type * as ipcRendererInternalModule from '@electron/internal/renderer/ipc-renderer-internal';
|
import type * as ipcRendererInternalModule from '@electron/internal/renderer/ipc-renderer-internal';
|
||||||
|
|
||||||
declare const binding: {
|
declare const binding: {
|
||||||
@@ -29,12 +28,11 @@ for (const prop of Object.keys(EventEmitter.prototype) as (keyof typeof process)
|
|||||||
Object.setPrototypeOf(process, EventEmitter.prototype);
|
Object.setPrototypeOf(process, EventEmitter.prototype);
|
||||||
|
|
||||||
const { ipcRendererInternal } = require('@electron/internal/renderer/ipc-renderer-internal') as typeof ipcRendererInternalModule;
|
const { ipcRendererInternal } = require('@electron/internal/renderer/ipc-renderer-internal') as typeof ipcRendererInternalModule;
|
||||||
const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils') as typeof ipcRendererUtilsModule;
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
preloadScripts,
|
preloadScripts,
|
||||||
process: processProps
|
process: processProps
|
||||||
} = ipcRendererUtils.invokeSync<{
|
} = ipcRendererInternal.invokeSync<{
|
||||||
preloadScripts: {
|
preloadScripts: {
|
||||||
preloadPath: string;
|
preloadPath: string;
|
||||||
preloadSrc: string | null;
|
preloadSrc: string | null;
|
||||||
|
|||||||
4
typings/internal-electron.d.ts
vendored
4
typings/internal-electron.d.ts
vendored
@@ -208,10 +208,6 @@ declare namespace ElectronInternal {
|
|||||||
appIcon: Electron.NativeImage | null;
|
appIcon: Electron.NativeImage | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IpcRendererInternal extends NodeJS.EventEmitter, Pick<Electron.IpcRenderer, 'send' | 'sendSync' | 'invoke'> {
|
|
||||||
invoke<T>(channel: string, ...args: any[]): Promise<T>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IpcMainInternalEvent extends Omit<Electron.IpcMainEvent, 'reply'> {
|
interface IpcMainInternalEvent extends Omit<Electron.IpcMainEvent, 'reply'> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user