文档:requestStorageAccess() 方法
基线 2023 *
新推出
Document 接口的 requestStorageAccess() 方法允许在第三方上下文中(即嵌入在 <iframe> 中)加载的内容请求访问第三方 Cookie 和未分区状态。这与用户代理有关,用户代理默认情况下会阻止访问第三方未分区 Cookie 以提高隐私(例如,防止跟踪),并且它是存储访问 API 的一部分。
要检查是否已授予访问第三方 Cookie 的权限,你可以调用 Permissions.query(),指定功能名称 "storage-access"。
注意:此功能的使用可能会被服务器上设置的 storage-access 权限策略阻止。此外,文档必须通过额外的浏览器特定检查,例如允许列表、阻止列表、设备端分类、用户设置、反点击劫持启发式方法或提示用户明确许可。
语法
requestStorageAccess()
requestStorageAccess(types)
参数
types可选-
一个对象,包含控制哪些未分区状态可访问的属性。如果未指定,则属性的默认值为
false。可用属性如下:all-
一个布尔值,指定是否应使所有可能的未分区状态可访问。
-
一个布尔值,指定是否应使第三方 Cookie 可访问。
sessionStorage-
一个布尔值,指定是否应使
StorageAccessHandle.sessionStorage可访问。 localStorage-
一个布尔值,指定是否应使
StorageAccessHandle.localStorage可访问。 indexedDB-
一个布尔值,指定是否应使
StorageAccessHandle.indexedDB可访问。 locks-
一个布尔值,指定是否应使
StorageAccessHandle.locks可访问。 caches-
一个布尔值,指定是否应使
StorageAccessHandle.caches可访问。 getDirectory-
一个布尔值,指定是否应使
StorageAccessHandle.getDirectory()可访问。 estimate-
一个布尔值,指定是否应使
StorageAccessHandle.estimate()可访问。 createObjectURL-
一个布尔值,指定是否应使
StorageAccessHandle.createObjectURL()可访问。 revokeObjectURL-
一个布尔值,指定是否应使
StorageAccessHandle.revokeObjectURL()可访问。 BroadcastChannel-
一个布尔值,指定是否应使
StorageAccessHandle.BroadcastChannel()可访问。 -
一个布尔值,指定是否应使
StorageAccessHandle.SharedWorker()可访问。
返回值
如果已授予第三方 Cookie 的访问权限且未提供 types 参数,则返回一个解析为 undefined 的 Promise;如果提供了由 types 参数请求的未分区状态的访问权限,则返回一个解析为 StorageAccessHandle 的 Promise;如果访问被拒绝,则返回一个拒绝的 Promise。
除非嵌入式内容当前正在处理用户手势(例如点击或轻触)(瞬时激活),或者之前已授予权限,否则 requestStorageAccess() 请求将自动被拒绝。如果之前未授予权限,则需要在基于用户手势的事件处理程序中运行它们。用户手势行为取决于 Promise 的状态:
- 如果 Promise 解析(即已授予权限),则用户手势未被消耗,因此脚本随后可以调用需要用户手势的 API。
- 如果 Promise 拒绝(即未授予权限),则用户手势已被消耗,因此脚本无法执行任何需要手势的操作。这是有意为之的防滥用保护——它阻止脚本循环调用
requestStorageAccess()直到用户接受提示。
异常
InvalidStateErrorDOMException-
在以下情况下抛出
- 当前的
Document尚未激活。 - 提供了
types参数,并且其所有属性均为false。
- 当前的
NotAllowedErrorDOMException-
在以下情况下抛出
- 文档的窗口不是安全上下文。
- 使用被
storage-access权限策略阻止。 - 文档或顶级文档的来源为
null。 - 嵌入的
<iframe>已沙盒化,并且未设置allow-storage-access-by-user-activation令牌。 - 用户代理的 API 使用权限请求被拒绝。
示例
document.requestStorageAccess().then(
() => {
console.log("cookie access granted");
},
() => {
console.log("cookie access denied");
},
);
document.requestStorageAccess({ localStorage: true }).then(
(handle) => {
console.log("localStorage access granted");
handle.localStorage.setItem("foo", "bar");
},
() => {
console.log("localStorage access denied");
},
);
注意:有关更完整的示例,请参阅使用 Storage Access API。
规范
| 规范 |
|---|
| Storage Access API # dom-document-requeststorageaccess |
浏览器兼容性
加载中…
另见
Document.hasStorageAccess()、Document.hasUnpartitionedCookieAccess()、Document.requestStorageAccessFor()- 使用 Storage Access API
- Storage Access API 介绍 (WebKit 博客)