如何在 Firefox 插件中实现 Chrome 扩展程序的 chrome.tabs.sendMessage API

2023-12-19

我正在使用 Addon-Builder 进行 Firefox 插件开发。我不知道如何在 Firefox 插件中实现 Chrome 扩展的 chrome.tabs.sendMessage API。代码是这样的(代码在background.js中,类似于Firefox插件中的main.js):

function sendMessageToTabs(message, callbackFunc){
    chrome.tabs.query({}, function(tabsArray){
        for(var i=0; i<tabsArray.length; i++){
            //console.log("Tab id: "+tabsArray[i].id);
            chrome.tabs.sendMessage(tabsArray[i].id,message,callbackFunc);
        }
    });
}

那么,我怎样才能实现这一目标呢?


在使用附加 SDK 构建附加组件时,内容脚本由 main.js 管理。没有内置方法可以访问所有附加组件的内容脚本。要将消息发送到所有选项卡,您需要手动跟踪内容脚本。

单向消息很容易由现有的API https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/page-mod.html。不过,回调不是内置的。

My 浏览器动作 SDK 库 https://github.com/Rob--W/browser-action-jplib包含一个名为“消息传递 https://github.com/Rob--W/browser-action-jplib/blob/master/lib/messaging.js”,它实现了 Chrome 消息传递 API。在以下示例中,内容脚本和主脚本使用一个名为“extension”的对象。该对象公开了onMessage and sendMessage方法,模仿 Chrome 扩展消息传递 https://developer.chrome.com/extensions/messaging.html APIs.

The following example adds a content script to every page on Stack Overflow, and upon click, the titles of the tabs are logged to the console (the one opened using Ctrl + Shift + J).

lib/main.js

// https://github.com/Rob--W/browser-action-jplib/blob/master/lib/messaging.js
const { createMessageChannel, messageContentScriptFile } = require('messaging');
const { PageMod } = require('sdk/page-mod');
const { data } = require('sdk/self');
 
// Adds the message API to every page within the add-on
var ports = [];
var pagemod = PageMod({
    include: ['http://stackoverflow.com/*'],
    contentScriptWhen: 'start',
    contentScriptFile: [messageContentScriptFile, data.url('contentscript.js')],
    contentScriptOptions: {
        channelName: 'whatever you want',
        endAtPage: false
    },
    onAttach: function(worker) {
        var extension = createMessageChannel(pagemod.contentScriptOptions, worker.port);
        ports.push(extension);
        worker.on('detach', function() {
            // Remove port from list of workers when the content script is deactivated.
            var index = ports.indexOf(extension);
            if (index !== -1) ports.splice(index, 1);
        });
    }
});
function sendMessageToTabs(message, callbackFunc) {
    for (var i=0; i<ports.length; i++) {
        ports[i].sendMessage(message, callbackFunc);
    }     
}
    
// Since we've included the browser-action module, we can use it in the demo
var badge = require('browserAction').BrowserAction({
    default_title: 'Click to send a message to all tabs on Stack Overflow'
});
badge.onClicked.addListener(function() {
    sendMessageToTabs('gimme title', function(response) {
        // Use console.error to make sure that the log is visible in the console.
        console.error(response);
    });
});

作为记录,有趣的部分main.js是在里面onAttach event.

data/contentscript.js

