当前位置: 首页 > news >正文

Chrome扩展之通信

Chrome扩展通信

chrome扩展的5种js

js类型介绍
popup单击插件图标后的弹窗中的js,由于单击图标打开popup,焦点离开又立即关闭,生命周期一般很短。
content-script与页面共享DOM,但是不共享JS,可访问部分chrome扩展API。
background权限最高,几乎可调用所有Chrome扩展API(除了devTools),且可以无限制跨域。生命周期最长,跟随浏览器开关。
injected-script通过DOM操作的方式向页面注入的一种JS,和原始页面共享js(即可访问原始页面变量,方法等),无法访问Chrome扩展API。
devtools每打开一个开发者工具窗口,都会创建devtools的页面的实例,F12窗口关闭,页面也随之关闭,故devtools的生命周期和devtools窗口是一致的。可访问一组特有的DevTools API(background都无权访问):chrome.devtools.panels(面板相关);chrome.devtools.inspectedWindow(获取被审查窗口的相关信息);chrome.devtools.network(获取有关网络请求信息)。

Chrome插件提供的2种额外的通信方式

  1. chrome.tabs.sendMessagechrome.runtime.sendMessage 用于简单的一次性请求;
  2. chrome.tabs.connectchrome.runtime.connect,用于长时效连接。

通信接口使用限制

inject-scriptcontent-scriptpopup-jsbackground
inject-script-window.postMessage--
content-scriptwindow.postMessage-chrome.runtime.sendMessage chrome.runtime.connectchrome.runtime.sendMessage chrome.runtime.connect
popup-js-chrome.tabs.sendMessage chrome.tabs.connect-chrome.runtime.sendMessage chrome.runtime.connect
background-js-chrome.tabs.sendMessage chrome.tabs.connectchrome.tabs.sendMessage chrome.tabs.connect-
devtools-jschrome.devtools.inspectedWindow.evalchrome.runtime.sendMessagechrome.runtime.sendMessage

chrome.runtime.onMessageExternal 接口用于扩展间通信,与chrome.tabs.sendMessage 用法类似。

一次性请求

一次性请求类似于HTTP请求,包含一次请求和一次返回,且如果接收方不在线,就会出现请求失败;

扩展程序(popup、background)向content-script一次性通信

//popup.js发送
function sendToContentScript(message, callback){chrome.tabs.query({active: true, currentWindow: true}, tabs => {chrome.tabs.sendMessage(tabs[0].id, message, callback);});
}
sendToContentScript({cmd:'test', value:'popup_to_content'}, res => {console.log(res)   *// {res:'content_to_popup'}*
} );// content_script.js接收
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {console.log(request)   *// {cmd:'test', value:'popup_to_content'}*if(request.cmd === 'content_to_bg'){sendResponse({res:'content_to_popup'})// 若异步使用sendResponse,需添加return true*}
})

双方通信直接发送的都是JSON对象,不是JSON字符串,所以无需解析,很方便(当然也可以直接发送字符串)

content-script主动向扩展程序(background、popup)一次性通信

// content_script.js发送
chrome.runtime.sendMessage({cmd: 'test', value:'content_to_bg'}, res => {console.log(res);     //{res:'bg_to_content'}
});// background.js接收
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {console.log(request);   // {cmd: 'test', value:'content_to_bg'}sendResponse({res:'bg_to_content'})
});

注意事项

  • content_scriptspopup主动发消息的前提是popup处于打开状态,否则需要利用background作中转;
  • 使用chrome.runtime.sendMessage后无论是否需要回应,接收方都需调用sendReponse反馈,若不调用则发送方就会报错:
  • 如果backgroundpopup同时监听,那么它们都可以同时收到消息,但是只有一个可以sendResponse,一个先发送了,那么另外一个再发送就无效

页面脚本(包括inject-script)和content-script之间一次性通信

由于inject-script和content-script内均可获取到原始页面的window对象,故可通过window.postMessage来进行通信。该方法还可规避跨域的限制,可以在任意页面之间进行通信。

