除了支持传统的一切 web API、JavaScript API 以外,chrome插件额外支持以下API(chrome.xxx):
{
// 清单文件的版本,必须是2
"minifest_version": 2,
”name“: "demo",
"version": "1.0.0",
"description": "简单的chrome插件demo",
"icons": {
"16": "img/icon.png",
"48": "img/icon@48x.png",
"128": "img/icon@128x.png",
},
// 会一直常驻在后台运行的js文件或html页面。有 2 种指定方式:
// ①指定js,那么会自动生成一个背景页
"background": {
"scripts": ["js/background.js"]
},
// ②指定html页面,可以通过script标签引入多个js文件
// "background": {
// "page": "background.html"
// },
"browser_action": {
"default_icon": "img/icon.png",
// (可选)鼠标悬停在右上角图标上的标题
"default_title": "这是一个示例chrome插件",
"default_popup": "popup.html"
},
// 对某些特性网页才显示的图标
"page_action": {
"default_icon": "img/icon.png",
"default_title": "这是page action",
"default_popup": "popup.html"
},
// 需要注入页面的JS
"content_scripts": [
{
// ["http://*/*", "https://*/*"] 表示匹配这两个协议的所有地址
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多个JS按顺序注入
"js": ["js/util.js", "js/content.js"],
// CSS的注入容易影响全局,一定要谨慎!
"css": ["css/custom.css"],
// 代码注入的时间,可选值:"document_start", "document_end", "document_idle",最后一个表示页面空闲时,默认document_idle
"run_at": "document_start"
},
// content_script 可配置多个规则
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-size.js"]
}
],
// 申请权限
"premissions": [
"contextMenus",
"tabs",
"notifications",
"webRequest",
"storage",
"http://*/*", // 可以通过executeScript或者insertCSS访问的网站???
"https://*/*", // 可以通过executeScript或者insertCSS访问的网站???
],
// 普通页面能够直接访问的插件资源列表,如果不设置是无法直接访问的???
"web_accessible_resources": ["js/inject.js"],
// 插件主页,广告位
"homepage_url": "http://github.com/...",
// 覆盖浏览器默认页
"chrome_url_overrides": {
// 覆盖浏览器默认的新标签页
"newtab": "newTab.html"
},
// 插件配置页
"options_ui": {
"page": "options.html",
// 添加官方的默认样式,推荐使用
"chrome_style": true
},
//
"omnibox": { "keyword": "go" },
//
"default_locale": "zh_CN",
// devtools 页面入口??注意只能指向一个HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
background的权限非常大,几乎可以调用所有的 chrome API(除了 devtools),而且它可以无限跨域,也就是可以跨域访问任意网站而无需对方设置CORS。
注意:
content_scripts 不能访问大部分的 chrome API,除了下面几种:
Content script是在一个特殊环境中运行的,这个环境成为isolated world(隔离环境)。它们可以访问所注入页面的DOM,但是不能访问里面的任何javascript变量和函数。 对每个content script来说,就像除了它自己之外再没有其它脚本在运行。 反过来也是成立的: 页面里的javascript也不能访问content script中的任何变量和函数。
注:第一列为发起方,第一行为接收
// popup.js
let bg = chrome.extension.getBackgroundPage()
bg.xxx() // 访问bg的方法
console.log(bg.document.title) // 访问BG的DOM
// background.js
let views = chrome.extension.getViews({type: 'popup'})
if (views.length) {
console.log(views[0].document.title)
}
// popup.js 或 background.js
function sendMessageToContent (message, callback) {
chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
chrome.tabs.sendMessage(tabs[0].id, message, (response) => {
if (callback) callback(response)
})
})
}
sendMessageToContent({action: 'test', data: '你好,我来自popup!'}, (response) => {
console.log('来自content的回复:', response)
})
// content.js 接收
chrome.runtime.onMessage.addListener((request, sender, senderResponse) => {
if (request.action === 'test') {
console.log(request.data)
}
senderResponse('我收到了你的消息---来自content')
})
content 主动向 popup 或 background 发送消息。注意事项:
// content.js
chrome.runtime.sendMessage({data: '你好,我来自content'}, (response) => {
console.log('收到来自后台的回复:', response)
})
// background.js 或 popup.js
chrome.runtime.onMessage.addListener((request, sender, senderResponse) => {
console.log('收到来自content的消息')
console.log(request, sender, senderResponse)
senderResponse('我来自后台,我已收到你的消息')
})
鉴于background生命周期太长,长时间挂载后台可能会影响性能,所以Google又弄一个event-pages,在配置文件上,它与background的唯一区别就是多了一个persistent参数:
{
"background": {
"scripts": ["event-page.js"],
"persistent": false
}
}
它的生命周期是:在被需要时加载,在空闲时被关闭,什么叫被需要时呢?比如第一次安装、插件更新、有content-script向它发送消息,等等。
browserAction(浏览器右上角)
调试:打开开发者模式。在 chrome://extensions 里找到本插件,点击“背景页”,就可以打开 Devtools
关于插件ID
关于 pem 密钥文件有何用?
【与chrome插件无关】在websocket协议头里无法通过自定义header字段添加 Token 鉴权信息。
如果要让chrome插件与本地原生应用通讯,需要把插件id配置在 chrome 的 manifest.json 文件里:
MHTML is a standard format supported by most browsers. It encapsulates in a single file a page and all its resources (CSS files, images…).
Note that for security reasons a MHTML file can only be loaded from the file system and that it can only be loaded in the main frame.
chrome.windows.getCurrent(function (currentWindow) {
console.log('当前窗口ID:' + currentWindow.id);
});
// 方法一:
function getCurrentTabId (callback) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
{
if (callback) callback(tabs.length ? tabs[0].id: null);
});
}
// 方法二:(更稳妥)
function getCurrentTabId2() {
chrome.windows.getCurrent(function(currentWindow) {
chrome.tabs.query({active: true, windowId: currentWindow.id}, function(tabs) {
if (callback) callback(tabs.length ? tabs[0].id: null);
});
});
}
- chrome.storage是针对插件全局的,你在background中保存的数据,在content-script也能获取到;
// web请求监听,最后一个参数表示阻塞式,需单独声明权限:webRequestBlocking
chrome.webRequest.onBeforeRequest.addListener(details => {
// cancel 表示取消本次请求
if(!showImage && details.type == 'image') return {cancel: true};
// 简单的音视频检测
// 大部分网站视频的type并不是media,且视频做了防下载处理,所以这里仅仅是为了演示效果,无实际意义
if(details.type == 'media') {
chrome.notifications.create(null, {
type: 'basic',
iconUrl: 'img/icon.png',
title: '检测到音视频',
message: '音视频地址:' + details.url,
});
}
}, {urls: ["<all_urls>"]}, ["blocking"]);
Extension context invalidated. 报错
360浏览器扩展开发文档:
一种开发 Chrome 扩展程序的新姿势:
原网址: 访问
创建于: 2022-09-04 13:19:38
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论