我有桌面应用程序,作为简单的浏览器。它具有显示网页的webviews选项卡。电子:webview不会从新创建的窗口收到回调代码
部分网站有social sign-in选项。我真的需要它为我的用户提供。
在通过Facebook登录的浏览器(例如chrome)中,它会创建具有社会授权表单的新窗口。提交此表单后,新窗口关闭,父窗口收到回调代码,重新加载并登录。
在我的应用程序中,当您尝试执行相同操作时,包含网页的webview会使用相同的权限创建新的BrowserWindow形成。在这一点上一切正常。当你提交表单时,新窗口关闭,但没有任何反应。父窗口没有收到任何回调,应该运行的代码根本没有被触发。或者也许它已收到,但不触发,因为如果我重新加载页面,它表明我参与的签名。
按照electron documentation <的WebView >运行在比渲染过程中一个单独的进程。所以我认为当新窗口关闭时,回调由父BrowserWindow(渲染器进程)接收,而不是完全在webview框架中运行。
在搜索解决方案的不同来源时,我发现这个问题也与window.opener有关,在最早的电子版本中没有完全支持。但根据github上的issue#1865完整的window.opener支持现在可用,如果我通过window.open方法打开窗口。
为了使这项工作,我应该防止webview to open new BrowserWindow并自己创建它。
下面的代码失败:
// in renderer process
webview.addEventListener('new-window', function(event) {
event.preventDefault();
// I also tried 'event.defaultPrevented = true;'
// or 'return false;'
});
监听器被触发,但我不能阻止新窗口打开。
有人写道,只能在主进程中防止新窗口。
所以我添加以下代码在我main.js:
// in main process
var electron = require('electron');
var BrowserWindow = electron.BrowserWindow;
mainWindow = new BrowserWindow({
"width": 970,
"height": 500,
"center": true,
'title': 'Main window',
"autoHideMenuBar": true
});
mainWindow.loadURL('file://' + root + '/index.html');
mainWindow.webContents.on('new-window', function(event) {
console.log(event);
});
这次event 'new-window'不会被触发的。我认为这是因为该事件仅适用于渲染器处理通过window.open打开新窗口的请求。但在我的情况下,新窗口打开< webview >标记,而不是渲染过程。所以我没有阻止新窗口打开,因为这是两个独立的过程。
因此,我决定在打开它后立即获得新窗口。
// in renderer process
var electron = require("electron");
var remote = electron.remote;
webview.addEventListener('new-window', function(event) {
var win = remote.BrowserWindow.getFocusedWindow();
var contents = win.webContents;
win.setIcon(root+"/img/favicon.ico");
win.setMenuBarVisibility(false);
contents.on('dom-ready', function() {
contents.openDevTools();
})
});
之后,我真的不知道下一步该怎么做?如何追加window.opener解决我的问题
我发现在GitHub上很多类似的问题。但他们都合并为一个问题#1865,到目前为止还没有明确的答案。
我知道解决方案存在。勇敢的开发者修复了这个Brave browser同样用普通浏览器也可以正常工作。但是在查看其sources时我找不到答案。
他们甚至做了测试来检查window.opener是否工作正常。但是我没有从git仓库安装Brave。在'npm-start'之后,它会显示'错误:%1不是有效的Win32应用程序'。我有Windows 10.(只是另一个原因使我切换到Linux,希望尽快)
所以,我的问题是:如何将回调数据从新窗口发回到创建此窗口的webview。提前致谢。