赞
踩
现在开发前端项目,文件中都有一个 package.json 文件,里面是这个整个项目的配置、项目的基础信息、项目的依赖等,那插件开发也有这个文件,那就是 manifest.json 文件
Every extension has a JSON-formatted manifest file, named manifest.json, that provides important information
(每个扩展都有一个JSON格式的清单文件,名为manifest.json,该清单文件提供重要信息)
{ // 必选项 "manifest_version": 2, "name": "My Extension", "version": "versionString", // 建议项 "default_locale": "en", "description": "A plain text description", "icons": {...}, // 二选一/不选 "browser_action": {...}, "page_action": {...}, // 可选项 "action": ..., "author": ..., "automation": ..., "background": { // 建议 "persistent": false, // 可选 "scripts": [] }, "chrome_settings_overrides": {...}, "chrome_url_overrides": {...}, "commands": {...}, "content_capabilities": ..., "content_scripts": [{...}], "content_security_policy": "policyString", "converted_from_user_script": ..., "current_locale": ..., "declarative_net_request": ..., "devtools_page": "devtools.html", "differential_fingerprint": ..., "event_rules": [{...}], "externally_connectable": { "matches": ["*://*.example.com/*"] }, "file_browser_handlers": [...], "file_system_provider_capabilities": { "configurable": true, "multiple_mounts": true, "source": "network" }, "homepage_url": "http://path/to/homepage", "host_permissions": ..., "import": [{"id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}], "incognito": "spanning, split, or not_allowed", "input_components": ..., "key": "publicKey", "minimum_chrome_version": "versionString", "nacl_modules": [...], "natively_connectable": ..., "oauth2": ..., "offline_enabled": true, "omnibox": { "keyword": "aString" }, "optional_permissions": ["tabs"], "options_page": "options.html", "options_ui": { "chrome_style": true, "page": "options.html" }, "permissions": ["tabs"], "platforms": ..., "replacement_web_app": ..., "requirements": {...}, "sandbox": [...], "short_name": "Short Name", "signature": ..., "spellcheck": ..., "storage": { "managed_schema": "schema.json" }, "system_indicator": ..., "tts_engine": {...}, "update_url": "http://path/to/updateInfo.xml", "version_name": "aString", "web_accessible_resources": [...] }
一个整数,指定软件包所需的清单文件格式的版本。从Chrome 18开始,指定2
name
和short_name
属性是扩展插件名。
name
最多45个字符
short_name
最多12个字符,如果没填则使用 name
字段,通常用于没有足够空间展示全名的地方
name
展示在:
short_name
展示在:
tab
页面你插件的版本
使用0-4个点分隔的整数,它们必须介于0和65535之间(包括0和65535),并且非零整数不能以0开头。例如,99999和032均无效
version_name
可以设置为描述性的版本字符串,并将在显示时用于显示目的。如果没有version_name
字段,将显示 version
;
默认的语言环境
当插件有 _locales
文件夹时,这个必填,没有_locales
文件夹时这个字段不能填,会报错。
描述,插件的描述
插件的图标,最好都为正方形,宽高都一样
支持 16 * 16
、32 * 32
(windows下使用)、48 * 48
、128 * 128
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
}
浏览器操作
点击浏览器右侧插件图标,弹出的页面窗口
谷歌翻译插件示例:
"browser_action": {
"default_icon": {
"16": "images/icon16.png",
"24": "images/icon24.png",
"32": "images/icon32.png"
},
"default_icon": "images/icon32.png"
"default_title": "Google Mail",
"default_popup": "popup.html"
}
default_icon
两种写法 对象/字符串
页面操作
统一放在浏览器插件位置,不放在输入框里
在当前页面上执行正常,不再当前页面是显示灰色
示例:
"page_action": {
"default_icon": {
"16": "images/icon16.png",
"24": "images/icon24.png",
"32": "images/icon32.png"
},
"default_icon": "images/icon32.png"
"default_title": "Google Mail",
"default_popup": "popup.html"
}
default_icon
两种写法 对象/字符串
action
字段是需要在 canary channel(开发者专用的每日构建版)版本/新版本里面,不能在稳定版本中
‘action’ requires canary channel or newer, but this is the stable channel.
作者信息
自动化
This API is experimental. It is only available to Chrome users on the dev channel.(API是实验性的)
背景(后台脚本管理)
使chrome提前启动,延迟关闭
加载后后台页面就会保持运行状态。在关闭所有可见视图和所有消息端口之前,后台页面不会卸载。所以的js
文件在scripts
数组中展示,且persistent
(持续活动)字段一般为false
"background": {
"scripts": ["background1.js", "background2.js", ...],
"persistent": false
},
保持后台脚本持续活动的唯一点是,如果扩展程序使用chrome.webRequest API阻止或修改网络请求。 webRequest API与非持久性后台页面不兼容。
设置替代功能是扩展程序替代所选Chrome设置的一种方法。
"chrome_settings_overrides": { "homepage": "http://www.homepage.com", "search_provider": { "name": "name.__MSG_url_domain__", "keyword": "keyword.__MSG_url_domain__", "search_url": "http://www.foo.__MSG_url_domain__/s?q={searchTerms}", "favicon_url": "http://www.foo.__MSG_url_domain__/favicon.ico", "suggest_url": "http://www.foo.__MSG_url_domain__/suggest?q={searchTerms}", "instant_url": "http://www.foo.__MSG_url_domain__/instant?q={searchTerms}", "image_url": "http://www.foo.__MSG_url_domain__/image?q={searchTerms}", "search_url_post_params": "search_lang=__MSG_url_domain__", "suggest_url_post_params": "suggest_lang=__MSG_url_domain__", "instant_url_post_params": "instant_lang=__MSG_url_domain__", "image_url_post_params": "image_lang=__MSG_url_domain__", "alternate_urls": [ "http://www.moo.__MSG_url_domain__/s?q={searchTerms}", "http://www.noo.__MSG_url_domain__/s?q={searchTerms}" ], "encoding": "UTF-8", "is_default": true }, "startup_pages": ["http://www.startup.com"] }
除search_url
之外,还可以使用 alternate_urls
,为一个数组
"chrome_settings_overrides": { "homepage": "https://home.superboss.cc/index.html#/", "search_provider": { "name": "myName", "keyword": "呵呵", "search_url": "https://img.alicdn.com/imgextra/i4/305442977/O1CN01oadttT1XrVfooSTZ9_!!305442977.png", "favicon_url": "https://staticnew.superboss.cc/qianniu/img/superboss.ico", "suggest_url": "https://f.superboss.cc/ProductUsingServlet?kind=14&ftrace=1228&landingPage=%E4%B8%BB%E5%9B%BE%E6%B0%B4%E5%8D%B0#/multipleFunc/waterList/", "instant_url": "https://developer.chrome.com/extensions/settings_override", "image_url": "https://img.alicdn.com/imgextra/i3/826052692/O1CN01RLLHYU1VkypJ4XsyD_!!826052692.png", "search_url_post_params": "search_url的字符串", "suggest_url_post_params": "suggest_url的字符串", "instant_url_post_params": "instant_url的字符串", "image_url_post_params": "image_url的字符串", "encoding": "UTF-8", "is_default": true }, "startup_pages": ["https://yunyin.superboss.cc/proRight/index.html"] },
示例
覆盖谷歌浏览器特定页面
可以替换的页面:
"chrome_url_overrides" : {
"bookmarks": "bookmarks.html",
"history": "history.html",
"newtab": "newtab.html"
}
使用命令API可以添加键盘快捷键,这些快捷键会触发扩展程序中的操作。
可以从 chrome://extensions/shortcuts 设置插件快捷键
支持的键:A-Z, 0-9, Comma, Period, Home, End, PageUp, PageDown, Space, Insert, Delete, Arrow keys (Up, Down, Left, Right) and the Media Keys (MediaNextTrack, MediaPlayPause, MediaPrevTrack, MediaStop)
.
所有的键都必须包含 Ctrl* / Alt,但是不允许使用 Ctrl + Alt的组合
"commands": {
"my-commands": {
"suggested_key": {
"default": "Ctrl+Shift+Y",
"mac": "Command+Shift+Y"
},
"description": "this is my command",
"global": true | false
}
},
可以通过 chrome.commands.onCommand.addListener
监听设置的 commands
事件
chrome.commands.onCommand.addListener(function(command) {
console.log('Command: name', command);
// my-commands
});
在 chrome://extensions/shortcuts
中显示为
global
全局属性,仅限于仅将Ctrl + Shift + [0..9]
指定为全局快捷方式。
白名单
与指定URL模式匹配的网站授予指定权限。
内容脚本
内容脚本是在网页上下文中运行的文件。通过使用标准的文档对象模型(DOM),他们能够读取浏览器访问的网页的详细信息,对其进行更改并将信息传递给其父扩展。
"content_scripts": [
{
"matches": ["http://*.taobao.com/*"],
"css": ["myStyles.css"],
"js": ["contentScript.js"]
}
]
会在页面 http://*.taobao.com/*
中运行 contentScript.js
和 myStyles.css
字段 | 解释 |
---|---|
matches | 必选项 指定此内容脚本将被注入到哪些页面 |
css | 可选项 要插入页面的css,按照数组顺序注入 |
js | 可选项 插入页面的 js,按照数组顺序注入 |
match_about_blank | 可选项 stackoverflow |
exclude_matches | 可选项 排除此脚本注入的URL页面 |
include_globs | 可选项 包含字段的URL |
exclude_globs | 可选项 排除包含字段的url |
run_at | 可选项 文件何时注入页面中 document_idle ,document_start , document_end |
all_frames | 可选项 是否注入当前tab所有的页面中,默认 false,仅注入最顶层。 |
run_at字段 | 解释 |
---|---|
document_idle | 首选 在document_end 与window.onload 事件触发后立即之间插入脚本。确切的注入时刻取决于文档的复杂程度以及加载所需的时间,并针对页面加载速度进行了优化。可以确保它们在DOM完成之后运行。 |
document_start | 在css文件之后,但在构造任何其他DOM或运行任何其他脚本之前注入。 |
document_end | 在DOM完成之后,但在加载子资源(例如图像和框架)之前,注入脚本。 |
将使扩展默认情况下更加安全。
默认的安全策略:
script-src 'self'; object-src 'self'
用户脚本转化(没搞明白)
当前语言环境
用于通过指定声明性规则来阻止或修改网络请求(chrome 84以上版本支持)
"declarative_net_request" : { "rule_resources" : [{ "id": "ruleset_1", "enabled": true, "path": "rules_1.json" }, { "id": "ruleset_2", "enabled": false, "path": "rules_2.json" }, { "id" : 1, "priority": 1, "action" : { "type" : "block" }, "condition" : { "urlFilter" : "abc", "domains" : ["foo.com"], "resourceTypes" : ["script"] } }] },
拓展开发者选项页
前端开发vue、react都会用到插件,能显示对应的组件、数据等。是通过devtools_page
来渲染
"devtools_page": "devtools.html",
可以通过chrome的devtools的方法创建
chrome.devtools.panels.create(
'myTestplu', 'icons/icon128.png', 'devtools.html',
function (panel) {
}
)
chrome.devtools.panels.elements.createSidebarPane("myTestplu2",
function(sidebar) {
sidebar.setObject({ some_data: "Some data to show" });
});
"differential_fingerprint": {
"channel": "stable",
"extension_types": "all"
}
事件规则
改规则可以使用 declarativeWebRequest
阻止或者修改web 请求的规则等
"event_rules": [{
"event": "declarativeContent.onPageChanged",
"actions": [{
"type": "declarativeContent.ShowPageAction"
}],
"conditions": [{
"type": "declarativeContent.PageStateMatcher",
"css": ["video"]
}]
}],
等同于使用 declarativeWebRequest
chrome.declarativeContent.onPageChanged.addRules([{
actions: [
new chrome.declarativeContent.ShowPageAction()
],
conditions: [
new chrome.declarativeContent.PageStateMatcher(
{css: ["video"]}
)
]
}]);
可进行外部链接的匹配
如果未声明externally_connectable
,则所以的扩展程序和应用程序都可以连接。
"externally_connectable": {
"ids": [],
"matches": [],
"accepts_tls_channel_id": false
}
ids
:拓展程序的ID,如果未声明则所以的都不可链接,如果要匹配所有,则’*’matches
:网页的匹配模式。不影响内容脚本。如果未指定此字段,则无法连接任何网页accepts_tls_channel_id
:true | false;表示扩展程序要使用与其连接的网页的TLS通道ID。如果为true,则如果这些方法要求将通过runtime.connect或runtime.sendMessage发送的消息设置为runtime.MessageSender.tlsChannelId。如果为false,则在任何情况下都不会设置runtime.MessageSender.tlsChannelId。扩展Chrome操作系统文件浏览器
仅在chrome操作系统中有效
需要在permissions
中声明许可才行
"file_browser_handlers": [
{
"id": "upload",
"default_title": "Save to Gallery",
"file_filters": [
"filesystem:*.jpg",
"filesystem:*.jpeg",
"filesystem:*.png"
]
}
],
"permissions" : [
"fileBrowserHandler"
]
在浏览器的 fileBrowserHandler
事件中进行操作
chrome.fileBrowserHandler.onExecute.addListener(function(id, details) {
if (id == 'upload') {
var fileEntries = details.entries;
for (var i = 0, entry; entry = fileEntries[i]; ++i) {
entry.file(function(file) {
});
}
}
});
可以创建文件系统
需要在permissions
中声明fileSystemProvider
"permissions": [
"fileSystemProvider"
],
"file_system_provider_capabilities": {
"configurable": true,
"watchable": false,
"multiple_mounts": true,
"source": "network"
},
"homepage_url": "https://www.baidu.com",
插件小图标右键之后,点击插件名称的跳转页面
主机权限
"host_permissions": {
"channel": "dev",
"extension_types": ["extension"],
"min_manifest_version": 3
}
导入
使用import字段声明它们依赖于特定共享模块的资源
"import": [
{"id": "cccccccccccccccccccccccccccccccc"},
{"id": "dddddddddddddddddddddddddddddddd"
"minimum_version": "0.5" // optional
},
]
导出
导出字段指示扩展是共享模块,可导出其资源
"export": {
"allowlist": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
}
允许导入此共享模块资源的扩展ID的可选列表。 如果未给出允许列表,则所有扩展名都可以导入它。
是否可以在无痕模式下启用
三个值:spanning
/ split
/ not_allowed
自定义 IME
要在 permissions
中添加input
权限
"permissions": [
"input"
],
"input_components": [
{
"name": "Test IME",
"type": "ime",
"id": "test",
"description": "Test IME", // 用户可见的描述
"language": "en-US", // 语言
"layouts": ["us::eng"] // 支持的语言
}
]
var ime_api = chrome.input.ime; var context_id = -1; console.log("Initializing IME"); ime_api.onFocus.addListener(function(context) { console.log('onFocus:' + context.contextID); context_id = context.contextID; }); ime_api.onBlur.addListener(function(contextID) { console.log('onBlur:' + contextID); context_id = -1; }); ime_api.onActivate.addListener(function(engineID) { console.log('onActivate:' + engineID); }); ime_api.onDeactivated.addListener(function(engineID) { console.log('onDeactivated:' + engineID); }); ime_api.onKeyEvent.addListener( function(engineID, keyData) { console.log('onKeyEvent:' + keyData.key + " context: " + context_id); if (keyData.type == "keydown" && keyData.key.match(/^[a-z]$/)) { chrome.input.ime.commitText({"contextID": context_id, "text": keyData.key.toUpperCase()}); return true; } return false });
扩展程序的key
通常不需要使用此值。当打包.crx
的时候会自动设置的。
支持的最低的chrome版本
Nacl 模块(Native Client模块)
"nacl_modules": [{
"path": "OpenOfficeViewer.nmf",
"mime_type": "application/vnd.oasis.opendocument.spreadsheet"
},
{
"path": "OpenOfficeViewer.nmf",
"mime_type": "application/vnd.oasis.opendocument.spreadsheet-template"
},
{
"path": "ExcelViewer.nmf",
"mime_type": "application/excel"
}]
.nmf
文件的位置本地链接
"natively_connectable": {
"channel": "dev",
"extension_types": ["extension"]
}
验证用户身份
OAuth2是用于授权的行业标准协议。它提供了一种机制,使用户可以在不共享用户名,密码和其他私有凭据的情况下,向Web和桌面应用程序授予对私有信息的访问权限。
"oauth2": {
"client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
"scopes":[""]
}
是否可以离线使用
允许您在Google Chrome浏览器的地址栏中注册关键字
"omnibox": { "keyword" : "omnix" },
chrome.omnibox.onInputChanged.addListener(
function(text, suggest) {
console.log('inputChanged: ' + text);
suggest([
{content: text + " one", description: "the first one"},
{content: text + " number two", description: "the second entry"}
]);
});
// This event is fired with the user accepts the input in the omnibox.
chrome.omnibox.onInputEntered.addListener(
function(text) {
console.log('inputEntered: ' + text);
alert('You just typed "' + text + '"');
});
可选权限
在运行时而非安装时请求声明的可选权限,因此用户可以理解为什么需要这些权限,并仅授予必要的权限。
不能设置为可选权限的权限:
声明权限
如果需要使用chrome的API,则需要权限声明才可以。
权限 | 描述 |
---|---|
activeTab | 请求根据activeTab规范授予扩展名权限。 |
alarms | 扩展程序访问chrome.alarms API。 |
background | 具有后台权限,可以在后台运行,直到退出chrome;通常,“背景”权限与背景页面,事件页面或背景窗口一起使用。 |
bookmarks | 扩展程序访问chrome.bookmarks API的权限。 |
browsingData | 扩展程序可以访问chrome.browsingData API。 |
certificateProvider | 扩展程序授予chrome.certificateProvider API的访问权限。 |
clipboardRead | 如果扩展程序或应用程序使用,则为必填document.execCommand(‘paste’)。 |
clipboardWrite | 表示扩展程序或应用程序使用document.execCommand(‘copy’)或document.execCommand(‘cut’)。 |
contentSettings | 扩展程序访问chrome.contentSettings API。 |
contextMenus | 扩展程序访问chrome.contextMenus API。 |
cookies | 扩展程序访问chrome.cookies API。 |
debugger | 扩展程序访问chrome.debugger API。 |
declarativeContent | 扩展程序访问chrome.declarativeContent API的权限。 |
declarativeNetRequest | 扩展程序访问chrome.declarativeNetRequest API的权限。 |
declarativeNetRequestFeedback | 授予扩展程序对chrome.declarativeNetRequest API中的事件和方法的访问权限。 |
declarativeWebRequest | 扩展程序对chrome.declarativeWebRequest API的访问权限。 |
desktopCapture | 扩展程序可以访问chrome.desktopCapture API。 |
displaySource | 扩展程序授予chrome.displaySource API的访问权限。 |
dns | 扩展程序访问chrome.dns API。 |
documentScan | 扩展程序访问chrome.documentScan API的权限。 |
downloads | 扩展程序访问chrome.downloads API。 |
enterprise.deviceAttributes | 扩展程序访问chrome.enterprise.deviceAttributes API。 |
enterprise.hardwarePlatform | 扩展程序访问chrome.enterprise.hardwarePlatform API。 |
enterprise.networkingAttributes | 扩展程序访问chrome.enterprise.networkingAttributes API。 |
enterprise.platformKeys | 扩展程序访问chrome.enterprise.platformKeys API。 |
experimental | 扩展程序或应用程序使用任何chrome.experimental.* API,则为必填项。 |
fileBrowserHandler | 扩展程序授予chrome.fileBrowserHandler API的访问权限。 |
fileSystemProvider | 扩展程序访问chrome.fileSystemProvider API的权限。 |
fontSettings | 扩展程序访问chrome.fontSettings API。 |
gcm | 扩展程序访问chrome.gcm API。 |
geolocation | 扩展程序或应用程序使用建议的HTML5地理位置API,而无需提示用户进行许可。 |
history | 扩展程序访问chrome.history API。 |
identity | 扩展程序访问chrome.identity API。 |
idle | 扩展程序可以访问chrome.idle API。 |
idltest | 扩展程序可以访问chrome.idltest API。 |
login | 扩展程序可以访问chrome.login API。 |
loginScreenStorage | 扩展程序访问chrome.loginScreenStorage API的权限。 |
loginState | 扩展程序对chrome.loginState API的访问权限。 |
management | 扩展程序访问chrome.management API。 |
nativeMessaging | 扩展程序可以访问本机消息传递API。 |
notifications | 扩展程序访问chrome.notifications API。 |
pageCapture | 扩展程序可以访问chrome.pageCapture API。 |
platformKeys | 扩展程序可以访问chrome.platformKeys API。 |
power | 扩展程序访问chrome.power API。 |
printerProvider | 扩展程序访问chrome.printerProvider API的权限。 |
printing | 扩展程序访问chrome.printing API。 |
printingMetrics | 扩展程序可以访问chrome.printingMetrics API。 |
privacy | 扩展程序访问chrome.privacy API。 |
processes | 扩展程序可以访问chrome.processes API。 |
proxy | 扩展程序可以访问chrome.proxy API。 |
scripting | 扩展程序可以访问chrome.scripting API。 |
search | 扩展程序可以访问chrome.search API。 |
sessions | 扩展程序访问chrome.sessions API。 |
signedInDevices | 扩展程序可以访问chrome.signedInDevices API。 |
storage | 扩展程序可以访问chrome.storage API。 |
system.cpu | 扩展程序访问chrome.system.cpu API。 |
system.display | 扩展程序访问chrome.system.display API。 |
system.memory | 扩展程序访问chrome.system.memory API。 |
system.storage | 扩展程序访问chrome.system.storage API。 |
tabCapture | 扩展程序访问chrome.tabCapture API。 |
tabGroups | 扩展程序访问chrome.tabGroups API的权限。 |
tabs | 扩展程序可以访问Tab包括chrome.tabs和chrome.windows在内的多个API使用的对象的特权字段。在许多情况下,您的扩展程序无需声明"tabs"使用这些API的权限。 |
topSites | 扩展程序访问chrome.topSites API。 |
tts | 扩展程序可以访问chrome.tts API。 |
ttsEngine | 扩展程序访问chrome.ttsEngine API的权限。 |
unlimitedStorage | 提供无限的配额来存储HTML5客户端数据,例如数据库和本地存储文件。没有此许可,扩展程序或应用程序仅限于5 MB本地存储。 |
vpnProvider | 扩展程序访问chrome.vpnProvider API的权限。 |
wallpaper | 扩展程序访问chrome.wallpaper API。 |
webNavigation | 扩展程序访问chrome.webNavigation API的权限。 |
webRequest | 扩展程序可以访问chrome.webRequest API |
webRequestBlocking | 扩展程序以阻止方式使用chrome.webRequest API,则为必填。 |
平台
"replacement_web_app": {
"channel": "stable",
"extension_types": ["extension", "platform_app"],
"min_manifest_version": 2
}
应用或扩展程序所需的技术。
"requirements": {
"3D": {
"features": ["webgl"]
},
"plugins": {
"npapi": true
}
}
从chrome 57开始,Chrome将不再允许沙盒页面内包含外部Web内容(包括嵌入式框架和脚本)。使用 webview
代替
可通过网络主动从网络上加载实时内容,并将其嵌入到您的Chrome应用中。
"permissions": ["webview"],
"webview": {
"partitions": [
{
"name": "partition",
"accessible_resources": [""]
}
]
}
签名
存储
与本地和同步存储区不同,托管存储区要求将其结构声明为JSON结构。
"storage": {
"managed_schema": "schema.json"
}
tts 引擎
使用chrome.ttsEngine API通过扩展来实现文本语音转换(TTS)引擎。
"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"]
}
]
},
event_types:
更新的 URL , 参考自动更新
能够在网页页面中注入的资源路径
"web_accessible_resources": [
"images/*.png",
"style/double-rainbow.css",
"script/double-rainbow.js",
"script/main.js",
"templates/*"
],
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。