//inject-script
window.postMessage({cmd:"test",value:"inject_to_content"},"*")//content-script
window.addEventListener("message", e => {console.log(e.data)    //{cmd:"test",value:"inject_to_content"}
})

长时效连接

长连类似 WebSocket,建立连接后会一直保持,双方可以随时互发消息。

chrome.tabs.connectchrome.runtime.connect 长时效连接通信示例

扩展程序和web页面之间建立长连接,只需要从一端建立就可以了。
在popup或js或background发起连接请求:

//popup.js或background.js 发起连接需要指定发送到某个标签页
chrome.tabs.query({active: true, currentWindow: true}, tabs => {const port = chrome.tabs.connect(tabs[0].id, {name: 'popup'});//向指定tabd页发起连接请求port.postMessage({cmd: 'popup-connect',value:'extension'});port.onMessage.addListener(msg => {if(msg.cmd === 'connected') {//do somethingport.postMessage({cmd: 'done'});}});
});

在content-script发起连接和监听消息:

// content-script直接建立长链接
const port = chrome.runtime.connect({name: 'content'});
port.postMessage({cmd: 'cnt-connect'});
port.onMessage.addListener(msg => {if(msg.cmd === 'connected'){//do somethingport.postMessage({cmd: 'done'});}
});

任意一端监听连接请求:

chrome.runtime.onConnect.addListener(port => {if(port.name == 'popup') {port.onMessage.addListener(msg => {if(msg.cmd== 'popup-connect') port.postMessage({cmd: 'connnected'});});}else if(port.name === 'content'){......}
});

postMessagemessageChannel 长时效连接通信

  • 同一MessageChannel实例下的port1和port2两个对象可以通过postMessageonmessage方法相互发送和接收消息;
  • port1和port2是MessagePort实例,MessagePort继承了Transferable接口,可在不同可执行上下文之间传递。
  • window.postMessage(message, targetOrigin, [transfer]),第三个参数可以用来传递Transferable对象
//inject-script
const {port1,port2} = new MessageChannel();
window.addEventListener("load", () => {
port1.onmessage = (e) => {console.log(e)
}
window.postMessage('来自inject_script的信息', '*', [port2]);
});//content-script
window.addEventListener('message', e=>{e.port[0].postMessage('来自content-script的信息')
});

相关文章:

Chrome扩展之通信

Chrome扩展通信 chrome扩展的5种js js类型介绍popup单击插件图标后的弹窗中的js,由于单击图标打开popup,焦点离开又立即关闭,生命周期一般很短。content-script与页面共享DOM,但是不共享JS,可访问部分chrome扩展API。…...

Appium 环境配置

Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念: •无需用户对 App 进行任何修改或…...

前端JavaScript篇之Javscript数组的常用方法有哪些?JavaScript判断数组的方式有哪些?

目录 Javscript数组的常用方法有哪些?JavaScript判断数组的方式有哪些?1. Array.isArray() 方法:2. instanceof 操作符:3. Object.prototype.toString.call() 方法:4. Array.from() 方法: Javscript数组的常…...

【Spring Boot 3】【Redis】基本数据类型操作

【Spring Boot 3】【Redis】基本数据类型操作 背景介绍开发环境开发步骤及源码工程目录结构 背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工…...

[MySQL]关于表的增删改查

目录 1.插入 1.1单行数据全列插入 1.2多行插入,指定列插入 ​编辑2.查询 2.1全列查询 2.2指定列查询 3.3查询字段为表达式 2.4别名 ​编辑2.5去重 2.6排序 2.7条件查询 2.7.1基本查询: 2.7.2 AND 和OR 2.7.3范围查询 2.7.4模糊查询 2.7.5分页查询 limit …...

编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)

一、翻译环境和运行环境​ 在ANSI C的任何一种实现中,存在两个不同的环境。​ 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。​ 第2种是执行环境,它用于实际执行代码。​ VS中编译器:cl.exe ;Linux中…...

洛谷 P1364 医院设置

