文档:requestStorageAccess() 方法

基线 2023 *
新推出

自 ⁨2023 年 12 月⁩起,此功能可在最新的设备和浏览器版本上使用。此功能可能无法在较旧的设备或浏览器上使用。

* 此特性的某些部分可能存在不同级别的支持。

Document 接口的 requestStorageAccess() 方法允许在第三方上下文中(即嵌入在 <iframe> 中)加载的内容请求访问第三方 Cookie 和未分区状态。这与用户代理有关,用户代理默认情况下会阻止访问第三方未分区 Cookie 以提高隐私(例如,防止跟踪),并且它是存储访问 API 的一部分。

要检查是否已授予访问第三方 Cookie 的权限,你可以调用 Permissions.query(),指定功能名称 "storage-access"

注意:此功能的使用可能会被服务器上设置的 storage-access 权限策略阻止。此外,文档必须通过额外的浏览器特定检查,例如允许列表、阻止列表、设备端分类、用户设置、反点击劫持启发式方法或提示用户明确许可。

语法

js
requestStorageAccess()
requestStorageAccess(types)

参数

types 可选

一个对象,包含控制哪些未分区状态可访问的属性。如果未指定,则属性的默认值为 false。可用属性如下:

all

一个布尔值,指定是否应使所有可能的未分区状态可访问。

cookies

一个布尔值,指定是否应使第三方 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() 可访问。

SharedWorker

一个布尔值,指定是否应使 StorageAccessHandle.SharedWorker() 可访问。

返回值

如果已授予第三方 Cookie 的访问权限且未提供 types 参数,则返回一个解析为 undefinedPromise;如果提供了由 types 参数请求的未分区状态的访问权限,则返回一个解析为 StorageAccessHandle 的 Promise;如果访问被拒绝,则返回一个拒绝的 Promise。

除非嵌入式内容当前正在处理用户手势(例如点击或轻触)(瞬时激活),或者之前已授予权限,否则 requestStorageAccess() 请求将自动被拒绝。如果之前未授予权限,则需要在基于用户手势的事件处理程序中运行它们。用户手势行为取决于 Promise 的状态:

  • 如果 Promise 解析(即已授予权限),则用户手势未被消耗,因此脚本随后可以调用需要用户手势的 API。
  • 如果 Promise 拒绝(即未授予权限),则用户手势已被消耗,因此脚本无法执行任何需要手势的操作。这是有意为之的防滥用保护——它阻止脚本循环调用 requestStorageAccess() 直到用户接受提示。

异常

InvalidStateError DOMException

在以下情况下抛出

  • 当前的 Document 尚未激活。
  • 提供了 types 参数,并且其所有属性均为 false
NotAllowedError DOMException

在以下情况下抛出

  • 文档的窗口不是安全上下文。
  • 使用被 storage-access 权限策略阻止。
  • 文档或顶级文档的来源为 null
  • 嵌入的 <iframe> 已沙盒化,并且未设置 allow-storage-access-by-user-activation 令牌。
  • 用户代理的 API 使用权限请求被拒绝。

示例

js
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

浏览器兼容性

另见