浏览器插件开发-manifest文件解读「建议收藏」

浏览器插件开发-manifest文件解读调研资料manifest.json官方文档ChromeExtensionAPI360浏览器的插件文档中文,虽然内核差不多但是不一定与Chromeapi一致,可以作为参考Chrome官方案例库案例如何实现网页和Chrome插件之间的通信消息传递manifest.json配置说明manifest.json用于描述…

大家好,又见面了,我是你们的朋友全栈君。

浏览器插件开发-manifest文件解读

调研资料

? 当前文档基于 manifest v2, 最新版的 manifest v3 有很大不同,建议查看官方文档

manifest.json 配置说明

manifest.json 用于描述 Chrome 插件的源数据,配置信息等,基本内容如下

{ 
   
    "name": "名称",
    "description": "描述",
    "version": "打包完成后用于判断插件是否需要更新",
    "manifest_version": 2,
    "browser_action": { 
   
        "default_popup": "xxx.html 右上角点击后的弹窗,可以用一个页面定义",
        "default_icon": "xxx.png 显示在右上角的图标button"
    },
}

配置项简介

1. manifest_version 必填

清单文件格式的版本, Chrome 18 开发 写 2 即可

2. name 必填

插件名称

3. version 必填

插件版本,发布新版本后,浏览器会比较其已安装的插件的版本,有更新的版本则会自动更新

4. description

插件的描述,132个字符限制

5. icons

插件的图标,可以用在 Chrome 商店展示(128 * 128) | 插件管理界面 (48 * 48) | 扩展页图标 (16 * 16) 最好是 png 格式

6. browser_action

可以用来定义点击图标后展示的窗口,对应接口 chrome.browserAction,这项配置与 page_action 是对立的,只能二选一,以下是 browser_action 子项的配置

  • default_icon: Object | string 一个或者一组图标的路径
  • default_title 设置 tooltip
  • default_popup 指定弹出的窗口,可以是任意 html
  • badges “徽章” 就是小图标上的一个标记,用来展示一些状态

7. page_action

代表可以在当前页面执行的操作,不活动时显示灰色,对应接口 chrome.pageAction

  • default_icon: Object | string 一个或者一组图标的路径
  • 可用 pageAction.(show|hide) 改变插件活动状态

browser_actionpage_action都用来定义放置在工具栏右上角的图标点击情况,但是两者的活动状态展示 | 点击后的展示 | 主要负责场景是不一致的

猜测 browser_action 适用于用户需要点击图标后在弹窗中操作的场景 page_action 试用与在后台运行,重要工作是监听用户行为的插件

官方建议:如果要实现的功能只针对某一个页面有用则建议使用 page_action 否则使用 browser_action

8. background

用来定义后台脚本部分

扩展是基于事件的程序,这些事件包括导航到新页面、删除书签、或者关闭选项卡,扩展在他们的后台脚本中监视这些事件,然后用指定的指令进行响应

关于后台脚本的状态

  1. 首次下载后或者更新后被加载
  2. 后台脚本下载后会处于休眠状态,直到它侦听的某个事件被触发,
  3. 侦听到事件后,会使用指定的指令响应(怎么相应自定义)

以下情况会需要调用到后台脚本

  1. 扩展首次下载或者版本更新
  2. 后台脚本中正在监听事件,并且这事件被触发了
  3. content_script 或者其他扩展中调用了 sendMessage
  4. 当前扩展中的其他部分,例如弹窗中调用了 runtime.getBackgroundPage

后台脚本定义选项

{
    ...
    "background": {
        "scripts": ["bg1.js", "bg2.js"], // 后台脚本可以注册多个
        "persistent": false // 是否是持久的,一般为 false, 某些特殊情况需要参考文档 
    }
}

事件过滤器,有些事件支持事件过滤,比如选项卡的切换可以监听

