共有ストレージ API

コミュニティグループ報告書草案,

このバージョン:
https://github.com/WICG/shared-storage
課題追跡:
GitHub
仕様内インライン
編集者:
(Google)

概要

Shared Storage は、トップレベル traversable サイトによって意図的にパーティション化されないストレージ API です(ただし、 もちろんコンテキスト origin によっては依然としてパーティション化されます!)。ユーザーのクロスサイト再識別を制限するため、 Shared Storage 内のデータは、慎重に構築された出力ゲートを持つ制限された環境でのみ読み取れます。

この文書のステータス

この仕様は、Web Platform Incubator Community Group によって公開されました。 これは W3C 標準ではなく、W3C 標準化過程上にもありません。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトおよびその他の条件が適用されることに注意してください。 W3C Community and Business Groups についてさらに学ぶ。

1. 導入

この節は規範的ではありません。

クロスサイトでのユーザー追跡を防ぐため、ブラウザーはあらゆる形式のストレージを top-level traversable サイトによってパーティション化しています。Client-Side Storage Partitioning を参照してください。しかし、パーティション化されていないストレージに現在依存している 正当なユースケース が多数あります。

この文書は、パーティション化されていないストレージを必要とする多数のユースケースに対応するため、top-level traversable サイトによって意図的にパーティション化されない(ただし context origin によっては依然としてパーティション化される) 新しいストレージ API を導入します。ユーザーのクロスサイト再識別を制限するため、 Shared Storage 内のデータは、2 つの制限された環境でのみ読み取れます。そのような環境の 1 つは worklet と呼ばれ、worklet からのあらゆる出力は fenced frame または Private Aggregation レポートの形式になります。時間の経過とともに、追加の worklet 出力 ゲートが標準に含まれる可能性があります。 もう 1 つの制限された環境は、disableUntrustedNetwork() の呼び出しを解決した後の fenced frame のコンテンツ内であり、 読み取られたデータがフレーム外へ共有されることを防ぎます。

a.example は、クロスサイトで一貫する方法により、ユーザーをランダムにグループへ割り当てます。

a.example iframe 内:

function generateSeed() {}
await window.sharedStorage.worklet.addModule('experiment.js');

// まだ存在しない場合にのみ、クロスサイト seed を a.example のストレージに書き込む。
window.sharedStorage.set('seed', generateSeed(), { ignoreIfPresent: true });

let fencedFrameConfig = await window.sharedStorage.selectURL(
  'select-url-for-experiment',
  [
    {url: "blob:https://a.example/123…", reportingMetadata: {"click": "https://report.example/1..."}},
    {url: "blob:https://b.example/abc…", reportingMetadata: {"click": "https://report.example/a..."}},
    {url: "blob:https://c.example/789…"}
  ],
  { data: { name: 'experimentA' } }
);

// fenced frame 'my-fenced-frame' がすでに接続されていると仮定する。
document.getElementById('my-fenced-frame').config = fencedFrameConfig;

experiment.js worklet スクリプト内:

class SelectURLOperation {
  hash(experimentName, seed) {}

  async run(urls, data) {
    const seed = await this.sharedStorage.get('seed');
    return hash(data.name, seed) % urls.length;
  }
}
register('select-url-for-experiment', SelectURLOperation);

2. SharedStorageWorklet インターフェイス

SharedStorageWorklet オブジェクトにより、開発者は module scripts を供給して Shared Storage データを処理し、その後、その結果を 1 つ以上の output gates を通じて出力できます。現在、output gates には 2 つあり、Private Aggregation output gate と URL-selection output gate です。
typedef (USVString or FencedFrameConfig) SharedStorageResponse;
[Exposed=(Window)]
interface SharedStorageWorklet : Worklet {
  Promise<SharedStorageResponse> selectURL(DOMString name,
                               sequence<SharedStorageUrlWithMetadata> urls,
                               optional SharedStorageRunOperationMethodOptions options = {});
  Promise<any> run(DOMString name,
                   optional SharedStorageRunOperationMethodOptions options = {});
};

SharedStorageWorklet は、関連付けられた boolean addModule initiated を持ち、 false に初期化されます。

SharedStorageWorklet は、関連付けられた USVString data origin を持ち、"context-origin" に初期化されます。

SharedStorageWorklet は、関連付けられた boolean has cross-origin data origin を持ち、false に初期化されます。

同じ SharedStorageWorklet に対して addModule() により複数の module scripts を追加すると、呼び出し側は Shared Storage からのデータを module scripts 内で定義されたグローバル変数に保存し、その後の addModule() 呼び出しを通じてデータを外部へ流出させることが可能になるため、各 SharedStorageWorkletaddModule() を一度しか呼び出せません。addModule initiated boolean により、 この制限を強制できます。

worklet に対して addModule() が呼び出されると、check if addModule is allowed and update state を実行し、その結果が "DisallowedDueToNonPreferenceError" である場合、または結果が "DisallowedDueToPreferenceError" であり worklet の has cross-origin data origin が false である場合、§ 2.2.6 Monkey Patch for addModule() で詳述されるように、 addModule() を失敗させます。

environment settings object environment および origin origin が与えられたとき、 check if user preference setting allows access to shared storage するには、次の手順を実行します:
  1. 必要に応じて environment および origin で利用可能な値を使用し、true または false のいずれかを返す implementation-defined アルゴリズムを実行する。

environment settings object environmentorigin origin、および boolean allowedInOpaqueOriginContext が与えられたとき、 determine whether shared storage is allowed by context するには、次の手順を実行します:
  1. environmentsecure context でない場合、false を返す。

  2. allowedInOpaqueOriginContext が false であり、かつ environmentoriginopaque origin である場合、false を返す。

  3. originopaque origin である場合、false を返す。

  4. globalObject を、current realmglobal object とする。

  5. Assert: globalObjectWindow または SharedStorageWorkletGlobalScope である。

  6. globalObjectWindow であり、かつ "shared-storage"、globalObjectassociated document、および origin に対して Is feature enabled in document for origin? を実行した結果が false を返す場合、false を返す。

  7. origin に対して obtain a site を実行した結果が enrolled でない場合、false を返す。

  8. true を返す。

アルゴリズム determine whether shared storage is allowed by context および check if user preference setting allows access to shared storage が使用されるシナリオは次のとおりです:
SharedStorageWorklet worklet および URL moduleURLRecord が与えられたとき、 check if addModule is allowed and update state するには、次の手順を実行します:
  1. workletaddModule initiated が true である場合、 "DisallowedDueToNonPreferenceError" を返す。

  2. workletaddModule initiated を true に設定する。

  3. workletDataOrigincurrent settings objectorigin とする。

  4. workletdata origin"script-origin" である場合、workletDataOriginmoduleURLRecordorigin に設定する。

  5. そうでなく、workletdata origin"context-origin" でない場合:

    1. customOriginUrl を、workletdata origin に対して URL parser を実行した結果とする。

    2. customOriginUrl が有効な URL でない場合、 "DisallowedDueToNonPreferenceError" を返す。

    3. workletDataOrigincustomOriginUrlorigin に設定する。

  6. hasCrossOriginDataOrigin を false とする。

  7. workletDataOrigincurrent settings objectoriginsame origin でない場合、hasCrossOriginDataOrigin を true に設定する。

  8. allowedInOpaqueOriginContexthasCrossOriginDataOrigin とする。

  9. current settings objectworkletDataOrigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、 "DisallowedDueToNonPreferenceError" を返す。

  10. worklethas cross-origin data originhasCrossOriginDataOrigin に設定する。

  11. current settings object および workletDataOrigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、 "DisallowedDueToPreferenceError" を返す。

  12. "Allowed" を返す。

さらに、各 SharedStorageWorkletlist of global scopes は、初期状態では空であり、その worklet global scope type である SharedStorageWorkletGlobalScope のインスタンスを最大 1 つ含むことができます。

2.1. SharedStorageWorklet 上での操作メソッドの実行

SharedStorageWorklet workletDOMString operationNamelist of strings urlListorigin workletDataOriginnavigable navigableSharedStorageRunOperationMethodOptions optionspre-specified report parameters または null の preSpecifiedParams、および aggregation coordinator または null の aggregationCoordinator が与えられたとき、 get the select-url result index するには、次の手順を実行します。このアルゴリズムは、urlList から選択された URL のインデックスを値とする unsigned long に解決される promise と、top-level traversable の budgetscharged されるべきかどうかを示す boolean からなる tuple を返します。
  1. promise を新しい promise とする。

  2. windowworkletrelevant settings object とする。

  3. Assert: windowWindow である。

  4. windowbrowsing context が null である場合、(TypeErrorpromise rejected されたもの、 true)の tuple を返す。

  5. windowassociated documentfully active でない場合、(TypeErrorpromise rejected されたもの、 true)の tuple を返す。

  6. Assert: workletglobal scopessize は 1 である。

  7. globalScopeworkletglobal scopes[0] とする。

  8. moduleMapKeyTuples を、globalScoperelevant settings objectmodule map に対して get the keys を実行した結果とする。

  9. Assert: moduleMapKeyTuplessize 1 を持つ。

  10. moduleURLRecordmoduleMapKeyTuples[0][0] とする。

  11. savedQueryNameoptions["savedQuery"] とする。

  12. savedQueryName が空文字列でない string である場合:

    1. callbackTask を、windowurlList、 および promise が与えられた状態で obtain a callback to process the saved index result を実行した結果とする。

    2. savedIndex を、navigableworkletDataOriginmoduleURLRecordoperationNamesavedQueryName、 および callbackTask に対して get the index for a saved query を実行した結果とする。

    3. savedIndex が "pending callback" である場合、tuple (promise, false) を返す。

      注: callbackTask は、このクエリのインデックスを選択する操作を以前取得された worklet agent が完了したときに実行されるように、現在保存されています。 callbackTask の手順が実行されると、 promise は解決されます。

    4. savedIndexunsigned long である場合:

      1. savedIndex が与えられた状態で callbackTask の手順を実行するため、 window が与えられた DOM manipulation task source 上に Queue a global task する。

        注: callbackTask の手順を実行すると promise は解決されます。

      2. tuple (promise, false) を返す。

    5. Assert: savedIndex は "pending current operation" である。

  13. 次の手順を実行するため、globalScopeworklet event loop 上に Queue a task する:

    1. operationMapglobalScopeoperation map とする。

    2. operationMapoperationNamecontain しない場合、promiseTypeErrorreject するため、window が与えられた DOM manipulation task source 上に queue a global task し、 これらの手順を中止する。

      注: これは register()operationName で一度も呼び出されなかった場合に起こり得ます。

    3. Assert: operationMap[operationName] の associated realmthisrelevant realm である。

    4. operation を、operationMap[operationName] を RunFunctionForSharedStorageSelectURLOperationconverted したものとする。

    5. privateAggregationCompletionTask を、workletDataOriginpreSpecifiedParams および aggregationCoordinator が与えられた状態で setting up the Private Aggregation scopes した結果とする。

    6. argumentsListlist « urlList » とする。

    7. options["data"] が exist する場合、それを argumentsListappend する。

    8. indexPromise を、argumentsListoperationinvoking した結果とする。

    9. indexPromiseReact する:

      それが値 index で fulfilled された場合:
      1. indexurlListsize より大きい場合:

        1. savedQueryName が空文字列でない string である場合、 windownavigableworkletDataOriginmoduleURLRecordoperationNamesavedQueryName、および default selectURL indexstore the index for a saved query を実行する。

        2. promiseTypeErrorreject するため、 window が与えられた DOM manipulation task source 上に Queue a global task し、 これらの手順を中止する。

        注: 結果の index は入力 urls の size を超えています。これは selectURL() プロトコルに違反しており、どの url を選択すべきか分かりません。

        そうでない場合:

        1. savedQueryName が空文字列でない string である場合、 windownavigableworkletDataOriginmoduleURLRecordoperationNamesavedQueryName、および indexstore the index for a saved query を実行する。

        2. promiseindexresolve するため、 window が与えられた DOM manipulation task source 上に Queue a global task する。

        3. privateAggregationCompletionTask を実行する。

      それが rejected された場合:
      1. savedQueryName が空文字列でない string である場合、 windownavigableworkletDataOriginmoduleURLRecordoperationNamesavedQueryName、および default selectURL indexstore the index for a saved query を実行する。

      2. promiseTypeErrorreject するため、 window が与えられた DOM manipulation task source 上に Queue a global task する。

        注: これは operationCtor の run() メソッドでエラーが発生したこと (ここで operationCtorregister() のパラメーターです)、 または結果の index が非整数値であり、それが selectURL() プロトコルに違反しており、どの url を選択すべきか分からないことを示します。

      3. privateAggregationCompletionTask を実行する。

  14. tuple (promise, true) を返す。

SharedStorageWorklet workletenvironment settings object environmentDocument documentsequence of SharedStorageUrlWithMetadata urlslist of strings urlListnavigable navigableSharedStorageRunOperationMethodOptions optionsfenced frame config mapping fencedFrameConfigMappingurn uuid urnboolean shouldChargeTopLevelBudgetsboolean shouldUseDefaultIndex、および unsigned long resultIndex が与えられたとき、 handle the result of selecting an index するには、次の手順を実行します:
  1. site を、documentoriginobtain a site を実行した結果とする。

  2. remainingBudget を、environment および sitedetermine remaining navigation budget を実行した結果とする。

  3. pendingBits を、urlListsize の 2 を底とする対数とする。

  4. shouldChargeTopLevelBudgets が true である場合:

    1. pageBudgetResult を、navigablesite、および pendingBitscharge shared storage top-level traversable budgets を実行した結果とする。

    2. pageBudgetResult が false である場合、shouldUseDefaultIndex を true に設定する。

  5. pendingBitsremainingBudget より大きい場合、 shouldUseDefaultIndex を true に設定する。

  6. shouldUseDefaultIndex が true である場合、resultIndexdefault selectURL index に設定する。

  7. finalConfig を新しい fenced frame config とする。

  8. finalConfigmapped urlurlList[resultIndex] に設定する。

  9. finalConfiga "pending shared storage budget debit" fieldpendingBits に設定する。

  10. urn および finalConfigfencedFrameConfigMapping 上の Finalize a pending config を実行する。

  11. resultURLWithMetadataurls[resultIndex] とする。

  12. resultURLWithMetadata がフィールド "reportingMetadata" を持つ場合、 resultURLWithMetadata["reportingMetadata"] で register reporting metadata を実行する。

  13. options["keepAlive"] が false である場合、 workletterminate a worklet global scope を実行する。

