文件: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

瀏覽器相容性

另見