// background.js
chrome.webNavigation.onCompleted.addListener(function () { 
   }, { 
   
    url: [{ 
   urlMatches: 'http://www.baidu.com'}] // 过滤
});

9. chrome setting 修改 | chrome 用户界面展示修改 | chrome 一些内置页面的替换

  1. setting 使用 chrome_settings_overrides 配置,详细配置查看文档
  2. 用户界面 使用 chrome_ui_overrides 配置,详细配置查看文档,可以设置一些书签方面的规则
  3. 内置页面替换 使用 chrome_url_overrides 配置,详细配置查看文档,标签页、历史页、新 tab 都可替换

10. commands

可以通过 commands 选项定义触发扩展事件的快捷键

{
    ...,
    commands: {
        "xxx": {
            "suggested_key": {
                "default": "Ctrl+X",
                "mac": "Command+X",
                "windows": "Ctrl+X"
            }
        },
        "_execute_browser_action": {...},
        "_execute_page_action": {...}
    }
}

操作快捷键后,插件后台会监听到对应的事件

// background.js
chrome.commands.onCommand.addListener(function(command) { 
   });

注意:\ _execute_browser_action \ _execute_page_action 这两个命令不会被监听,他们是触发 popup 弹出的,要监听 窗口弹出事件可以使用 popup_page 的onDomReady

11. content_scripts

content_script 在一个特殊的环境中运行,可以称之为隔离环境,在这里可以访问所注入页面的DOM,但是不能访问里边的任何 javascript 变量和函数,反之,页面中的js 也不能访问 content_script 中的变量和函数

访问目标网站的 DOM ,可以用来进行通信

分为两种情况,一种是声明型注入脚本,使用 content_scripts 配置项,另一种是编程方式注入使用 permissions: ["activeTab"] 选项,

  1. 声明型注入脚本 content_scripts 值可以是一个数组,设置不同站点的不同注入文件
    • 需要设置 matches: ["http://"] 指定匹配的网址,
    • js 设置注入脚本
    • css 设置注入样式
    • run_at 定义注入要本的时机 document_idle 表示浏览器帮你把握时机,会在 DOM 完成 与 window.onload 之后注入;document_start 在 CSS 注入之后,其他任何脚本或者 DOM 之前注入;document.end DOM 完成之后立即注入,但是在图像等资源之前
  2. 编程方式注入,不需要指定可访问的域名,可以针对当前活动的选项卡运行,获取临时访问权限 permissions: ["tabs"] 编程方式注入会在 chrome.tabs.executeScript(tabId, details, callback) 接口中详细介绍

通信案例,通过 content_script 与页面 共享 DOM,来实现页面与扩展间的通信

// page.js 页面中触发一个postMessage

document.getElementById('btn').addEventListener('click', () => { 
   
    window.postMessage({ 
   type: 'TO_CONNECT_EXTERNAL', data: 'data'});
})

// content_script.js 中做中转

var port = chrome.runtime.connect();

window.addEventListener('message', (e) => { 
   
    if (e.source !== window) { 
   return};

    if (event.data.type && (event.data.type == "FROM_PAGE")) { 
   
        port.postMessage(event.data.data); // 发消息给扩展
    }
}, false);

12. externally_connectable

这项配置直接实现网站与插件间通信,但是需要在 manifest.json 中作出如下配置

{
    "externally_connectable": {
        "matches": ["http://*.xx.com"] // 只有匹配的网站才可以通信
    }
}
// page.js 中发出请求

var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";

chrome.runtime.sendMessage(
    editorExtensionId, 
    { 
   type: 'MsgFromPage', msg: 'Hello, I am page~'}, 
    function(response) { 
   
      console.log(response);
    }
);

// background.js

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) { 
   
  // 可以针对sender做一些白名单检查
  // sendResponse返回响应
  if (request.type == 'MsgFromPage') { 
   
    sendResponse({ 
   tyep: 'MsgFromChrome', msg: 'Hello, I am chrome extension~'});
  }
});

