2

私はFirefoxの新しいwebExtensionsフレームワークを使用してWebExtensionを作成しています。これはChromeに基づいています。すべてのサンプル拡張はNightlyビルドで動作しますので、ここでテストします。私がやろうとしているのは、コンテンツページが読み込まれたときにスクリプトを実行することです。Firefoxでメインフレームでスクリプトを実行できないのはなぜですか?

background.jsこれは夜間に働く

"use strict"; 

function onCompletedFunc(details) { 
    var script = 'console.log("ok");'; 
    console.log("Details are %o", details); 
    chrome.tabs.executeScript(details['tabId'], { 
     code: script, 
     runAt: 'document_end' 
    }); 
}; 
chrome.webRequest.onCompleted.addListener(onCompletedFunc, 
            {'urls': ['<all_urls>']}, 
            ['responseHeaders']); 
//Does not work: 
/* 
chrome.webRequest.onCompleted.addListener(onCompletedFunc, 
            {'urls': ['<all_urls>'], 'types':["main_frame"]}, 
            ['responseHeaders']); 
*/ 

:ここに私のbackground.jsページです。バックグラウンドページからの詳細(「詳細は...」)と、コンテンツページのコンソール上のいくつかの「ok」行が、ロードされたリソースごとに1つずつ表示されます。 Chromeでも同じように動作します(マニフェストファイルは少し異なります)。

第2のバリエーションは、ページ上で1回のみ実行されます。これはChromeで正常に動作します。夜間には、メインフレームから「詳細」メッセージが1つ表示されますが、コンテンツページのコンソールには何も表示されません。

これはタイミングの問題だと確信していますが、ここで何が問題なのですか?


manifest.jsonを( "アプリケーション" を削除:{...}クロームで使用するために)あなたがいないだから(typesなし)

{ 

    "description": "", 
    "manifest_version": 2, 
    "name": "execute_script", 
    "version": "1.0", 

    "applications": { 
    "gecko": { 
     "id": "[email protected]", 
     "strict_min_version": "45.0" 
    } 
    }, 

    "permissions": [ 
    "webRequest", "webRequestBlocking", "<all_urls>" 
    ], 

    "background": { 
    "scripts": ["background.js"] 
    } 

} 
+0

まだサポートされていない可能性があります。 Firefox WebExtensionsフォーラムにお問い合わせください。 – wOxxOm

+0

@wOxxOmバグのようですが、私はhttps://bugzilla.mozilla.org/show_bug.cgi?id=1290016 –

答えて

1

あなたの最初のスニペットにのみ動作しますちょうどmain_frameの要求を取得するだけでなく、別のサブリソースも取得します。 webRequest.onCompletedは、スクリプトを挿入する場合は適切なイベントではありません。タブ内のページがリクエストを受け取ったページと一致するという保証はありません。

無条件でコードを実行する場合は、マニフェストファイルでコンテンツスクリプトを宣言するだけです。詳細はcontent script documentationをご覧ください。

プログラム注入が必須の場合は、webRequestイベントの代わりにchrome.webNavigation.onCommittedイベントを使用します。このイベントでは、タブが指定されたURLへの応答を表示していることがわかります。たとえば:

chrome.webNavigation.onCommitted.addListener(function(details) { 
    // Example: Only run in main frame and URLs containing "example" 
    if (details.frameId === 0 && details.url.includes('example')) { 
     chrome.tabs.executeScript(details.tabId, { 
      code: 'console.log("Injected at " + document.URL);', 
      runAt: 'document_end' 
     }); 
    } 
}); 
// filter (the second parameter, not used above) is supported as of Firefox 50. 

イベントあなたがwebNavigation.onCommittedを使用している場合、あなたは APIは非ブロックされていることを考慮しなければなりません。可能であれば(低い確率で)次のようなことが起こります。

  1. ユーザーがリクエストを開始しました。
  2. webNavigation.onCompletedが発生します。
  3. tabs.executeScriptを呼び出します。
  4. 一方、タブは他のサイトに移動します。
  5. tabs.executeScriptリクエストがタブに到着し、その間に別のURLに切り替えられました。
  6. あなたは、意図したページとは異なるページにスクリプトを挿入しました。

URLの不一致が望ましくない場合は、document.URLまたはlocationをチェックすると、コンテンツスクリプトロジックを続行する前に、期待値を持っています。

+0

でそれを報告しました。リダイレクト後にスクリプトがページ上で実行されると、実際には問題ないと思っています。私はall_urlsとしてフィルタを設定した場合、なぜスクリプトがまったく実行されないのか理解しているのかまだ分かりません。 –

+0

@CaitlinRainoneこれはバグです。あなたの質問(https://bugzilla.mozilla.org/show_bug.cgi?id=1290016)の下にあるリンクを見てください。 –

関連する問題