selectURL(name, urls, options) メソッドの手順は次のとおりです:
  1. resultPromise を新しい promise とする。

  2. thisaddModule initiated が false である場合、 TypeErrorpromise rejected されたものを返す。

  3. windowthisrelevant settings object とする。

  4. Assert: windowWindow である。

  5. contextwindowbrowsing context とする。

  6. context が null である場合、TypeErrorpromise rejected されたものを返す。

  7. preSpecifiedParams を、options および context が与えられた状態で obtaining the pre-specified report parameters した結果とする。

  8. preSpecifiedParamsDOMException である場合、preSpecifiedParamsa promise rejected with されたものを返す。

  9. aggregationCoordinator を、options が与えられた状態で obtaining the aggregation coordinator した結果とする。

  10. aggregationCoordinatorDOMException である場合、aggregationCoordinatora promise rejected with されたものを返す。

  11. documentcontextactive document とする。

  12. thisglobal scopesempty である場合、 TypeErrorpromise rejected されたものを返す。

    注: これは selectURL()addModule() より前に呼び出された場合に起こり得ます。

  13. Assert: thisglobal scopessize は 1 である。

  14. globalScopethisglobal scopes[0] とする。

  15. workletDataOrigin を、globalScoperealmsettings objectorigin とする。

  16. "shared-storage-select-url"、 document、および workletDataOrigin に対して Is feature enabled in document for origin? を実行した結果が false を返す場合、TypeErrorpromise rejected されたものを返す。

  17. globalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  18. urls が空、または urlssize が 8 より大きい場合、 TypeErrorpromise rejected されたものを返す。

    注: ここで 8 が選ばれているのは、 selectURL() の各呼び出しが、結果の fenced frame がクリックされたときに最大 log2(8) = 3 ビットの情報しか漏らせないようにするためです。 これは 1 回の呼び出しあたりでは多くない情報です。

  19. urlList を空の list とする。

  20. urls 内の各 urlWithMetadata について For each:

    1. urlWithMetadata がフィールド "url" を持たない場合、TypeErrorpromise rejected されたものを返す。

    2. そうでなければ、urlStringurlWithMetadata["url"] とする。

    3. serializedUrl を、urlStringget the canonical URL string if valid を実行した結果とする。

    4. serializedUrl が undefined である場合、TypeErrorpromise rejected されたものを返す。

    5. そうでなければ、serializedUrlurlListappend する。

    6. urlWithMetadata がフィールド "reportingMetadata" を持つ場合:

      1. reportingMetadataurlWithMetadata["reportingMetadata"] とする。

      2. reportingMetadatavalidate reporting metadata を実行した結果が false である場合、resultPromiseTypeErrorreject し、これらの手順を中止する。

  21. navigable を、windowassociated documentnode navigable とする。

  22. fencedFrameConfigMapping を、navigabletraversable navigablefenced frame config mapping とする。

  23. pendingConfig を新しい fenced frame config とする。

  24. urn を、pendingConfigfencedFrameConfigMapping 上の store a pending config を実行した結果とする。

  25. urn が failure である場合、TypeErrorpromise rejected されたものを返す。

  26. environmentwindowrelevant settings object とする。

  27. allowedInOpaqueOriginContextthishas cross-origin data origin とする。

  28. environmentworkletDataOrigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  29. environment および workletDataOrigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合:

    1. thishas cross-origin data origin が false である場合、TypeErrorpromise rejected されたものを返す。

  30. options["resolveToConfig"] が true である場合、 resultPromisependingConfigresolve する。

  31. そうでなければ、resultPromiseurnresolve する。

  32. (indexPromise, shouldChargeTopLevelBudgets) を、thisnameurlListworkletDataOriginnavigableoptionspreSpecifiedParams および aggregationCoordinator が与えられた状態で get the select-url result index を実行した結果とする。

  33. indexPromiseresultIndexUpon fulfillment されたとき、workletenvironmentdocumenturlsurlListnavigableoptionsfencedFrameConfigMappingurnshouldChargeTopLevelBudgets、 false、および resultIndex が与えられた状態で handle the result of selecting an index を実行する。

  34. indexPromiseUpon rejection されたとき、 workletenvironmentdocumenturlsurlListnavigableoptionsfencedFrameConfigMappingurnshouldChargeTopLevelBudgets、 true、および default selectURL index が与えられた状態で handle the result of selecting an index を実行する。

  35. resultPromise を返す。

run(name, options) メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. thisaddModule initiated が false である場合、 TypeErrorpromise rejected されたものを返す。

  3. windowthisrelevant settings object とする。

  4. Assert: windowWindow である。

  5. contextwindowbrowsing context とする。

  6. context が null である場合、TypeErrora promise rejected with されたものを返す。

  7. preSpecifiedParams を、options および context が与えられた状態で obtaining the pre-specified report parameters した結果とする。

  8. preSpecifiedParamsDOMException である場合、preSpecifiedParamsa promise rejected with されたものを返す。

  9. aggregationCoordinator を、options が与えられた状態で obtaining the aggregation coordinator した結果とする。

  10. aggregationCoordinatorDOMException である場合、aggregationCoordinatora promise rejected with されたものを返す。

  11. thisglobal scopesempty である場合、 TypeErrorpromise rejected されたものを返す。

    注: これは run()addModule() より前に呼び出された場合に起こり得ます。

  12. Assert: thisglobal scopessize は 1 である。

  13. globalScopethisglobal scopes[0] とする。

  14. globalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  15. workletDataOrigin を、globalScoperealmsettings objectorigin とする。

  16. allowedInOpaqueOriginContextthishas cross-origin data origin とする。

  17. windowworkletDataOrigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、promiseTypeErrorreject する。

  18. window および workletDataOrigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合:

    1. thishas cross-origin data origin が false である場合、promiseTypeErrorreject する。

    2. そうでなければ、promise を undefined で resolve する。

    3. promise を返す。

  19. promise を返し、直ちに window が与えられた状態で obtaining a worklet agent し、 残りの手順をその agent 内で実行する:

    注: promise の解決は、 SharedStorageWorkletGlobalScope 内での実行より前であり、その実行に依存しないべきです。 これは、shared storage がパーティション化されていないストレージの一種であり、SharedStorageWorkletGlobalScope がクロスサイトデータにアクセスできるため、そのデータが run() (その成功/エラー結果を介して)漏えいすべきではないからです。

    1. promise を undefined で resolve するため、window が与えられた DOM manipulation task source 上に Queue a global task する。

    2. globalScoperelevant settings objectmodule mapempty でない場合:

      1. operationMapthisSharedStorageWorkletGlobalScopeoperation map とする。

      2. operationMapnamecontain する場合:

        1. Assert: operationMap[name] の associated realmthisrelevant realm である。

        2. operation を、operationMap[name] を Functionconverted したものとする。

        3. privateAggregationCompletionTask を、workletDataOriginpreSpecifiedParams および aggregationCoordinator が与えられた状態で setting up the Private Aggregation scopes した結果とする。

        4. argumentsList を新しい list とする。

        5. options["data"] が exist する場合、それを argumentsListappend する。

        6. argumentsList および "report" で operationInvoke する。

        7. 該当する場合、operation の実行が完了するまで待機する。

        8. privateAggregationCompletionTask を実行する。

    3. options["keepAlive"] が false である場合:

      1. 該当する場合、operation の実行が完了するまで待機する。

      2. terminate a worklet global scopethis で実行する。

SharedStorageRunOperationMethodOptions options が与えられたとき、 obtain the aggregation coordinator するには、次の手順を実行します。これらは aggregation coordinator、null、または DOMException を返します:
  1. options["privateAggregationConfig"] が exist しない場合、null を返す。

  2. options["privateAggregationConfig"]["aggregationCoordinatorOrigin"] が exist しない場合、null を返す。

  3. options["privateAggregationConfig"]["aggregationCoordinatorOrigin"] が与えられた状態で obtaining the Private Aggregation coordinator した結果を返す。

SharedStorageRunOperationMethodOptions options および browsing context context が与えられたとき、 obtain the pre-specified report parameters するには、次の手順を実行します。これらは pre-specified report parameters、null、または DOMException を返します:
  1. options["privateAggregationConfig"] が exist しない場合、null を返す。

  2. privateAggregationConfigoptions["privateAggregationConfig"] とする。

  3. contextId を null とする。

  4. privateAggregationConfig["contextId"] が exist する場合、contextIdprivateAggregationConfig["contextId"] に設定する。

  5. contextIdlength が 64 より大きい場合、名前が "DataError" の新しい DOMException を返す。

  6. filteringIdMaxBytesdefault filtering ID max bytes とする。

  7. privateAggregationConfig["filteringIdMaxBytes"] が exist する場合、filteringIdMaxBytesprivateAggregationConfig["filteringIdMaxBytes"] に設定する。

  8. filteringIdMaxBytesvalid filtering ID max bytes rangecontained されていない場合、名前が "DataError" の新しい DOMException を返す。

  9. contextfenced frame config instance が null でない場合:

    1. filteringIdMaxBytesdefault filtering ID max bytes でない、または contextId が null でない場合、名前が "DataError" の新しい DOMException を返す。

  10. maxContributions を null とする。

  11. privateAggregationConfig["maxContributions"] が exist する場合、maxContributionsprivateAggregationConfig["maxContributions"] に設定する。

  12. maxContributions がゼロである場合、名前が "DataError" の新しい DOMException を返す。

  13. 次の項目を持つ新しい pre-specified report parameters を返す:

    context ID

    contextId

    filtering ID max bytes

    filteringIdMaxBytes

    max contributions

    maxContributions

origin workletDataOriginpre-specified report parameters または null の preSpecifiedParams、および aggregation coordinator または null の aggregationCoordinator が与えられたとき、 set up the Private Aggregation scopes するには、次の手順を実行します。これらは algorithm を返します。

注: 返された algorithm は、関連付けられた操作が 完了したときに実行されるべきです。

  1. batchingScope を新しい batching scope とする。

  2. debugScope を新しい debug scope とする。

  3. privateAggregationTimeout を null とする。

  4. hasRunPrivateAggregationCompletionTask を false とする。

  5. privateAggregationCompletionTask を、次の手順を実行する algorithm とする:

    1. hasRunPrivateAggregationCompletionTask である場合、返す。

    2. hasRunPrivateAggregationCompletionTask を true に設定する。

    3. debugScope が与えられた状態で Mark a debug scope complete する。

    4. batchingScopeworkletDataOrigin、 "shared-storage" および privateAggregationTimeout が与えられた状態で Process contributions for a batching scope する。

  6. aggregationCoordinator が null でない場合、 aggregationCoordinator および batchingScope が与えられた状態で set the aggregation coordinator for a batching scope する。

  7. preSpecifiedParams が null でない場合:

    1. isDeterministicReport を、preSpecifiedParams が与えられた状態で determining if a report should be sent deterministically した結果とする。

    2. isDeterministicReport である場合:

      1. privateAggregationTimeoutcurrent wall timedeterministic operation timeout duration を加えたものに設定する。

    3. preSpecifiedParams および batchingScope が与えられた状態で Set the pre-specified report parameters for a batching scope する。

    4. isDeterministicReport である場合、次の手順を in parallel に実行する:

      1. privateAggregationTimeout まで待機する。

      2. privateAggregationCompletionTask を実行する。

  8. privateAggregationCompletionTask を返す。

deterministic operation timeout duration は、Shared Storage 操作が deterministic report をトリガーしている場合に、 どれだけ長く Private Aggregation contributions を行えるか、および同等に、その report が 操作開始後いつ送信されるべきかを制御する、implementation-defined な非負の duration です。

2.2. Worklets に対するモンキーパッチ

この仕様は、Shared Storage のニーズに対応するため、Worklet 標準にいくつかの変更を加えます。

2.2.1. set up a worklet environment settings object に対するモンキーパッチ

set up a worklet environment settings object アルゴリズムは、追加のパラメーター Worklet worklet を含める必要があります。settingsObjectorigin を定義する手順は、次のように変更されるべきです:

  1. settingsObject を、次のように定義されるアルゴリズムを持つ新しい environment settings object とする:

    ......

    origin

    1. workletGlobalScope を、 realmExecutionContext の Realm component の global object とする。

    2. workletGlobalScopeSharedStorageWorkletGlobalScope でない場合、origin を返す。

    3. Assert: workletSharedStorageWorklet である。

    4. workletdata origin"context-origin" である場合、outsideSettingsorigin を返す。

    5. そうでなく、data origin"script-origin" である場合:

      1. pendingAddedModules を、workletadded modules listclone とする。

      2. Assert: pendingAddedModulessize は 1 である。

      3. moduleURLpendingAddedModules[0] とする。

      4. moduleURLorigin を返す。

    6. そうでなければ、customOriginUrl を、data origin に対して URL parser を実行した結果とする。

    7. Assert: customOriginUrl は有効な URL である。

    8. customOriginUrlorigin を返す。

    ......

2.2.2. create a worklet global scope に対するモンキーパッチ

create a worklet global scope アルゴリズムは、 worklet パラメーターを渡すように変更する必要があります:

  1. insideSettings を、realmExecutionContextoutsideSettings、および worklet が与えられた状態で setting up a worklet environment settings object した結果とする。

2.2.3. fetch a worklet script graph に対するモンキーパッチ

fetch a worklet script graph アルゴリズムは、アルゴリズムパラメーター processCustomFetchResponse を受け取る fetch a worklet/module worker script graph アルゴリズムを呼び出します。その processCustomFetchResponse パラメーターの定義には、手順 "5. Fetch request, ..." の前に次の手順を含める必要があります:

  1. fetchClientglobal objectSharedStorageWorkletGlobalScope である場合:

    1. requestredirect mode を "error" に設定する。

      注: shared storage では、module script request に対するリダイレクトは許可されません。この制限により、SharedStorageWorkletGlobalScope が作成されるとすぐに、realmsettings objectorigin を取得するアルゴリズム(§ 2.2.1 Monkey Patch for set up a worklet environment settings object で説明)を定義して使用できます。origin は変更されないためです。この制限は、将来の設計の反復で削除される可能性があります。 リダイレクトが許可されるようになった場合、おそらく、realmsettings objectorigin を取得するアルゴリズムは、最終 request の response を受け取った後、最終 request の URLorigin を返すように更新されるべきであり、user preference checkings はその時点以降にのみ行われるべきです。

    2. fetchClientoriginsettingsObjectoriginsame origin でない場合:

      1. dataOriginValuesettingsObjectoriginserialization とする。

      2. Assert: dataOriginValue は null でない。

      3. Append the header (`Sec-Shared-Storage-Data-Origin`, dataOriginValue) to requestheader list.

