sendMessage из фонового сценария в сценарий содержимого в приложении не работает

ОБНОВЛЕНИЕ

Насколько я могу судить, невозможно отправить сообщение из фонового сценария в сценарий содержимого с помощью функции "sendMessage". Однако есть ужасный обходной путь,

В файле window.onload вашего контентного скрипта отправьте сообщение фоновому скрипту:

chrome.runtime.sendMessage( { action: "messaging", window: "app" }, this.listenForFutureMessages );

Также в сценарии содержимого есть следующая функция:

listenForFutureMessages: function(someAction)
{
    //Take some action based on the message

    //If we want the background script to be able to contact
    //us again, we need to give them another callback. This
    //is because Chrome only allows one use per callback
    chrome.runtime.sendMessage( { action: "messaging", window: "app" }, this.listenForFutureMessages );
},

В фоновом скрипте есть слушатель, который делает что-то вроде этого:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse)
    {
        if ( request.action === "messaging" )
        {
            //Save the callback for later
            this.listeners[ request.window ] = sendResponse;

            //Tell chrome we will be using the callback later
            return true;
        }
    }
);

Когда ваш фоновый скрипт хочет отправить скрипту содержимого сообщение, просто назовите его так:

this.listeners[ "app" ]( { someProperty: "some value" } );

Это глупый способ сделать это, но он действительно делает это возможным. Надеюсь, это поможет всем, кому нужна эта функция.

ОРИГИНАЛЬНЫЙ Я не могу отправить сообщение из фонового скрипта в скрипт содержания. Когда я пытаюсь найти идентификатор вкладки, он сообщает мне, что у меня нет разрешений, хотя у моего приложения есть это разрешение. И когда я получаю сообщение от сценария содержимого и распечатываю объект sender, он показывает tab.id = -1. API для отправки сообщения в сценарий содержимого требует идентификатора вкладки!

chrome.tabs.sendMessage (integer tabId, любое сообщение, функция responseCallback)

Ошибка:

chrome.tabs недоступен: у вас нет разрешения на доступ к этому API. Убедитесь, что требуемое разрешение или свойство манифеста включено в ваш manifest.json.

Ошибка в обработчике событий для undefined: невозможно вызвать метод sendMessage неопределенного TypeError: невозможно вызвать метод sendMessage из undefined в chrome-extension: //panoaieakcofaegcjfbmhndaekfgpijh/scripts/background.js: 109: 16 в Event.dispatchToListener ( event_bindings: 356: 21) в Event.dispatch_ (event_bindings: 342: 27) в Event.dispatch (event_bindings: 362: 17) в miscellaneous_bindings: 167: 33 в Event.dispatchToListener (event_bindings: 356: 21) в Event.dispatch_ ( event_bindings: 342: 27) в Event.dispatch (event_bindings: 362: 17) в Object.chromeHidden.Port.dispatchOnMessage (miscellaneous_bindings: 253: 22)

Итак, как мне связаться с моим сценарием контента? (У меня несколько окон, и мне нужно связаться с ними индивидуально)

Мой манифест:

{
    "manifest_version": 2,
    "name": "App",
    "description": "App",
    "version": "0.75",
    "minimum_chrome_version": "27",
    "offline_enabled": true,
    "icons": 
    {
        "16": "images/icon16.png",
        "48": "images/icon48.png",
        "128": "images/icon128.png"
    },
    "app": 
    {
        "background": 
        {
            "scripts": 
            [
                "scripts/background.js"
            ]
        }
    },
    "permissions": 
    [
        "unlimitedStorage",
        "fullscreen",
                {
            "fileSystem": 
            [
                "write"
            ]
        },
        "background",
        "<all_urls>",
        "tabs"
    ],
    "update_url": "http://192.168.1.121/app.xml"
}

person Don Rhummy    schedule 29.06.2013    source источник
comment
Не вкладывайте свой ответ в вопрос. Если у вас есть ответ, опубликуйте его как ответ.   -  person apaderno    schedule 01.07.2013
comment
@kiamlaluno Я не считаю это ответом. Это обходной путь.   -  person Don Rhummy    schedule 12.12.2013


Ответы (1)


В приложении Chrome нет такой вещи, как «сценарии содержимого». Ваш файл манифеста выглядит как смесь расширений Chrome. Откройте chrome://extensions/, включите режим разработчика, и вы увидите предупреждение о том, что разрешения «фон» и «вкладки» недействительны для приложения Chrome.

Если вы реализуете приложение Chrome, просто используйте chrome.runtime.sendMessage и _ 3_. Эти сообщения можно отправлять со страницы вашего мероприятия и на главную страницу. Например:

// event page (aka background page)
chrome.app.runtime.onLaunched.addListener(function() { 
    chrome.app.window.create('main.html');
});

    // Later, when you want to notify the app window
    chrome.runtime.sendMessage(" ... any message ... ");
<!-- main.html -->
<script src="main.js"></script>
// main.js
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    // Do something with the message
});
person Rob W    schedule 29.06.2013
comment
У меня это не работает (это именно то, что я пытался сделать). main.js никогда не получает сообщение. Возможно, я использовал неправильную терминологию, но моя главная страница никогда не получает это сообщение. - person Don Rhummy; 10.07.2013
comment
@DonRhummy Затем покажите свой реальный манифест и код вместо чего-то еще, что не соответствует вашему коду. - person Rob W; 10.07.2013
comment
Это мой манифест. Вы заметите, что он не объявляет никаких сценариев содержимого. Даже удаление разрешений фона и вкладок не работает. - person Don Rhummy; 10.07.2013
comment
@DonRhummy Пожалуйста, укажите свой исходный код в своем вопросе. В противном случае я могу только догадываться, что не так с вашим кодом (моя попытка воспроизвести вашу среду не удалась, поэтому вам нужно предоставить автономный пример, демонстрирующий вашу проблему). - person Rob W; 11.07.2013