Safari Extension 扩展插件的权限相关的内容大致分为下面几个方面:
用户要掌控扩展(Users are in control)
Safari Extension 扩展插件是要在用户控制下的,不能想干嘛就干嘛,因此扩展只有在用户进行互动之后才会运行。在第一次运行之前,扩展图表旁边会有一个提醒,点击会弹出一个标记来帮助指导用户使用。如下:
激活后的扩展图标会变成蓝色的。
可以根据各个网站来授予权限(Permissions are per-website)
Safari Extension 扩展插件的权限是可以针对不同网站来授予的,这样用户就可以自行决定在一些网站中才能使用扩展,或者在一些网站中不使用扩展。(开发者也可以针对不同的网站来设置权限,这里不赘述,下一节中细说)
点击下图红色方框中的“编辑网站”按钮,就可以看到已配置该扩展的网站和权限。(这里建议各位读者尝试将默认生成项目中的example.com
改成*
来匹配所有网站,然后点击激活扩展之后,再访问几个网站看看下面的窗口会变成什么样,这样就更好理解了)
四种权限类型
开发者设置或调整这些权限类型时,需要在项目的 manifest.json 文件中进行相关操作。
脚本插入权限(Script injection Permission)
脚本插入权限运行对用户当前浏览的界面插入 JavaScript 脚本和 CSS 样式表。
json 中的格式如下:
//脚本插入权限
"content_scripts": [{
"js": [ "content.js" ],
"css": [ "content.css" ],
"matches": [ "*://example.com/*" ]
}],
其中:
"js"
表示如果当前页面在匹配的网站,那么插入 content.js 脚本。"css"
表示如果当前页面在匹配的网站,那么插入 content.css 样式表。"matches"
表示匹配域名的正则表达式,通过正则表达式来判断当前页面是否在允许插入脚本的域名中。
如果当前页面在匹配的域名中,那么用户就可以点击启用脚本来插入脚本或样式表了。
隐式权限(Implicit Permission)
在默认生成的扩展项目的 manifest.json 文件中,可以看到这么一段代码(因为放在最后所以实际上是没有最后的逗号,
的):
"permissions": [ ],
方括号[ ]
中就是用于填写隐式权限的。下面举个例子:
"permissions": [
//第一部分
"alarms","clipboardWrite", "menus", "nativeMessaging", "storage",
//第二部分
"cookies", "tabs", "webNavigation"
],
第一部分是非敏感的权限,它们不需要额外的特权;第二部分是敏感的权限,因为它们具有网站标识数据,例如 Cookies。
隐式权限的原理是,当你访问 API 的时候,它会等待回调和数据,用户和扩展交互之后会看到询问权限的提示(也就是用户来提出权限申请)。在用户允许之后,回调会被执行,数据也会返回,所有允许的操作都会立刻执行。
显式权限(Explicit Permission)
显式权限之所以称之为“显式”是因为扩展本身会索取权限,并且索取权限的提示永远以模态形式,而不会添加任何标记。这是因为索取权限的是扩展本身,而不是用户。
这个权限需要在 background.js 文件中写入,如下:
const permissionsToRequest = {
permissions: ["tabs"],
origins: ["*://example.com/*"]
}
browser.permissions.request(["permissionsToRequest"]);
活跃标签页权限(Active Tab Permission)
该权限填写在"permissions": [ ]
中,如下:
"permissions": [
"activeTab"
],
这是一种特殊情形,如果此时您不想显示提醒,那么就可以使用活跃标签页。用户需要通过工具栏(Mac 上可以使用快捷键或菜单)来与扩展交互。如果启用该权限,那么将会为当前标签页的域名授予标签页权限。