2.2.4. `Shared-Storage-Cross-Origin-Worklet-Allowed` HTTP レスポンスヘッダー

`Shared-Storage-Cross-Origin-Worklet-Allowed` HTTP レスポンスヘッダーは、従来の CORS ヘッダーとともに、cross-origin site に、module script の URLorigin から worklet を作成し、その後の操作を module script の URLorigin を shared storage データへアクセスするための data partition origin として使用して worklet 上で実行する権限を付与するために使用できます。すなわち、§ 2.2.1 Monkey Patch for set up a worklet environment settings object で設定される origin であり、これは origin となり、すべての SharedStorage 呼び出しで obtain a shared storage bottle map に使用されます。

cross-origin scripts を読み込む Worklets は、信頼された外部 origins を示すための基礎的な権限メカニズムとして CORS に依存します。 しかし、CORS だけでは、data partition origin が script origin である cross-origin script を持つ worklet の作成には不十分です。 単純なリソース共有とは異なり、worklets は creator site が target origin の context 内で JavaScript を実行することを許可します。 セキュリティを確保するため、script origin から追加のレスポンスヘッダー、 `Shared-Storage-Cross-Origin-Worklet-Allowed`、 が必要です。

2.2.5. HTTP fetch に対するモンキーパッチ

Steps は、HTTP fetch アルゴリズムに追加される必要があります。

注: module script を提供する site は、セキュリティ上の影響を慎重に考慮する責任があります。module script の URLorigin と worklet の creator Window origin が same origin でない場合、permissive CORS headers と module script response 上の `Shared-Storage-Cross-Origin-Worklet-Allowed` ヘッダーを送信することで、サーバーは worklet の作成およびその後の worklet 上での操作を許可しつつ、worklet が worklet の script の origin を shared storage データにアクセスするための origin、すなわち data partition origin として使用することを許可します。たとえば、worklet の creator WindowselectURL() または run() を呼び出すことで、worklet origin の siteremaining navigation budget を汚染し使い切る可能性があります。 ここで worklet origin は global scope の realmsettings objectorigin です。

2.2.6. addModule() に対するモンキーパッチ

addModule() method steps for Worklet は、手順 "Let promise be a new promise" の前に次の手順を含める必要があります:

  1. thisSharedStorageWorklet 型である場合:

    1. addModuleAllowedResult を、this および moduleURLRecord が与えられた状態で check if addModule is allowed and update state を実行した結果とする。

    2. addModuleAllowedResult が "DisallowedDueToNonPreferenceError" である場合:

      1. TypeErrora promise rejected with されたものを返す。

    3. そうでなく、addModuleAllowedResult が "DisallowedDueToPreferenceError" である場合:

      1. thishas cross-origin data origin が false である場合、TypeErrora promise rejected with されたものを返す。

    4. そうでなければ:

      1. Assert: addModuleAllowedResult は "Allowed" である。

user preferences error では、addModule() は早い段階で中止されます。しかし、そのエラーが呼び出し元に公開されるのは same-origin worklet(すなわち initiator document の origin が module script の origin と same-origin である場合)に限られます。 cross-origin worklet では、エラーは隠されます。これは、(そのブラウザーベンダーに per-origin preference が存在する場合)呼び出し元がユーザーが preferences を通じて shared storage を無効にした origins を知ることを防ぐためです。

呼び出し元は依然として timing attacks を使ってこの情報を知る可能性がありますが、現実にはそのような preferences を設定するユーザーは非常に少なく、広範な検索を行うと worklets を起動するために大きなパフォーマンスコストが発生するため、これは軽微な security/privacy issue です。

この根拠は、selectURL() および run() に対する user preferences error の処理にも適用されます。

手順 "Let addedSuccessfully be false" の後に、次の手順を含める必要があります:

  1. thisSharedStorageWorklet 型であり、 has cross-origin data origin が true であり、かつ data origin"script-origin" でない場合:

    1. Assert: pendingTasks は 1 である。

    2. pendingTasks を 2 に設定する。

    3. 次の手順を実行するため、workletGlobalScope が与えられた networking task source 上に Queue a global task する:

      1. customOriginUrl を、data origin に対して URL parser を実行した結果とする。

      2. Assert: customOriginUrl は有効な URL である。

      3. customOriginUrlpath を ≪".well-known", "shared-storage", "trusted-origins"≫ に設定する。

      4. request を、その URLcustomOriginUrlmode"cors"referrer"client"destination"json"initiator type"script"、 かつ clientoutsideSettings である新しい request とする。

      5. requestFetch し、processResponseConsumeBody を、 response response と null、failure または byte sequence bodyBytes が与えられた次のアルゴリズムに設定する:

        1. 次のいずれかが true である場合:

          • bodyBytes が null または failure である。または

          • responsestatusok status でない。

          その場合:

          1. pendingTasks を −1 に設定する。

          2. promise を "TypeError" DOMException で Reject する。

          3. これらの手順を中止する。

        2. mimeType を、responseheader list から extracting a MIME type した結果とする。

        3. mimeTypeJSON MIME type でない場合:

          1. pendingTasks を −1 に設定する。

          2. promise を "TypeError" DOMException で Reject する。

          3. これらの手順を中止する。

        4. sourceText を、bodyBytesUTF-8 decoding した結果とする。

        5. parsed を、sourceText が与えられた状態で parsing a JSON string to an Infra value した結果とする。

        6. parsedlist でない、または parsedempty である場合:

          1. pendingTasks を −1 に設定する。

          2. promise を "TypeError" DOMException で Reject する。

          3. これらの手順を中止する。

        7. doesMatch を false とする。

        8. parsed の各 item について:

          1. itemordered map でない、または itemscriptOrigincontain しない、または itemcontextOrigincontain しない場合:

            1. pendingTasks を −1 に設定する。

            2. promise を "TypeError" DOMException で Reject する。

            3. これらの手順を中止する。

          2. doesMatch を、 item[scriptOrigin]、 moduleURLRecordoriginitem[contextOrigin]、および outsideSettingsorigin に対して check for script and context origin match を実行した結果とする。

          3. doesMatch が true である場合:

            1. 次の手順を実行するため、thisrelevant global object が与えられた networking task source 上に Queue a global task する:

              1. pendingTasks が −1 でない場合:

                1. pendingTaskspendingTasks − 1 に設定する。

                2. pendingTasks が 0 である場合、次の手順を実行する:

                  1. workletGlobalScope が関連付けられた boolean addModule success を持つ場合、 workletGlobalScopeaddModule success を true に設定する。

                  2. promiseResolve する。

            2. Break.

        9. doesMatch が false である場合:

          1. pendingTasks を −1 に設定する。

          2. promise を "TypeError" DOMException で Reject する。

注: worklet data origin が現在の context および script origin と異なる場合、追加の検査が実行されます。 これには、worklet data origin から構成ファイルをフェッチし、現在の context が script とともに worklet を読み込み、操作を実行することを許可されているかを検証することが含まれます。

最後から 2 番目の手順(すなわち最後にインデントされた手順)、現在の "If pendingTasks is 0, then resolve promise." は、次のように更新されるべきです:

  1. pendingTasks が 0 である場合、次の手順を実行する:

    1. workletGlobalScope が関連付けられた boolean addModule success を持つ場合、 workletGlobalScopeaddModule success を true に設定する。

    2. promiseResolve する。

最後の手順、現在の "Return promise." の直前に、次の手順を追加する:

  1. thisSharedStorageWorklet である場合、 promiseupon fulfillment または promiseupon rejection 時に、次の手順を実行する:

    1. globalScopesthisglobal scopes とする。

    2. Assert: globalScopessize は 1 に等しい。

    3. privateAggregationObjglobalScopes[0] の privateAggregation とする。

    4. privateAggregationObjallowed to use を、 thisrelevant global objectassociated document が "private-aggregation" policy-controlled featureallowed to use されているかどうかを決定した結果に設定する。

      permissions policy check が最初に行われる場合、ここに早期 return を追加することを検討してください。

    5. privateAggregationObjscoping details を、次の項目を持つ 新しい scoping details に設定する:

      get batching scope steps

      scope 内で現在実行中の呼び出しが返るときに process contributions for a batching scope に渡されるよう予定された batching scope を返すアルゴリズム。

      get debug scope steps

      scope 内で現在実行中の呼び出しが返るときに mark a debug scope complete に渡されるよう予定された debug scope を返すアルゴリズム。

      注: 複数の operation invocations が同時に進行中であり、それぞれが異なる batching scope と debug scope を持つことができます。 ただし、現在実行中であり得るものは 1 つだけです。

trusted origin typestring または list of strings です。

trusted origin type itemScriptOriginorigin actualScriptOrigintrusted origin type itemContextOrigin、および origin actualContextOrigin が与えられたとき、 check for script and context origin match するには、 次の手順を実行します:
  1. itemScriptOrigin および actualScriptOrigin が与えられた状態で check for trusted origin match を実行した結果が false である場合、false を返す。

  2. itemContextOrigin および actualContextOrigin が与えられた状態で check for trusted origin match を実行した結果を返す。

trusted origin type itemOrigin および origin actualOrigin が与えられたとき、 check for trusted origin match するには、次の手順を実行します:
  1. itemOriginstring である場合、 itemOrigin および actualOrigin が与えられた状態で check for trusted origin match on a string を実行した結果を返す。

  2. そうでなければ、itemOrigin 内の各 originString について:

    1. originString および actualOrigin が与えられた状態で check for trusted origin match on a string を実行した結果が true である場合、true を返す。

  3. false を返す。

string itemOrigin および origin actualOrigin が与えられたとき、 check for trusted origin match on a string するには、 次の手順を実行します:
  1. itemOrigin"*" である場合、true を返す。

  2. itemOriginUrl を、itemOrigin に対して URL parser を実行した結果とする。

  3. itemOriginUrl が有効な URL でない場合、 false を返す。

  4. itemOriginUrloriginactualOriginsame origin である場合、true を返す。

  5. そうでなければ、false を返す。

out-of-process worklets のための追加の monkey patch 部分を追加する。

2.3. SharedStorageWorkletGlobalScope

SharedStorageWorkletworklet global scope typeSharedStorageWorkletGlobalScope です。

SharedStorageWorkletworklet destination type は "sharedstorageworklet" です。

2.3.1. request destination に対するモンキーパッチ

fetch request の destination フィールドは、有効な値として "sharedstorageworklet" も追加で含むべきです。

callback RunFunctionForSharedStorageSelectURLOperation = Promise<unsigned long>(sequence<USVString> urls, optional any data);
[Exposed=SharedStorageWorklet, Global=SharedStorageWorklet]
interface SharedStorageWorkletGlobalScope : WorkletGlobalScope {
  undefined register(DOMString name,
                     Function operationCtor);

  readonly attribute SharedStorage sharedStorage;
  readonly attribute PrivateAggregation privateAggregation;

  Promise<sequence<StorageInterestGroup>> interestGroups();

  readonly attribute SharedStorageWorkletNavigator navigator;
};

SharedStorageWorkletGlobalScope は、関連付けられた environment settings object outside settings を持ち、これは関連付けられた SharedStorageWorkletrelevant settings object です。

SharedStorageWorkletGlobalScope は、関連付けられた boolean addModule success を持ち、これは false に初期化されます。

SharedStorageWorkletGlobalScope は、関連付けられた operation map も持ち、これは map であり、初期状態では空で、strings(operation names を表す)から function objects への map です。

SharedStorageWorkletGlobalScope は、関連付けられた SharedStorage インスタンス shared storage instance を持ちます。

SharedStorageWorkletGlobalScope は、関連付けられた SharedStorageWorkletNavigator インスタンス navigator instance を持ちます。

2.3.2. SharedStorageWorkletGlobalScope アルゴリズム

register(name, operationCtor) メソッドの手順は次のとおりです:
  1. name が欠落しているか空である場合、TypeError を投げる。

  2. operationMap を、この SharedStorageWorkletGlobalScopeoperation map とする。

  3. operationMap が、namekey とする entrycontains する場合、 TypeError を投げる。

  4. operationCtor が欠落している場合、TypeError を投げる。

  5. operationClassInstance を、引数なしで operationCtorconstructing した結果とする。

  6. runFunctionGet(operationClassInstance, "run") とする。 あらゆる例外を再スローする。

  7. IsCallable(runFunction) が false である場合、TypeError を投げる。

  8. operationMap[name] の値を runFunctionSet する。

