2

私は基本的にlocalStorage、バックグラウンド スクリプトのオブジェクトを使用して、Chrome 拡張機能用の永続的なストレージを取得しようとしています。

セットアップは次のとおりです。

バックグラウンド スクリプトとコンテンツ スクリプトが 1 つずつあります。コンテンツ スクリプトは、拡張機能の .xml からデータを取得/設定する必要がありますlocalStorage

ただし、バックグラウンド スクリプトに送信するメッセージを取得できません。

バックグラウンド スクリプトのコードは次のとおりです。

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  console.log(sender.tab ? "from a content script:" + sender.tab.url : "from the extension");
  if (request.greeting == "hello")
    sendResponse({farewell: "goodbye"});
});

そしてコンテンツスクリプト:

setTimeout(function () {
  chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
    console.log(response.farewell);
  });
}, 5000);

理想的には、バックグラウンド スクリプトが出力from a content script: [some url]し、コンテンツ スクリプトが出力する必要がありますgoodbye。代わりに、次のエラーが表示されます。

Port: Could not establish connection. Receiving end does not exist. 

どんな助け/提案も大歓迎です!

ありがとう :)

編集:マニフェスト

{
  "manifest_version": 2,

  "name": "Helios",
  "description": "Helios chrome extension.",
  "version": "0.0.1",

  "permissions": [
    "https://secure.flickr.com/",
    "storage"
  ],

  "background": {
    "page": "background.html"
  },

  "browser_action": {
    "default_icon": {
      "19": "img/icon-19.png",
      "38": "img/icon-38.png"
    },
    "default_title": "Helios",
    "default_popup": "popup.html"
  },

  "content_scripts":[
    {
      "matches": ["*://*/*"],
      "css": ["css/main.css"],
      "js": [
        "js/vendor/jquery-1.9.1.js",
        "js/vendor/handlebars-1.0.0-rc.4.js",
        "js/vendor/ember-1.0.0-rc.7.js",
        "js/vendor/d3.v3.js",
        "js/vendor/socket.io.min.js",
        "js/templates.js",
        "js/main.js"
      ],
      "run_at": "document_end"
    }
  ],

  "web_accessible_resources": [
    "img/**",
    "fonts/**"
  ]
}

編集:Chromeバージョン

Google Chrome   29.0.1547.65 (Official Build 220622) 
OS  Mac OS X 
Blink   537.36 (@156661)
JavaScript  V8 3.19.18.19
Flash   11.8.800.170
User Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36
4

1 に答える 1

7

onMessage のドキュメントから。

この関数は、イベント リスナーから返されたときに無効になります。ただし、イベント リスナーから true を返して、非同期で応答を送信することを示す場合を除きます (これにより、sendResponse が呼び出されるまでメッセージ チャネルが相手側に開かれたままになります)。

したがって、コードは次のようになります

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  console.log(sender.tab ? "from a content script:" + sender.tab.url : "from the extension");
  if (request.greeting == "hello") {
    sendResponse({farewell: "goodbye"});
    return true;
  }
});
于 2013-09-13T13:57:00.987 に答える