2016-07-26 9 views
2

私は単純なブラウザとして動作するデスクトップアプリケーションを持っています。 Webページを表示するWebビューのタブがあります。電子:webviewは新しい作成されたウィンドウからコールバックコードを受け取りません

ウェブサイトによっては、social sign-inオプションがあります。そして私は本当にそれが私のユーザーのために利用可能であることが必要です。

一般的なブラウザ(Chromeなど)では、Facebook経由でログインすると、社会認可フォームを使用して新しいウィンドウが作成されます。このフォームを送信した後、新しいウィンドウが閉じ、親ウィンドウがコールバックコードを受け取ってリロードしてログインします。

私のアプリでは、同じことをやろうとすると、Webページを含むwebviewが同じ認証を持つ新しいBrowserWindowを作成します形。この時点ですべて正常に動作します。フォームを送信すると、新しいウィンドウは閉じますが、その後は何も起こりません。親ウィンドウはコールバックを受信せず、実行すべきコードはまったくトリガされません。私はページをリロードすれば、それは私が署名してることを示しているためか、おそらくそれは、受け取ったが、トリガされませんされています。

electron documentation <のWebViewによる>ランをレンダリングプロセスよりも別のプロセスで。だから、私は新しいウィンドウが閉じると、親BrowserWindow(レンダラープロセス)によってコールバックが受信され、webviewフレームで正確に実行されないと思います。

解決策のためにさまざまなソースを検索していましたが、私は、この問題がwindow.openerにも関係していることを発見しました。これは最初のバージョンの電子では完全にサポートされていませんでした。しかし、githubのissue#1865によると、window.openメソッドでウィンドウを開くと、full window.openerのサポートが利用可能になりました。

この作業を行うには、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 >タグで開き、レンダラープロセスでは開きません。だから私は新しいウィンドウが2つの別々のプロセスであるので開くことを防ぐことに失敗した。

だから私はそれが開いた後に新しいウィンドウを取得することにしました。その後

// 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の上で多くの同様の問題を発見した

私の問題は解決する方法を...次に何をすべきか見当がつかない。しかし、それらのすべてが1つの問題#1865に統合されており、これまでのところ明確な答えはありません。

解決策があります。勇敢な開発者がこれを修正しました。 Brave browserも電子で作られているのは、一般のブラウザと同じです。しかし、sourcesを見ながら答えを見つけることができません。

彼らはwindow.openerが正しく動作するかどうかを確認するテストも行いました。しかし、私はgitリポジトリからBraveをインストールできませんでした。 'npm-start'の後に 'Error:%1は有効なWin32アプリケーションではありません'と表示されます。私はWindows 10を持っています(ちょっと別の理由でLinuxに切り替えることができます)。

私の質問は、新しいウィンドウのコールバックデータをこのウィンドウを作成したwebviewに送り返す方法です。前もって感謝します。

答えて

0

ハンドルに新しいウィンドウを自分でポップアップまず、あなたは(のWebViewからallowpopups属性を削除IE)allowpopupsを無効にする必要が 新しいウィンドウイベントがトリガされますが、あなたはexplicitellyそれをコーディングするまで、何のポップアップが開かれません。この方法では、 。

ソーシャルまたはssoログインに必要なwindow.opener機能については、電子には十分なサポートがありません。 issue 1865

を参照してください。Braveチームは、制限された方法でElectronのフォークで実装しました。 issue 4175を参照してください。あなたはどちらかにしようとして :

  • は(彼らはいくつかの主要な変更を加えたとして、それはあなたのニーズに合うと確信していない)
  • いるwindow.openerのサポートを統合するために電子ためにPRを行いブレイブからfork of electronを使用しますフォークから。
  • 欠けているwindow.openerメソッドを実装するスクリプトを注入することで、必要なメソッドの独自のポリフィルを作成します。 window.opener.sendを使用してレンダラプロセスと通信できます)
関連する問題