Chrome扩展的核心:manifest 文件(中)
大家好,我是 dom 哥。我正在写关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星 。
在上一篇中已经完成了 Chrome 扩展的雏形,本篇接着介绍 manifest 中的可选字段,完善扩展的细节。
manifest 中的可选字段
"content_scripts"
向 web 页面注入 JavaScript 和 CSS。可以说这是 Chrome 扩展的灵魂。当指定 content_scripts 后,每当页面加载时,content_scripts 也将随之加载。
"content_scripts": [
{
"css": ["content-style.css"],
"js": ["content-script.js"],
"matches": ["<all_urls>"],
"run_at": "document_idle", // optional
"world": "ISOLATED" // optional
}
]
content_scripts 里的配置项解释:
"css"
:指定注入的 css 样式文件"js"
:指定注入的 js 脚本文件
值得注意的是,css 和 js 指定的文件路径必须是相对路径!总是相对于扩展根目录!
"matches"
:用于指定往哪些页面注入 css 和 js,必填项。其值并非普通的 url,而是满足如下结构的匹配模式。
<scheme>://<host>/<path>
scheme
:指明协议格式,只能是以下几种- http
- https
- 通配符
*
, 表示 http 或 https - file
host
:指明主机名。支持通配符*
,但有限制,通配符*
的屁股后面必须跟.
或/
!也就是只有以下两种使用方式*.example.com
匹配子域*/
匹配所有域
path
:指明匹配的网址路径。/*
表示匹配所有路径。
特殊 case:
"<all_urls>"
匹配所有页面!一般,额,简单粗暴,就用这个!"run_at"
:脚本注入时机。默认情况下,扩展会在页面处于空闲状态时注入 css 和 js。有以下3个时机可供选择:document_start
页面 html 开始加载前就注入。此时 DOM 树还未建立!document_end
window DOMContentLoaded 事件触发后注入。此时 DOM 树已建立,但图片,字体,脚本等资源尚未加载完毕。document_idle
当页面空闲时注入。这也是默认的注入时机!浏览器会在document_end
和window.onload
触发前这个时间段内选择时机注入,具体注入时机取决于页面的复杂程度。
下面这张图片可以直观的看出注入时机和页面加载状态的先后时间顺序。 红色字是页面内脚本打印, 绿色字是扩展 content-script 打印。
"world"
:content-script 的脚本执行环境。默认情况下,content-script 运行在一个隔离的沙箱环境中。这意味着和页面的运行时环境是隔离开来的两个独立环境,最明显的表现就是两个环境里的 全局变量window
不通。该字段有以下2个选择:ISOLATED
隔离沙箱环境。这也是默认的 content-script 执行环境。MAIN
页面运行时环境。这意味者扩展脚本和页面脚本共享运行时,同一个 window,同一个世界,同一个梦想。
理解两者的不同非常重要!假设页面上的 js 给
window
对象增加了一个customVariable
全局变量,<head>
<script>
window.customVariable = "window.customVariable"
</script>
</head>
下面是扩展的 content-script 在
ISOLATED
和MAIN
两个不同的环境中打印window.customVariable
变量的结果:可以发现
ISOLATED
隔离环境访问不到window.customVariable
,值是 undefined,而MAIN
环境则能访问到!我画了一张图,以便直观的展示
ISOLATED
和MAIN
执行环境的区别
"background"
注册一个 service worker 作为后台服务。"content_scripts"
是页面级别的脚本,运行于前台页面,随页面销毁。"background"
是浏览器级别的服务,可以长期运行于后台,但事情也并没有那么简单,Chrome 扩展的 service worker 会在需要时自动加载,在闲置时自动休眠。
作为后台服务,service worker 的主要用途是注册事件监听,响应各种事件,比如网络请求,content_scripts 传来的 message 等等。Chrome 扩展提供了大量 chrome.* 接口可供使用,这些接口大多都能在 "background"
中使用,但 "content_scripts"
只能使用其中的少数,这是为安全起见故意设计的。
"background": {
"service_worker": "service-worker.js",
"type": "module"
}
不同于 "content_scripts"
可以用数组指定多个,"background"
只支持设置一个。
type
:指明支不支持 ES Modules,只有module
一个值,加上就支持 import,不加上就不支持!
配置完 "background"
后在扩展管理里更新扩展,就能看到注册的 Service Worker 啦!
当 service worker 闲置时,它会自动休眠,显示为无效。如下图所示:
"permissions"
明确申明你的扩展需要用到哪些特殊的扩展 APIs,就像手机 App 询问网络权限,位置权限,照片权限等等。权限和 API 绑定,每个权限被授权后都将解锁一批 API。有些权限只需要申明,浏览器就会授予权限,而有些权限还将展示警示弹窗需要用户明确授权才行。
举几个例子:
"webRequest"
,获得访问chrome.webRequest
API,可以监控所有网络流量。"cookies"
,获得访问chrome.cookies
API,可以操作网站 cookie"bookmarks"
,获得访问chrome.bookmarks
API,可以读写管理书签"desktopCapture"
,获得访问chrome.desktopCapture
API,可以进行窗口或页面的截图"downloads"
,获得访问chrome.downloads
API,可以操作和管理浏览器下载
截至目前,crx-demo 项目的目录结构如下:
crx-demo
├── background
│ ├── service-worker.js
│ └── sub.js
├── content-scripts
│ ├── document_end.css
│ ├── document_end.js
│ ├── document_idle.css
│ ├── document_idle.js
│ ├── document_idle_main.js
│ ├── document_start.css
│ └── document_start.js
├── icon128.png
├── icon48.png
└── manifest.json
已经可以在 content-script 和 background 里任意编写代码来实现自己匪夷所思的奇思妙想啦!
crx-demo 项目已经放在 github 上啦,后续会继续更新丰富细节。
本篇就介绍到这里,下篇接着将把剩余的 manifest 重要选项整理完。
觉得不错可以 点个小星星 支持一下
Chrome扩展的核心:manifest 文件(中)的更多相关文章
- Android manifest文件中的标签详细介绍
官方文档 概要 每一个Android应用都应该包含一个manifest文件,即AndroidManifest.xml.它包含了程序运行的一些必备信息,比如:--为Java应用程序指定一个独一无二的名字 ...
- chrome插件 - Manifest文件中的 background
在Manifest中指定background域可以使扩展常驻后台. background可以包含三种属性,分别是scripts.page和persistent. 如果指定了scripts属性,则Chr ...
- Android基础知识之Manifest文件中的用户权限元素
原文:http://android.eoe.cn/topic/android_sdk 分任务原文链接一:http://developer.android.com/guide/topics/manife ...
- HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的
HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...
- Android app图标总是显示默认的机器人图标,且在manifest文件的application中修改无效...
问题描述:我使用的开发工具是eclipse,Android app默认的图标是一个机器人,如下图所示 现在我要将app的图标修改成另外一个图标: 探索过程: 首先想到修改Manifest文件中的app ...
- 清除页面广告?身为前端,自己做一款简易的chrome扩展吧
大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...
- 自己做一款简易的chrome扩展--清除页面广告
大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...
- 在半小时内从无到有开发并调试一款Chrome扩展(Chrome插件/谷歌浏览器插件)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_120 就在不久之前,我们目前这个毕业班的班长那日同学和我说,他正在公司开发Chrome扩展,看起来很高大上的技术,实际开发却非常简 ...
- Android学习笔记(二)Manifest文件节点详解
在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文件最基本的结构: <manifest ...
- Android应用程序的组成部分和Manifest文件(转)
Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起:应用程序Manifest描述了每一组件和它们之间的交互方式,还用于指定应用程序元数据.其硬件和平台要求.外部库以及 ...
随机推荐
- 作为用户我该如何调用API 接口获取商品数据
作为用户,如果你想要获取商品数据,可以通过调用API接口来实现.下面是一些步骤和注意事项,帮助你成功获取商品数据. 了解开放平台:首先,你需要了解开放平台,注册一个开发者账号,并创建一个应用.在创建应 ...
- Windows安装JDK 8/11/17教程
JDK,全称Java Development Kit,即Java开发工具包,它是整个Java开发的核心,包含了Java运行环境(JVM+Java系统类库)和Java工具.目前JDK 8.11.17是长 ...
- 后端常用的Linux命令大全,建议收藏
引言 作为一名后端工程师,使用终端是一种常见的做法,也是你应该学习的技能.许多命令和实用程序可以帮助你在使用 Linux 时更有效地完成任务. 基本 Linux 命令 如果你想使用 Linux 操作系 ...
- Abp vNext 模块加载机制
文章目录 生命周期 PreConfigureServices 添加依赖注入或者其它配置之前 ConfigureServices 添加依赖注入或者其它配置 PostConfigureServices 添 ...
- Python网络编程——基于tcp协议实现远程执行命令、udp协议没有粘包问题、解决粘包问题、socketserver模块的基本使用(基于tcp协议、基于udp协议的使用)
文章目录 基于tcp协议实现远程执行命令 udp协议没有粘包问题 解决粘包问题 解决粘包问题(终极版) socketserver模块的基本使用 基于tcp协议的使用 基于udp协议的使用 基于tcp协 ...
- Go流程控制与快乐路径原则
Go流程控制与快乐路径原则 目录 Go流程控制与快乐路径原则 一.流程控制基本介绍 二.if 语句 2.1 if 语句介绍 2.2 单分支结构的 if 语句形式 2.3 Go 的 if 语句的特点 2 ...
- FSCTF 2023(公开赛道)CRYPTO WP
RSA 1 1.题目信息 提交格式:FSCTF{你所解出的内容} p=1458769258361 q=4556983871563 e=17 求d 2.解题方法 exp from gmpy2 impor ...
- 虹科案例 | Redis企业版数据库帮助金融机构满足客户需求
如今,传统银行与新兴银行正在进行激烈的竞争.随着苹果.亚马逊.谷歌等科技巨头正凭借其数字化.移动应用程序和云体验打入金融服务行业.为了进行公平竞争,传统银行也需要通过个性化的全渠道客户体验来实现交互式 ...
- 二进制枚举&爆搜DFS
给定一个如下图所示的全圆量角器. 初始时,量角器上的指针指向刻度 0. 现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针) ...
- PostgreSQL 提升子连接与 ORACLE 子查询非嵌套
查询优化器对子查询一般采用嵌套执行的方式,即父查询中的每一行,都要执行一次子查询,这样子查询会执行很多次,效率非常低. 例如 exists.not exists 逐行取出经行匹配处理,项目中使用子查询 ...