Я работаю над проектом в 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 в основной фрейм страницы, а также в фреймы. Для этого я сейчас
используя прослушиватель 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})
});
Этот метод позволил мне получить сообщение "from_mainland" в моем файле preload.js с использованием IPC, найти кадр по идентификатору маршрутизации, указанному в вызове, и
вставьте необходимый код в соответствующий фрейм, вызвав для него executeJavaScript.
Хорошо работает в Electron 4.1.4. Однако вчера я попробовал его на другой машине, на которой установлен Electron 5.0.1, и все сломалось. По существу,
Функция webFrame.findFrameByRoutingId возвращает ноль, когда я предоставляю ему идентификатор маршрутизации из вызова. Любые идеи о том, что вызывает эту проблему и как обойти это?
Спасибо!
ОБНОВЛЕНИЕ: Итак, я еще немного поработал над этим и обнаружил, что в Electron 5.0.1 вызовы findFrameByRoutingId и firstChild будут возвращать фреймы только в том случае, если они принадлежат одному домену, в противном случае вы получаете ноль, поэтому это выглядит как ошибка в электронном 5.