ここでは WebIDL により "name" と "operationCtor" は欠落し得ません。default/empty 値だけを確認すべきです。 [Issue #151]

interestGroups() メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  3. globalObject を、current realmglobal object とする。

  4. contextglobalObjectbrowsing context とする。

  5. context が null である場合、TypeErrorpromise rejected されたものを返す。

  6. documentcontextactive windowassociated document とする。

  7. documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  8. workletDataOrigincurrent realmsettings objectorigin とする。

  9. 次の手順を in parallel に実行する:

    1. interestGroups を、workletDataOrigin が与えられた状態で get storage interest groups for owner を実行した結果とする。

    2. interestGroups が failure である場合:

      1. promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

    3. そうでなければ:

      1. promiseinterestGroupsresolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  10. promise を返す。

sharedStorage getter steps は次のとおりです:
  1. thisaddModule success が true である場合、thisshared storage instance を返す。

  2. そうでなければ、TypeError を投げる。

navigator getter steps は次のとおりです:
  1. thisnavigator instance を返す。

privateAggregation getter steps は次を行うことです:
  1. this が与えられた状態で Get the privateAggregation する。

check whether addModule is finished するための手順は次のとおりです:
  1. addModule success の値を返す。

2.4. SharedStorageUrlWithMetadata と Reporting

dictionary SharedStorageUrlWithMetadata {
  required USVString url;
  object reportingMetadata;
};

SharedStorageUrlWithMetadata dictionary が、FenceEventeventTypekeys とし、有効な URLs に parse される stringsvalues とする dictionary 形式の、非 emptyreportingMetadata object を含む場合、これらの eventType-URL ペアは、この selectURL() 呼び出しから生じる SharedStorageResponse を読み込む任意の fenced frame 内で後でアクセスするために registered されます。

reportingMetadatadictionary であるべきです。 [Issue #141]

reportingMetadata object を伴う selectURL() を通じて registered された eventType-URL ペアを持つ fenced frame 内で、"shared-storage-select-url" を containing する destination を持つ FenceEvent に対して reportEvent() が呼び出され、その FenceEvent の対応する eventType がトリガーされた場合、その FenceEventeventData は、その eventType に対して登録された URLbeacon として送信されます。

object reportingMetadata が与えられたとき、 validate reporting metadata するには、次の手順を実行します:
  1. reportingMetadatadictionary でない場合、false を返す。

  2. reportingMetadataempty である場合、 true を返す。

  3. reportingMetadata の各 eventTypeurlString について For eachurlStringget the canonical URL string if valid を実行した結果が undefined である場合、false を返す。

  4. true を返す。

string urlString が与えられたとき、 get the canonical URL string if valid するには、次の手順を実行します:
  1. url を、urlString に対して URL parser を実行した結果とする。

  2. url が有効な URL でない場合、 undefined を返す。

  3. そうでなければ、url に対して URL serializer を実行した結果を返す。

object reportingMetadata および fenced frame config fencedFrameConfigStruct が与えられたとき、 register reporting metadata するには、次の手順を実行します:
  1. reportingMetadataempty である場合、 返す。

  2. Assert: reportingMetadatadictionary である。

  3. reportingUrlMapemptymap とする。

  4. reportingMetadata の各 eventTypeurlString について For each:

    1. url を、urlString に対して URL parser を実行した結果とする。

    2. Assert: url は有効な URL である。

    3. reportingUrlMap[eventType] を urlSet する。

reportingUrlMap を、fencedFrameConfigStruct に関連付けられた fenced frame reporter クラス内に保存する。 これらはいずれもまだ草案 [Fenced-Frame] に追加する必要があります。 [Issue #144]

2.5. エントロピー予算

bits of entropyselectURL() を通じて漏えいし得るため、user agent はこれらの漏えいを制限するための budgets を維持する必要があります。

selectURL() の呼び出しにおいて、これらの budgets のいずれかが使い果たされている場合、どの URL を選択するかを決定するために default selectURL index が使用されます。

sequence<USVString> urls が与えられたとき、 get the default selectURL index するには、次の手順を実行します:
  1. 0 を返す。

    注: 返される index が登録された operation class の "run" メソッドから独立している限り、0 から urlssize までの排他的な range に含まれる任意の unsigned long を返すこともできました。

default selectURL index は、sequence<USVString> urls が与えられた状態で get the default selectURL index を実行して得られる index です。

ユーザーが、selectURL() によって生成された fenced frame config instancebrowsing context が持つ、node documentfenced frameactivates し、それにより top-level traversable navigation を開始した場合、これは landing page に、その URL が選択されたことを明らかにします。これは selectURL() の呼び出しに対する入力 URLs の個数の 2 を底とする対数までの entropy bits の漏えいです。 これを軽減するため、user agent は per-sitenavigation entropy allowance を設定します。

navigation entropy allowance は、与えられた calling site について、与えられた navigation budget epoch の間に top-level traversable navigations を開始する fenced frames を通じて漏えいすることが許可される entropy bits の最大 allowance です。この allowanceuser agent によって定義され、 site-agnostic です。

user agent は、固定された事前決定済みの duration navigation budget lifetime を定義します。

navigation budget epoch は、その durationnavigation budget lifetime である任意の時間間隔です。

この navigation entropy allowance がどのように使用されるかを追跡するため、 user agentshared storage navigation budget table を使用します。これは sites から navigation entropy ledgers への map です。

navigation entropy ledger は、bit debitslist です。

bit debit は、次の items を持つ struct です:

bits

double

timestamp

DOMHighResTimeStampUnix Epoch からのもの)

Bit debits のうち、その timestamps が現在の navigation budget epoch の開始より前であるものは、expired と言われます。

漏えいが発生したとき、その値は entropy bits で計算され、その site について、 現在時刻を timestamp としてともに、bit debit として shared storage navigation budget table に保存されます。

site は、関連付けられた double remaining navigation budget を持ち、その値は navigation entropy allowance から、現在の navigation budget epoch 内に timestamps を持つ あらゆる bit debits を引いたものです。

site が十分な remaining navigation budget を持たない場合、selectURL()default selectURL index にある SharedStorageUrlWithMetadata 内の url について、SharedStorageResponse (すなわち FencedFrameConfig または urn uuid のいずれか)を返します。

environment settings object environment および site site が与えられたとき、 determine remaining navigation budget するには、次の手順を実行します:
  1. Assert: siteopaque origin ではない。

  2. maxBitsuser agentnavigation entropy allowance とする。

  3. user agentshared storage navigation budget tablesitecontain しない場合、maxBits を返す。

  4. そうでなければ、ledgeruser agentshared storage navigation budget table[site] とする。

  5. debitSum を 0 とする。

  6. ledger 内の各 item bitDebit について For each、次の手順を実行する:

    1. debitbitDebitbits とする。

    2. environment および bitDebitcheck whether a bit debit is expired を実行した結果が false である場合、debitSumdebit だけ増加させる。

  7. maxBitsdebitSum を返す。

environment settings object environment および bit debit bitDebit が与えられたとき、 check whether a bit debit is expired するには、次の手順を実行します:
  1. epochLengthuser agentnavigation budget lifetime とする。

  2. currentTimeenvironmentcurrent wall time とする。

  3. thresholdcurrentTimeepochLength とする。

  4. bitDebittimestampthreshold より小さい場合、 true を返す。

  5. そうでなければ、false を返す。

bit debit は、selectURL() 経由で生成された fenced frame config instancebrowsing context が持つ、 node documentfenced frame によって開始される各 top-level traversable navigation について、shared storage navigation budget tablecharged される必要があります。これは cross-site data を漏えいさせ得るためです。 課金する bitsselectURL() の呼び出し中に計算されますが、結果として得られる fenced frame が top-level traversable navigation を開始する場合にのみ、かつその時点でのみ実際に shared storage navigation budget table に記録されるため、 この時点まで、bits は対応する fenced frame の node documentbrowsing contextfenced frame config instance 内に pending shared storage budget debit として保存されなければなりません。

pending shared storage budget debit の定義を fenced frame config instance へ、草案 [Fenced-Frame] 仕様内で移動する。 [Issue #148]

beginning navigationending navigation の間に、user agentcharge shared storage navigation budget アルゴリズムを実行します。

navigation budget charging の timing を指定するよりよい方法を見つける必要があります。 [Issue #138]

navigable navigable および Document sourceDocument による navigation 中に charge shared storage navigation budget するには、次の手順を実行します:
  1. navigabletop-level traversable でない場合、返す。

  2. currentNavigablesourceDocumentnode navigable とする。

  3. currentNavigable が null でない間:

    1. site を、currentNavigableactive documentoriginobtain a site を実行した結果とする。

    2. instancecurrentNavigablenode documentbrowsing contextfenced frame config instance とする。

    3. currentNavigablecurrentNavigableparent に設定する。

    4. instance が null、または siteopaque origin である場合、continue する。

    5. pendingBitsinstancepending shared storage budget debit とする。

    6. pendingBits が 0 より大きくない場合、continue する。

    7. ledgeruser agentshared storage navigation budget table[site] とする。

    8. bitDebit を新しい bit debit とする。

    9. bitDebitbitspendingBits に設定する。

    10. currentTimecurrent wall time とする。

    11. bitDebittimestampcurrentTime に設定する。

    12. bitDebitledgerAppend する。

    13. pendingBits を 0 に設定する。

user agent は、expired した bit debits がもはや不要になるため、すべての navigation entropy ledgers から purge expired bit debits from all navigation entropy ledgers を定期的に行う timer の設定を望むことがあります。

purge expired bit debits from all navigation entropy ledgers するには、次の手順を実行します:
  1. user agentshared storage navigation budget table の各 originledger について For each:

    1. ledger 内の各 bitDebit について For eachbitDebitcheck whether a bit debit is expired を実行した結果が true である場合、ledger から bitDebitremove する。

2.5.2. Top-Level Traversable エントロピー予算

短期的には、制限の緩い fenced frames が存在する間、次のような追加の制限を課す必要があります。

user agent は、最大 overall page entropy allowance および最大 site page entropy allowance を指定します。前者は top-level traversable ごとに selectURL() について漏えいが許可される合計ビット数であり、後者は site ごと、かつ top-level traversable ごとに selectURL() について漏えいが許可される合計ビット数です

shared storage page budget は、次の items を持つ struct です:

overall budget

double

site budget map

map of site to double

saved query map

tuples (origin data origin, URL worklet script URL, string operation name, string query name) から saved query data への map

saved query data は、次の items を持つ struct です:

index

long

callbacks

tasksqueue

2.5.2.1. Traversable Navigables に対するモンキーパッチ

[HTML]Traversable navigables セクションに、次を追加します:

navigable のプロパティに加えて、traversable navigable は次を持ちます:

2.5.2.2. Navigables に対するモンキーパッチ

initialize the navigable アルゴリズムを、末尾に次の手順を追加することで変更します:

  1. parent が null であり、かつ navigabletraversable navigable である場合:

    1. newPageBudget を、空の site budget map を持つ shared storage page budget とする。

    2. newPageBudgetoverall budgetoverall page entropy allowance に設定する。

    3. navigablepage budgetnewPageBudget に設定する。

2.5.2.3. 保存されたクエリ
navigable navigableorigin originURL moduleURLRecordstring operationNamestring savedQueryName、および task callbackTask が与えられたとき、 get the index for a saved query するには:
  1. topLevelTraversable を、navigable について get the top-level traversable を実行した結果とする。

  2. Assert: topLevelTraversablepage budget は null でない。

  3. topLevelTraversablepage budgetsaved query map が (origin, moduleURLRecord, operationName, savedQueryName) を contain しない場合:

    1. topLevelTraversablepage budgetsaved query map[(origin, moduleURLRecord, operationName, savedQueryName)] を、新しい saved query data struct queryDataSet する。

    2. queryDataindex 値を -1 に設定する。

    3. "pending current operation" を返す。

  4. savedIndextopLevelTraversablepage budgetsaved query map[(origin, moduleURLRecord, operationName, savedQueryName)] の index とする。

  5. savedIndex が -1 である場合:

    1. callbackTaskqueryDatacallbacksEnqueue する。

    2. "pending callback" を返す。

  6. savedIndex を返す。

注: get the index for a saved query アルゴリズムは、registered された operation を実行するために、SharedStorageWorkletGlobalScopeworklet event loop 上に queueing a task した結果を index 値が待機中であることを示すために、 "pending current operation" を返します。

注: get the index for a saved query アルゴリズムは、index の結果を決定する task が以前に SharedStorageWorkletGlobalScopeworklet event loop 上に queued されており、元の task が完了したときに実行される追加の callbackTask を 現在 queueing していることを示すために、"pending callback" を返します。

Window windownavigable navigableorigin originURL moduleURLRecordstring operationNamestring savedQueryName、および unsigned long index が与えられたとき、 store the index for a saved query するには:
  1. topLevelTraversable を、navigable について get the top-level traversable を実行した結果とする。

  2. Assert: topLevelTraversablepage budget は null でない。

  3. queryDatatopLevelTraversablepage budgetsaved query map[(origin, moduleURLRecord, operationName, savedQueryName)] とする。

  4. queryDataindexindexSet する。

  5. queryDatacallbacks が empty でない間 While:

    1. queryDatacallbacks から次の task callbackTaskDequeue し、index が与えられた状態で callbackTask の手順を実行するため、window が与えられた DOM manipulation task source 上に queue a global task する。

Window windowlist of SharedStorageUrlWithMetadatas urlList、および promise promise が与えられたとき、 obtain a callback to process the saved index result するには、次の手順を実行します。これらは algorithm を返します。
  1. processIndexTask を、unsigned long index が与えられたとき、次の手順を実行する algorithm とする:

    1. indexurlListsize より大きい場合、 promiseTypeErrorreject するため、window が与えられた DOM manipulation task source 上に queue a global task する。

      注: 結果 index は入力 urls の size を超えています。これは selectURL() プロトコルに違反しており、どの url を選択すべきか分かりません。

    2. そうでなければ、promiseindexresolve するため、window が与えられた DOM manipulation task source 上に queue a global task する。

  2. processIndexTask を返す。

2.5.2.4. Top-Level Traversable エントロピー予算の課金
navigable navigablesite site、および double pendingBits が与えられたとき、 charge shared storage top-level traversable budgets するには、次の手順を実行します:
  1. topLevelTraversable を、navigable について get the top-level traversable を実行した結果とする。

  2. Assert: topLevelTraversablepage budget は null でない。

  3. pendingBitstopLevelTraversablepage budgetoverall budget より大きい場合、 false を返し、これらの手順を中止する。

  4. topLevelTraversablepage budgetsite budget mapsitecontain しない場合、topLevelTraversablepage budgetsite budget map [site] を site page entropy allowanceset する。

  5. pendingBitstopLevelTraversablepage budgetsite budget map [site] より大きい場合、false を返し、これらの手順を中止する。

  6. topLevelTraversablepage budgetsite budget map [site] を pendingBits だけ減少させる。

  7. topLevelTraversablepage budgetoverall budgetpendingBits だけ減少させる。

  8. true を返す。

3. Shared Storage のバックエンド

Shared Storage API は、以下のように、新しい storage endpointregistering することで、Storage API に統合されます。

3.1. Storage Model に対するモンキーパッチ

この標準は、Storage Model に新しい storage type "shared" を追加します。

user agent は、type "shared" の storage endpoints のために、shared storage shed を保持します。

この標準はまた、type "shared"、storage identifier "sharedStorage"、および quota 54 * 216 bytes(すなわち 39.0625 mebibytes)を持つ storage endpointregister します。

この quota は、現在の実装から計算されています。 現在の実装を storage endpoints "localStorage" および "sessionStorage" の仕様、すなわち 5 * 220 bytes に合わせることを検討してください。たとえば、origin ごとの entry limit を 10,000 から 1,280 に下げれば、これを達成できます。

shared storage shed は、origins から storage shelves への map です。初期状態では空です。

注: storage sheds とは異なり、その keys は storage keys ですが、shared storage shedsorigins を直接 keys として使用します。Shared storage は、意図的に client-side storage partitioning から除外されます。

shared storage shed 内の各 storage shelf について、その storage shelfbucket map は現在、"default" という単一の key だけを持ちます。

user agentshared storage shed は、すべての shared storage データを保持します。

shared storage shed shedenvironment settings object environment、および origin origin が与えられたとき、 obtain a shared storage shelf するには、次の手順を実行します:
  1. allowedInOpaqueOriginContext を false とする。

  2. environmentorigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、failure を返す。

  3. environment および origin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、failure を返す。

  4. shed[origin] が存在しない場合、shed[origin] を、 type "shared" で create a shared storage shelf を実行した結果に設定する。

  5. shed[origin] を返す。

create a shared storage shelf するには、次の手順を実行します:
  1. shelf を新しい storage shelf とする。

  2. shelfbucket map["default"] を、create a shared storage bucket を実行した結果に設定する。

  3. shelf を返す。

shared storage bucket は、shared storage shedshelves のいずれかにある storage bucket です。

create a shared storage bucket するには、次の手順を実行します:
  1. endpoint を、storage identifier "sharedStorage" を持つ storage endpoint とする。

  2. bucket を新しい shared storage bucket とする。

  3. bucketbottle map["sharedStorage"] を、endpointquota である quota を持つ、新しい storage bottle に設定する。

  4. bucket を返す。

注: 現在、shared storage bucketbottle mapsize 1 を持ちます。これは、type "shared" で registered された storage endpoint が 1 つしかないためです。

environment settings object environment および origin origin が与えられたとき、 obtain a shared storage bottle map するには、次の手順を実行します:
  1. sheduser agentshared storage shed とする。

  2. shelf を、shedenvironment、および originobtain a shared storage shelf を実行した結果とする。

  3. shelf が failure である場合、failure を返す。

  4. bucketshelfbucket map["default"] とする。

  5. bottlebucketbottle map["sharedStorage"] とする。

  6. proxyMap を、その backing mapbottlemap である新しい storage proxy map とする。

  7. proxyMapbottleproxy map reference setAppend する。

  8. proxyMap を返す。

3.2. Shared Storage Database

browsing context は、関連付けられた shared storage database を持ち、これは データを storeretrievedeleteclear、および purge expired するメソッド、 ならびに以下の追加メソッドを提供します。database 内のデータは entries の形式をとります。

shared storage databaseshared storage database queue を持ち、これは starting a new parallel queue の結果です。この queue は、当該 browsing context から呼び出しが開始されたときに、各 shared storage database のメソッドを実行するために使用されます。

entry は、keyvalue struct から構成されます。

entrykeystring です。

User agents は、keymaximum length を指定してもよいです。

keysentries を整理し効率的に取得するために使用されるため、keys は任意の与えられた shared storage database 内で最大 1 回だけ出現しなければなりません。

entryvalue struct は、string value と、DOMHighResTimeStamp last updatedUnix Epoch からのもの)からなる struct です。

User agents は、valuemaximum length を指定してもよいです。

User agents は、default entry lifetime、すなわち entrystored されてから期限切れになるまでの、既定の duration を指定してもよいです。 user agentdefault entry lifetime を指定する場合、database から定期的に purge expired entries from the database する timer を持つべきです。

3.3. 中核 Database アルゴリズム

shared storage database queue queuestorage proxy map databaseMapenvironment settings object environmentkey key、および value value が与えられたとき、 store an entry in the database するには、 queue 上で次の手順を実行します:
  1. valueStruct を新しい value struct とする。

  2. valueStructvaluevalue に設定する。

  3. currentTimeenvironmentcurrent wall time とする。

  4. valueStructlast updatedcurrentTime に設定する。

  5. databaseMap[key] を valueStructSet する。

  6. an exception was thrown である場合、false を返す。

    注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。

  7. そうでなければ、true を返す。

shared storage database queue queuestorage proxy map databaseMapenvironment settings object environment、および key key が与えられたとき、 retrieve an entry from the database するには、queue 上で次の手順を実行します:
  1. databaseMapkeycontain しない場合、undefined を返す。

  2. valueStruct を、 databaseMap に対して keyGet を実行した結果とする。

  3. an exception was thrown である場合、failure を返す。

    注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。

  4. environment および valueStructdetermine whether an entry is expired を実行した結果が true である場合、undefined を返す。

  5. valueStructvalue を返す。

shared storage database queue queuestorage proxy map databaseMap、および key key が与えられたとき、 delete an entry from the database するには、 queue 上で次の手順を実行します:
  1. databaseMap[key] を Remove する。

  2. an exception was thrown である場合、false を返す。

    注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。

  3. true を返す。

shared storage database queue queue および storage proxy map databaseMap が与えられたとき、 clear all entries in the database するには、 queue 上で次の手順を実行します:
  1. databaseMap に対して Clear を実行する。

  2. an exception was thrown である場合、false を返す。

    注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。

  3. true を返す。

shared storage database queue queue および storage proxy map databaseMap が与えられたとき、 retrieve all entries from the database するには、queue 上で次の手順を実行します:
  1. values を、databaseMap に対して getting the values を実行した結果とする。

  2. an exception was thrown である場合、failure を返す。

    注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。

  3. values を返す。

shared storage database queue queue および storage proxy map databaseMap が与えられたとき、 count entries in the database するには、 queue 上で次の手順を実行します:
  1. sizedatabaseMapsize とする。

  2. an exception was thrown である場合、failure を返す。

    注: storage proxy map databaseMap の members によるエラーは、 その実装によって発生する可能性があります。

  3. size を返す。

shared storage database queue queuestorage proxy map databaseMap、および environment settings object environment が与えられたとき、 purge expired entries from the database するには、queue 上で次の手順を実行します:
  1. databaseMap 内の各 key key について For each:

    1. valueStruct を、 databaseMap に対して keyGet を実行した結果とする。

    2. an exception was thrown である場合、 false を返す。

    3. environment および valueStructdetermine whether an entry is expired を実行した結果が true である場合、databaseMap[key] を Remove する。

    4. an exception was thrown である場合、 false を返す。

  2. true を返す。

environment settings object environment および value struct valueStruct が与えられたとき、determine whether an entry is expired するには、次の手順を実行します:

  1. lastUpdatedvalueStructlast updated とする。

  2. lifetimeuser agentdefault entry lifetime とする。

  3. expirationlastUpdatedlifetime の和とする。

  4. currentTimeenvironmentcurrent wall time とする。

  5. expirationcurrentTime 以下である場合、true を返す。

  6. そうでなければ、false を返す。

3.4. 特殊化された Database アルゴリズム

これらのアルゴリズムは、§ 3.3 The Core Database Algorithms の core algorithms とは異なり、より特殊化されたヒューリスティックを持つパラメーターを受け取るか、 複数手順のプロセスを用いるか、またはその両方により、より複雑な database operations を扱います。

shared storage database queue queuestorage proxy map databaseMapenvironment settings object environmentkey keyvalue value、および boolean ignoreIfPresent が与えられたとき、 set an entry in the database するには、 queue 上で次の手順を実行します:

  1. ignoreIfPresent である場合:

    1. currentValue を、queuedatabaseMapenvironment、および keyretrieve an entry from the database を実行した結果とする。

    2. currentValue が failure である場合、false を返す。

    3. currentValue が undefined でない場合、true を返す。

  2. queuedatabaseMapenvironmentkey、および valuestore an entry in the database を実行した結果を返す。

shared storage database queue queuestorage proxy map databaseMapenvironment settings object environmentkey key、および value value が与えられたとき、append an entry in the database するには、 queue 上で次の手順を実行します:

  1. currentValue を、queuedatabaseMapenvironment、 および keyretrieve an entry from the database を実行した結果とする。

  2. currentValue が failure である場合、false を返す。

  3. currentValue が undefined でない場合:

    1. list を新しい list とする。

    2. currentValuelistAppend する。

    3. valuelistAppend する。

    4. value を、list に対して concatenate を実行した結果に設定する。

  4. queuedatabaseMapenvironmentkey、および valuestore an entry in the database を実行した結果を返す。

shared storage database queue queuestorage proxy map databaseMapenvironment settings object environment、 および SharedStorageModifierMethodlist methods が与えられたとき、batch update entries in the database するには、queue 上で次の手順を実行します:

  1. originalDatabaseMapdatabaseMap とする。

  2. innerMethodFailed を false とする。

  3. methods 内の各 method について:

    1. methodSharedStorageSetMethod である場合:

      1. keymethodkey とする。

      2. valuemethodvalue とする。

      3. ignoreIfPresentmethodignore if present とする。

      4. result を、queuedatabaseMapenvironmentkeyvalue、および ignoreIfPresentset an entry in the database を実行した結果とする。

      5. result が false である場合:

        1. innerMethodFailed を true に設定する。

        2. Break.

    2. そうでなく、methodSharedStorageAppendMethod である場合:

      1. keymethodkey とする。

      2. valuemethodvalue とする。

      3. result を、queuedatabaseMapenvironmentkey、および valueappend an entry in the database を実行した結果とする。

      4. result が false である場合:

        1. innerMethodFailed を true に設定する。

        2. Break.

    3. そうでなく、methodSharedStorageDeleteMethod である場合:

      1. keymethodkey とする。

      2. result を、queuedatabaseMapenvironment、および keydelete an entry from the database を実行した結果とする。

      3. result が false である場合:

        1. innerMethodFailed を true に設定する。

        2. Break.

    4. そうでなければ:

      1. Assert: methodSharedStorageClearMethod である。

      2. result を、queuedatabaseMap、および environmentclear all entries in the database を実行した結果とする。

      3. result が false である場合:

        1. innerMethodFailed を true に設定する。

        2. Break.

  4. innerMethodFailed である場合:

    1. databaseMaporiginalDatabaseMap に設定する。

    2. false を返す。

  5. true を返す。

このアルゴリズムは単純な rollback メカニズムを使用します。本番環境では、 database 全体のコピーを避ける、より効率的な手法を検討してください。

4. Window インターフェイスへの拡張

Window オブジェクトは、関連付けられた SharedStorage インスタンス sharedStorage を持ちます。これは、Shared Storage が有効な場合、 Window とともに作成され、下記の getter を持ちます。
partial interface Window {
  [SecureContext] readonly attribute SharedStorage? sharedStorage;
};
sharedStorage getter steps は次のとおりです:
  1. thisfully active である場合、thissharedStorage を返す。

  2. そうでなければ、null を返す。

5. SharedStorageModifierMethod インターフェイスグループ

SharedStorageSetMethodSharedStorageAppendMethodSharedStorageDeleteMethodSharedStorageClearMethod インターフェイスは、set()append()delete()clear() modifier methods に対応します。これらはすべて、基底 SharedStorageModifierMethod インターフェイスを継承します。
[Exposed=(Window,SharedStorageWorklet)]
interface SharedStorageModifierMethod {};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageSetMethod : SharedStorageModifierMethod {
  constructor(DOMString key, DOMString value, optional SharedStorageSetMethodOptions options = {});
};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageAppendMethod : SharedStorageModifierMethod {
  constructor(DOMString key, DOMString value, optional SharedStorageModifierMethodOptions options = {});
};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageDeleteMethod : SharedStorageModifierMethod {
  constructor(DOMString key, optional SharedStorageModifierMethodOptions options = {});
};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageClearMethod : SharedStorageModifierMethod {
  constructor(optional SharedStorageModifierMethodOptions options = {});
};

dictionary SharedStorageModifierMethodOptions {
  DOMString withLock;
};

dictionary SharedStorageSetMethodOptions : SharedStorageModifierMethodOptions {
  boolean ignoreIfPresent;
};

SharedStorageModifierMethod は、次の関連付けられたフィールドを持ちます:

with lock

Null または string。初期値は null。

SharedStorageSetMethod は、次の関連付けられたフィールドを持ちます:

key

string。初期値は空。

value

string。初期値は空。

ignore if present

boolean。初期値は false。

SharedStorageAppendMethod は、次の関連付けられたフィールドを持ちます:

key

string。初期値は空。

value

string。初期値は空。

SharedStorageDeleteMethod は、次の関連付けられたフィールドを持ちます:

key

string。初期値は空。

new SharedStorageSetMethod(key, value, options) constructor steps は次のとおりです:

  1. globalObject を、current realmglobal object とする。

  2. context を null とする。

  3. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  4. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeError を投げる。

  5. context が null である場合、TypeError を投げる。

  6. contextactive windowassociated documentfully active でない場合、TypeError を投げる。

  7. keylengthmaximum length を超える場合、TypeError を投げる。

  8. valuelengthmaximum length を超える場合、 TypeError を投げる。

  9. environmentcontextactive windowrelevant settings object とする。

  10. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  11. databaseMap が failure である場合、TypeError を投げる。

  12. thiskeykey に設定する。

  13. thisvaluevalue に設定する。

  14. thisignore if presentoptions["ignoreIfPresent"] に設定する。

  15. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeError を投げる。

    2. thiswith lockoptions["withLock"] に設定する。

new SharedStorageAppendMethod(key, value, options) constructor steps は次のとおりです:

  1. globalObject を、current realmglobal object とする。

  2. context を null とする。

  3. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  4. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeError を投げる。

  5. context が null である場合、TypeError を投げる。

  6. contextactive windowassociated documentfully active でない場合、TypeError を投げる。

  7. keylengthmaximum length を超える場合、 TypeError を投げる。

  8. valuelengthmaximum length を超える場合、 TypeError を投げる。

  9. environmentcontextactive windowrelevant settings object とする。

  10. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  11. databaseMap が failure である場合、TypeError を投げる。

  12. thiskeykey に設定する。

  13. thisvaluevalue に設定する。

  14. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeError を投げる。

    2. thiswith lockoptions["withLock"] に設定する。

new SharedStorageAppendMethod(key, options) constructor steps は次のとおりです:

  1. globalObject を、current realmglobal object とする。

  2. context を null とする。

  3. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  4. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeError を投げる。

  5. context が null である場合、TypeError を投げる。

  6. contextactive windowassociated documentfully active でない場合、TypeError を投げる。

  7. keylengthmaximum length を超える場合、 TypeError を投げる。

  8. environmentcontextactive windowrelevant settings object とする。

  9. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  10. databaseMap が failure である場合、TypeError を投げる。

  11. thiskeykey に設定する。

  12. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeError を投げる。

    2. thiswith lockoptions["withLock"] に設定する。

new SharedStorageClearMethod(options) constructor steps は次のとおりです:

  1. globalObject を、current realmglobal object とする。

  2. context を null とする。

  3. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  4. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeError を投げる。

  5. context が null である場合、TypeError を投げる。

  6. contextactive windowassociated documentfully active でない場合、TypeError を投げる。

  7. environmentcontextactive windowrelevant settings object とする。

  8. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  9. databaseMap が failure である場合、TypeError を投げる。

  10. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeError を投げる。

    2. thiswith lockoptions["withLock"] に設定する。

6. SharedStorage インターフェイス

SharedStorage インターフェイスは、Window および SharedStorageWorklet に公開されます。

データの設定および/または削除を許可するメソッドは、WindowSharedStorageWorklet の両方に公開されますが、それらの実装は environment によって異なる場合があります。これにより、複数の context から Shared Storage 内のデータを変更できるようになります。

一方、SharedStorageWorkletGlobalScope 内で実行する operations を投稿するためのメソッド(すなわち selectURL() および run())、 ならびに worklet 属性(これは addModule() を呼び出すために使用されます)は、Window のみに公開されます。これらは、WindowSharedStorageWorklet とやり取りするための手段であるためです。

他方、shared storage database からデータを取得するためのメソッドは、database から読み取られるデータの流れを慎重に制御するために、SharedStorageWorklet のみに公開されます。唯一の例外は、get()Window に公開されることですが、これは determine if a navigable has fully revoked network アルゴリズムの結果が true である場合にのみ成功します。

注: determine if a navigable has fully revoked network アルゴリズムは、get() が、disableUntrustedNetwork() への呼び出しを正常に解決した fenced frames に対してのみ成功することを保証します。

[Exposed=(Window,SharedStorageWorklet)]
interface SharedStorage {
  Promise<DOMString> get(DOMString key);
  Promise<any> set(DOMString key,
                   DOMString value,
                   optional SharedStorageSetMethodOptions options = {});
  Promise<any> append(DOMString key,
                      DOMString value,
                      optional SharedStorageModifierMethodOptions options = {});
  Promise<any> delete(DOMString key, optional SharedStorageModifierMethodOptions options = {});
  Promise<any> clear(optional SharedStorageModifierMethodOptions options = {});
  Promise<any> batchUpdate(sequence<SharedStorageModifierMethod> methods,
                           optional SharedStorageModifierMethodOptions options = {});

  [Exposed=Window]
  Promise<SharedStorageResponse> selectURL(DOMString name,
                               sequence<SharedStorageUrlWithMetadata> urls,
                               optional SharedStorageRunOperationMethodOptions options = {});

  [Exposed=Window]
  Promise<any> run(DOMString name,
                   optional SharedStorageRunOperationMethodOptions options = {});

  [Exposed=Window]
  Promise<SharedStorageWorklet> createWorklet(USVString moduleURL, optional SharedStorageWorkletOptions options = {});

  [Exposed=Window]
  readonly attribute SharedStorageWorklet worklet;

  [Exposed=SharedStorageWorklet]
  Promise<unsigned long> length();

  [Exposed=SharedStorageWorklet]
  Promise<double> remainingBudget();

  [Exposed=SharedStorageWorklet]
  async iterable<DOMString, DOMString>;
};

dictionary SharedStoragePrivateAggregationConfig {
  USVString aggregationCoordinatorOrigin;
  USVString contextId;
  [EnforceRange] unsigned long long filteringIdMaxBytes;
  [EnforceRange] unsigned long long maxContributions;
};

dictionary SharedStorageRunOperationMethodOptions {
  object data;
  boolean resolveToConfig = false;
  boolean keepAlive = false;
  SharedStoragePrivateAggregationConfig privateAggregationConfig;
  DOMString savedQuery;
};

dictionary SharedStorageWorkletOptions : WorkletOptions {
  USVString dataOrigin = "context-origin";
};

6.1. SharedStorage 上の Run Operation Methods

selectURL(name, urls, options) メソッドの手順は次のとおりです:
  1. sharedStoragethis とする。

  2. sharedStorage.worklet.selectURL(name, urls, options) を返す。

run(name, options) メソッドの手順は次のとおりです:
  1. sharedStoragethis とする。

  2. sharedStorage.worklet.run(name, options) を返す。

6.2. SharedStorage 経由で新しい worklet を作成する

createWorklet(moduleURL, options) メソッドの手順は次のとおりです:
  1. sharedStorageWorklet を新しい SharedStorageWorklet とする。

  2. options が "dataOrigin" を contains する場合、 sharedStorageWorkletdata originoptions["dataOrigin"] に設定する。

  3. addModulePromise を、sharedStorageWorklet.addModule(moduleURL, options) を呼び出した結果とする。

  4. resultPromise を新しい promise とする。

  5. addModulePromiseupon fulfillment 時に、resultPromisesharedStorageWorkletresolve する。

  6. addModulePromiseupon rejection 時に、resultPromiseTypeErrorreject する。

  7. resultPromise を返す。

6.3. BatchUpdate メソッド

batchUpdate(methods, options) メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. globalObject を、current realmglobal object とする。

  3. context を null とする。

  4. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  5. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  6. context が null である場合、TypeErrorpromise rejected されたものを返す。

  7. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  8. methods 内の各 method について:

    1. method["withLock"] が exists する場合:

      1. TypeErrorpromise rejected されたものを返す。

      注: batchUpdate() は transactional operation として実行されます。より細粒度な locking に起因する潜在的な deadlock を避けるため、 batchUpdate() 内部の inner methods は withLock オプションを利用できません。このオプションを無視する代わりに、 制限を強制し誤用を防止するためにエラーが投げられます。

  9. environmentcontextactive windowrelevant settings object とする。

  10. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  11. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  12. onLockGrantedCallback を、次の手順を実行する algorithm とする:

    1. queue 上に Enqueue the following steps する:

      1. result を、queuedatabaseMapenvironment、および methodsbatch update entries in the database を実行した結果とする。

      2. result が false であり、かつ globalObjectSharedStorageWorkletGlobalScope である場合:

        1. promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

        2. これらの手順を中止する。

      3. promise を undefined で resolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  13. options["withLock"] が exists する場合、environmentoriginoptions["withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。

  14. そうでなければ、onLockGrantedCallback を実行する。

  15. promise を返す。

6.4. Setter/Deleter メソッド

set(key, value, options) メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. globalObject を、current realmglobal object とする。

  3. context を null とする。

  4. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  5. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  6. context が null である場合、TypeErrorpromise rejected されたものを返す。

  7. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  8. keylengthmaximum length を超える場合、TypeErrorpromise rejected されたものを返す。

  9. valuelengthmaximum length を超える場合、 TypeErrorpromise rejected されたものを返す。

  10. environmentcontextactive windowrelevant settings object とする。

  11. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  12. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  13. queue を、context の関連付けられた databaseshared storage database queue とする。

  14. realmcurrent realm とする。

  15. onLockGrantedCallback を、次の手順を実行する algorithm とする:

    1. queue 上に Enqueue the following steps する:

      1. result を、queuedatabaseMapenvironmentkeyvalue、および options["ignoreIfPresent"] で set an entry in the database を実行した結果とする。

      2. result が false であり、かつ globalObjectSharedStorageWorkletGlobalScope である場合:

        1. promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

        2. これらの手順を中止する。

      3. promise を undefined で resolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  16. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorpromise rejected されたものを返す。

    2. environmentoriginoptions["withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。

  17. そうでなければ、onLockGrantedCallback を実行する。

  18. promise を返す。

append(key, value, options) メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. globalObject を、current realmglobal object とする。

  3. context を null とする。

  4. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  5. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  6. context が null である場合、TypeErrorpromise rejected されたものを返す。

  7. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  8. keylengthmaximum length を超える場合、TypeErrorpromise rejected されたものを返す。

  9. valuelengthmaximum length を超える場合、 TypeErrorpromise rejected されたものを返す。

  10. environmentcontextactive windowrelevant settings object とする。

  11. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  12. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  13. queue を、context の関連付けられた databaseshared storage database queue とする。

  14. realmcurrent realm とする。

  15. onLockGrantedCallback を、次の手順を実行する algorithm とする:

    1. queue 上に Enqueue the following steps する:

      1. result を、queuedatabaseMapenvironmentkey、および valueappend an entry in the database を実行した結果とする。

      2. result が false であり、かつ globalObjectSharedStorageWorkletGlobalScope である場合:

        1. promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

        2. これらの手順を中止する。

      3. promise を undefined で resolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  16. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorpromise rejected されたものを返す。

    2. environmentoriginoptions["withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。

  17. そうでなければ、onLockGrantedCallback を実行する。

  18. promise を返す。

delete(key, options) メソッドの手順は 次のとおりです:
  1. promise を新しい promise とする。

  2. globalObject を、current realmglobal object とする。

  3. context を null とする。

  4. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  5. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  6. context が null である場合、TypeErrorpromise rejected されたものを返す。

  7. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  8. keylengthmaximum length を超える場合、TypeErrorpromise rejected されたものを返す。

  9. environmentcontextactive windowrelevant settings object とする。

  10. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  11. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  12. queue を、context の関連付けられた databaseshared storage database queue とする。

  13. realmcurrent realm とする。

  14. onLockGrantedCallback を、次の手順を実行する algorithm とする:

    1. queue 上に Enqueue the following steps する:

      1. result を、queuedatabaseMap、および keydelete an entry from the database を実行した結果とする。

      2. result が false であり、かつ globalObjectSharedStorageWorkletGlobalScope である場合:

        1. promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

        2. これらの手順を中止する。

      3. promise を undefined で resolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  15. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorpromise rejected されたものを返す。

    2. environmentoriginoptions["withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。

  16. そうでなければ、onLockGrantedCallback を実行する。

  17. promise を返す。

clear(options) メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. globalObject を、current realmglobal object とする。

  3. context を null とする。

  4. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

  5. そうでなければ:

    1. contextglobalObjectoutside settingstarget browsing context に設定する。

    2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  6. context が null である場合、TypeErrorpromise rejected されたものを返す。

  7. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  8. environmentcontextactive windowrelevant settings object とする。

  9. databaseMap を、environment および environmentorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  10. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  11. queue を、context の関連付けられた databaseshared storage database queue とする。

  12. realmcurrent realm とする。

  13. onLockGrantedCallback を、次の手順を実行する algorithm とする:

    1. queue 上に Enqueue the following steps する:

      1. result を、queue および databaseMapclear all entries in the database を実行した結果とする。

      2. result が false であり、かつ globalObjectSharedStorageWorkletGlobalScope である場合:

        1. promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

        2. これらの手順を中止する。

      3. promise を undefined で resolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  14. options["withLock"] が exists する場合:

    1. options["withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorpromise rejected されたものを返す。

    2. environmentoriginoptions["withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。

  15. そうでなければ、onLockGrantedCallback を実行する。

  16. promise を返す。

6.5. Getter メソッド

get(key) メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. globalObject を、current realmglobal object とする。

  3. context を null とする。

  4. environment を null とする。

  5. globalObjectWindow である場合:

    1. contextglobalObjectbrowsing context に設定する。

    2. context が null である場合、TypeErrorpromise rejected されたものを返す。

    3. environmentcontextactive windowrelevant settings object に設定する。

    4. allowedInOpaqueOriginContext を false とする。

    5. environmentenvironmentorigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

    6. environment および environmentorigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、OperationErrorpromise rejected されたものを返す。

    7. documentcontextactive document とする。

    8. "fenced-unpartitioned-storage-read"、 document、および environmentorigin について Is feature enabled in document for origin? を実行した結果が false である場合、OperationErrorpromise rejected されたものを返す。

    9. navigabledocumentnode navigable とする。

    10. navigable が与えられた状態で determine if a navigable has fully revoked network を実行した結果が false である場合、OperationErrorpromise rejected されたものを返す。

  6. そうでなければ: 1 SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

    1. contextSharedStorageSharedStorageWorkletGlobalScopeoutside settingstarget browsing context に設定する。

    2. context が null である場合、TypeErrorpromise rejected されたものを返す。

    3. environmentcontextactive windowrelevant settings object に設定する。

  7. keylengthmaximum length を超える場合、TypeErrorpromise rejected されたものを返す。

  8. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  9. realmcurrent realm とする。

  10. databaseMap を、environment および realmsettings objectorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  11. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  12. queuecontext の関連付けられた databaseshared storage database queue とする。

  13. queue 上に Enqueue the following steps する:

    1. value を、queuedatabaseMapenvironment、および keyretrieve an entry from the database を実行した結果とする。

    2. value が failure である場合、promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

    3. そうでなく、value が undefined である場合、promise を undefined で resolve するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

    4. そうでなければ、promisevalueresolve するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

  14. promise を返す。

length() メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  3. contextSharedStorageSharedStorageWorkletGlobalScopeoutside settingstarget browsing context とする。

  4. context が null である場合、TypeErrorpromise rejected されたものを返す。

  5. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  6. environmentcontextactive windowrelevant settings object とする。

  7. realmcurrent realm とする。

  8. databaseMap を、environment および realmsettings objectorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  9. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  10. queuecontext の関連付けられた databaseshared storage database queue とする。

  11. queue 上に Enqueue the following steps する:

    1. numEntries を、queue および environmentcount entries in the database を実行した結果とする。

    2. numEntries が failure である場合、promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

    3. そうでなければ、promisenumEntriesresolve するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

  12. promise を返す。

remainingBudget() メソッドの手順は次のとおりです:
  1. promise を新しい promise とする。

  2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  3. contextSharedStorageSharedStorageWorkletGlobalScopeoutside settingstarget browsing context とする。

  4. context が null である場合、TypeErrorpromise rejected されたものを返す。

  5. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  6. environmentcontextactive windowrelevant settings object とする。

  7. realmcurrent realm とする。

  8. allowedInOpaqueOriginContext を false とする。

  9. environmentrealmsettings objectorigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  10. environment および realmsettings objectorigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  11. site を、realmsettings objectoriginobtain a site を実行した結果とする。

  12. Assert: siteopaque origin ではない。

  13. queuecontext の関連付けられた databaseshared storage database queue とする。

  14. queue 上に Enqueue the following steps する:

    1. remainingBudget を、sitedetermine remaining navigation budget を実行した結果とする。

    2. promiseremainingBudgetresolve するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

  15. promise を返す。

6.6. 反復処理

SharedStorage async iterator インスタンスは、entriesqueue pending entries を持ち、初期状態では empty です。

SharedStorage async iterator インスタンスはまた、boolean error を持ち、初期値は false です。

以下で定義される asynchronous iterator initialization steps および get the next iteration result アルゴリズムは、Web IDL Standard において asynchronous iterator initialization steps および get the next iteration result アルゴリズムとして参照されるものに対応します。

SharedStorage async iterator iterator のための asynchronous iterator initialization steps は次のとおりです:
  1. promise を新しい promise とする。

  2. SharedStorage に関連付けられた SharedStorageWorkletGlobalScope について check whether addModule is finished を実行した結果が false である場合、TypeErrorpromise rejected されたものを返す。

  3. contextSharedStorageSharedStorageWorkletGlobalScopeoutside settingstarget browsing context とする。

  4. context が null である場合、TypeErrorpromise rejected されたものを返す。

  5. contextactive windowassociated documentfully active でない場合、TypeErrorpromise rejected されたものを返す。

  6. environmentcontextactive windowrelevant settings object とする。

  7. realmcurrent realm とする。

  8. databaseMap を、environment および realmsettings objectorigin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。

  9. databaseMap が failure である場合、TypeErrorpromise rejected されたものを返す。

  10. queuecontext の関連付けられた databaseshared storage database queue とする。

  11. queue 上に Enqueue the following steps する:

    1. entries を、queue および environmentretrieve all entries from the database を実行した結果とする。

    2. entries が failure である場合、promiseTypeErrorreject するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

    3. そうでなければ、promiseentriesresolve するため、realmglobal object が与えられた DOM manipulation task source 上に queue a global task する。

  12. promiseupon fulfillment 時に、次を実行する:

    1. promiseEntriespromise の値とする。

    2. promiseEntries 内の各 entry entry について For eachentryiteratorpending entriesenqueue する。

  13. promiseupon rejection 時に、iteratorerror を true に設定する。

SharedStorageasync iterator iterator が与えられたとき、 get the next iteration result するには、次の手順を実行する:
  1. promise を新しい promise とする。

  2. Enqueue the following steps する:

    1. iteratorerror が true である場合、TypeErrorpromise rejected されたものを返す。

    2. iteratorpending entriesempty である場合:

      1. オブジェクト doneObject を作成する。

      2. promisedoneObjectresolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

      3. これらの手順を中止する。

    3. そうでなければ、entryiteratorpending entries から dequeue した結果とする。

    4. promiseentryresolve するため、realmglobal object が与えられた DOM manipulation task source 上に Queue a global task する。

  3. promise を返す。

7. HTTP 応答ヘッダー経由で操作をトリガーする

setter および deleter operations(例: set(), append(), delete(), clear()) は、Window または SharedStorageWorkletGlobalScope のために上記の API を介して開始できますが、setter/deleter operations は代わりに HTTP response header 経由でトリガーすることもできます。

これには、HTML および Fetch 仕様への monkey patches が必要になります。

8. HTML Monkey Patches

8.1. sharedStorageWritable & sharedstoragewritable 属性

次の interface mixin を定義し、それを HTMLIFrameElement および HTMLImageElement の IDL interfaces に含めます:

interface mixin HTMLSharedStorageWritableElementUtils {
  [CEReactions, SecureContext] attribute boolean sharedStorageWritable;
};

HTMLIFrameElement includes HTMLSharedStorageWritableElementUtils;
HTMLImageElement includes HTMLSharedStorageWritableElementUtils;

次の boolean content attributes を追加します:

iframe

sharedstoragewritable

img

sharedstoragewritable

IDL 属性 sharedStorageWritable は、同じ名前のそれぞれの content attributereflect しなければなりません。

8.2. HTML アルゴリズムの変更

8.2.1. Update the image data アルゴリズムへの変更

update the image data を次のように変更する:

次の手順の後に

requestpriority を現在の状態に設定する...

次の手順を追加する

  1. 要素が sharedstoragewritable 属性を持つ場合、requestshared storage writable を true に設定する。

8.2.2. Create navigation params by fetching アルゴリズムへの変更

create navigation params by fetching を次のように変更する:

次の手順の後に

request を、... を伴う新しい request とする。

次の手順を追加する

  1. navigablecontaineriframe 要素であり、かつそれが sharedstoragewritable content attribute を持つ場合、 requestshared storage writable を true に設定する。

9. Fetch Monkey Patches

9.1. sharedStorageWritable キー

request は、関連付けられた boolean shared storage writable を持ちます。特に明記されない限り、これは false です。

RequestInit dictionary は、sharedStorageWritable キーを含みます:

partial dictionary RequestInit {
  boolean sharedStorageWritable;
};

9.2. Fetch アルゴリズムの変更

9.2.1. Request Constructor アルゴリズムへの変更

new Request(input, init) constructor を次のように変更する:

次の手順の前に

this の requestrequest に設定する。

次の手順を追加する

  1. init["sharedStorageWritable"] が exists する場合、requestshared storage writable をそれに設定する。

9.2.2. HTTP network or cache fetch アルゴリズムへの変更

HTTP network or cache fetch アルゴリズムを次のように変更する:

次の手順の前に

httpRequestheader list を HTTP に従って変更する。...

次の手順を追加する

  1. httpRequest に対して Append or modify a Sec-Shared-Storage-Writable request header する。

9.2.3. HTTP fetch アルゴリズムへの変更

HTTP fetch アルゴリズムを次のように変更する:

次の手順の前に

internalResponsestatusredirect status である場合: ...

次の手順を追加する

  1. requestdestination が "sharedstorageworklet" である場合:

    1. dataOriginValue を、requestheader list から `Sec-Shared-Storage-Data-Origin` を getting した結果とする。

    2. dataOriginValue が null でない場合:

      1. dataOriginUrl を、 dataOriginValue に対して URL parser を実行した結果とする。

      2. Assert: dataOriginUrl は failure でない。

      3. Assert: requestorigin は "client" でない。

      4. Assert: requestoriginrequestURLoriginsame origin でない。

      5. allowed を true とする。

      6. dataOriginUrloriginrequestURLoriginsame origin である場合:

        1. responseHeadersinternalResponseheader list とする。

        2. allowed を、 `Shared-Storage-Cross-Origin-Worklet-Allowed`、 "item"、および入力としての responseHeaders が与えられた状態で get a structured field value アルゴリズムを実行した結果とする。

      7. allowed が false である場合、network error を返す。

  2. 入力として response internalResponse および request request が与えられた状態で、Handle a Shared-Storage-Write response する。

9.3. Shared Storage HTTP ヘッダー

9.3.1. `Sec-Shared-Storage-Data-Origin` リクエストヘッダー

この仕様は、Sec-Shared-Storage-Data-Origin HTTP request header を定義する。

`Sec-Shared-Storage-Data-Origin` request headervaluestring である。

`Sec-Shared-Storage-Data-Origin` が fetch a worklet/module worker script graph アルゴリズム中に送信される場合、その value は、worklet の shared storage data を所有する origin を直列化したものに設定される。

9.3.2. `Shared-Storage-Cross-Origin-Worklet-Allowed` レスポンスヘッダー

この仕様は、Shared-Storage-Cross-Origin-Worklet-Allowed HTTP response header を定義する。

`Shared-Storage-Cross-Origin-Worklet-Allowed` response headerStructured Header であり、その値は Boolean でなければならない。

response が `Shared-Storage-Cross-Origin-Worklet-Allowed` を値 true で持つ場合、worklet script のサーバーは、cross-origin site が worklet script の origin 由来の shared storage data を使用して worklet を作成する権限を与えている。

9.3.3. `Sec-Shared-Storage-Writable` リクエストヘッダー

この仕様は、Sec-Shared-Storage-Writable HTTP request header を定義する。

`Sec-Shared-Storage-Writable` request headerStructured Header であり、その値は Boolean でなければならない。

request が `Sec-Shared-Storage-Writable` を true に設定する場合、その responseshared storage に書き込むことができる。

9.3.4. `Shared-Storage-Write` レスポンスヘッダー

この仕様は、Shared-Storage-Write HTTP response header を定義する。

`Shared-Storage-Write` response headerStructured Header であり、その値は List でなければならない。次の list members が定義される。同じ文字列を保持する TokensStrings は等価とみなされる。HTTP ヘッダーを介して non-ASCII Unicode keys および values の書き込みと削除の機能を提供するため、UTF-8 encoded bytes を表す Byte Sequences も許可される。

未知の list members は、strings でも Byte Sequences でもない型を含め、 スキップされ、list の残りはそれらが存在しなかったものとして処理される。members は、必須 parameters が欠落している場合、またはそれらの parameters が予期しない型を持つ場合にもスキップされる。

注: Unicode keys および values に対応するため、Byte Sequences を許可する。任意の Byte SequenceUTF-8 encoded であると仮定され、それ以外の場合は解析に失敗する。

例を追加する。

9.4. Shared Storage Fetch 関連アルゴリズム

request request が与えられたとき、determine whether a request can currently use shared storage するには、次の手順を実行する:
  1. windowrequestwindow とする。

  2. window が、その global objectWindow である environment settings object でない場合、false を返す。

  3. allowedInOpaqueOriginContext を true とする。

  4. windowrequestcurrent URLorigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、false を返す。

  5. window および requestcurrent URLorigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、false を返す。

determine whether a request can currently use shared storage アルゴリズムは、https://github.com/w3c/webappsec-permissions-policy/pull/499 で述べられているように、"opt-in features" を考慮する必要がある。

request request が与えられたとき、append or modify a Sec-Shared-Storage-Writable request header するには、次の手順を実行する:
  1. requestshared storage writable が true でない場合、 return する。

    注: リダイレクト時には、 requestshared storage writable が true であっても、 リダイレクトが shared storage を使用する権限を持たず、その結果 request に対して determine whether a request can currently use shared storage を実行した結果が false になることがある。

  2. request に対して determine whether a request can currently use shared storage を実行した結果が false である場合、requestheader list から `Sec-Shared-Storage-Writable` を delete する。

  3. そうでなければ、requestheader list 内で set a structured field value (`Sec-Shared-Storage-Writable`, true) する。

response response および request request が与えられたとき、handle a Shared-Storage-Write response するには、次の手順を実行する:
  1. sharedStorageWritable を、 `Sec-Shared-Storage-Writable`、 "item"、および入力としての requestheader list が与えられた状態で get a structured field value アルゴリズムを実行した結果とする。

  2. sharedStorageWritable が null である、または sharedStorageWritableBoolean でない、または sharedStorageWritable の値が false である場合、return する。

  3. windowrequestwindow とする。

  4. Assert: window は、その global objectWindow である environment settings object である。

  5. sharedStoragewindowglobal objectsharedStorage とする。

  6. sharedStorage が null である場合、return する。

  7. listresponseheader list とする。

  8. operationsToParse を、 `Shared-Storage-Write`、 "list"、および入力としての list が与えられた状態で get a structured field value アルゴリズムを実行した結果とする。

  9. operationsToParse が null または empty である場合、 return する。

  10. methods を空の list とする。

  11. batchWithLock を null とする。

  12. operationsToParse 内の各 tuple (item, parameters) について、 次の手順を実行する:

    1. itemInner List である場合、continue する。

    2. Assert: itemBare Item である。

    3. methodOrOptionsStringitem に対して get the string value を実行した結果とする。

    4. methodOrOptionsString が failure である場合、continue する。

    5. methodOrOptionsString で switch する:

      methodOrOptionsString が "clear" である場合:
      次の手順を実行する:
      1. options を新しい SharedStorageModifierMethodOptions とする。

      2. withLock を、parameters および "with_lock" で obtain a string-like parameter value を実行した結果とする。

      3. withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["withLock"] を withLockset する。

      4. method を new SharedStorageClearMethod(options) とする。

      5. an exception was thrown である場合、 continue する。

      6. methodmethodsAppend する。

      7. Continue.

      methodOrOptionsString が "delete" である場合:
      次の手順を実行する:
      1. key を、parameters および "key" で obtain a string-like parameter value を実行した結果とする。

      2. key が null である場合、continue する。

      3. options を新しい SharedStorageModifierMethodOptions とする。

      4. withLock を、parameters および "with_lock" で obtain a string-like parameter value を実行した結果とする。

      5. withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["withLock"] を withLockset する。

      6. method を new SharedStorageDeleteMethod(key, options) とする。

      7. an exception was thrown である場合、 continue する。

      8. methodmethodsAppend する。

      9. Continue.

      methodOrOptionsString が "append" である場合:
      次の手順を実行する:
      1. key を、parameters および "key" で obtain a string-like parameter value を実行した結果とする。

      2. key が null である場合、continue する。

      3. value を、parameters および "value" で obtain a string-like parameter value を実行した結果とする。

      4. value が null である場合、continue する。

      5. options を新しい SharedStorageModifierMethodOptions とする。

      6. withLock を、parameters および "with_lock" で obtain a string-like parameter value を実行した結果とする。

      7. withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["withLock"] を withLockset する。

      8. method を new SharedStorageAppendMethod(key, value, options) とする。

      9. an exception was thrown である場合、 continue する。

      10. methodmethodsAppend する。

      11. Continue.

      methodOrOptionsString が "set" である場合:
      次の手順を実行する:
      1. key を、parameters および "key" で obtain a string-like parameter value を実行した結果とする。

      2. key が null である場合、continue する。

      3. value を、parameters および "value" で obtain a string-like parameter value を実行した結果とする。

      4. value が null である場合、continue する。

      5. options を新しい SharedStorageSetMethodOptions とする。

      6. parameters および "ignore_if_present" で obtain a boolean parameter value を実行した結果が true である場合、options["ignoreIfPresent"] を true に set する。

      7. withLock を、parameters および "with_lock" で obtain a string-like parameter value を実行した結果とする。

      8. withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["withLock"] を withLockset する。

      9. method を new SharedStorageSetMethod(key, value, options) とする。

      10. an exception was thrown である場合、 continue する。

      11. methodmethodsAppend する。

      12. Continue.

      methodOrOptionsString が "options" である場合:
      次の手順を実行する:
      1. batchWithLock を、parameters および "with_lock" で obtain a string-like parameter value を実行した結果に設定する。

      2. Continue.

      methodOrOptionsString がそれ以外である場合:
      Continue.
  13. batchOptions を新しい SharedStorageModifierMethodOptions とする。

  14. batchWithLock が null でなく、かつ batchWithLock が U+002D HYPHEN-MINUS (-) で始まらない場合、batchOptions["withLock"] を batchWithLock に設定する。

  15. sharedStorage.batchUpdate(methods, batchOptions) を実行する。

Bare Item item について check if string-like するには、次を行う:
  1. itemStringToken、または Byte Sequence である場合、true を返す。

  2. そうでなければ、false を返す。

Bare Item item について get the string value するには、次を行う:
  1. item に対して check if string-like を実行した結果が false である場合、 failure を返す。

  2. item の型で switch する:

    itemToken である場合:
    itemString である場合:
    次の手順を実行する:
    1. Assert: itemASCII string である。

    2. item を返す。

    itemByte Sequence である場合:
    次の手順を実行する:
    1. fromUTF8 を、item に対して UTF-8 decode を実行した結果とする。

    2. fromUTF8 が error である場合、null を返す。

    3. fromUTF8 を返す。

parameters map parameters および Token paramKey が与えられたとき、 obtain a string-like parameter value するには、次の手順を実行する:
  1. parametersparamKeycontain しない場合、null を返す。

  2. parameters[paramKey] について check if string-like を実行した結果が false である場合、null を返す。

  3. parameters[paramKey] に対して get the string value を実行した結果を返す。

parameters map parameters および Token paramKey が与えられたとき、obtain a boolean parameter value するには、次の手順を実行する:
  1. parametersparamKeycontain しない場合、null を返す。

  2. parameters[paramKey] が Boolean でない場合、 null を返す。

  3. parameters[paramKey] を返す。

10. Web Locks 統合

10.1. ユーザーエージェント関連状態

shared storage lock managers map は、origins から lock managers への map である。初期状態では空である。

user agent は、関連付けられた shared storage lock managers map を持つ。

注: data partitioning と同様に、shared storage は Storage Buckets API とは独立した固有の lock management scope を持つ。これらの web locks は、既存のレガシー Web Locks API を介して Window または Worker から作成された web locks とは相互作用しない。

10.2. SharedStorageWorkletNavigator interface

[
  Exposed=SharedStorageWorklet
] interface SharedStorageWorkletNavigator {};

10.3. Web Locks IDL Monkey Patches

NavigatorLocks mixin を SharedStorageWorkletNavigator に含める(すなわち、SharedStorageWorkletNavigatorLockManager インスタンスを含める):

SharedStorageWorkletNavigator includes NavigatorLocks;

LockManager および Lock は、 追加で SharedStorageWorklet に公開される:

[SecureContext, Exposed=(Window,Worker,SharedStorageWorklet)]
interface LockManager {};
[SecureContext, Exposed=(Window,Worker,SharedStorageWorklet)]
interface Lock {};

10.4. lock manager の説明に対する Monkey Patch

lock manager を定義する段落の末尾に、次の文を追加する: "Additionally, each user agent includes one shared storage lock managers map for Web Locks API’s integration with the Shared Storage API."

10.5. locks getter steps に対する Monkey Patch

locks getter steps は、次の手順に更新されるべきである:

  1. globalObject を、current realmglobal object とする。

  2. globalObjectSharedStorageWorkletGlobalScope である場合:

    1. globalObjectaddModule success が false である場合、TypeError を投げる。

  3. thisrelevant settings objectLockManager object を返す

10.6. "obtain a lock manager" アルゴリズムに対する Monkey Patch

obtain a lock manager アルゴリズムの前に、次の手順を追加すべきである:

  1. current realmglobal objectSharedStorageWorkletGlobalScope である場合:

    1. workletDataOriginenvironmentorigin とする。

    2. shared storage lock managers map[workletDataOrigin] を返す。

10.7. "Handle callback within a shared storage lock" アルゴリズム

origin workletDataOriginstring nametask callback が与えられたとき、handle callback within a shared storage lock するには、次の手順を実行する:
  1. environmentthisrelevant settings object とする。

  2. lockManagershared storage lock managers map[workletDataOrigin] とする。

  3. promisea new promise とする。

  4. defaultOptions を新しい LockOptions とする。

  5. promise、現在の agentenvironmentidlockManagercallbacknamedefaultOptions["mode"], defaultOptions["ifAvailable"], defaultOptions["steal"], defaultOptions["signal"] で、 Request a lock する。

注: 既定の LockOptions では、lock が許可されたときに callback は最終的に呼び出される(すなわち、lock request は失敗しない)。

11. Permissions Policy 統合

この仕様は、次の文字列で識別される 3 つの policy-controlled features を定義する:

shared-storage" は、Shared Storage への一般的なアクセスを制限する。

"shared-storage-select-url" は、selectURL() に追加の permission layer を加える。

"fenced-unpartitioned-storage-read" は、 get() に追加の permission layer を加え、Window からそれを正常に呼び出せるのが、disableUntrustedNetwork() から返された Promiseresolved した場合に限られるようにする。

これらのそれぞれについて、default allowlist は * である。

12. Clear Site Data 統合

Clear Site Data 統合の詳細を追加する。

13. プライバシーに関する考慮事項

Shared Storage API は、third-party cookies の使用よりもユーザーのプライバシーをより良く保護する形で、さまざまなユースケースに cross-site data を使用する能力を提供しようとする。Shared Storage の主なプライバシー保護策は、その storage に保存された data への読み取りアクセスが embedder の SharedStorageWorklet 内でのみ発生できることである。 明確に定義された制限により、SharedStorageWorklet からの data 出力は最小限に制限される。

特に、embedder は、自身の shared storage 内の data に基づいて、短い list の URL 群から URL を選択し、その結果を fenced frame に表示できる。embedder は、より長期的にはより適切に緩和される特定のメカニズムを除き、どの URL が選択されたかを知ることはできない。現在、ユーザーが fenced frame をクリックして top-level traversable navigation を開始するたび、および/または fenced framereportEvent() API を呼び出すたびに、数ビットのエントロピーが漏洩する可能性がある。

embedder はまた、Private Aggregation API 経由で aggregatable reports を送信できる。この API は differential privacy を実現するためにノイズを追加し、レポート送信に時間遅延を用い、送信されるレポート数に制限を課し、個人のプライバシーが保護されるようレポートを aggregate data に処理する。

適合性

文書の 慣例

適合性要件は、 記述的な表明と RFC 2119 用語の組み合わせによって表される。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” は、RFC 2119 で説明されているとおりに解釈される。 ただし、可読性のため、 この仕様ではこれらの語はすべて大文字では現れない。

明示的に非規範的と記された節、例、および注を除き、この仕様のすべてのテキストは規範的である。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 規範的テキストから class="example" によって分離される。 次のようになる:

これは参考例の例である。

参考注は “Note” という語で始まり、 規範的テキストから class="note" によって分離される。 次のようになる:

Note, これは参考注である。

索引

この 仕様で定義される用語

参照により定義される用語

参考文献

規範的参考文献

[BEACON]
Ilya Grigorik; Alois Reitbauer. Beacon. URL: https://w3c.github.io/beacon/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[Fenced-Frame]
Fenced Frame. Draft Community Group Report. URL: https://wicg.github.io/fenced-frame/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[I18N-GLOSSARY]
Richard Ishida; Addison Phillips. Internationalization Glossary. URL: https://w3c.github.io/i18n-glossary/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIA-SOURCE-2]
Jean-Yves Avenard; Mark Watson. Media Source Extensions™. URL: https://w3c.github.io/media-source/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing Standard. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[PRIVATE-AGGREGATION-API]
Private Aggregation API. Unofficial Proposal Draft. URL: https://patcg-individual-drafts.github.io/private-aggregation-api/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC8941]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. February 2021. Proposed Standard. URL: https://httpwg.org/specs/rfc8941.html
[STORAGE]
Anne van Kesteren. Storage Standard. Living Standard. URL: https://storage.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEB-LOCKS]
Joshua Bell; Kagami Rosylight. Web Locks API. URL: https://w3c.github.io/web-locks/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報的参考文献

[SERVICE-WORKERS]
Yoshisato Yanagisawa; Monica CHINTALA. Service Workers. URL: https://w3c.github.io/ServiceWorker/

IDL 索引

typedef (USVString or FencedFrameConfig) SharedStorageResponse;

[Exposed=(Window)]
interface SharedStorageWorklet : Worklet {
  Promise<SharedStorageResponse> selectURL(DOMString name,
                               sequence<SharedStorageUrlWithMetadata> urls,
                               optional SharedStorageRunOperationMethodOptions options = {});
  Promise<any> run(DOMString name,
                   optional SharedStorageRunOperationMethodOptions options = {});
};

callback RunFunctionForSharedStorageSelectURLOperation = Promise<unsigned long>(sequence<USVString> urls, optional any data);

[Exposed=SharedStorageWorklet, Global=SharedStorageWorklet]
interface SharedStorageWorkletGlobalScope : WorkletGlobalScope {
  undefined register(DOMString name,
                     Function operationCtor);

  readonly attribute SharedStorage sharedStorage;
  readonly attribute PrivateAggregation privateAggregation;

  Promise<sequence<StorageInterestGroup>> interestGroups();

  readonly attribute SharedStorageWorkletNavigator navigator;
};

dictionary SharedStorageUrlWithMetadata {
  required USVString url;
  object reportingMetadata;
};

partial interface Window {
  [SecureContext] readonly attribute SharedStorage? sharedStorage;
};

[Exposed=(Window,SharedStorageWorklet)]
interface SharedStorageModifierMethod {};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageSetMethod : SharedStorageModifierMethod {
  constructor(DOMString key, DOMString value, optional SharedStorageSetMethodOptions options = {});
};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageAppendMethod : SharedStorageModifierMethod {
  constructor(DOMString key, DOMString value, optional SharedStorageModifierMethodOptions options = {});
};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageDeleteMethod : SharedStorageModifierMethod {
  constructor(DOMString key, optional SharedStorageModifierMethodOptions options = {});
};

[Exposed=(Window, SharedStorageWorklet)]
interface SharedStorageClearMethod : SharedStorageModifierMethod {
  constructor(optional SharedStorageModifierMethodOptions options = {});
};

dictionary SharedStorageModifierMethodOptions {
  DOMString withLock;
};

dictionary SharedStorageSetMethodOptions : SharedStorageModifierMethodOptions {
  boolean ignoreIfPresent;
};

[Exposed=(Window,SharedStorageWorklet)]
interface SharedStorage {
  Promise<DOMString> get(DOMString key);
  Promise<any> set(DOMString key,
                   DOMString value,
                   optional SharedStorageSetMethodOptions options = {});
  Promise<any> append(DOMString key,
                      DOMString value,
                      optional SharedStorageModifierMethodOptions options = {});
  Promise<any> delete(DOMString key, optional SharedStorageModifierMethodOptions options = {});
  Promise<any> clear(optional SharedStorageModifierMethodOptions options = {});
  Promise<any> batchUpdate(sequence<SharedStorageModifierMethod> methods,
                           optional SharedStorageModifierMethodOptions options = {});

  [Exposed=Window]
  Promise<SharedStorageResponse> selectURL(DOMString name,
                               sequence<SharedStorageUrlWithMetadata> urls,
                               optional SharedStorageRunOperationMethodOptions options = {});

  [Exposed=Window]
  Promise<any> run(DOMString name,
                   optional SharedStorageRunOperationMethodOptions options = {});

  [Exposed=Window]
  Promise<SharedStorageWorklet> createWorklet(USVString moduleURL, optional SharedStorageWorkletOptions options = {});

  [Exposed=Window]
  readonly attribute SharedStorageWorklet worklet;

  [Exposed=SharedStorageWorklet]
  Promise<unsigned long> length();

  [Exposed=SharedStorageWorklet]
  Promise<double> remainingBudget();

  [Exposed=SharedStorageWorklet]
  async iterable<DOMString, DOMString>;
};

dictionary SharedStoragePrivateAggregationConfig {
  USVString aggregationCoordinatorOrigin;
  USVString contextId;
  [EnforceRange] unsigned long long filteringIdMaxBytes;
  [EnforceRange] unsigned long long maxContributions;
};

dictionary SharedStorageRunOperationMethodOptions {
  object data;
  boolean resolveToConfig = false;
  boolean keepAlive = false;
  SharedStoragePrivateAggregationConfig privateAggregationConfig;
  DOMString savedQuery;
};

dictionary SharedStorageWorkletOptions : WorkletOptions {
  USVString dataOrigin = "context-origin";
};

interface mixin HTMLSharedStorageWritableElementUtils {
  [CEReactions, SecureContext] attribute boolean sharedStorageWritable;
};

HTMLIFrameElement includes HTMLSharedStorageWritableElementUtils;
HTMLImageElement includes HTMLSharedStorageWritableElementUtils;

partial dictionary RequestInit {
  boolean sharedStorageWritable;
};

[
  Exposed=SharedStorageWorklet
] interface SharedStorageWorkletNavigator {};

SharedStorageWorkletNavigator includes NavigatorLocks;

[SecureContext, Exposed=(Window,Worker,SharedStorageWorklet)]
interface LockManager {};

[SecureContext, Exposed=(Window,Worker,SharedStorageWorklet)]
interface Lock {};

Issue 索引

permission policy チェックが最初に行われる場合、ここに早期 return を追加することを検討する。
WebIDL により、ここでは "name" と "operationCtor" が欠落することはありえない。単に default/empty 値をチェックすべきである。 [Issue #151]
reportingMetadatadictionary であるべきである。 [Issue #141]
reportingUrlMap を、fencedFrameConfigStruct に関連付けられた fenced frame reporter class 内に保存する。これらはいずれも、draft [Fenced-Frame] にまだ 追加する必要がある。 [Issue #144]
pending shared storage budget debit の定義を、draft fenced frame config instance [Fenced-Frame] 仕様へ移動する。 [Issue #148]
navigation budget charging のタイミングを指定する、より良い方法を見つける必要がある。 [Issue #138]
determine whether a request can currently use shared storage アルゴリズムは、https://github.com/w3c/webappsec-permissions-policy/pull/499 で述べられているように、"opt-in features" を考慮する必要がある。