我正在尝试创建一个自定义菜单/标题栏,但我使用BrowserView将其添加到主BrowserWindow中,而不仅仅是使用BrowserWindow.loadURL()方法(出于某些原因)。
但是,当启用上下文隔离时,这似乎会导致加载预加载脚本时出现问题。
我所拥有的:
main.js
const mainWindow = new BrowserWindow({
frame: false,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, "preload.js")
}
})
const bView = new BrowserView();
bView.setBounds(//set my bounds);
bView.webContext.loadURL(path.join(__dirname, "menu.html"));
mainWindow.setBrowserView(bView);preload.js
const { remote } = require('electron')
window.mainWindow = remote.getCurrentWindow();在渲染器脚本中:
console.log(window.mainWindow); // undefined我想我理解为什么它是未定义的,但如果可能的话,我不清楚如何与渲染器进程共享主进程变量。
我已经尝试了上面提到的here (使用webFrame.executeJavaScript()),但似乎没有任何作用(我甚至不确定webFrame应该是什么)。
如果我只使用mainWindow.loadURL(filePath)加载menu.html,一切都很好,但这不是我想要做的。
发布于 2020-01-23 04:21:14
好吧,我想通了我的问题:
我在BrowserWindow中加载预加载脚本。我需要将它加载到BrowserView中,然后它才能工作。
发布于 2020-01-23 03:48:15
contextBridge.exposeInMainWorld是允许在启用上下文分离时在预加载到渲染器上下文之间进行通信接口。https://www.electronjs.org/docs/api/context-bridge#contextbridgeexposeinmainworldapikey-api-experimental
但也应该注意,它将不能转发非序列化对象,可能还包括远程对象。此外,通过远程暴露整个对象是一个巨大的安全漏洞,无论如何都应该避免上下文隔离。您也可以参考关于远程模块的计划弃用讨论:https://github.com/electron/electron/issues/21408
https://stackoverflow.com/questions/59866014
复制相似问题