feat: MessagePorts in the main process (#22404)
This commit is contained in:
parent
c4c0888972
commit
b4d07f76d3
34 changed files with 1316 additions and 113 deletions
12
lib/browser/api/message-channel.ts
Normal file
12
lib/browser/api/message-channel.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { MessagePortMain } from '@electron/internal/browser/message-port-main'
|
||||
const { createPair } = process.electronBinding('message_port')
|
||||
|
||||
export default class MessageChannelMain {
|
||||
port1: MessagePortMain;
|
||||
port2: MessagePortMain;
|
||||
constructor () {
|
||||
const { port1, port2 } = createPair()
|
||||
this.port1 = new MessagePortMain(port1)
|
||||
this.port2 = new MessagePortMain(port2)
|
||||
}
|
||||
}
|
|
@ -24,6 +24,7 @@ module.exports = [
|
|||
{ name: 'nativeTheme' },
|
||||
{ name: 'net' },
|
||||
{ name: 'netLog' },
|
||||
{ name: 'MessageChannelMain' },
|
||||
{ name: 'Notification' },
|
||||
{ name: 'powerMonitor' },
|
||||
{ name: 'powerSaveBlocker' },
|
||||
|
|
|
@ -16,6 +16,7 @@ export const browserModuleList: ElectronInternal.ModuleEntry[] = [
|
|||
{ name: 'inAppPurchase', loader: () => require('./in-app-purchase') },
|
||||
{ name: 'Menu', loader: () => require('./menu') },
|
||||
{ name: 'MenuItem', loader: () => require('./menu-item') },
|
||||
{ name: 'MessageChannelMain', loader: () => require('./message-channel') },
|
||||
{ name: 'nativeTheme', loader: () => require('./native-theme') },
|
||||
{ name: 'net', loader: () => require('./net') },
|
||||
{ name: 'netLog', loader: () => require('./net-log') },
|
||||
|
|
|
@ -11,6 +11,7 @@ const { internalWindowOpen } = require('@electron/internal/browser/guest-window-
|
|||
const NavigationController = require('@electron/internal/browser/navigation-controller')
|
||||
const { ipcMainInternal } = require('@electron/internal/browser/ipc-main-internal')
|
||||
const ipcMainUtils = require('@electron/internal/browser/ipc-main-internal-utils')
|
||||
const { MessagePortMain } = require('@electron/internal/browser/message-port-main')
|
||||
|
||||
// session is not used here, the purpose is to make sure session is initalized
|
||||
// before the webContents module.
|
||||
|
@ -115,6 +116,13 @@ WebContents.prototype.send = function (channel, ...args) {
|
|||
return this._send(internal, sendToAll, channel, args)
|
||||
}
|
||||
|
||||
WebContents.prototype.postMessage = function (...args) {
|
||||
if (Array.isArray(args[2])) {
|
||||
args[2] = args[2].map(o => o instanceof MessagePortMain ? o._internalPort : o)
|
||||
}
|
||||
this._postMessage(...args)
|
||||
}
|
||||
|
||||
WebContents.prototype.sendToAll = function (channel, ...args) {
|
||||
if (typeof channel !== 'string') {
|
||||
throw new Error('Missing required channel argument')
|
||||
|
@ -472,6 +480,11 @@ WebContents.prototype._init = function () {
|
|||
}
|
||||
})
|
||||
|
||||
this.on('-ipc-ports', function (event, internal, channel, message, ports) {
|
||||
event.ports = ports.map(p => new MessagePortMain(p))
|
||||
ipcMain.emit(channel, event, message)
|
||||
})
|
||||
|
||||
// Handle context menu action request from pepper plugin.
|
||||
this.on('pepper-context-menu', function (event, params, callback) {
|
||||
// Access Menu via electron.Menu to prevent circular require.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue