Javascript 如何在navigator.permissions中枚举支持的权限名称?
在给定的浏览器环境中,受支持的浏览器可能不同于 在我写这个问题时,规范列表包括以下名称:Javascript 如何在navigator.permissions中枚举支持的权限名称?,javascript,permissions,navigator,Javascript,Permissions,Navigator,在给定的浏览器环境中,受支持的浏览器可能不同于 在我写这个问题时,规范列表包括以下名称: 加速计 环境光照传感器 后台提取 后台同步 蓝牙 摄像机 剪贴板读取 剪贴板写入 设备信息 显示捕获 地理定位 陀螺仪 磁强计 麦克风 midi nfc 通知 持久存储 推送 扬声器 环境支持可能不仅是规范列表的子集,还包括规范中未列出的其他权限。例如,Chrome 83支持定期后台同步。(我已经包含了一段代码片段来演示。) 如何获取当前环境中受支持权限名称的枚举列表?我如何通过编程知道什么是可能的
加速计
环境光照传感器
后台提取
后台同步
蓝牙
摄像机
剪贴板读取
剪贴板写入
设备信息
显示捕获
地理定位
陀螺仪
磁强计
麦克风
midi
nfc
通知
持久存储
推送
扬声器
//✅ = 支持
// ❌ = 不支持
const getPermissionStatus=name=>navigator.permissions.query({name});
const logSupportedPermissions=异步(…名称)=>{
for(名称的常量名称){
试一试{
const status=等待getPermissionStatus(名称);
console.log(`✅ ${name}(${status.state})`)
}
捕捉(错误){
console.log(`❌ ${name}`)
}
}
};
常量名称=[
“剪贴板写入”//列出,在Chrome 83中工作
'定期背景同步',//未列出,但在Chrome 83中工作
'显示捕获',//列出,但在Chrome 83中抛出
'a-nonexistent-permission-name',//未列出,抛出
];
logSupportedPermissions(…名称)代码>权限API仍在开发中,不允许检查授予了哪些权限,也不允许检查哪些权限可用,除非通过上面集成的异步方法进行查询
也许有一天像Object.keys(Permissions.prototype)
这样的东西会变得可用,就像Object.keys(Navigator.prototype)
目前,您需要继续查阅MDN中的“浏览器支持”部分或。正如joe所说,这目前是不可能的,至少在Chrome83中是不可能的。支持的权限列表不是从JavaScript直接访问的,因为它们只存在于C++中,浏览器是从.< /p>编译的。
注意Chrome中的navigator.permissions.query.toString()
如何返回query(){[native code]}
也就是说,我们可以看看发生了什么
有一个名为ParsePermissionDescriptor
的大函数,该函数处理将传递给query
的字符串转换为可用权限并进行检查的逻辑。我们可以检查此函数的作用:
PermissionDescriptor*权限=
NativeValueTraits::NativeValue(
脚本\状态->GetIsolate(),原始\描述符.V8Value(),
例外情况(美国);
if(异常\状态.HadException())
返回空ptr;
常量字符串&name=权限->名称();
如果(名称=“地理位置”)
返回CreatePermissionDescriptor(PermissionName::GEOLOCATION);
因此,我们得到名称,然后将其与字符串进行比较。如果它们相等,我们将返回一个新的PermissionDescriptor
if(name==“剪贴板读取”|| name==“剪贴板写入”){
PermissionName permission\u name=PermissionName::剪贴板\u READ;
如果(名称=“剪贴板写入”)
权限\ u名称=权限名称::剪贴板\ u写入;
剪贴板权限描述符*ClipboardPermissionDescriptor\U权限=
NativeValueTraits::NativeValue(
脚本\状态->GetIsolate(),原始\描述符.V8Value(),
例外情况(美国);
返回CreateClipboardPermissionDescriptor(
权限\u名称,剪贴板\u权限->允许不带手势(),
剪贴板_权限->允许WithOutsanization());
}
但我们也在用自己的构造函数处理这些更复杂的权限,比如CreateClipboardPermissionDescriptor
无论如何,您都可以查看该文件并尝试使用name==“some string”
检查的所有值(请注意,为禁用权限返回的错误消息是如何通过logSupportedPermissions
函数返回的),但我不知道您如何能够通过编程获得这些信息。从浏览器源代码中获取
-
-
-
-
我认为第一行有一个问题:您创建了一个包装navigator.permissions.query的函数,但根据mdn,该函数需要一个包含键值对的对象,但您只是传递了一个字符串,所以称为navigator.permissions.query({'clipboard-write'})。您需要实际调用navigator.permissions.query({name:'clipboard write')。将第一行更改为:const getPermissionStatus=name=>navigator.permissions.query({'name':name})
看看是否有效。@leisheng查看源代码:@AlexNikulin我看到我可以查看与发布版本相对应的特定标记。是否有类似的(版本化,易于解析)标记Firefox、Edge等的文件?我可以获取浏览器版本,然后获取并解析这些文件。@jsejcksn,正如您所看到的,mozilla也指chromium。Edge也是webkit,因此您可以从chromium源(以及注释属性)获取感谢您花时间回答。但是,这不是对我所问问题的回答。Safari?Opera?Safari和Opera的来源是铬叉。Fari不是铬叉