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

Расширение Chrome: связь между контентом script и background.html

Я новичок в расширениях Chrome. Я пытаюсь установить связь между содержимым script и background.html. Background.html отправляет запрос, "привет", в контент script, а содержимое script должно отвечать на предупреждение "hello background". Но это просто не происходит. Мой код background.html:

function testRequest() {        
    chrome.tabs.getSelected(null, function(tab) {
        chrome.tabs.sendRequest(tab.id, {greeting: "hello"});
    });    
}

content.js код:

chrome.extension.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.greeting == "hello")
        alert("hello background");
    }
);

popup.html код:

<!doctype html>
<html>
    <head></head>
    <body>
        <form>
            <input type="button" value="sendMessage" onclick="testRequest()" />
        </form>    
    </body>
</html>

manifest.json:

{
    "browser_action": {
        "default_icon": "icon.png",
        "popup": "popup.html"
    },
    "background": {
        "page": "background.html"
    },
    "permissions": [
        "tabs",
        "http://*/*",
        "https://*/*",
        "notifications",
        "contextMenus"
    ],
    "content_scripts": [
        {
            "matches": ["http://*/*","https://*/*"],
            "js": ["content.js"]
        }
    ],
    "name": "FirstExtension",
    "version": "1.0"
}

Пожалуйста, помогите!

4b9b3361

Ответ 1

sendRequest/onRequest заменяется на sendMessage/onMessage в Chrome 20. *Message - это не просто псевдоним для *Request, это другой API.

Если вы хотите поддерживать Chrome < 20 (многие пользователи Ubuntu все еще находятся в Chromium 18, поскольку PPA не обновляется), используйте onRequest и sendRequest. В противном случае используйте методы *Message.


Другая проблема заключается в том, что ваша функция находится на фоновой странице, и вызов выполняется во всплывающем окне. Это разные области, если вы хотите вызвать метод фоновой страницы из всплывающего окна, используйте chrome.extension.getBackgroundPage():

chrome.extension.getBackgroundPage().testRequest();

Заключительное примечание: вы используете манифеста 1 и встроенные обработчики событий. Эта практика устарела, для получения дополнительной информации см. http://code.google.com/chrome/extensions/manifestVersion.html.