2

Chrome拡張機能で何か奇妙なことが起こります。

コンテンツスクリプト:

console.log('content');

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
    console.log('request received');
    sendResponse();
});

chrome.extension.sendRequest( JSON.stringify({'msg': 'page_loaded'}) );

拡張メッセージをリッスンし、ページが読み込まれるとメッセージをバックグラウンドに送信します。

バックグラウンドスクリプト:

console.log('bg');

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
    sendResponse();
    chrome.tabs.sendRequest(
        sender.tab.id,
        JSON.stringify({'msg': 'page_loaded_bg_receive'}),
        function(){
            console.log('sendRequest page_loaded_bg_receive callback');
        });
});

メッセージをリッスンし、メッセージを送信者タブに送信します。

そして、それは機能しているようです。少なくともほとんどの場合、ページログには「リクエストを受信しました」と表示されます。

Chromeに入るURLは、ユーザーが「Enter」を押す前に入力されたアドレスをロードすることがあります。これは奇妙な動作です。ページの読み込み、コンテンツスクリプトの実行、メッセージのバックグラウンドへの送信が、バックグラウンドからメッセージが返されると、バックグラウンドログメッセージで失敗します。

ポートエラー:接続を確立できませんでした。受信側は存在しません。miscellaneous_bindings:184 chromeHidden.Port.dispatchOnDisconnect miscellaneous_bindings:184

これはChromeのバグですか?プリロードタブにメッセージを送信するにはどうすればよいですか?

これは、そのような動作を再現するための人工的な最小限のサンプルです。メッセージを処理した後、複数回「chrome.tabs.sendRequest」を呼び出す必要があるため、「sendResponse」を呼び出すことは解決策ではありません。

4

1 に答える 1

3

記事https://developers.google.com/chrome/whitepapers/pagevisibilityに基づくソリューション。document.webkitVisibilityStateが「hidden」または「prerender」でない場合はcontent-scriptコードを実行し、他の場所では「webkitvisibilitychange」をリッスンしてdocument.webkitVisibilityStateが「hidden」または「prerender」でない場合に実行します。'prerender'をチェックするだけで十分だと思いますが、新しい空のタブを開くと、document.webkitVisibilityState ='hidden'のページが読み込まれ、このページにもバックグラウンドメッセージが表示されませんでした。

function isDocumentReady() {
  return document.webkitVisibilityState != "hidden" && document.webkitVisibilityState != "prerender";
}

if (isDocumentReady())
  main();
else {

  function onVisibilityChange() {
    if (!isDocumentReady())
      return;
    document.removeEventListener(
      "webkitvisibilitychange",
      onVisibilityChange,
      false);
    main();
  }

  document.addEventListener(
    "webkitvisibilitychange",
    onVisibilityChange,
    false);

}
于 2012-07-05T10:35:35.570 に答える