2016-07-26 13 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與渲染器進程通信)
相關問題