WebExtensions:如何向内容脚本发送消息? (机器人)

时间:2017-01-24 16:34:30

标签: android google-chrome-extension firefox-webextensions firefox-android

我刚注意到标签API only available for the desktop不适用于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 个答案:

答案 0 :(得分:2)

从Firefox 54开始,使用.tabs.sendMessage()

从Firefox 54开始,tabs API is supported on Firefox for Android

替代Firefox 54之前的Firefox版本。

Firefox for Android支持storage API。因此,虽然我还没有对其进行测试,但您可以使用将数据发送到内容脚本的方法是使用chrome.storage.local.set()保存值。通过监听内容脚本中的chrome.storage.onChanged事件,可以通知您存储/更改的数据。这将提供一种事件驱动的方式来将消息(即存储的数据)发送到内容脚本。

为了区分在不同选项卡中接收数据,您需要为所保存的数据建立一个协议。这可能就像一个特定的保存键/值一样简单,这意味着所有内容脚本都应该向后台脚本发送消息以获取更多信息,或者在发送/存储类似内容时更复杂:

{
    contentScriptMessage: {
        tab: 14,
        frame: 1234,
        message: 'Some data'
    }
}

在每个内容脚本的chrome.storage.onChanged侦听器中,它可以忽略任何不对其运行的选项卡/框架所做的更改。

当您尝试实施此方法时,此方法将需要充实。希望至少部分chrome.tabs API将在不久的将来为Android实施。