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 в ближайшее время.

Другие вопросы по тегам