所谓 Manifest V3 就是新版的扩充功能规格,
Manifest V3 上线以后可能有一天会停止支援 Manifest V2,
届时旧的扩充功能都必须改写为 Manifest V3 规格才能使用。
BUT...程序猿生最麻烦的就是这个 BUT...
不是所有 Manifest V2 支援的功能都保证能在 Manifest V3 继续使用...
Chromium 88 版开始提供 Manifest V3:
https://developers.google.com/web/updates/2021/01/nic88
目前没设定停止支援 Manifest V2 的明确日期,
有资讯说可能在 Manifest V3 正式推出的一年内:
http://bit.ly/2LRtTVe
官方 Manifest V3 规格资讯:
https://developer.chrome.com/docs/extensions/mv3/intro/mv3-migration/
此页提到的几个重点改变:
1. 拿掉 background page,改用 service worker
service worker 虽然和 background script 差不多,
但有个问题是 service worker 没有 window、document 相关的 API,
如果套件要在背景计算 DOM 资讯可能会需要改写成复杂的 message passing...
2. 拿掉 blocking webRequest API,改用 declarativeNetRequest API
declarativeNetRequest 提供一套定义是否放行 web request 的规则集,
但是有规则上限等限制,不如以往的 blocking webRequest API 自由。
declarativeNetRequest API:
http://bit.ly/39V0dP8
社群回馈和各种功能缺陷的抱怨:
http://bit.ly/3a0FGse
一个很大的影响是 uBlock Origin 之类的广告封锁套件可能死掉或半残。
官方目前说强制安装的套件仍允许使用 blocking webRequest API。
强制安装需要更动系统设定(需要管理员权限),写入要强制安装的套件 ID,
然后系统上所有使用者 Chrome 中的所有帐号都会强制从商店安装指定的套件,
无法移除或停用。
设定方式可参见:http://bit.ly/3oba1to
强制安装会衍生出不少麻烦,除了需要管理员权限和所有使用者都受影响以外,
开发测试也会变得极为麻烦,因为不能直接加载测试套件,
一定要先在 Chrome 商店上架才能强制安装,
问题是测试中的套件谁有那个美国时间去写那些上架要求的隐私权原则等等啊XD
3. manifest CSP 对 script-src, object-src, worker-src directives 限制更严
这几个值以后只能使用 self, none 和 localhost
一个很大的影响是套件不再能用类似
<script src="http://example.com/myscript.js">
之类的方式加载远端脚本,
所有程式码都必须直接写在套件里,
或是改把程式放在远端服务器执行。
套件也无法加载远端的交互式 SVG、Java applet、Flash 等元件。
4. 禁止 chrome.tabs.executeScript 参数用“code”执行程式码文字
此外,content script 也禁止执行 eval 类函数(Manifest V2 可以)
补充一下,content script 在 DOM 插入 script 元素时,
script 似乎是视为在 content script(而不是 page script)执行
所以在 content script 执行类似以下脚本的方式也是不通:
var s = document.createElement('script');
s.innerText = "alert('test');";
document.body.appendChild(s);
看起来就是封死一切在 content script 执行任意自订脚本的可能性。
一个很大的影响是 XXXMonkey 之类的套件可能会因此死掉...
其他细节就有待各位先进一起研究研究了,
看看 Chromium 还值不值得开发者努力......