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

上一篇中已经完成了 Chrome 扩展的雏形,本篇接着介绍 manifest 中的可选字段,完善扩展的细节。

manifest 中的可选字段

"content_scripts"

向 web 页面注入 JavaScript 和 CSS。可以说这是 Chrome 扩展的灵魂。当指定 content_scripts 后,每当页面加载时,content_scripts 也将随之加载。

  1. "content_scripts": [
  2. {
  3. "css": ["content-style.css"],
  4. "js": ["content-script.js"],
  5. "matches": ["<all_urls>"],
  6. "run_at": "document_idle", // optional
  7. "world": "ISOLATED" // optional
  8. }
  9. ]

content_scripts 里的配置项解释:

  • "css":指定注入的 css 样式文件
  • "js":指定注入的 js 脚本文件

值得注意的是,css 和 js 指定的文件路径必须是相对路径!总是相对于扩展根目录!

  • "matches":用于指定往哪些页面注入 css 和 js,必填项。

    其值并非普通的 url,而是满足如下结构的匹配模式。

    1. <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_endwindow.onload 触发前这个时间段内选择时机注入,具体注入时机取决于页面的复杂程度。

    下面这张图片可以直观的看出注入时机和页面加载状态的先后时间顺序。 红色字是页面内脚本打印, 绿色字是扩展 content-script 打印。

  • "world"content-script 的脚本执行环境。默认情况下,content-script 运行在一个隔离的沙箱环境中。这意味着和页面的运行时环境是隔离开来的两个独立环境,最明显的表现就是两个环境里的 全局变量 window 不通。该字段有以下2个选择:

    • ISOLATED 隔离沙箱环境。这也是默认的 content-script 执行环境。
    • MAIN 页面运行时环境。这意味者扩展脚本和页面脚本共享运行时,同一个 window,同一个世界,同一个梦想。

    理解两者的不同非常重要!假设页面上的 js 给 window 对象增加了一个 customVariable 全局变量,

    1. <head>
    2. <script>
    3. window.customVariable = "window.customVariable"
    4. </script>
    5. </head>

    下面是扩展的 content-script 在 ISOLATEDMAIN 两个不同的环境中打印 window.customVariable 变量的结果:

    可以发现 ISOLATED 隔离环境访问不到 window.customVariable,值是 undefined,而 MAIN 环境则能访问到!

    我画了一张图,以便直观的展示 ISOLATEDMAIN 执行环境的区别

"background"

注册一个 service worker 作为后台服务"content_scripts" 是页面级别的脚本,运行于前台页面,随页面销毁。"background" 是浏览器级别的服务,可以长期运行于后台,但事情也并没有那么简单,Chrome 扩展的 service worker 会在需要时自动加载,在闲置时自动休眠。

作为后台服务,service worker 的主要用途是注册事件监听,响应各种事件,比如网络请求,content_scripts 传来的 message 等等。Chrome 扩展提供了大量 chrome.* 接口可供使用,这些接口大多都能在 "background" 中使用,但 "content_scripts" 只能使用其中的少数,这是为安全起见故意设计的。

  1. "background": {
  2. "service_worker": "service-worker.js",
  3. "type": "module"
  4. }

不同于 "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 项目的目录结构如下:

  1. crx-demo
  2. ├── background
  3.    ├── service-worker.js
  4.    └── sub.js
  5. ├── content-scripts
  6.    ├── document_end.css
  7.    ├── document_end.js
  8.    ├── document_idle.css
  9.    ├── document_idle.js
  10.    ├── document_idle_main.js
  11.    ├── document_start.css
  12.    └── document_start.js
  13. ├── icon128.png
  14. ├── icon48.png
  15. └── manifest.json

已经可以在 content-script 和 background 里任意编写代码来实现自己匪夷所思的奇思妙想啦!

crx-demo 项目已经放在 github 上啦,后续会继续更新丰富细节。

本篇就介绍到这里,下篇接着将把剩余的 manifest 重要选项整理完。

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

