Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在navigator.permissions中枚举支持的权限名称?_Javascript_Permissions_Navigator - Fatal编程技术网

Javascript 如何在navigator.permissions中枚举支持的权限名称?

Javascript 如何在navigator.permissions中枚举支持的权限名称?,javascript,permissions,navigator,Javascript,Permissions,Navigator,在给定的浏览器环境中,受支持的浏览器可能不同于 在我写这个问题时,规范列表包括以下名称: 加速计 环境光照传感器 后台提取 后台同步 蓝牙 摄像机 剪贴板读取 剪贴板写入 设备信息 显示捕获 地理定位 陀螺仪 磁强计 麦克风 midi nfc 通知 持久存储 推送 扬声器 环境支持可能不仅是规范列表的子集,还包括规范中未列出的其他权限。例如,Chrome 83支持定期后台同步。(我已经包含了一段代码片段来演示。) 如何获取当前环境中受支持权限名称的枚举列表?我如何通过编程知道什么是可能的

在给定的浏览器环境中,受支持的浏览器可能不同于

在我写这个问题时,规范列表包括以下名称:
  • 加速计
  • 环境光照传感器
  • 后台提取
  • 后台同步
  • 蓝牙
  • 摄像机
  • 剪贴板读取
  • 剪贴板写入
  • 设备信息
  • 显示捕获
  • 地理定位
  • 陀螺仪
  • 磁强计
  • 麦克风
  • midi
  • nfc
  • 通知
  • 持久存储
  • 推送
  • 扬声器
环境支持可能不仅是规范列表的子集,还包括规范中未列出的其他权限。例如,Chrome 83支持定期后台同步。(我已经包含了一段代码片段来演示。)

如何获取当前环境中受支持权限名称的枚举列表?我如何通过编程知道什么是可能的

//✅ = 支持
// ❌ = 不支持
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不是铬叉