题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距…...

JAVAEE初阶 网络编程(三)

TCP回显服务器 一. TCP的API二. TCP回显服务器的代码分析三. TCP回显服务器代码中存在的问题四. TCP回显服务器代码五. TCP客户端的代码六.TCP为基准的回显服务器的执行流程 一. TCP的API 二. TCP回显服务器的代码分析 这的clientSocket并不是表示用户端的层面东西,…...

Linux 的提示符太长了,帮你精简一下

普通用户修改文件 ~/.bashrc 修改 50 行左右的代码,将两个w改为大写的W 如果是root用户则修改文件/root/.bashrc,同样的方法。...

nvm, node.js, npm, yarn 安装配置

文章目录 nvm 安装node.js 安装npm yarn 配置 nvm 安装 nvm 是一个 node.js 管理工具,可以快捷下载安装使用多个版本的node.js linux 命令行输入: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashwget -qO- https…...

Springboot之监听器

Springboot之事件监听器 事件监听的几种方式1 方式一:实现接口1.1 创建事件1.2 创建事件监听器1.3 发布事件 2 方式二:注解方式2.1 创建事件2.1.1 创建发送邮件事件2.1.2 创建发送短信事件 2.2 创建事件监听器2.3 发布事件2.4 事件异步处理(方…...

【02】mapbox js api加载arcgis切片服务

需求: 第三方的mapbox js api加载arcgis切片服务,同时叠加在mapbox自带底图上 效果图: 形如这种地址去加载: http://zjq2022.gis.com:8080/demo/loadmapbox.html arcgis切片服务参考链接思路:【01】mapbox js api加…...

Vue四个阶段,八个钩子函数

- 创造阶段:创建Vue实例和初始化数据事件,数据代理,监测watch - beforeCreate,只是创建实例,不能this.$el,this.msg,this.方法名() - created,数据代理了,能v…...

rancher和k8s接口地址,Kubernetes监控体系,cAdvisor和kube-state-metrics 与 metrics-server

为了能够提前发现kubernetes集群的问题以及方便快捷的查询容器的各类参数,比如,某个pod的内存使用异常高企 等等这样的异常状态(虽然kubernetes有自动重启或者驱逐等等保护措施,但万一没有配置或者失效了呢)&#xff0…...

idea编译打包前端vue项目

网上download了一个前端vue项目 第一次接触前端记录一下编译打包遇到的问题 1、idea前端项目打包一般是依赖 <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.0…...

Unity中URP下的 额外灯 逐像素光 和 逐顶点光

文章目录 前言一、额外灯 的 逐像素灯 和 逐顶点灯1、存在额外灯的逐像素灯2、存在额外灯的逐顶点灯 二、测试这两个宏的作用1、额外灯的逐像素灯2、额外灯的逐顶点灯 前言 在之前的文章中&#xff0c;我们了解了 主光相关的反射计算。 Unity中URP下的SimpleLit的 Lambert漫反…...

《WebKit 技术内幕》学习之五(2): HTML解释器和DOM 模型

2.HTML 解释器 2.1 解释过程 HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。 这一过程中&#xff0c;WebKit 内部对网页内容在各个阶段的结构表示。 WebKit 中这一过程如下&#xff1a;首先是字节流&#xff0c;经过解码之…...

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都…...

离线数据仓库-关于增量和全量

数据同步策略 数据仓库同步策略概述一、数据的全量同步二、数据的增量同步三、数据同步策略的选择 数据仓库同步策略概述 应用系统所产生的业务数据是数据仓库的重要数据来源&#xff0c;我们需要每日定时从业务数据库中抽取数据&#xff0c;传输到数据仓库中&#xff0c;之后…...

09 STM32 - PWM

9.1 PWM简介 脉冲宽度调制(Pulse Width Modulation,简称PWM)&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点&#xff0c;就是对脉冲宽度的控制。 9.2 PWM波原理 如下图所示&#xff0c;使用定时器定时&#xff0c;从0开始&#x…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...