4

コンテンツ スクリプト、背景ページ、設定ページ、ポップアップ ページを持つ Google Chrome 拡張機能を開発しています。content-script が Chrome Web Store にロードされても、onMessage リスナーが呼び出されないという難しい方法を学びました。

を実行している時点で一貫して中断できますchrome.extension.onMessage.addListenerが、リスナーが呼び出されることはありません。したがってchrome.tabs.sendMessage、バックグラウンド ページまたはポップアップ ページから実行すると、responseCallback関数が呼び出されることはありません。つまり、内部のロジックはresponseCallback決して実行されません。Chrome はこれをエラー シナリオのように扱いません。リクエストを受け入れますが、その後はサイレントになります。

これをエラー ケースとして処理した場合 (chrome://ページにメッセージを送信しようとする場合と同様)、responseCallbackは未定義の応答引数で呼び出され、エラー処理コードが実行されますが、そのような運はありません。

のコードに特別な動作を追加することもできましhttp(s)://chrome.google.com/webstore/*たが、実行が禁止されているページを見つけるためのより公式な方法があることを望んでいました。そこの指針をいただければ幸いです。

ここで素晴らしい投稿を見つけましたが、プログラム API がないため、この質問です。

Chrome ウェブストアとchrome://URL が特殊なケースであることは既に認識しています。ただし、私の調査によると、chrome://URL での動作は Chrome Web ストアでの動作とは異なります。URLchrome://では、コンテンツ スクリプトがまったく読み込まれていないように見え、sendMessageresponseCallback関数が null/未定義の応答オブジェクトで呼び出されます。これはエラーを通知する API の公式の方法であり、私にとっては問題なく動作します。

私の問題は、URL をハードコーディングしなくても、Chrome Web ストアで発生したようなエラーをプログラムで検出できることです (URL は時間の経過とともに変化する可能性があります)。

ご回答ありがとうございます。

4

2 に答える 2

2

chrome.webNavigation.onCompletedバックグラウンドスクリプトにリスナーを追加するのはどうですか?新しいページが読み込まれたら、特別な「ping」メッセージをタブに送信し、chrome.extension.onMessageコンテンツスクリプトでpingを受信して​​応答するために使用します。コンテンツスクリプトが応答しない場合は、そのページで実行されていないことがわかります。

于 2012-11-06T12:03:32.603 に答える
0

chrome.tabs.executeScript実行して、そのドメインでスクリプトを実行できるかどうかを確認できます。

chrome.tabs.executeScript(tabId, {code: ""}, function() {
  if(chrome.runtime.lastError) {
    // Something went wrong, perhaps no rights
  } else {
    // Scripting allowed
  }
});
于 2016-04-29T12:10:09.777 に答える