我有桌面應用程序,作爲簡單的瀏覽器。它具有顯示網頁的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。提前致謝。