在电子5

时间:2019-05-17 19:31:18

标签: javascript electron

我正在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中。

0 个答案:

没有答案