WebExtensions: Как отправить сообщение в контентный скрипт? (Android)
Я только что заметил, что API вкладок доступен только для рабочего стола, а не для Android. В прошлом я использовал этот код для отправки сообщений в мои скрипты контента:
sendMsgToTabs(msg) {
return browser.tabs.query({}).then(tabs => {
let msgPromises = []
for (let tab of tabs) {
let msgPromise = browser.tabs.sendMessage(tab.id, msg)
msgPromises.push(msgPromise)
}
return Promise.all(msgPromises)
})
}
Но как мне это сделать, когда API вкладок недоступен?
Я имею в виду, что единственное, о чем я могу думать, - это постоянно отправлять пустые сообщения из скриптов содержимого в фоновый скрипт, и всякий раз, когда у фонового скрипта появляется новая информация, он может отправлять прямой ответ на одно из этих сообщений. Но это звучит ужасно неэффективно. Должен быть лучший способ, верно?
1 ответ
Начиная с Firefox 54, используйте .tabs.sendMessage()
Начиная с Firefox 54, tabs
API поддерживается в Firefox для Android.
Альтернатива для версий Firefox до Firefox 54.
storage
API заявлен как поддерживаемый в Firefox для Android. Таким образом, хотя я не проверял это, метод, который вы могли бы использовать для отправки данных в скрипт контента, состоял бы в сохранении значения с помощью chrome.storage.local.set()
, Слушая chrome.storage.onChanged
событие в ваших сценариях содержания, вы можете быть уведомлены о сохранении / изменении этих данных. Это обеспечит управляемый событиями способ отправки сообщения (т.е. сохраненных данных) в скрипт контента.
Чтобы различать получение данных на разных вкладках, вам нужно будет установить протокол для значения сохраняемых данных. Это может быть просто простой сохраненный ключ / значение, означающий, что все сценарии содержимого должны отправлять сообщение в фоновый сценарий для получения дополнительной информации, или более сложный, когда вы отправляете / сохраняете что-то вроде:
{
contentScriptMessage: {
tab: 14,
frame: 1234,
message: 'Some data'
}
}
В каждом содержании скрипта chrome.storage.onChanged
слушатель, он может затем игнорировать любые изменения, которые не относятся к вкладке / фрейму, в котором он работает.
Эта методология потребует конкретизации, поскольку вы пытаетесь ее реализовать. Надеюсь, по крайней мере, часть chrome.tabs
API будет реализован для Android в ближайшее время.