Передача сообщений в background.html из popup.js и контент-скриптов

Я пытаюсь заставить всплывающее/всплывающее меню показывать пользователю другой контент на основе текущего URL-адреса страницы, но не могу установить соединение. Я читал, что только background.html имеет доступ к URL-адресам текущих вкладок в структуре Chrome, поэтому я пытаюсь заставить его сообщить моему контент-скрипту и моему popup.js это через передача сообщений -- background.html получит сообщение и включит в ответ нужную информацию. Popup должен иметь возможность использовать getBackgroundPage(), но сценарии ввода контента не разрешены, поэтому я хотел бы использовать обмен сообщениями для обоих и иметь общее решение.

Итак... консольные сообщения о неудачных соединениях скрыты в каком-то случайном коде реализации, который я даже не могу просмотреть, а именно: разное_bindings:236 или разное_bindings:235, в зависимости от аргументов к кал. Попытка просмотреть, где мы попали, приводит меня к следующему:

Веб-страница по адресу chrome-devtools://devtools/miscellaneous_bindings может быть временно недоступна или навсегда перемещена на новый веб-адрес.

Я убежден, что делаю что-то глупое, или моя система испорчена, но я не могу понять, что именно. Большинство примеров и вопросов, которые я видел, либо требуют функциональности канала бета-релиза, либо используют манифесты версии 1.0, используют устаревшие функции (вопросы, например, 2011 года), либо не имеют принятых ответов. Я использую Chrome 24.0.1312.40 м и отключил другие расширения.

Вот как мы устроены...

всплывающее окно.html

<!doctype html>
<html>
    <head>
        <title>Working title popup</title>
        <script src="popup.js">
            // nothing allowed in here
        </script>
    </head>
    <body>

    <form>
        <fieldset>
        <button>Demo</button>
        <!--^ push to try again to get response string from background -->
        </fieldset>
    </form>

    </body>
</html>

popup.js:

asky();

function asky(){
        catchersMit=null;
        console.log("Going to get info.");
        // Below causing Port error: 
        //"Could not establish connection. Receiving end does not exist.":
        chrome.extension.sendMessage({msg:"need some info"} //arg1
                                     ,function(response){   //arg2
                                        alert(reponse.msg);
                                        //^ yields undefined in alert window
                                        catchersMit=response;}
                                    );
        //_*_ catchersMit still appears undefined out here.
}

background.html:

<!doctype html>
<html><head><script type="text/javascript">
chrome.extension.onMessage.addListener(

function(message,sender,sendResponse){
                sendResponse( {msg: "info you wanted"} );
} // anonymous (1st parameter) function OUT

); // onRequest listener OUT
</script></head><body></body></html>

manifest.json:

{
  "name": "Extension Working Title",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Coolest functionality.",
        "browser_action": {
    "default_icon": "lnr_icon.png",
        "default_popup": "popup.html"
  },

  "permissions": [ "tabs","http://*/*" ],
  "background": { "page": "background.html" }
}

Прямо сейчас я просто работаю с popup.js, так как мне легче отлаживать, но решение этой проблемы не должно отличаться между этим и контент-скриптом, если я не ошибаюсь.


person dooozies    schedule 15.12.2012    source источник
comment
I've read that only background.html has access to current-tabs' URLs in the Chrome framework, неверное предположение. API chrome.tabs(), вызываемый на всех страницах расширения, дает ожидаемые результаты.   -  person Sudarshan    schedule 15.12.2012
comment
1. CSP внедрил в background.html правило запрета встроенных скриптов. 2. Вы не привязали ни одного слушателя chrome.extension.onMessage.   -  person Rob W    schedule 15.12.2012
comment
@RobW - 1. Выдает ошибку импорта, если я включаю <head><script>/*code*/</script> в popup.html вместо использования <script src="_pathToSrc_">, но на background.html таких уведомлений нет. Тогда есть ли просто отсутствие правоприменения? 2. В background.html у меня было chrome.extension.onMessage.addListener(//... нужно ли было что-то еще там для завершения привязки?   -  person dooozies    schedule 16.12.2012
comment
@dooozies 1. Вы должны были получить сообщение об ошибке. Ваша ошибка необычная, обычно вы получаете сообщение об ошибке am о порте. Проблема также проявляется в новом профиле Chrome?   -  person Rob W    schedule 16.12.2012


Ответы (1)


Предполагая, что вам нужен текущий URL-адрес вкладки просмотра из вашего описания проблемы (I'm trying to get the popup/popopen menu to show the user different content based off the current page-URL), следующий код извлечет текущий URL-адрес вкладки просмотра, вы можете воспроизвести для фильтрации необходимой информации.

chrome.tabs.query({
            "status": "complete",
            "currentWindow": true,
            "active": true
        }, function (tabs) {
            for(tab in tabs)console.log(tabs[tab].url);
});

Нет необходимости в дополнительной передаче сообщений между фоном и HTML-страницей действия браузера.

Сценарии содержимого уже имеют доступ к URL-адресу через window.location.href

person Sudarshan    schedule 15.12.2012
comment
Спасибо. На самом деле это намного проще, чем пытаться выяснить, с каких вкладок приходят сообщения на моей фоновой странице. - person dooozies; 12.01.2013