所謂 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 還值不值得開發者努力......