首页 > 编程语言 >Chrome扩展程序是如何进行消息传递的

Chrome扩展程序是如何进行消息传递的

时间:2023-12-25 12:13:11浏览次数:33  
标签:Chrome 扩展 content chrome API scripts 消息传递 发消息

大家好,我是 dom 哥。这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星

一个复杂的 Chrome 扩展程序通常由 content_scriptsbackgroundaction popupside paneloptions pagedevtools 等部分组成,这些部分所负责的功能各不相同,所处的运行环境各不相同,所能访问的 chrome.* API 也各不相同,也因此经常需要通信告诉对方需要做什么。

下面是我画的一张图,简单说明各部分关系:

这些花花绿绿的部分各自运行在不同的环境中,往往需要相互通信,Chrome 为我们提供了两种通信方式:

  • 一种是一次性请求(one-time requests),一次只能发一条消息,类似于手机发短信,跟 HTTP 请求很像。
  • 一种是长期连接(long-lived connections),允许发送多条消息,类似于手机打电话,跟 Websocket 连接很像。

接下来就详细说说这两种通信方式。

一次性请求(one-time requests)

如果要向扩展程序的另一部分发送一条消息,有两个 API 可供调用:

  • chrome.runtime.sendMessage(extensionId?, message)
  • chrome.tabs.sendMessage(tabId, message)

从函数签名很容易看出来,一个是向扩展程序的各个部分发消息的,另一个是给某个浏览器的某个页签发消息的。

为什么设计两个 API?这是因为 content_scripts 是一个很独特的存在!

先说说浏览器的的工作原理。

浏览器的每个页签都是单独的线程。每个页签运行在与其他页签或扩展相隔离的独立线程中。如下图所示

我们在每个页签中打开页面。content_scripts 是一个很特殊的存在!作为被注入到页面的脚本,它的生命周期跟随页面。而扩展程序的其他部分,都有自己的生命周期!如果你在各个部分查看它们的 location,就会发现,只有 content_scripts 的 origin 是页面的 url 一样,而其它部分的 location.origin 都是 chrome://your-extention-id

知道了 content_scripts 的特殊性后,那么这两个 API 就很好理解了。

chrome.runtime.sendMessage() 是给扩展程序发消息的,它的第一个参数是一个可选的 extensionId,意味着不但可以给自身扩展程序发消息,还能给别的扩展程序发消息,它发送的消息可以被扩展的任一部分接收到,包括 backgroundaction popupside paneloptions pagedevtools 等等,除了 content_scripts!!!

那么想给 content_scripts 发送消息怎么办呢???

chrome.tabs.sendMessage() 就是专门用来给 content_scripts 发消息的!值得注意的是,想要给 content_scripts 发消息需要指定 tabId,也就是需要指明给哪个页签下的页面的 content_scripts 发消息。这个设计很好,因为每个页签的页面都运行了一份 content_scripts,这就避免了无关的页面接收到消息。

发送消息搞定啦,有方法发送就得有方法接收才行啊。

接收消息的方法只有一个 API:

chrome.runtime.onMessage.addListener(
  (message, sender, sendResponse) => boolean | undefined
)

在扩展程序的任意部分(包括 content_scripts)都是用这个接收消息。这很方便。

长期连接(long-lived connections)

长期链接的 API 和一次性消息的 API 是相互对应的。

要创建一个可重复使用的长期消息传递通道,有两个 API 可以调用:

  • chrome.runtime.connect(extensionId?, connectInfo?): Port
  • chrome.tabs.connect(tabId, connectInfo?): Port

这两个 API 的设计和一次性消息的一样。

chrome.runtime.connect() 用于和扩展程序的任一部分建立消息通道,除了 content_scripts!!!

chrome.tabs.connect() 是专门用来和 content_scripts 建立消息通道哒!

chrome.{runtime,tabs}.connect() 返回的是一个 Port 对象。Port 就是被设计用来在扩展程序的不同部分之间进行双向通信的一个接口。

觉得不错可以 点个小星星 支持一下哦

标签:Chrome,扩展,content,chrome,API,scripts,消息传递,发消息
From: https://www.cnblogs.com/iovec/p/messaging.html

