Подтвердить что ты не робот

Chrome.runtime.sendMessage работает не так, как ожидалось

Я пишу плагин Chrome с контентом script и фоном script, и я пытаюсь заставить их общаться.

В моем содержании script, я делаю

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

и на моем фоне script, я делаю

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"});
    }
);

Мой манифест выглядит следующим образом:

{
    "manifest_version": 2,
    "name": "Tesing Phase",
    "version": "1.0",
    "background": {
        "persistent": false,
        "scripts": ["bgscript.js"]
    },
    "content_scripts": [{
        "js": ["contentscript.js"],
        "all_frames": true,
        "run_at" : "document_start",
        "matches": ["*://*/*"]
    }],
    "web_accessible_resources": ["script.js"]
}

Когда я запускаю свой плагин, я получаю следующую ошибку:

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 

Я попробовал logging chrome.runtime, и не было метода sendMessage. Я использую версию 25.0 Chromium на Ubuntu. Я также попытался использовать sendRequest, но он сказал, что он обесценился, и sendMessage следует использовать.

Может ли кто-нибудь указать мне, чего я здесь не хватает? Существуют ли какие-либо разрешения для этого?

4b9b3361

Ответ 1

chrome.runtime.sendMessage/onMessage (и другие связанные события/методы, такие как connect) были введены в Chrome 26.

Если вы хотите написать расширение, совместимое с Chrome 20-25, используйте chrome.extension.sendMessage.

Способ достижения оптимальной совместимости - это определить методы chrome.runtime самостоятельно. Например, запустите следующий код перед остальной частью вашего кода (background/content script):

if (!chrome.runtime) {
    // Chrome 20-21
    chrome.runtime = chrome.extension;
} else if(!chrome.runtime.onMessage) {
    // Chrome 22-25
    chrome.runtime.onMessage = chrome.extension.onMessage;
    chrome.runtime.sendMessage = chrome.extension.sendMessage;
    chrome.runtime.onConnect = chrome.extension.onConnect;
    chrome.runtime.connect = chrome.extension.connect;
}

Затем вы можете просто использовать последний формат API:

// Bind event:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    // Do something
});

// Send message:
chrome.runtime.sendMessage({greeting: 'hello'});

Если вы чувствуете себя некомфортно с помощью методов модификации объекта chrome.runtime, вы можете использовать следующий подход:

var runtimeOrExtension = chrome.runtime && chrome.runtime.sendMessage ?
                         'runtime' : 'extension';

// Bind event:
chrome[runtimeOrExtension].onMessage.addListener(
  function(message, sender, sendResponse) {
    // Do something
});

// Send message:
chrome[runtimeOrExtension].sendMessage({greeting: 'hello'});