extension.onMessage.addListener(function(message, sender, sendResponse) {
    if (message === 'gimme title') {
        sendResponse(document.title);
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Firefox 插件中实现 Chrome 扩展程序的 chrome.tabs.sendMessage API 的相关文章

随机推荐

  • 链接自注册的抽象工厂

    我一直在使用和测试一个基于此处描述的自注册抽象工厂 https stackoverflow com a 582456 https stackoverflow com a 582456 在我所有的测试用例中 它就像一个魅力 并提供了我想要的功
  • 如何在我自己的高阶组件 (HOC) 中使用 React Router 的 withRouter HOC?

    我有一个更高阶的组件 它使用location searchReact Router 提供的 prop 用来构造一个queryParams对象并将其作为 prop 传递给其包装的组件 function withQueryParams Wrap
  • 为什么这个简短的 php 脚本不发送电子邮件?

    我似乎无法让我的 php 脚本发送电子邮件 首先 我在php ini文件中设置了邮件功能设置 如下所示 我在 Outlook 上检查了我的电子邮件帐户设置 它不需要身份验证 端口为 25 加密连接类型为 自动 鉴于此 我相应地配置了我的 p
  • Xcode A+ 源代码控制符号

    我刚刚注意到 XCode 显示与源代码管理相关的 A 符号 这是什么意思 A 代表移动文件 重命名被视为移动 所有功劳都归功于用户2129800 他的答案在问题下的评论中
  • 将 WPF 应用程序重写到 Surface

    我正在开发一个 WPF 应用程序 我很好奇如果有一天我们想通过多点触控来控制它 需要什么才能将该应用程序重写为 Surface 应用程序 我们是否可以重用 WPF 应用程序的大部分内容并将其顺利转移到 Surface 或者 Surface
  • 验证 ASP.Net Core 中 IFormFile 的图像类型

    我有一个 ASP NET Core 应用程序 我需要验证上传的文件是图像 而不是具有图像扩展名的非图像文件 我发现的所有有意义的解决方案都使用 System Drawing Image 或 ASP NET Core 中不可用的类似类 您能建
  • Visual C 内联汇编器中的立即调用/jmp

    当我尝试立即调用或跳转 VC 2010 内联汇编器时 asm call 00405B90h jmp 00405B90h jmp far 00405B90h 它会产生一个错误 C2415 improper operand type 这可能吗
  • $(window).hashchange() 不起作用

    Hi 我正在尝试使用浏览器后退按钮 我了解如何使用 hashchange 插件捕获事件 gt window hashchange function alert location hash window hashchange 当我尝试加载新页
  • dplyr sql 连接

    考虑以下 SQL SELECT D product name FROM business payment P LEFT JOIN dim product name D ON D product id P product id 该查询返回付款
  • 如何在 VB.NET 中激活、移动窗口并调整窗口大小

    我有一个窗口 我只知道其标题 例如记事本 我需要激活该窗口 调整其大小并将其放置在屏幕的左上角 因此 在对 MSDN 和论坛进行一些研究后 我发现了一些应该实现此目的的功能 我使用FindWindow按标题获取句柄 然后使用GetWindo
  • “复杂胜于复杂”是什么意思? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在蒂姆 彼得斯 Tim Peters 的 Python 之禅 中 复杂胜于复杂 这句话让我很困惑 谁能
  • 在java中使用什么好的持久集合框架?

    我所说的持久集合是指类似于 clojure 中的集合 例如 我有一个包含元素 a b c 的列表 对于普通列表 如果我添加 d 我的原始列表将包含 a b c d 作为其元素 对于持久列表 当我调用 list add d 时 我会返回一个新
  • 弹出到应用程序委托中的根视图控制器

    我有一个有人登录的应用程序 如果他们在将其发送到后台超过 10 分钟后启动它 我会弹出一个漂亮的小 会话过期 警报 并将它们发送到根视图控制器 登录页面 一切都很好 但我不知道如何从应用程序委托的 applicationWillEnterF
  • 如何使用 Amazon S3 实施 LuceneNet

    我尝试在我的应用程序中使用 Amazon S3 来存储我生成的索引来实现 Lucene 但我可以找到任何代码示例或清晰的文章 因此 任何有这方面经验的人请提供指南或可以帮助我开始的东西 有一个类似的问题here https stackove
  • psql:致命:无法打开文件“base/11951/11717”:只读文件系统

    我正在尝试从 CLI 访问 postgreSQL 数据库 当我以 postgres 身份登录并输入命令时 我收到错误 psql FATAL could not open file base 11951 11717 Read only fil
  • PHP 中的单元测试 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 你们用 PHP 进行单元测试吗 我不
  • Angular Material sidenav 事件广播

    我正在使用 Angular Material 的 sidenav 指令 当我们点击组件之外时 sidenav 将被关闭 当时播出的活动是什么 In your controller use watch https docs angularjs
  • 如何检测用户使用的是移动设备、平板电脑还是桌面设备并重定向它们?

    首先我知道响应式网站不是 1 但不幸的是目前这不是一个选择 我也有很强的 JavaScript 编码能力 我需要检测用户是否使用台式机 平板电脑或移动设备并重定向它们 用户使用桌面 留在站点 A 用户使用平板电脑 从 A 重定向到站点 B
  • Typescript 如何将类型键映射到驼峰命名法

    我是打字稿新手 但我想创建一个映射类型来将键从另一种类型转换 具体来说 假设我有一个所有键都是蛇形外壳的类型 我如何创建一个所有键都是驼形外壳的类型 我想我可以做类似的事情 type CamelCase
  • 如何在 Firefox 插件中实现 Chrome 扩展程序的 chrome.tabs.sendMessage API

    我正在使用 Addon Builder 进行 Firefox 插件开发 我不知道如何在 Firefox 插件中实现 Chrome 扩展的 chrome tabs sendMessage API 代码是这样的 代码在background js