相关文章

  • 推荐给程序员的chrome扩展插件:gitzip for github下载单个GitHub仓库中的文件;json-hand
    推荐清单gitzipforgithub下载单个GitHub仓库中的文件双击文件,勾选文件前面的复选框,可以一次性选择多个文件json-handle格式化json......
  • SciTech-Python-编译Python的C/C++扩展的setup.py
    https://github.com/google-deepmind/tree/setup.py"""Setupforpippackage."""importos,platform,sys,sysconfig,shutil,subprocess,setuptoolsfromsetuptools.commandimportbuild_exthere=os.path.dirname(os.path.abspath......
  • 2023 年最受欢迎的 12 款 Chrome 浏览器扩展
    掘金2023年度人气创作者打榜中,快来帮我打榜吧~谷歌浏览器Chrome是目前最受欢迎的浏览器之一,而浏览器扩展则是为了提升用户体验和功能而开发的插件。2023年谷歌公布了12款最受欢迎的Chrome浏览器扩展。每个都提供独特的功能来增强您的浏览体验。以下是它们的详细介绍:Speechify:将......
  • 英语一课一练一年级扩展阅读02Art Class and Drawings-艺术课和绘画
    PDF格式公众号回复关键字:YYYKYLY02记忆树1Itistimefortheartclass.翻译现在是艺术课的时间。简化记忆艺术课句子结构1"Itistimefor":这是一个固定句型,用来表示做某件事情的时间到了。"it"(它)是形式主语,真正主语是"timefor"(做某件事情的时间);"for"(对于)是介词......
  • Linux:vscode扩展无法下载,报错:Error while fetching extensions : XHR failed
     在Linux系统上下载安装好vscode以后,发现扩展里面无法下载安装,报错:Error while fetching extensions : XHR failed 解决办法:修改hosts文件1.sudocp/etc/hosts/etc/hosts.bak2.sudovi/etc/hots3.在文件末尾增加下面的文字,然后保存,关闭  4.刷新DNS,Ubuntu22......
  • 315二叉树扩展先序遍历转中序遍历
    题目:二叉树扩展先序遍历转中序遍历问题描述编一个程序,读入用户输入的一串扩展先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的扩展先序遍历字符串:ABC##DE#G##F###其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出......
  • 欧拉定理 & 扩展欧拉定理 笔记
    欧拉函数欧拉函数定义为:\(\varphi(n)\)表示\(1\simn\)中所有与\(n\)互质的数的个数。关于欧拉函数有下面的性质和用途:欧拉函数是积性函数。可以通过这个性质求出他的公式。\(f(p)=p-1\)。很显然,比质数\(p\)小的所有数都与他互质。\(f(p^2)=p\times......
  • 扩展中国剩余定理(Excrt)笔记
    扩展中国剩余定理(excrt)本来应该先学中国剩余定理的。但是有了扩展中国剩余定理,朴素的CRT就没用了。扩展中国剩余定理用来求解如下形式的同余方程组:\[\begin{cases}x\equiva_1\({\rmmod}\b_1)\\x\equiva_2\({\rmmod}\b_2)\\...\\x\equiva_n\({\rmmod}\b_......
  • java selenium+ChromeDriver抓取网页长截图全过程 亲测有效
    废话不多说嗷,直接上代码,这个是在借鉴的基础上改的,找不到原版了,所以此处就不@了首先准备下载工具chromedriver.exe此处是一定要跟自己的goole版本对应嗷,我这谷歌版本是最新的,所以下载是118版本的chromedriver.exe大概就是下面这个东西引入maven依赖:<dependency>......
  • 彻底清除Chrome、Firefox、Edge、Safari等浏览器的缓存文件
     浏览器的缓存,是存储在硬盘驱动器或手机/平板电脑存储中的网页集合。缓存包括你访问过的网页上包含的文本、图像和大多数其他媒体。拥有网页的本地副本可以在下次访问时快速加载,因为你的计算机或移动设备不必再次从互联网下载。然而,随着时间的推移,缓存可能会占用计算机存......