2

したがって、<webview>要素が埋め込まれたChromeアプリケーションを作成しています。埋め込みWebアプリケーションには、window.showModalDialog呼び出し(Chromeはもはやサポートしていません)などの多くのレガシーコードが含まれています。Polyfill window.showModalDialog in webview

私が今やっていることは、それらの呼び出しをポリフィルすることです。

<webview src="http://legacyCodeIsAwesome.com/" style="width:100%; height:100%"></webview> 

コードWebViewの要素上で動作:(console.log作品をデバッグの追加)

webview.addEventListener('contentload', function() { 
    webview.executeScript(
     { 
     code: 'window.showModalDialog = function() { console.log ("Hello, world");}', 
     runAt: 'document_start' 
     } 
    ); 
    }); 

上記のコードを実行すると、唯一のそれはそれは何しません、私は簡単なテスト例を作成しましたこれは、showModalDialog関数を上書きしています。

webviewsのwindowオブジェクトの上書き機能には何らかの制限がありますか?その周りに道がありますか?

答えて

1

webview.executeScriptに電話するときは、基本的にContent Scriptを作成します。

コンテンツスクリプトの基本原則の1つは、isolated worldです。コンテンツスクリプトには、windowオブジェクトの別のコピーがあります。

コンテンツスクリプトは、独立した世界と呼ばれる特別な環境で実行されます。彼らは注入されたページのDOMにアクセスできますが、ページで作成されたJavaScript変数や関数にはアクセスできません。実行中のページで他のJavaScriptが実行されていないかのように、各コンテンツスクリプトを探します。逆も同様です。ページ上で実行されているJavaScriptは、関数を呼び出すことも、コンテンツスクリプトによって定義された変数にアクセスすることもできません。

したがって、オーバーライドは機能しますが、コンテンツスクリプトのコンテキストでのみ機能します。

ページコンテキスト自体でオーバーライドを実行するには、より深く、に移動する必要があります。 We need to go deeper

コンテンツスクリプトは、ページに<script>要素を作成できます。前記要素内のコードはページのコンテキスト内で実行される。この方法については、ページレベルスクリプトまたは注入スクリプトin this canonical questionと呼ばれています。あなたはあまりにも遅く、あなたのコードを注入している、と述べた

// Content script 
var script = document.createElement('script'); 
script.textContent = ` 
    window.showModalDialog = function() { 
    console.log("Hello, world"); 
    } 
`; 
(document.head||document.documentElement).appendChild(script); 
script.remove(); 

contentloadでは、問題のJSは既に実行されている可能性が高く、"document_start"を追加すると時間を巻き戻さないことになります。

幸いにも、あなたはdeclare in advance the content scripts you want to haveできます:あなたの大規模な答えを

webview.addContentScripts([ 
    { 
    name: "showModalDialogPolyfill", 
    matches: ["https://webapp.example.com/*"], 
    js: { files: ['content.js'] }, 
    run_at: 'document_start' 
    } 
]); 
webview.src = "https://webapp.example.com/"; 
+0

おかげで多くのことを、私は当初の参照 –

+0

のためにあなただけの小さな補正を+2を与えたいと思いますが、 'matches'をする必要があります配列 –

+0

@ NexusDuck固定、ありがとう。 – Xan