feat: add <webview>.sendToFrame() / frameId to 'ipc-message' event (#30451)
This commit is contained in:
parent
be43996d35
commit
501ac15b1d
4 changed files with 43 additions and 3 deletions
|
@ -606,6 +606,21 @@ listening to the `channel` event with the [`ipcRenderer`](ipc-renderer.md) modul
|
|||
See [webContents.send](web-contents.md#contentssendchannel-args) for
|
||||
examples.
|
||||
|
||||
### `<webview>.sendToFrame(frameId, channel, ...args)`
|
||||
|
||||
* `frameId` [number, number] - `[processId, frameId]`
|
||||
* `channel` String
|
||||
* `...args` any[]
|
||||
|
||||
Returns `Promise<void>`
|
||||
|
||||
Send an asynchronous message to renderer process via `channel`, you can also
|
||||
send arbitrary arguments. The renderer process can handle the message by
|
||||
listening to the `channel` event with the [`ipcRenderer`](ipc-renderer.md) module.
|
||||
|
||||
See [webContents.sendToFrame](web-contents.md#contentssendtoframeframeid-channel-args) for
|
||||
examples.
|
||||
|
||||
### `<webview>.sendInputEvent(event)`
|
||||
|
||||
* `event` [MouseInputEvent](structures/mouse-input-event.md) | [MouseWheelInputEvent](structures/mouse-wheel-input-event.md) | [KeyboardInputEvent](structures/keyboard-input-event.md)
|
||||
|
@ -920,6 +935,7 @@ webview.addEventListener('close', () => {
|
|||
|
||||
Returns:
|
||||
|
||||
* `frameId` [number, number] - pair of `[processId, frameId]`.
|
||||
* `channel` String
|
||||
* `args` any[]
|
||||
|
||||
|
|
|
@ -161,8 +161,12 @@ const createGuest = function (embedder: Electron.WebContents, embedderFrameId: n
|
|||
});
|
||||
|
||||
// Dispatch guest's IPC messages to embedder.
|
||||
guest.on('ipc-message-host' as any, function (_: Electron.Event, channel: string, args: any[]) {
|
||||
sendToEmbedder(IPC_MESSAGES.GUEST_VIEW_INTERNAL_DISPATCH_EVENT, 'ipc-message', { channel, args });
|
||||
guest.on('ipc-message-host' as any, function (event: Electron.IpcMainEvent, channel: string, args: any[]) {
|
||||
sendToEmbedder(IPC_MESSAGES.GUEST_VIEW_INTERNAL_DISPATCH_EVENT, 'ipc-message', {
|
||||
frameId: [event.processId, event.frameId],
|
||||
channel,
|
||||
args
|
||||
});
|
||||
});
|
||||
|
||||
// Notify guest of embedder window visibility when it is ready
|
||||
|
|
|
@ -65,6 +65,7 @@ export const asyncMethods = new Set([
|
|||
'insertText',
|
||||
'removeInsertedCSS',
|
||||
'send',
|
||||
'sendToFrame',
|
||||
'sendInputEvent',
|
||||
'setLayoutZoomLevelLimits',
|
||||
'setVisualZoomLevelLimits',
|
||||
|
|
|
@ -267,6 +267,24 @@ describe('<webview> tag', function () {
|
|||
expect(args).to.deep.equal([message]);
|
||||
});
|
||||
|
||||
it('<webview>.sendToFrame()', async () => {
|
||||
loadWebView(webview, {
|
||||
nodeintegration: 'on',
|
||||
webpreferences: 'contextIsolation=no',
|
||||
preload: `${fixtures}/module/preload-ipc.js`,
|
||||
src: `file://${fixtures}/pages/ipc-message.html`
|
||||
});
|
||||
|
||||
const { frameId } = await waitForEvent(webview, 'ipc-message');
|
||||
|
||||
const message = 'boom!';
|
||||
webview.sendToFrame(frameId, 'ping', message);
|
||||
|
||||
const { channel, args } = await waitForEvent(webview, 'ipc-message');
|
||||
expect(channel).to.equal('pong');
|
||||
expect(args).to.deep.equal([message]);
|
||||
});
|
||||
|
||||
it('works without script tag in page', async () => {
|
||||
const message = await startLoadingWebViewAndWaitForMessage(webview, {
|
||||
preload: `${fixtures}/module/preload.js`,
|
||||
|
@ -529,8 +547,9 @@ describe('<webview> tag', function () {
|
|||
webpreferences: 'contextIsolation=no',
|
||||
src: `file://${fixtures}/pages/ipc-message.html`
|
||||
});
|
||||
const { channel, args } = await waitForEvent(webview, 'ipc-message');
|
||||
const { frameId, channel, args } = await waitForEvent(webview, 'ipc-message');
|
||||
|
||||
expect(frameId).to.be.an('array').that.has.lengthOf(2);
|
||||
expect(channel).to.equal('channel');
|
||||
expect(args).to.deep.equal(['arg1', 'arg2']);
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue