Spec-Zone.ru › Web Extensions

runtime.sendMessage()

Отправляет одно сообщение слушателям событий внутри вашей расширения или в другое расширение.

При отправке в ваше расширение, опустите аргумент extensionId. Событие runtime.onMessage будет срабатывать на каждой странице в вашем расширении, за исключением фрейма, который вызвал runtime.sendMessage.

При отправке в другое расширение, включите аргумент extensionId, установленный в ID другого расширения. Событие runtime.onMessageExternal будет срабатывать в другом расширении. По умолчанию, ваше расширение может обмениваться сообщениями с собой и любым другим расширением (определенным extensionId). Однако, ключ externally_connectable манифеста может быть использован для ограничения связи конкретными расширениями.

Расширения не могут отправлять сообщения скриптам контента с помощью этого метода. Для отправки сообщений скриптам контента используйте tabs.sendMessage.

Это асинхронная функция, которая возвращает Promise.

Примечание: Вы также можете использовать подход, основанный на соединении для обмена сообщениями.

Синтаксис

let sending = browser.runtime.sendMessage(
  extensionId,             // optional string
  message,                 // any
  options                  // optional object
)

Параметры

extensionId Необязательно

string. ID расширения, которому нужно отправить сообщение. Включите это, чтобы отправить сообщение в другое расширение. Если предполагаемый получатель установил ID явно, используя ключ browser_specific_settings в manifest.json, тогда extensionId должно иметь это значение. В противном случае оно должно иметь ID, который был сгенерирован для предполагаемого получателя.

Если extensionId опущено, сообщение отправляется вашему расширению.

message

any. Объект, который может быть сериализован с помощью структурного клонирования (см. Алгоритм клонирования данных).

options Необязательно

object.

includeTlsChannelId Необязательно

boolean. Будет ли ID TLS канала передан в runtime.onMessageExternal для процессов, которые слушают событие подключения.

Этот параметр поддерживается только в браузерах на основе Chromium.

В зависимости от аргументов, эта API иногда неоднозначна. Используются следующие правила:

  • если один аргумент, это сообщение для отправки, и сообщение будет отправлено внутренне.
  • если два аргумента:
    • аргументы интерпретируются как (message, options), и сообщение отправляется внутренне, если второй аргумент — любой из следующих:
      1. объект options (т.е., объект, который содержит только те свойства options , которые поддерживаются браузером)
      2. null
      3. undefined
    • в противном случае аргументы интерпретируются как (extensionId, message). Сообщение будет отправлено расширению, идентифицированному как extensionId.
  • если три аргумента, аргументы интерпретируются как (extensionId, message, options). Сообщение будет отправлено расширению, идентифицированному как extensionId.

Обратите внимание, что до Firefox 55 правила были другими в случае с 2 аргументами. По старым правилам, если первый аргумент был строкой, он обрабатывался как extensionId, а сообщение как второй аргумент. Это означало, что если вы вызывали sendMessage() с аргументами, такими как ("my-message", {}), тогда он отправлял бы пустое сообщение расширению, идентифицированному как «my-message». По новым правилам, с этими аргументами вы бы отправили сообщение «my-message» внутренне, с пустым объектом options.

Возвращаемое значение

A Promise. Если получатель отправил ответ, это будет выполнено с ответом. В противном случае это будет выполнено без аргументов. Если при подключении к расширению произошла ошибка, обещание будет отклонено с сообщением об ошибке.

Совместимость с браузерами

Рабочий стол Мобильный
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox для Android Opera Android Safari на IOS Samsung Internet
sendMessage 26
14runtime.onMessage слушатели в представлениях расширений получают отправленные ими сообщения.
45 ? 15 14 ? ? 48 ? 15 ?

Примеры

Вот скрипт контента, который отправляет сообщение фоновому скрипту, когда пользователь щелкает окно контента. Данные сообщения — {greeting: "Greeting from the content script"}, и отправитель также ожидает получить ответ, который обрабатывается в функции handleResponse:

// content-script.js

function handleResponse(message) {
  console.log(`Message from the background script: ${message.response}`);
}

function handleError(error) {
  console.log(`Error: ${error}`);
}

function notifyBackgroundPage(e) {
  const sending = browser.runtime.sendMessage({
    greeting: "Greeting from the content script",
  });
  sending.then(handleResponse, handleError);
}

window.addEventListener("click", notifyBackgroundPage);

Соответствующий скрипт фона выглядит так:

// background-script.js
function handleMessage(request, sender, sendResponse) {
  console.log(`A content script sent a message: ${request.greeting}`);
  sendResponse({ response: "Response from background script" });
}

browser.runtime.onMessage.addListener(handleMessage);

Примечание: Вместо использования sendResponse(), рекомендуемый подход для дополнений Firefox — возвращение Promise. Примеры использования Promise доступны в разделе примеров слушателя runtime.onMessage.

Примеры расширений

  • content-script-register
  • devtools-panels
  • export-helpers
  • find-across-tabs
  • mocha-client-tests
  • notify-link-clicks-i18n
  • store-collected-images
  • user-script-register
  • webpack-modules

Примечание: Эта API основана на API chrome.runtime Chromium. Данная документация получена из runtime.json кода Chromium.

© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API