Chrome 浏览器插件 V3 版本 Manifest.json 文件全字段解析
Manifest.json 文件格式
每个扩展程序的根目录中都必须有一个 manifest.json 文件,其中列出了有关该扩展程序的结构和行为的重要信息。
1、Demo 展示
1. 最小文件
{"manifest_version": 3,"name": "My Chrome Ext","version": "1.0.0","description": "Chrome Ext","icons": {"48": "icon-48.png","128": "icon-128.png"},}
2. 增加 content_scripts
{"manifest_version": 3,"name": "Run script automatically","description": "Add Context Scripts","version": "1.0","icons": {"16": "icon-16.png","32": "icon-32.png","48": "icon-48.png","128": "icon-128.png"},"content_scripts": [{"js": ["content-script.js"],"matches": ["http://*.example.com//"]}]}
3. 增加 service_worker
{"manifest_version": 3,"name": "Click to run","description": "Add Service Worker","version": "1.0","icons": {"16": "icon-16.png","32": "icon-32.png","48": "icon-48.png","128": "icon-128.png"},"background": {"service_worker": "service-worker.js"},"action": {"default_icon": {"16": "icon-16.png","32": "icon-32.png","48": "icon-48.png","128": "icon-128.png"}},"permissions": ["scripting", "activeTab"]}
4. 增加 action
{"manifest_version": 3,"name": "Popup extension that requests permissions","description": "Add Action","version": "1.0","icons": {"16": "icon-16.png","32": "icon-32.png","48": "icon-48.png","128": "icon-128.png"},"action": {"default_popup": "popup.html"},"host_permissions": ["https://*.example.com/"],"permissions": ["storage"]}
5. 增加侧边栏
{"manifest_version": 3,"name": "Side panel extension","version": "1.0","description": "Extension with a default side panel.","icons": {"16": "images/icon-16.png","48": "images/icon-48.png","128": "images/icon-128.png"},"side_panel": {"default_path": "sidepanel.html"},"permissions": ["sidePanel"]}
二、Manifest.json 文件字段及解析
1. Chrome 插件所必需的 key
1.1 manifest_version
1.2 name
1.3 version
"manifest_version": 3,"name": "My Chrome Ext Name","version": "0.0.1",
2. Chrome 应用商店所需的 key
2.1 description
2.2 icons
{"manifest_version": 3,"name": "chrome extension","version": "0.0.1","description": "My Chrome Extension description","icons": {"16": "public/icons/icon_16.png","32": "public/icons/icon_32.png","48": "public/icons/icon_48.png","128": "public/icons/icon_128.png"}}
3. Chrome 插件可选 key
3.1 action
{"name": "Action Extension","action": {"default_icon": {"16": "images/icon16.png","24": "images/icon24.png","32": "images/icon32.png"},"default_title": "Click Me","default_popup": "popup.html"},}
popup.html 是点击 chrome 按钮弹出的页面
3.2 author
{"author": {"email": "[email protected]"},}
3.3 background
"background": {"service_worker": "service-worker.js","type": "module"}
3.4 chrome_settings_overrides
{"manifest_version": 3,"name": "My extension","chrome_url_overrides" : {"PAGE_TO_OVERRIDE": "myPage.html"},}
3.5 chrome_url_overrides
3.5.1 扩展程序可以使用 HTML 覆盖网页来替换 Google Chrome 通常提供的网页。
扩展程序可以覆盖以下任意网页,但每个扩展程序只能覆盖 1 个网页:
{"manifest_version": 3,"name": "My extension","chrome_url_overrides" : {"PAGE_TO_OVERRIDE": "myPage.html"},}
PAGE_TO_OVERRIDE 替换为以下项之一:
3.6 commands
"commands": {"run-foo": {"suggested_key": {"default": "Ctrl+Shift+Y","mac": "Command+Shift+Y"},"description": "Run "foo" on the current page."}}
3.7 content_scripts
{ "name": "My extension", "content_scripts": [ { "matches": ["https://*.nytimes.com/*"], "css": ["my- styles.css"], "js": ["content-script.js"] } ]}
3.8 content_security_policy
3.8.1 默认策略
如果没有在 manifest.json 中定义 content_security_policy,将使用默认属性,默认值为:
{"content_security_policy": {"extension_pages": "script-src 'self'; object-src 'self';","sandbox": "sandbox allow-scripts allow-forms allow-popups allow-modals; script-src 'self' 'unsafe-inline' 'unsafe-eval'; child-src 'self';"}}
在这种情况下,扩展程序只会从自己的打包资源加载本地脚本和对象。WebAssembly 将停用,该扩展程序将不会运行内嵌 JavaScript,也无法将字符串评估为可执行代码。如果添加了沙盒页面,页面将拥有更宽松的权限,可以从扩展程序外部评估脚本。
3.8.2 自定义策略
Chrome 对扩展程序页面强制执行最低的内容安全政策。这相当于在 manifest.json 中制定以下策略:
{"content_security_policy": {"extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"}}
extension_pages 策略的放宽限制不能超过此最小值。
3.9 cross_origin_embedder_policy
{ "cross_origin_embedder_policy": { "value": "require-corp" },}
3.10 cross_origin_opener_policy
{ "cross_origin_opener_policy": { "value": "same-origin" },}
3.11 declarative_net_request
{ "name": "My extension", "declarative_net_request" : { "rule_resources" : [{ "id": "ruleset_1", "enabled": true, "path": "rules_1.json" }, { "id": "ruleset_2", "enabled": false, "path": "rules_2.json" }] }, "permissions": [ "declarativeNetRequest", "declarativeNetRequestFeedback", ], "host_permissions": [ "http://www.blogger.com/*", "http://*.google.com/*" ],}
3.12 default_locale
3.13 devtools_page
{ "name": "Chrome Ext", "version": "1.0", "devtools_page": "devtools.html",}
3.14 export
{"version": "1.0","name": "My Shared Module","export": {// Optional list of extension IDs explicitly allowed to// import this Shared Module's resources. If no allowlist// is given, all extensions are allowed to import it."allowlist": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"]}// Note: no permissions are allowed in Shared Modules}
3.15 externally_connectable
✅ 有效网址 |
❌ 网址无效 |
*://example.com/ |
*://example.com/one/ |
http://*.example.org/* |
<all_urls> |
https://example.com/* |
http://*/* |
{"name": "My externally connectable extension","externally_connectable": {"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",],// If this field is not specified, no web pages can connect."matches": ["https://*.google.com/*","*://*.chromium.org/*",],"accepts_tls_channel_id": false},}
3.16 homepage_url
{"manifest_version": 3,"name": "chrome extension","version": "0.1.0","description": "My Chrome Extension","homepage_url": "https://guoqiankun.blog.csdn.net/",}
3.17 host_permissions
{"name": "Permissions Extension","permissions": ["activeTab","contextMenus","storage"],"optional_permissions": ["topSites",],"host_permissions": ["https://www.developer.chrome.com/*"],"optional_host_permissions":["https://*/*","http://*/*"],"manifest_version": 3}
3.18 import
{"version": "1.0","name": "My Importing Extension","import": [{"id": "cccccccccccccccccccccccccccccccc"},{"id": "dddddddddddddddddddddddddddddddd""minimum_version": "0.5" // optional},]}
3.19 incognito
{"incognito": "not_allowed"}3.20 key
{ "manifest_version": 3, "key": "ThisKeyIsChromeKey",}
3.21 minimum_chrome_version
{"minimum_chrome_version": "120.0.6099.129"}
3.22 oautp
{ "name": "OAuth Tutorial FriendBlock", ... "oautp": { "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com", "scopes":[""] },}
3.23 omnibox
{"omnibox": { "keyword": "newTab" },}
3.24 optional_host_permissions
{"optional_host_permissions":["https://*/*","http://*/*"],}
3.25 optional_permissions
{"optional_permissions": ["topSites",],}
3.26 options_page
{"options_page": "index.html",}
3.27 options_ui
{"name": "My extension","options_ui": {"page": "options.html","open_in_tab": false},}
3.28 permissions
"permissions": ["storage","activeTab","scripting"]
3.29 requirements
"requirements": {"3D": {"features": ["webgl"]}}
3.30 sandbox
{"content_security_policy": {"sandbox": "sandbox allow-scripts; script-src 'self' https://example.com"},"sandbox": {"pages": ["page1.html","directory/page2.html"]},}
3.31 short_name
{"short_name": "short name"}
3.32 side_panel
{"name": "My side panel extension","side_panel": {"default_path": "sidepanel.html"}}
3.33 storage
{"name": "My enterprise extension","storage": {"managed_schema": "schema.json"},}
3.34 tts_engine
{"name": "My TTS Engine","version": "1.0","permissions": ["ttsEngine"],"tts_engine": {"voices": [{"voice_name": "Alice","lang": "en-US","event_types": ["start", "marker", "end"]},{"voice_name": "Pat","lang": "en-US","event_types": ["end"]}]},"background": {"page": "background.html","persistent": false}}
3.35 update_url
{ "name": "My extension", "update_url": "https://myhost.com/mytestextension/updates.xml",}
3.36 version_name
{"version_name": "1.0 beta"}
3.37 web_accessible_resources
{"web_accessible_resources": [{"resources": [ "test1.png", "test2.png" ],"matches": [ "https://web-accessible-resources-1.glitch.me/*" ]}, {"resources": [ "test3.png", "test4.png" ],"matches": [ "https://web-accessible-resources-2.glitch.me/*" ],"use_dynamic_url": true}],}
4. ChromeOS 可选的 Key
4.1 file_browser_handlers
{ "name": "My extension", "file_browser_handlers": [ { "id": "upload", "default_title": "Save to Gallery", // What the button will display "file_filters": [ "filesystem:*.jpg", // To match all files, use "filesystem:*.*" "filesystem:*.jpeg", "filesystem:*.png" ] } ], "permissions" : [ "fileBrowserHandler" ],}
4.2 file_handlers
"file_handlers": [{"action": "/open_text.html","name": "Plain text","accept": {"text/plain": [".txt"]}"launch_type": "single-client"}]
4.3 file_system_provider_capabilities
{ "name": "My extension", "permissions": [ "fileSystemProvider" ], "file_system_provider_capabilities": { "configurable": true, "watchable": false, "multiple_mounts": true, "source": "network" },}
4.4 input_components
{"input_components": [{"name": "ToUpperIME","id": "ToUpperIME","language": "en","layouts": ["us::eng"]}]}
原文链接:https://juejin.cn/post/7324213873783717923