2016-07-26 14 views
2

我有桌面应用程序,作为简单的浏览器。它具有显示网页的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。提前致谢。

回答

0

首先,要处理新窗口弹出式菜单自己,你必须禁用allowpopups(即删除web视图allowpopups属性) 这样的新窗口将触发事件,但没有弹出窗口将被打开,直到你explicitelly代码它。

对于某些社交或sso登录所需的window.opener功能,电子没有足够的支持。请参阅issue 1865

The Brave团队已在其Electron的叉子中以受限制的方式实施了它。见issue 4175。 您可以尝试两种:

  • 使用从勇敢(不知道它会满足您的需求,因为他们已经取得了一些重大变化)
  • 做一个公关的电子来window.opener的支持整合fork of electron从叉子。
  • 通过注入实现缺少的window.opener方法的脚本,为您需要的方法创建自己的polyfill。您可以使用window.opener.send与渲染器进程通信)
相关问题