Skip to content

Commit

Permalink
feat: add event.processId to be usable with webFrameMain.fromId()
Browse files Browse the repository at this point in the history
  • Loading branch information
miniak committed Dec 1, 2020
1 parent 6c5f7a6 commit 99e552d
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 6 deletions.
1 change: 1 addition & 0 deletions docs/api/structures/ipc-main-event.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# IpcMainEvent Object extends `Event`

* `frameId` Integer - The ID of the renderer frame that sent this message
* `processId` Integer - The ID of the process which owns the frame
* `returnValue` any - Set this to the value to be returned in a synchronous message
* `sender` WebContents - Returns the `webContents` that sent the message
* `ports` MessagePortMain[] - A list of MessagePorts that were transferred with this message
Expand Down
1 change: 1 addition & 0 deletions docs/api/structures/ipc-main-invoke-event.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# IpcMainInvokeEvent Object extends `Event`

* `frameId` Integer - The ID of the renderer frame that sent this message
* `processId` Integer - The ID of the process which owns the frame
* `sender` WebContents - Returns the `webContents` that sent the message
11 changes: 10 additions & 1 deletion docs/api/web-frame-main.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ win.webContents.on(
)
```

You can also access frames of existing pages by using the `webFrame` property
You can also access frames of existing pages by using the `mainFrame` property
of [`WebContents`](web-contents.md).

```javascript
Expand All @@ -51,6 +51,15 @@ async function main () {
main()
```

You can access the frame, which sent an IPC message using `webFrameMain.fromId(event.processId, event.frameId)`.
```javascript
const { ipcMain, webFrameMain } = require('electron')

ipcMain.on('ping', (event) => {
console.log(`Message from: ${webFrameMain.fromId(event.processId, event.frameId).url}`)
})
```

## Methods

These methods can be accessed from the `webFrameMain` module:
Expand Down
13 changes: 11 additions & 2 deletions lib/browser/api/web-contents.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { app, ipcMain, session, deprecate, BrowserWindowConstructorOptions } from 'electron/main';
import type { MenuItem, MenuItemConstructorOptions, LoadURLOptions } from 'electron/main';
import { app, ipcMain, session, deprecate, webFrameMain } from 'electron/main';
import type { BrowserWindowConstructorOptions, MenuItem, MenuItemConstructorOptions, LoadURLOptions } from 'electron/main';

import * as url from 'url';
import * as path from 'path';
Expand Down Expand Up @@ -493,6 +493,12 @@ const addReplyInternalToEvent = (event: any) => {
});
};

const addFrameToEvent = (event: any) => {
Object.defineProperty(event, 'frame', {
get: () => webFrameMain.fromId(event.processId, event.frameId)
});
}

const addReturnValueToEvent = (event: any) => {
Object.defineProperty(event, 'returnValue', {
set: (value) => event.sendReply(value),
Expand Down Expand Up @@ -536,6 +542,7 @@ WebContents.prototype._init = function () {

// Dispatch IPC messages to the ipc module.
this.on('-ipc-message' as any, function (this: Electron.WebContents, event: any, internal: boolean, channel: string, args: any[]) {
addFrameToEvent(event);
if (internal) {
addReplyInternalToEvent(event);
ipcMainInternal.emit(channel, event, ...args);
Expand All @@ -547,6 +554,7 @@ WebContents.prototype._init = function () {
});

this.on('-ipc-invoke' as any, function (event: any, internal: boolean, channel: string, args: any[]) {
addFrameToEvent(event);
event._reply = (result: any) => event.sendReply({ result });
event._throw = (error: Error) => {
console.error(`Error occurred in handler for '${channel}':`, error);
Expand All @@ -561,6 +569,7 @@ WebContents.prototype._init = function () {
});

this.on('-ipc-message-sync' as any, function (this: Electron.WebContents, event: any, internal: boolean, channel: string, args: any[]) {
addFrameToEvent(event);
addReturnValueToEvent(event);
if (internal) {
addReplyInternalToEvent(event);
Expand Down
5 changes: 4 additions & 1 deletion shell/common/gin_helper/event_emitter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "shell/common/gin_helper/event_emitter.h"

#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "shell/browser/api/event.h"
#include "shell/common/gin_helper/dictionary.h"
#include "shell/common/gin_helper/object_template_builder.h"
Expand Down Expand Up @@ -67,8 +68,10 @@ v8::Local<v8::Object> CreateNativeEvent(
Dictionary dict(isolate, event);
dict.Set("sender", sender);
// Should always set frameId even when callback is null.
if (frame)
if (frame) {
dict.Set("processId", frame->GetProcess()->GetID());
dict.Set("frameId", frame->GetRoutingID());
}
return event;
}

Expand Down
3 changes: 3 additions & 0 deletions spec-main/api-subframe-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ describe('renderer nodeIntegrationInSubFrames', () => {
expect(event1[0].frameId).to.not.equal(event2[0].frameId);
expect(event1[0].frameId).to.equal(event1[2]);
expect(event2[0].frameId).to.equal(event2[2]);
expect(event2[0].frame.name).to.equal('frame');
});

it('should load preload scripts in nested iframes', async () => {
Expand All @@ -47,6 +48,8 @@ describe('renderer nodeIntegrationInSubFrames', () => {
expect(event1[0].frameId).to.equal(event1[2]);
expect(event2[0].frameId).to.equal(event2[2]);
expect(event3[0].frameId).to.equal(event3[2]);
expect(event2[0].frame.name).to.equal('frame-with-frame');
expect(event3[0].frame.name).to.equal('frame');
});

it('should correctly reply to the main frame with using event.reply', async () => {
Expand Down
2 changes: 1 addition & 1 deletion spec-main/fixtures/sub-frames/frame-container.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
</head>
<body>
This is the root page
<iframe src="./frame.html"></iframe>
<iframe src="./frame.html" name="frame"></iframe>
</body>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
</head>
<body>
This is the root page
<iframe src="./frame-with-frame.html"></iframe>
<iframe src="./frame-with-frame.html" name="frame-with-frame"></iframe>
</body>
</html>

0 comments on commit 99e552d

Please sign in to comment.