I am working on a project in Electron where I will need to access user-loaded pages and perform some manipulations with their DOM. I'm using BrowserView because apparently it's more performant and has fewer bugs, so my BrowserView init code looks like this:
let view = new BrowserView({
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: false,
contextIsolation: true,
sandbox: true,
enableRemoteModule: false,
allowPopups: false
}
})
win.setBrowserView(view)
Now, I need to inject a certain JS code into the main frame of the page, as well as the iframes. In order to do that, I'm currently using "did-frame-finish-load" listener in the main process, like so:
view.webContents.on("did-frame-finish-load", function (e, isMainFrame, frameProcessId, frameRoutingId) {
view.webContents.send("from_mainland", {"command": "inject_code", "frameRoutingId": frameRoutingId, "isMainFrame": isMainFrame})
});
This technique allowed me to receive "from_mainland" message in my preload.js file using IPC, find a frame by routing ID supplied in the call and inject necessary code into relevant frame by calling executeJavaScript on it.
It works well in Electron 4.1.4. However, yesterday I tried it on another machine that has Electron 5.0.1 installed, and everything broke. Essentially, function webFrame.findFrameByRoutingId returns null when I supply it the routing id from the call. Any ideas on what's causing this issue and how to work around it?
Thank you!
UPDATE: So, I was plying with it some more and discovered that in Electron 5.0.1 findFrameByRoutingId and firstChild calls will return frames only if they belong to the same domain, otherwise you get a null, so it looks like a bug in Electron 5.
from Problem with finding frames by routing ID in Electron 5
No comments:
Post a Comment