Chrome扩展的核心:manifest 文件(中)的更多相关文章

  1. Android manifest文件中的标签详细介绍

    官方文档 概要 每一个Android应用都应该包含一个manifest文件,即AndroidManifest.xml.它包含了程序运行的一些必备信息,比如:--为Java应用程序指定一个独一无二的名字 ...

  2. chrome插件 - Manifest文件中的 background

    在Manifest中指定background域可以使扩展常驻后台. background可以包含三种属性,分别是scripts.page和persistent. 如果指定了scripts属性,则Chr ...

  3. Android基础知识之Manifest文件中的用户权限元素

    原文:http://android.eoe.cn/topic/android_sdk 分任务原文链接一:http://developer.android.com/guide/topics/manife ...

  4. HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的

    HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...

  5. Android app图标总是显示默认的机器人图标,且在manifest文件的application中修改无效...

    问题描述:我使用的开发工具是eclipse,Android app默认的图标是一个机器人,如下图所示 现在我要将app的图标修改成另外一个图标: 探索过程: 首先想到修改Manifest文件中的app ...

  6. 清除页面广告?身为前端,自己做一款简易的chrome扩展吧

    大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...

  7. 自己做一款简易的chrome扩展--清除页面广告

    大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...

  8. 在半小时内从无到有开发并调试一款Chrome扩展(Chrome插件/谷歌浏览器插件)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_120 就在不久之前,我们目前这个毕业班的班长那日同学和我说,他正在公司开发Chrome扩展,看起来很高大上的技术,实际开发却非常简 ...

  9. Android学习笔记(二)Manifest文件节点详解

    在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文件最基本的结构: <manifest ...

  10. Android应用程序的组成部分和Manifest文件(转)

    Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起:应用程序Manifest描述了每一组件和它们之间的交互方式,还用于指定应用程序元数据.其硬件和平台要求.外部库以及 ...

随机推荐

  1. 番外1.ssh连接管理器

    目录 本篇前瞻 项目背景 ssh连接管理器 优点 使用方式 配置 使用方法 快速开始 注意点 使用样例 本篇后记 本篇前瞻 学习完go语言基础的专栏,我们究竟写出怎么样的实用工具呢?我在github上 ...

  2. Windows 虚拟地址 到底是如何映射到 物理地址 的?

    一:背景 1. 讲故事 我发现有很多的 .NET程序员 写了很多年的代码都没弄清楚什么是 虚拟地址,更不用谈什么是 物理地址 以及Windows是如何实现地址映射的了?这一篇我们就来聊一聊这两者之间的 ...

  3. 《Kali渗透基础》07. 弱点扫描(一)

    @ 目录 1:漏洞发现 1.1:Exploit-DB 1.2:searchsploit 1.3:nmap 2:漏洞管理 3:弱点扫描类型 4:漏洞基本概念 4.1:CVSS 4.2:CVE 4.3:O ...

  4. MIPS寄存器堆

    实验目的 熟悉并掌握 MIPS 计算机中寄存器堆的原理和设计方法 理解源操作数/目的操作数的概念 实验环境 Vivado 集成开发环境 MIPS寄存器 寄存器R0的值恒为0. 模块接口设计 1个写端口 ...

  5. Ipa打包并安装到iphone

    手动运行篇: 在真机上运行appium会进行闪退,因为我们的真机是不合法的真机,怎么样才能合法呢,要注册我们的设备才行 要对app进行打包,要先进行签名,要签名,就需要证书,证书可以自己伪造,但是这一 ...

  6. iOS越狱后必装软件

    iOS越狱后就跟ubuntu没两样了,很多ubuntu下常用的软件都要装一下 openssh 这个软件可以让我们能够登录iphone Apt-get 用这个软件可以安装很多软件,主要是一些工具调试类软 ...

  7. redis基本数据类型 Hash

    Hash 类型 Hash类型的常见命令 HSET key field value: 添加或者修改hash类型key的field的值HGET key field: 获取一个hash类型key的field ...

  8. Eclipse OSGI配置文件说明

  9. nacos2.X版本无法注册的几个原因以及解决方案(踩坑避雷!)

    在使用nacos+dubbo 注册服务的时候 遇到了无法注册的问题 记录一下踩的坑以及解决方案 com.alibaba.nacos.api.exception.NacosException: Requ ...

  10. C++中::和:, .和->的作用和区别

    符号::和:的作用和区别 ::是作用域运算符,A::B表示作用域A中的-名称B,A可以是名字空间.类.结构: 类作用域操作符 "::"指明了成员函数所属的类.如:M::f(s)就表 ...