我正在Electron上的一个项目中,需要访问用户加载的页面并对其DOM执行一些操作。 我使用的是BrowserView,因为它显然性能更高且错误更少,因此我的BrowserView初始化代码如下:
let view = new BrowserView({
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: false,
contextIsolation: true,
sandbox: true,
enableRemoteModule: false,
allowPopups: false
}
})
win.setBrowserView(view)
现在,我需要将某些JS代码注入到页面的主框架以及iframe中。为此,我目前 在主要过程中使用“ did-frame-finish-load”侦听器,如下所示:
view.webContents.on("did-frame-finish-load", function (e, isMainFrame, frameProcessId, frameRoutingId) {
view.webContents.send("from_mainland", {"command": "inject_code", "frameRoutingId": frameRoutingId, "isMainFrame": isMainFrame})
});
该技术使我可以使用IPC在preload.js文件中接收“ from_mainland”消息,并通过调用中提供的路由ID查找帧,然后 通过在其上调用executeJavaScript将必要的代码注入相关框架。
在Electron 4.1.4中效果很好。但是,昨天我在另一台安装了Electron 5.0.1的计算机上进行了尝试,一切都坏了。实质上, 当我从调用中提供路由ID时,函数webFrame.findFrameByRoutingId返回null。关于导致此问题的原因以及解决方法的任何想法?
谢谢!
更新:所以,我对此进行了更多尝试,发现在Electron 5.0.1中,findFrameByRoutingId和firstChild调用仅在它们属于同一域时才返回帧,否则会返回null,因此它看起来像一个bug在Electron 5中。