13. offline_enabled

扩展是否需要离线工作,默认为 true, 当chrome 检测到离线时,程序会被高亮显示

14. permissions | optional_permissions

声明 权限(插件实现基础功能所需要的) | 可选权限 (插件中可选的特性所需要的),两者的子配置项是一样的

选项的值是一个数组,代表每一个权限,权限可以是已知的权限字符串 也可以是一个主机的匹配模式
权限字符串大多都对应着一个同名的 chrome[permissionName] API,全部的权限字符串可以点击上边链接查看,一下列出常用的权限

  • activeTab 允许用户在调用扩展时临时访问当前活动的选项卡,
  • background 后台权限,可以用来增加Chrome 运行时间,即开机即运行(虽然是不可见的)
  • bookmarks 书签操作权限
  • browsingData 浏览器数据操作权限,主要用来清除浏览器数据 cookie storage 等
  • contentSettings 浏览器设置权限
  • contextMenus 上下文菜单添加权限
  • cookies cookie 的查询、修改、onChange 监听
  • history 浏览器历史记录操作权限
  • storage chrome.storage 的使用权限(注意不是浏览器的 localStorage)
  • tabs 选项卡权限,允许创建、修改、重新排列选项卡
  • webNavigation 请求进行过程中的操作权限
  • webRequest | webRequestBlocking 开放 正在运行请求的 拦截、阻塞、或修改的权限

15. web_accessible_resources

指定打包资源的的路径字符串数组,这些资源是在扩展中是可用了,例如 content_script会用到的资源等,

16. content_security_policy

内容安全策略, 默认的安全策略为 script-src 'self'; object-src 'self' 他会有如下限制

  1. 禁止 eval 及相关函数
  2. 禁止内联<script>块和内联事件处理程序(例如,<button onclick="…">)
  3. 只有扩展包内的脚本和资源才会被加载!通过Web即时下载的将不会被加载

可以通过 白名单 使用通配符设置哪些外部资源是可以访问的(仅支持 https),如下

"content_security_policy": "script-src 'self' https://*.xxx.com; object-src 'self'"

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128164.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux查看文件大小的几种方法

    Linux查看文件大小的几种方法linux获取文件大小

    2022年5月9日
    41
  • 如何查看redis内存使用情况

    如何查看redis内存使用情况

    2021年10月16日
    55
  • java中main方法的运行

    java中main方法的运行转载自:https://blog.csdn.net/WGYH_3767/article/details/76933676(最近要把一个main方法启动的项目集入web项目里,参考了main方法的运行机制才解决。)学过java的都知道main方法是学习java的开始,也是程序的入口,不过你有多少个类或程序,线程,他们的入口方法都是main()。main方法是一个静态的…

    2022年5月20日
    47
  • vs2017当前页面的脚本发生错误_win10当前页面脚本发生错误

    vs2017当前页面的脚本发生错误_win10当前页面脚本发生错误今天使用金山卫士对IE8进行组件升级,此后再此使用VS2008查看项目界面中的控件变量类型,或者添加变量,都弹出“当前页面脚本错误”。在网上进行查找。解决办法如下:1、进入到注册表编辑器。2、按照以下路径“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet  Settings\Zones”查看是否存在

    2022年8月30日
    1
  • Java中获取文件大小的正确方法

    Java中获取文件大小的正确方法本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法;另外一种是使用FileInputStream的available(

    2022年4月30日
    235
  • Linux权限详解(chmod、600、644、700、711、755、777、4755、6755、7755)「建议收藏」

    Linux权限详解(chmod、600、644、700、711、755、777、4755、6755、7755)「建议收藏」权限简介Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。 Linux下文件的权限类型一般包括读,写,执行。对应字母为r、w、x。 Linux下权限的粒度有拥有者、群组、其它组三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组,如果其它的用户想有这个文件的权限…

    2022年4月27日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号