Как передавать данные между скриптами содержимого двух разных вкладок?

В моем расширении мне нужно передать некоторые данные из сценария содержимого одной вкладки в сценарий содержимого другой вкладки. Как я могу выбрать определенную вкладку с помощью chrome.tabs, если я знаю часть имени или URL-адреса этого объекта вкладки в нем? Как могут общаться сценарии двух вкладок?

ОБНОВЛЕНИЕ:

По-видимому, у меня нет метода sendMessage в chrome.extension. Когда я запускаю следующее из сценария содержимого:

chrome.extension.sendMessage("message");

получаю в консоли:

Uncaught TypeError: Объект № не имеет метода sendMessage.


person gvlasov    schedule 22.07.2012    source источник


Ответы (2)


Во-первых, обратите внимание, что сообщения, передаваемые в расширении, сериализуются в формате JSON. Несериализуемые типы, такие как функции, не включаются в сообщение.

В сценарии содержимого вы должны передать сообщение на фоновую страницу, потому что нет способа прямого доступа к другим вкладкам.

// Example: Send a string. Often, you send an object, which includes
//  additional information, eg {method:'userdefined', data:'thevalue'}
chrome.extension.sendMessage(' ... message ... ');

На фоновой странице используйте chrome.tabs.query для получения идентификатора вкладки. Для простоты примера я жестко закодировал шаблоны и URL-адреса. Было бы неплохо включить значения запроса из предыдущего сообщения следующим образом: {query:{...}, data:...}.

// background script:
chrome.extension.onMessage.addListener(function(details) {
    chrome.tabs.query({
        title: "title pattern",
        url: "http://domain/*urlpattern*"
    }, function(result) {
        // result is an array of tab.Tabs
        if (result.length === 1) { // There's exactely one tab matching the query.
            var tab = result[0];
            // details.message holds the original message
            chrome.tabs.sendMessage(tab.id, details.message);
        }
    });
});

chrome.tabs.sendMessage использовался для передачи исходных данных на другую вкладку.

Примечание. В этом примере я передал сообщение только тогда, когда запрос привел к одной уникальной вкладке. Если уникальность не является обязательным условием, просто переберите все полученные вкладки, используя result.forEach< /а> или:

for (var i=0, tab; i<result.length; i++) {
    tab = results[i];
    ...
}
person Rob W    schedule 22.07.2012
comment
Спасибо, это отличная информация для начала, но я все еще сталкиваюсь с некоторыми проблемами, смотрите обновление. - person gvlasov; 22.07.2012
comment
@Susei chrome.extension.sendMessage был представлен в Chrome 20. До Chrome 20 вам приходилось использовать chrome.extension.sendRequest (и использовать onRequest вместо onmessage). То же самое относится к chrome.tabs.sendMessage/sendRequest. - person Rob W; 23.07.2012

Из сценария содержимого вы можете общаться только с фоновым процессом. Вы можете общаться между двумя сценариями контента на разных вкладках, используя фон в качестве промежуточного звена.

Также DOM предоставляет другой способ связи между окнами DOM, но с той же политикой происхождения...

Чтобы получить URL-адрес вкладки, вы можете выполнить на ней скрипт содержимого. Сценарий содержимого может получить URL-адрес, используя window.location.href

person Alejandro Silvestri    schedule 22.07.2012