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()
呼び出しを通じてデータを外部へ流出させることが可能になるため、各 SharedStorageWorklet
は addModule()
を一度しか呼び出せません。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 および origin で利用可能な値を使用し、true または false のいずれかを返す implementation-defined アルゴリズムを実行する。
-
environment が secure context でない場合、false を返す。
-
allowedInOpaqueOriginContext が false であり、かつ environment の origin が opaque origin である場合、false を返す。
-
origin が opaque origin である場合、false を返す。
-
globalObject を、current realm の global object とする。
-
Assert: globalObject は
WindowまたはSharedStorageWorkletGlobalScopeである。 -
globalObject が
Windowであり、かつ "shared-storage"、globalObject の associated document、および origin に対して Is feature enabled in document for origin? を実行した結果が false を返す場合、false を返す。 -
origin に対して obtain a site を実行した結果が enrolled でない場合、false を返す。
-
true を返す。
-
worklet を作成する場合、environment は worklet を作成した
Windowに関連付けられた environment settings object であり、 origin は module script url の origin である。 -
worklet 上で(
Windowから) 操作を実行する場合、environment は worklet を作成したWindowに関連付けられた environment settings object であり、 origin は worklet の global scopes[0] の realm の settings object の origin である。 -
§ 6.4 Setter/Deleter Methods の場合、environment は (
Windowから呼び出されたときは) 現在の context、または(SharedStorageWorkletGlobalScopeから呼び出されたときは) worklet を作成したWindowに関連付けられた environment settings object のいずれかであり、 origin は environment の origin である。 -
get()がWindowから呼び出される場合(これは fenced frame 内でのみ成功できます)、environment は 現在の context であり、origin は environment の origin である。 -
§ 9.4 Shared Storage Fetch-Related Algorithms の場合、 environment は request の window であり、origin は request の current URL の origin である。
-
§ 9.4 Shared Storage Fetch-Related Algorithms の場合、 dataOrigin オプションの値
"script-origin"を使用して cross-origin worklet script で呼び出されたcreateWorklet()(これは has cross-origin data origin が true である worklet になる)、および has cross-origin data origin が true である worklet 上で動作するselectURL()とrun()については、allowedInOpaqueOriginContext は true である。他のメソッドについては、 allowedInOpaqueOriginContext は false である。
SharedStorageWorklet
worklet および URL moduleURLRecord が与えられたとき、
check if addModule is allowed and update state
するには、次の手順を実行します:
-
worklet の addModule initiated が true である場合、 "DisallowedDueToNonPreferenceError" を返す。
-
worklet の addModule initiated を true に設定する。
-
workletDataOrigin を current settings object の origin とする。
-
worklet の data origin が
"script-origin"である場合、workletDataOrigin を moduleURLRecord の origin に設定する。 -
そうでなく、worklet の data origin が
"context-origin"でない場合:-
customOriginUrl を、worklet の data origin に対して URL parser を実行した結果とする。
-
customOriginUrl が有効な URL でない場合、 "DisallowedDueToNonPreferenceError" を返す。
-
workletDataOrigin を customOriginUrl の origin に設定する。
-
-
hasCrossOriginDataOrigin を false とする。
-
workletDataOrigin と current settings object の origin が same origin でない場合、hasCrossOriginDataOrigin を true に設定する。
-
allowedInOpaqueOriginContext を hasCrossOriginDataOrigin とする。
-
current settings object、 workletDataOrigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、 "DisallowedDueToNonPreferenceError" を返す。
-
worklet の has cross-origin data origin を hasCrossOriginDataOrigin に設定する。
-
current settings object および workletDataOrigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、 "DisallowedDueToPreferenceError" を返す。
-
"Allowed" を返す。
さらに、各 SharedStorageWorklet
の
list of global scopes は、初期状態では空であり、その
worklet global scope type である SharedStorageWorkletGlobalScope
のインスタンスを最大 1 つ含むことができます。
2.1.
SharedStorageWorklet
上での操作メソッドの実行
SharedStorageWorklet
worklet、DOMString
operationName、list of strings urlList、origin workletDataOrigin、navigable navigable、SharedStorageRunOperationMethodOptions
options、pre-specified report parameters または null の
preSpecifiedParams、および aggregation coordinator または null の
aggregationCoordinator が与えられたとき、
get the
select-url result index するには、次の手順を実行します。このアルゴリズムは、urlList から選択された URL のインデックスを値とする
unsigned long
に解決される promise と、top-level traversable の
budgets が charged されるべきかどうかを示す
boolean からなる
tuple を返します。
-
promise を新しい promise とする。
-
window を worklet の relevant settings object とする。
-
window の browsing context が null である場合、(
TypeErrorで promise rejected されたもの、 true)の tuple を返す。 -
window の associated document が fully active でない場合、(
TypeErrorで promise rejected されたもの、 true)の tuple を返す。 -
Assert: worklet の global scopes の size は 1 である。
-
globalScope を worklet の global scopes[0] とする。
-
moduleMapKeyTuples を、globalScope の relevant settings object の module map に対して get the keys を実行した結果とする。
-
moduleURLRecord を moduleMapKeyTuples[0][0] とする。
-
savedQueryName を options["
savedQuery"] とする。 -
savedQueryName が空文字列でない string である場合:
-
callbackTask を、window、urlList、 および promise が与えられた状態で obtain a callback to process the saved index result を実行した結果とする。
-
savedIndex を、navigable、workletDataOrigin、 moduleURLRecord、operationName、savedQueryName、 および callbackTask に対して get the index for a saved query を実行した結果とする。
-
savedIndex が "pending callback" である場合、tuple (promise, false) を返す。
注: callbackTask は、このクエリのインデックスを選択する操作を以前取得された worklet agent が完了したときに実行されるように、現在保存されています。 callbackTask の手順が実行されると、 promise は解決されます。
-
savedIndex が
unsigned longである場合:-
savedIndex が与えられた状態で callbackTask の手順を実行するため、 window が与えられた DOM manipulation task source 上に Queue a global task する。
注: callbackTask の手順を実行すると promise は解決されます。
-
tuple (promise, false) を返す。
-
-
Assert: savedIndex は "pending current operation" である。
-
-
次の手順を実行するため、globalScope の worklet event loop 上に Queue a task する:
-
operationMap を globalScope の operation map とする。
-
operationMap が operationName を contain しない場合、promise を
TypeErrorで reject するため、window が与えられた DOM manipulation task source 上に queue a global task し、 これらの手順を中止する。注: これは
register()が operationName で一度も呼び出されなかった場合に起こり得ます。 -
Assert: operationMap[operationName] の associated realm は this の relevant realm である。
-
operation を、operationMap[operationName] を
RunFunctionForSharedStorageSelectURLOperationに converted したものとする。 -
privateAggregationCompletionTask を、workletDataOrigin、 preSpecifiedParams および aggregationCoordinator が与えられた状態で setting up the Private Aggregation scopes した結果とする。
-
argumentsList を list « urlList » とする。
-
indexPromise を、argumentsList で operation を invoking した結果とする。
-
indexPromise に React する:
- それが値 index で fulfilled された場合:
-
-
index が urlList の size より大きい場合:
-
savedQueryName が空文字列でない string である場合、 window、 navigable、workletDataOrigin、 moduleURLRecord、operationName、 savedQueryName、および default selectURL index で store the index for a saved query を実行する。
-
promise を
TypeErrorで reject するため、 window が与えられた DOM manipulation task source 上に Queue a global task し、 これらの手順を中止する。
注: 結果の index は入力 urls の size を超えています。これは selectURL() プロトコルに違反しており、どの url を選択すべきか分かりません。
そうでない場合:
-
savedQueryName が空文字列でない string である場合、 window、 navigable、workletDataOrigin、 moduleURLRecord、operationName、 savedQueryName、および index で store the index for a saved query を実行する。
-
promise を index で resolve するため、 window が与えられた DOM manipulation task source 上に Queue a global task する。
-
privateAggregationCompletionTask を実行する。
-
-
- それが rejected された場合:
-
-
savedQueryName が空文字列でない string である場合、 window、navigable、 workletDataOrigin、moduleURLRecord、 operationName、savedQueryName、および default selectURL index で store the index for a saved query を実行する。
-
promise を
TypeErrorで reject するため、 window が与えられた DOM manipulation task source 上に Queue a global task する。注: これは operationCtor の run() メソッドでエラーが発生したこと (ここで operationCtor は
register()のパラメーターです)、 または結果の index が非整数値であり、それが selectURL() プロトコルに違反しており、どの url を選択すべきか分からないことを示します。 -
privateAggregationCompletionTask を実行する。
-
-
-
tuple (promise, true) を返す。
SharedStorageWorklet
worklet、environment settings object environment、
Document
document、sequence
of SharedStorageUrlWithMetadata
urls、list of strings urlList、navigable navigable、SharedStorageRunOperationMethodOptions
options、fenced frame config mapping
fencedFrameConfigMapping、urn uuid urn、
boolean
shouldChargeTopLevelBudgets、boolean
shouldUseDefaultIndex、および unsigned long
resultIndex が与えられたとき、
handle the result of selecting an index
するには、次の手順を実行します:
-
site を、document の origin で obtain a site を実行した結果とする。
-
remainingBudget を、environment および site で determine remaining navigation budget を実行した結果とする。
-
pendingBits を、urlList の size の 2 を底とする対数とする。
-
shouldChargeTopLevelBudgets が true である場合:
-
pageBudgetResult を、navigable、 site、および pendingBits で charge shared storage top-level traversable budgets を実行した結果とする。
-
pageBudgetResult が false である場合、shouldUseDefaultIndex を true に設定する。
-
-
pendingBits が remainingBudget より大きい場合、 shouldUseDefaultIndex を true に設定する。
-
shouldUseDefaultIndex が true である場合、resultIndex を default selectURL index に設定する。
-
finalConfig を新しい fenced frame config とする。
-
finalConfig の mapped url を urlList[resultIndex] に設定する。
-
finalConfig の a "pending shared storage budget debit" field を pendingBits に設定する。
-
urn および finalConfig で fencedFrameConfigMapping 上の Finalize a pending config を実行する。
-
resultURLWithMetadata を urls[resultIndex] とする。
-
resultURLWithMetadata がフィールド "
reportingMetadata" を持つ場合、 resultURLWithMetadata["reportingMetadata"] で register reporting metadata を実行する。 -
options["
keepAlive"] が false である場合、 worklet で terminate a worklet global scope を実行する。
selectURL(name, urls, options)
メソッドの手順は次のとおりです:
-
resultPromise を新しい promise とする。
-
this の addModule initiated が false である場合、
TypeErrorで promise rejected されたものを返す。 -
window を this の relevant settings object とする。
-
context を window の browsing context とする。
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
preSpecifiedParams を、options および context が与えられた状態で obtaining the pre-specified report parameters した結果とする。
-
preSpecifiedParams が
DOMExceptionである場合、preSpecifiedParams で a promise rejected with されたものを返す。 -
aggregationCoordinator を、options が与えられた状態で obtaining the aggregation coordinator した結果とする。
-
aggregationCoordinator が
DOMExceptionである場合、aggregationCoordinator で a promise rejected with されたものを返す。 -
document を context の active document とする。
-
this の global scopes が empty である場合、
TypeErrorで promise rejected されたものを返す。注: これは
selectURL()がaddModule()より前に呼び出された場合に起こり得ます。 -
Assert: this の global scopes の size は 1 である。
-
globalScope を this の global scopes[0] とする。
-
workletDataOrigin を、globalScope の realm の settings object の origin とする。
-
"shared-storage-select-url"、 document、および workletDataOrigin に対して Is feature enabled in document for origin? を実行した結果が false を返す場合、
TypeErrorで promise rejected されたものを返す。 -
globalScope について check whether addModule is finished を実行した結果が false である場合、
TypeErrorで promise rejected されたものを返す。 -
urls が空、または urls の size が 8 より大きい場合、
TypeErrorで promise rejected されたものを返す。注: ここで 8 が選ばれているのは、
selectURL()の各呼び出しが、結果の fenced frame がクリックされたときに最大 log2(8) = 3 ビットの情報しか漏らせないようにするためです。 これは 1 回の呼び出しあたりでは多くない情報です。 -
urlList を空の list とする。
-
urls 内の各 urlWithMetadata について For each:
-
urlWithMetadata がフィールド "
url" を持たない場合、TypeErrorで promise rejected されたものを返す。 -
そうでなければ、urlString を urlWithMetadata["
url"] とする。 -
serializedUrl を、urlString で get the canonical URL string if valid を実行した結果とする。
-
serializedUrl が undefined である場合、
TypeErrorで promise rejected されたものを返す。 -
そうでなければ、serializedUrl を urlList に append する。
-
urlWithMetadata がフィールド "
reportingMetadata" を持つ場合:-
reportingMetadata を urlWithMetadata["
reportingMetadata"] とする。 -
reportingMetadata で validate reporting metadata を実行した結果が false である場合、resultPromise を
TypeErrorで reject し、これらの手順を中止する。
-
-
-
navigable を、window の associated document の node navigable とする。
-
fencedFrameConfigMapping を、navigable の traversable navigable の fenced frame config mapping とする。
-
pendingConfig を新しい fenced frame config とする。
-
urn を、pendingConfig で fencedFrameConfigMapping 上の store a pending config を実行した結果とする。
-
urn が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
environment を window の relevant settings object とする。
-
allowedInOpaqueOriginContext を this の has cross-origin data origin とする。
-
environment、 workletDataOrigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、
TypeErrorで promise rejected されたものを返す。 -
environment および workletDataOrigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合:
-
this の has cross-origin data origin が false である場合、
TypeErrorで promise rejected されたものを返す。
-
-
options["
resolveToConfig"] が true である場合、 resultPromise を pendingConfig で resolve する。 -
そうでなければ、resultPromise を urn で resolve する。
-
(indexPromise, shouldChargeTopLevelBudgets) を、this、name、urlList、 workletDataOrigin、navigable、options、 preSpecifiedParams および aggregationCoordinator が与えられた状態で get the select-url result index を実行した結果とする。
-
indexPromise が resultIndex で Upon fulfillment されたとき、worklet、environment、document、 urls、urlList、navigable、options、 fencedFrameConfigMapping、urn、shouldChargeTopLevelBudgets、 false、および resultIndex が与えられた状態で handle the result of selecting an index を実行する。
-
indexPromise が Upon rejection されたとき、 worklet、environment、document、 urls、urlList、navigable、options、 fencedFrameConfigMapping、urn、shouldChargeTopLevelBudgets、 true、および default selectURL index が与えられた状態で handle the result of selecting an index を実行する。
-
resultPromise を返す。
run(name, options)
メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
this の addModule initiated が false である場合、
TypeErrorで promise rejected されたものを返す。 -
window を this の relevant settings object とする。
-
context を window の browsing context とする。
-
context が null である場合、
TypeErrorで a promise rejected with されたものを返す。 -
preSpecifiedParams を、options および context が与えられた状態で obtaining the pre-specified report parameters した結果とする。
-
preSpecifiedParams が
DOMExceptionである場合、preSpecifiedParams で a promise rejected with されたものを返す。 -
aggregationCoordinator を、options が与えられた状態で obtaining the aggregation coordinator した結果とする。
-
aggregationCoordinator が
DOMExceptionである場合、aggregationCoordinator で a promise rejected with されたものを返す。 -
this の global scopes が empty である場合、
TypeErrorで promise rejected されたものを返す。注: これは
run()がaddModule()より前に呼び出された場合に起こり得ます。 -
Assert: this の global scopes の size は 1 である。
-
globalScope を this の global scopes[0] とする。
-
globalScope について check whether addModule is finished を実行した結果が false である場合、
TypeErrorで promise rejected されたものを返す。 -
workletDataOrigin を、globalScope の realm の settings object の origin とする。
-
allowedInOpaqueOriginContext を this の has cross-origin data origin とする。
-
window、 workletDataOrigin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、promise を
TypeErrorで reject する。 -
window および workletDataOrigin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合:
-
this の has cross-origin data origin が false である場合、promise を
TypeErrorで reject する。 -
そうでなければ、promise を undefined で resolve する。
-
promise を返す。
-
-
promise を返し、直ちに window が与えられた状態で obtaining a worklet agent し、 残りの手順をその agent 内で実行する:
注: promise の解決は、
SharedStorageWorkletGlobalScope内での実行より前であり、その実行に依存しないべきです。 これは、shared storage がパーティション化されていないストレージの一種であり、SharedStorageWorkletGlobalScopeがクロスサイトデータにアクセスできるため、そのデータがrun()(その成功/エラー結果を介して)漏えいすべきではないからです。-
promise を undefined で resolve するため、window が与えられた DOM manipulation task source 上に Queue a global task する。
-
globalScope の relevant settings object の module map が empty でない場合:
-
operationMap を this の
SharedStorageWorkletGlobalScopeの operation map とする。 -
operationMap が name を contain する場合:
-
Assert: operationMap[name] の associated realm は this の relevant realm である。
-
operation を、operationMap[name] を
Functionに converted したものとする。 -
privateAggregationCompletionTask を、workletDataOrigin、 preSpecifiedParams および aggregationCoordinator が与えられた状態で setting up the Private Aggregation scopes した結果とする。
-
argumentsList を新しい list とする。
-
argumentsList および "
report" で operation を Invoke する。 -
該当する場合、operation の実行が完了するまで待機する。
-
privateAggregationCompletionTask を実行する。
-
-
-
options["
keepAlive"] が false である場合:-
該当する場合、operation の実行が完了するまで待機する。
-
terminate a worklet global scope を this で実行する。
-
-
SharedStorageRunOperationMethodOptions
options が与えられたとき、
obtain
the aggregation coordinator するには、次の手順を実行します。これらは
aggregation coordinator、null、または DOMException
を返します:
-
options["
privateAggregationConfig"] が exist しない場合、null を返す。 -
options["
privateAggregationConfig"]["aggregationCoordinatorOrigin"] が exist しない場合、null を返す。 -
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
を返します:
-
options["
privateAggregationConfig"] が exist しない場合、null を返す。 -
privateAggregationConfig を options["
privateAggregationConfig"] とする。 -
contextId を null とする。
-
privateAggregationConfig["
contextId"] が exist する場合、contextId を privateAggregationConfig["contextId"] に設定する。 -
contextId の length が 64 より大きい場合、名前が "
DataError" の新しいDOMExceptionを返す。 -
filteringIdMaxBytes を default filtering ID max bytes とする。
-
privateAggregationConfig["
filteringIdMaxBytes"] が exist する場合、filteringIdMaxBytes を privateAggregationConfig["filteringIdMaxBytes"] に設定する。 -
filteringIdMaxBytes が valid filtering ID max bytes range に contained されていない場合、名前が "
DataError" の新しいDOMExceptionを返す。 -
context の fenced frame config instance が null でない場合:
-
filteringIdMaxBytes が default filtering ID max bytes でない、または contextId が null でない場合、名前が "
DataError" の新しいDOMExceptionを返す。
-
-
maxContributions を null とする。
-
privateAggregationConfig["
maxContributions"] が exist する場合、maxContributions を privateAggregationConfig["maxContributions"] に設定する。 -
maxContributions がゼロである場合、名前が "
DataError" の新しいDOMExceptionを返す。 -
次の項目を持つ新しい pre-specified report parameters を返す:
- context ID
-
contextId
- filtering ID max bytes
-
filteringIdMaxBytes
- max contributions
-
maxContributions
注: 返された algorithm は、関連付けられた操作が 完了したときに実行されるべきです。
-
batchingScope を新しい batching scope とする。
-
debugScope を新しい debug scope とする。
-
privateAggregationTimeout を null とする。
-
hasRunPrivateAggregationCompletionTask を false とする。
-
privateAggregationCompletionTask を、次の手順を実行する algorithm とする:
-
hasRunPrivateAggregationCompletionTask である場合、返す。
-
hasRunPrivateAggregationCompletionTask を true に設定する。
-
debugScope が与えられた状態で Mark a debug scope complete する。
-
batchingScope、workletDataOrigin、 "
shared-storage" および privateAggregationTimeout が与えられた状態で Process contributions for a batching scope する。
-
-
aggregationCoordinator が null でない場合、 aggregationCoordinator および batchingScope が与えられた状態で set the aggregation coordinator for a batching scope する。
-
preSpecifiedParams が null でない場合:
-
isDeterministicReport を、preSpecifiedParams が与えられた状態で determining if a report should be sent deterministically した結果とする。
-
isDeterministicReport である場合:
-
privateAggregationTimeout を current wall time に deterministic operation timeout duration を加えたものに設定する。
-
-
preSpecifiedParams および batchingScope が与えられた状態で Set the pre-specified report parameters for a batching scope する。
-
isDeterministicReport である場合、次の手順を in parallel に実行する:
-
privateAggregationTimeout まで待機する。
-
privateAggregationCompletionTask を実行する。
-
-
-
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 を含める必要があります。settingsObject の origin を定義する手順は、次のように変更されるべきです:
-
settingsObject を、次のように定義されるアルゴリズムを持つ新しい environment settings object とする:
......
-
workletGlobalScope を、 realmExecutionContext の Realm component の global object とする。
-
workletGlobalScope が
SharedStorageWorkletGlobalScopeでない場合、origin を返す。 -
Assert: worklet は
SharedStorageWorkletである。 -
worklet の data origin が
"context-origin"である場合、outsideSettings の origin を返す。 -
そうでなく、data origin が
"script-origin"である場合:-
pendingAddedModules を、worklet の added modules list の clone とする。
-
moduleURL を pendingAddedModules[0] とする。
-
moduleURL の origin を返す。
-
-
そうでなければ、customOriginUrl を、data origin に対して URL parser を実行した結果とする。
-
customOriginUrl の origin を返す。
......
-
2.2.2. create a worklet global scope に対するモンキーパッチ
create a worklet global scope アルゴリズムは、 worklet パラメーターを渡すように変更する必要があります:
-
insideSettings を、realmExecutionContext、outsideSettings、および 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, ..." の前に次の手順を含める必要があります:
-
fetchClient の global object が
SharedStorageWorkletGlobalScopeである場合:-
request の redirect mode を "
error" に設定する。注: shared storage では、module script request に対するリダイレクトは許可されません。この制限により、
SharedStorageWorkletGlobalScopeが作成されるとすぐに、realm の settings object の origin を取得するアルゴリズム(§ 2.2.1 Monkey Patch for set up a worklet environment settings object で説明)を定義して使用できます。origin は変更されないためです。この制限は、将来の設計の反復で削除される可能性があります。 リダイレクトが許可されるようになった場合、おそらく、realm の settings object の origin を取得するアルゴリズムは、最終 request の response を受け取った後、最終 request の URL の origin を返すように更新されるべきであり、user preference checkings はその時点以降にのみ行われるべきです。 -
fetchClient の origin と settingsObject の origin が same origin でない場合:
-
dataOriginValue を settingsObject の origin の serialization とする。
-
Assert: dataOriginValue は null でない。
-
Append the header (`
Sec-Shared-Storage-Data-Origin`, dataOriginValue) to request の header list.
-
-
2.2.4.
`Shared-Storage-Cross-Origin-Worklet-Allowed`
HTTP レスポンスヘッダー
`Shared-Storage-Cross-Origin-Worklet-Allowed`
HTTP レスポンスヘッダーは、従来の CORS ヘッダーとともに、cross-origin site に、module script の URL の origin から worklet を作成し、その後の操作を module script の
URL の
origin を 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 の URL の
origin と 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 Window
は selectURL()
または run()
を呼び出すことで、worklet origin の site の remaining navigation budget を汚染し使い切る可能性があります。
ここで worklet origin は global scope の realm の settings object の origin です。
2.2.6.
addModule()
に対するモンキーパッチ
addModule()
method steps for Worklet
は、手順 "Let promise be a new promise" の前に次の手順を含める必要があります:
-
this が
SharedStorageWorklet型である場合:-
addModuleAllowedResult を、this および moduleURLRecord が与えられた状態で check if addModule is allowed and update state を実行した結果とする。
-
addModuleAllowedResult が "DisallowedDueToNonPreferenceError" である場合:
-
TypeErrorで a promise rejected with されたものを返す。
-
-
そうでなく、addModuleAllowedResult が "DisallowedDueToPreferenceError" である場合:
-
this の has cross-origin data origin が false である場合、
TypeErrorで a promise rejected with されたものを返す。
-
-
そうでなければ:
-
Assert: addModuleAllowedResult は "Allowed" である。
-
-
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" の後に、次の手順を含める必要があります:
-
this が
SharedStorageWorklet型であり、 has cross-origin data origin が true であり、かつ data origin が"script-origin"でない場合:-
Assert: pendingTasks は 1 である。
-
pendingTasks を 2 に設定する。
-
次の手順を実行するため、workletGlobalScope が与えられた networking task source 上に Queue a global task する:
-
customOriginUrl を、data origin に対して URL parser を実行した結果とする。
-
customOriginUrl の path を ≪".well-known", "shared-storage", "trusted-origins"≫ に設定する。
-
request を、その URL が customOriginUrl、mode が
"cors"、referrer が"client"、destination が"json"、 initiator type が"script"、 かつ client が outsideSettings である新しい request とする。 -
request を Fetch し、processResponseConsumeBody を、 response response と null、failure または byte sequence bodyBytes が与えられた次のアルゴリズムに設定する:
-
次のいずれかが true である場合:
その場合:
-
pendingTasks を −1 に設定する。
-
promise を "TypeError" DOMException で Reject する。
-
これらの手順を中止する。
-
-
mimeType を、response の header list から extracting a MIME type した結果とする。
-
mimeType が JSON MIME type でない場合:
-
pendingTasks を −1 に設定する。
-
promise を "TypeError" DOMException で Reject する。
-
これらの手順を中止する。
-
-
sourceText を、bodyBytes を UTF-8 decoding した結果とする。
-
parsed を、sourceText が与えられた状態で parsing a JSON string to an Infra value した結果とする。
-
parsed が list でない、または parsed が empty である場合:
-
pendingTasks を −1 に設定する。
-
promise を "TypeError" DOMException で Reject する。
-
これらの手順を中止する。
-
-
doesMatch を false とする。
-
parsed の各 item について:
-
item が ordered map でない、または item が
scriptOriginを contain しない、または item がcontextOriginを contain しない場合:-
pendingTasks を −1 に設定する。
-
promise を "TypeError" DOMException で Reject する。
-
これらの手順を中止する。
-
-
doesMatch を、 item[
scriptOrigin]、 moduleURLRecord の origin、 item[contextOrigin]、および outsideSettings の origin に対して check for script and context origin match を実行した結果とする。 -
doesMatch が true である場合:
-
次の手順を実行するため、this の relevant global object が与えられた networking task source 上に Queue a global task する:
-
pendingTasks が −1 でない場合:
-
pendingTasks を pendingTasks − 1 に設定する。
-
pendingTasks が 0 である場合、次の手順を実行する:
-
workletGlobalScope が関連付けられた boolean addModule success を持つ場合、 workletGlobalScope の addModule success を true に設定する。
-
promise を Resolve する。
-
-
-
-
Break.
-
-
-
doesMatch が false である場合:
-
pendingTasks を −1 に設定する。
-
promise を "TypeError" DOMException で Reject する。
-
-
-
-
注: worklet data origin が現在の context および script origin と異なる場合、追加の検査が実行されます。 これには、worklet data origin から構成ファイルをフェッチし、現在の context が script とともに worklet を読み込み、操作を実行することを許可されているかを検証することが含まれます。
最後から 2 番目の手順(すなわち最後にインデントされた手順)、現在の "If pendingTasks is 0, then resolve promise." は、次のように更新されるべきです:
-
pendingTasks が 0 である場合、次の手順を実行する:
-
workletGlobalScope が関連付けられた boolean addModule success を持つ場合、 workletGlobalScope の addModule success を true に設定する。
-
promise を Resolve する。
-
最後の手順、現在の "Return promise." の直前に、次の手順を追加する:
-
this が
SharedStorageWorkletである場合、 promise の upon fulfillment または promise の upon rejection 時に、次の手順を実行する:-
globalScopes を this の global scopes とする。
-
privateAggregationObj を globalScopes[0] の
privateAggregationとする。 -
privateAggregationObj の allowed to use を、 this の relevant global object の associated document が "
private-aggregation" policy-controlled feature を allowed to use されているかどうかを決定した結果に設定する。permissions policy check が最初に行われる場合、ここに早期 return を追加することを検討してください。
-
privateAggregationObj の scoping 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 type は string または list of strings です。
-
itemScriptOrigin および actualScriptOrigin が与えられた状態で check for trusted origin match を実行した結果が false である場合、false を返す。
-
itemContextOrigin および actualContextOrigin が与えられた状態で check for trusted origin match を実行した結果を返す。
-
itemOrigin が string である場合、 itemOrigin および actualOrigin が与えられた状態で check for trusted origin match on a string を実行した結果を返す。
-
そうでなければ、itemOrigin 内の各 originString について:
-
originString および actualOrigin が与えられた状態で check for trusted origin match on a string を実行した結果が true である場合、true を返す。
-
-
false を返す。
-
itemOrigin が
"*"である場合、true を返す。 -
itemOriginUrl を、itemOrigin に対して URL parser を実行した結果とする。
-
itemOriginUrl が有効な URL でない場合、 false を返す。
-
itemOriginUrl の origin と actualOrigin が same origin である場合、true を返す。
-
そうでなければ、false を返す。
out-of-process worklets のための追加の monkey patch 部分を追加する。
2.3. SharedStorageWorkletGlobalScope
SharedStorageWorklet
の
worklet global scope type は SharedStorageWorkletGlobalScope
です。
SharedStorageWorklet
の
worklet 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 を持ち、これは関連付けられた
SharedStorageWorklet
の
relevant 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)
メソッドの手順は次のとおりです:
-
name が欠落しているか空である場合、
TypeErrorを投げる。 -
operationMap を、この
SharedStorageWorkletGlobalScopeの operation map とする。 -
operationMap が、name を key とする entry を contains する場合、
TypeErrorを投げる。 -
operationCtor が欠落している場合、
TypeErrorを投げる。 -
operationClassInstance を、引数なしで operationCtor を constructing した結果とする。
-
runFunction を Get(operationClassInstance, "
run") とする。 あらゆる例外を再スローする。 -
IsCallable(runFunction) が false である場合、
TypeErrorを投げる。 -
operationMap[name] の値を runFunction に Set する。
ここでは WebIDL により "name" と "operationCtor" は欠落し得ません。default/empty 値だけを確認すべきです。 [Issue #151]
interestGroups()
メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。 -
globalObject を、current realm の global object とする。
-
context を globalObject の browsing context とする。
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
document を context の active window の associated document とする。
-
document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
workletDataOrigin を current realm の settings object の origin とする。
-
次の手順を in parallel に実行する:
-
interestGroups を、workletDataOrigin が与えられた状態で get storage interest groups for owner を実行した結果とする。
-
interestGroups が failure である場合:
-
promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
そうでなければ:
-
promise を interestGroups で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
-
promise を返す。
sharedStorage getter steps は次のとおりです:
-
this の addModule success が true である場合、this の shared storage instance を返す。
-
そうでなければ、
TypeErrorを投げる。
-
addModule success の値を返す。
2.4. SharedStorageUrlWithMetadata
と Reporting
dictionary {SharedStorageUrlWithMetadata required USVString ;url object ; };reportingMetadata
SharedStorageUrlWithMetadata
dictionary が、FenceEvent
の
eventType
を
keys
とし、有効な URLs に parse される
strings を
values とする dictionary 形式の、非
empty な reportingMetadata
object
を含む場合、これらの eventType-URL
ペアは、この selectURL()
呼び出しから生じる SharedStorageResponse
を読み込む任意の fenced frame 内で後でアクセスするために registered されます。
reportingMetadata
は dictionary であるべきです。 [Issue #141]
reportingMetadata
object
を伴う
selectURL()
を通じて registered された eventType-URL
ペアを持つ fenced frame 内で、"shared-storage-select-url" を
containing する destination
を持つ FenceEvent
に対して reportEvent()
が呼び出され、その FenceEvent
の対応する
eventType
がトリガーされた場合、その FenceEvent
の
eventData
は、その eventType
に対して登録された
URL に
beacon
として送信されます。
object
reportingMetadata が与えられたとき、
validate
reporting metadata するには、次の手順を実行します:
-
reportingMetadata が dictionary でない場合、false を返す。
-
reportingMetadata が empty である場合、 true を返す。
-
reportingMetadata の各 eventType → urlString について For each、urlString で get the canonical URL string if valid を実行した結果が undefined である場合、false を返す。
-
true を返す。
-
url を、urlString に対して URL parser を実行した結果とする。
-
url が有効な URL でない場合、 undefined を返す。
-
そうでなければ、url に対して URL serializer を実行した結果を返す。
object
reportingMetadata および fenced
frame config fencedFrameConfigStruct が与えられたとき、
register
reporting metadata するには、次の手順を実行します:
-
reportingMetadata が empty である場合、 返す。
-
Assert: reportingMetadata は dictionary である。
-
reportingMetadata の各 eventType → urlString について For each:
-
url を、urlString に対して URL parser を実行した結果とする。
-
reportingUrlMap[eventType] を url に Set する。
-
reportingUrlMap を、fencedFrameConfigStruct に関連付けられた fenced frame reporter クラス内に保存する。 これらはいずれもまだ草案 [Fenced-Frame] に追加する必要があります。 [Issue #144]
2.5. エントロピー予算
bits of entropy は selectURL()
を通じて漏えいし得るため、user
agent はこれらの漏えいを制限するための budgets を維持する必要があります。
selectURL()
の呼び出しにおいて、これらの budgets のいずれかが使い果たされている場合、どの URL を選択するかを決定するために
default
selectURL index が使用されます。
sequence<USVString>
urls が与えられたとき、
get the
default selectURL index するには、次の手順を実行します:
-
0 を返す。
注: 返される index が登録された operation class の "
run" メソッドから独立している限り、0 から urls の size までの排他的な range に含まれる任意のunsigned longを返すこともできました。
default selectURL
index は、sequence<USVString>
urls が与えられた状態で get the default
selectURL index を実行して得られる index です。
2.5.1. ナビゲーションエントロピー予算
ユーザーが、selectURL()
によって生成された fenced frame config instance を
browsing context が持つ、node
document の fenced frame を activates し、それにより top-level traversable navigation を開始した場合、これは landing page に、その URL
が選択されたことを明らかにします。これは selectURL()
の呼び出しに対する入力 URLs
の個数の 2 を底とする対数までの entropy bits の漏えいです。
これを軽減するため、user agent は per-site の navigation entropy allowance を設定します。
navigation entropy allowance は、与えられた calling site について、与えられた navigation budget epoch の間に top-level traversable navigations を開始する fenced frames を通じて漏えいすることが許可される entropy bits の最大 allowance です。この allowance は user agent によって定義され、 site-agnostic です。
user agent は、固定された事前決定済みの duration navigation budget lifetime を定義します。
navigation budget epoch は、その duration が navigation budget lifetime である任意の時間間隔です。
この navigation entropy allowance がどのように使用されるかを追跡するため、 user agent は shared storage navigation budget table を使用します。これは sites から navigation entropy ledgers への map です。
navigation entropy ledger は、bit debits の list です。
bit debit は、次の items を持つ struct です:
- bits
- timestamp
-
DOMHighResTimeStamp(Unix 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 のいずれか)を返します。
-
Assert: site は opaque origin ではない。
-
maxBits を user agent の navigation entropy allowance とする。
-
user agent の shared storage navigation budget table が site を contain しない場合、maxBits を返す。
-
そうでなければ、ledger を user agent の shared storage navigation budget table[site] とする。
-
debitSum を 0 とする。
-
ledger 内の各 item bitDebit について For each、次の手順を実行する:
-
debit を bitDebit の bits とする。
-
environment および bitDebit で check whether a bit debit is expired を実行した結果が false である場合、debitSum を debit だけ増加させる。
-
-
maxBits − debitSum を返す。
-
epochLength を user agent の navigation budget lifetime とする。
-
currentTime を environment の current wall time とする。
-
threshold を currentTime − epochLength とする。
-
bitDebit の timestamp が threshold より小さい場合、 true を返す。
-
そうでなければ、false を返す。
bit debit は、selectURL()
経由で生成された fenced frame config instance を
browsing
context が持つ、
node
document の fenced frame によって開始される各 top-level traversable navigation について、shared storage navigation budget table に
charged される必要があります。これは cross-site data
を漏えいさせ得るためです。
課金する bits は selectURL()
の呼び出し中に計算されますが、結果として得られる fenced frame が top-level traversable navigation を開始する場合にのみ、かつその時点でのみ実際に
shared storage navigation budget table
に記録されるため、
この時点まで、bits は対応する fenced
frame の node
document の browsing context の fenced frame config instance 内に
pending
shared storage budget debit として保存されなければなりません。
pending shared storage budget debit の定義を fenced frame config instance へ、草案 [Fenced-Frame] 仕様内で移動する。 [Issue #148]
beginning navigation と ending navigation の間に、user agent は charge shared storage navigation budget アルゴリズムを実行します。
navigation budget charging の timing を指定するよりよい方法を見つける必要があります。 [Issue #138]
Document
sourceDocument による navigation 中に
charge shared storage navigation budget
するには、次の手順を実行します:
-
navigable が top-level traversable でない場合、返す。
-
currentNavigable を sourceDocument の node navigable とする。
-
currentNavigable が null でない間:
-
site を、currentNavigable の active document の origin で obtain a site を実行した結果とする。
-
instance を currentNavigable の node document の browsing context の fenced frame config instance とする。
-
currentNavigable を currentNavigable の parent に設定する。
-
instance が null、または site が opaque origin である場合、continue する。
-
pendingBits を instance の pending shared storage budget debit とする。
-
pendingBits が 0 より大きくない場合、continue する。
-
ledger を user agent の shared storage navigation budget table[site] とする。
-
bitDebit を新しい bit debit とする。
-
bitDebit の bits を pendingBits に設定する。
-
currentTime を current wall time とする。
-
bitDebit の timestamp を currentTime に設定する。
-
bitDebit を ledger に Append する。
-
pendingBits を 0 に設定する。
-
user agent は、expired した bit debits がもはや不要になるため、すべての navigation entropy ledgers から purge expired bit debits from all navigation entropy ledgers を定期的に行う timer の設定を望むことがあります。
-
user agent の shared storage navigation budget table の各 origin → ledger について For each:
-
ledger 内の各 bitDebit について For each、bitDebit で check whether a bit debit is expired を実行した結果が true である場合、ledger から bitDebit を remove する。
-
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
- site budget map
- 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 です:
2.5.2.1. Traversable Navigables に対するモンキーパッチ
[HTML] の Traversable navigables セクションに、次を追加します:
navigable のプロパティに加えて、traversable navigable は次を持ちます:
-
page budget、すなわち shared storage page budget または null。初期値は null。
2.5.2.2. Navigables に対するモンキーパッチ
initialize the navigable アルゴリズムを、末尾に次の手順を追加することで変更します:
-
parent が null であり、かつ navigable が traversable navigable である場合:
-
newPageBudget を、空の site budget map を持つ shared storage page budget とする。
-
newPageBudget の overall budget を overall page entropy allowance に設定する。
-
navigable の page budget を newPageBudget に設定する。
-
2.5.2.3. 保存されたクエリ
-
topLevelTraversable を、navigable について get the top-level traversable を実行した結果とする。
-
Assert: topLevelTraversable の page budget は null でない。
-
topLevelTraversable の page budget の saved query map が (origin, moduleURLRecord, operationName, savedQueryName) を contain しない場合:
-
topLevelTraversable の page budget の saved query map[(origin, moduleURLRecord, operationName, savedQueryName)] を、新しい saved query data struct queryData に Set する。
-
queryData の index 値を -1 に設定する。
-
"pending current operation" を返す。
-
-
savedIndex を topLevelTraversable の page budget の saved query map[(origin, moduleURLRecord, operationName, savedQueryName)] の index とする。
-
savedIndex が -1 である場合:
-
savedIndex を返す。
注: get the index for
a saved query アルゴリズムは、registered された operation を実行するために、SharedStorageWorkletGlobalScope
の
worklet event loop 上に queueing a task した結果を index 値が待機中であることを示すために、
"pending current operation" を返します。
注: get the index for
a saved query アルゴリズムは、index の結果を決定する task が以前に SharedStorageWorkletGlobalScope
の
worklet event loop 上に queued されており、元の task が完了したときに実行される追加の callbackTask を
現在 queueing していることを示すために、"pending callback" を返します。
Window
window、navigable navigable、origin
origin、URL moduleURLRecord、string operationName、
string
savedQueryName、および unsigned long
index が与えられたとき、
store
the index for a saved query するには:
-
topLevelTraversable を、navigable について get the top-level traversable を実行した結果とする。
-
Assert: topLevelTraversable の page budget は null でない。
-
queryData を topLevelTraversable の page budget の saved query map[(origin, moduleURLRecord, operationName, savedQueryName)] とする。
-
queryData の callbacks が empty でない間 While:
-
queryData の callbacks から次の task callbackTask を Dequeue し、index が与えられた状態で callbackTask の手順を実行するため、window が与えられた DOM manipulation task source 上に queue a global task する。
-
Window
window、list of SharedStorageUrlWithMetadatas
urlList、および promise promise が与えられたとき、
obtain a callback to process the saved index
result するには、次の手順を実行します。これらは algorithm を返します。
-
processIndexTask を、
unsigned longindex が与えられたとき、次の手順を実行する algorithm とする:-
index が urlList の size より大きい場合、 promise を
TypeErrorで reject するため、window が与えられた DOM manipulation task source 上に queue a global task する。注: 結果 index は入力 urls の size を超えています。これは selectURL() プロトコルに違反しており、どの url を選択すべきか分かりません。
-
そうでなければ、promise を index で resolve するため、window が与えられた DOM manipulation task source 上に queue a global task する。
-
-
processIndexTask を返す。
2.5.2.4. Top-Level Traversable エントロピー予算の課金
-
topLevelTraversable を、navigable について get the top-level traversable を実行した結果とする。
-
Assert: topLevelTraversable の page budget は null でない。
-
pendingBits が topLevelTraversable の page budget の overall budget より大きい場合、 false を返し、これらの手順を中止する。
-
topLevelTraversable の page budget の site budget map が site を contain しない場合、topLevelTraversable の page budget の site budget map [site] を site page entropy allowance に set する。
-
pendingBits が topLevelTraversable の page budget の site budget map [site] より大きい場合、false を返し、これらの手順を中止する。
-
topLevelTraversable の page budget の site budget map [site] を pendingBits だけ減少させる。
-
topLevelTraversable の page budget の overall budget を pendingBits だけ減少させる。
-
true を返す。
3. Shared Storage のバックエンド
Shared Storage API は、以下のように、新しい storage endpoint を registering することで、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
endpoint を register します。
この 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 sheds は origins を直接 keys として使用します。Shared storage は、意図的に client-side storage partitioning から除外されます。
shared storage shed
内の各 storage shelf について、その storage shelf の
bucket
map は現在、"default" という単一の key だけを持ちます。
user agent の shared storage shed は、すべての shared storage データを保持します。
-
allowedInOpaqueOriginContext を false とする。
-
environment、origin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、failure を返す。
-
environment および origin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、failure を返す。
-
shed[origin] が存在しない場合、shed[origin] を、 type "
shared" で create a shared storage shelf を実行した結果に設定する。 -
shed[origin] を返す。
-
shelf を新しい storage shelf とする。
-
shelf の bucket map["
default"] を、create a shared storage bucket を実行した結果に設定する。 -
shelf を返す。
shared storage bucket は、shared storage shed の shelves のいずれかにある storage bucket です。
-
endpoint を、storage identifier "
sharedStorage" を持つ storage endpoint とする。 -
bucket を新しい shared storage bucket とする。
-
bucket の bottle map["
sharedStorage"] を、endpoint の quota である quota を持つ、新しい storage bottle に設定する。 -
bucket を返す。
注: 現在、shared storage bucket の bottle
map は size 1 を持ちます。これは、type
"shared" で registered された storage
endpoint が 1 つしかないためです。
-
shed を user agent の shared storage shed とする。
-
shelf を、shed、environment、および origin で obtain a shared storage shelf を実行した結果とする。
-
shelf が failure である場合、failure を返す。
-
bucket を shelf の bucket map["
default"] とする。 -
bottle を bucket の bottle map["
sharedStorage"] とする。 -
proxyMap を、その backing map が bottle の map である新しい storage proxy map とする。
-
proxyMap を bottle の proxy map reference set に Append する。
-
proxyMap を返す。
3.2. Shared Storage Database
browsing context は、関連付けられた shared storage database を持ち、これは データを store、retrieve、delete、clear、および purge expired するメソッド、 ならびに以下の追加メソッドを提供します。database 内のデータは entries の形式をとります。
各 shared storage database は shared storage database queue を持ち、これは starting a new parallel queue の結果です。この queue は、当該 browsing context から呼び出しが開始されたときに、各 shared storage database のメソッドを実行するために使用されます。
各 entry は、key と value struct から構成されます。
User agents は、key の maximum length を指定してもよいです。
keys は entries を整理し効率的に取得するために使用されるため、keys は任意の与えられた shared storage database 内で最大 1 回だけ出現しなければなりません。
entry の value struct は、string value
と、DOMHighResTimeStamp
last updated(Unix Epoch
からのもの)からなる
struct です。
User agents は、value の maximum length を指定してもよいです。
User agents は、default entry lifetime、すなわち entry が stored されてから期限切れになるまでの、既定の duration を指定してもよいです。 user agent が default entry lifetime を指定する場合、database から定期的に purge expired entries from the database する timer を持つべきです。
3.3. 中核 Database アルゴリズム
-
valueStruct を新しい value struct とする。
-
valueStruct の value を value に設定する。
-
currentTime を environment の current wall time とする。
-
valueStruct の last updated を currentTime に設定する。
-
databaseMap[key] を valueStruct に Set する。
-
an exception was thrown である場合、false を返す。
注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。
-
そうでなければ、true を返す。
-
databaseMap が key を contain しない場合、undefined を返す。
-
valueStruct を、 databaseMap に対して key で Get を実行した結果とする。
-
an exception was thrown である場合、failure を返す。
注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。
-
environment および valueStruct で determine whether an entry is expired を実行した結果が true である場合、undefined を返す。
-
valueStruct の value を返す。
-
databaseMap[key] を Remove する。
-
an exception was thrown である場合、false を返す。
注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。
-
true を返す。
-
databaseMap に対して Clear を実行する。
-
an exception was thrown である場合、false を返す。
注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。
-
true を返す。
-
values を、databaseMap に対して getting the values を実行した結果とする。
-
an exception was thrown である場合、failure を返す。
注: storage proxy map databaseMap のメソッドによるエラーは、 その実装によって発生する可能性があります。
-
values を返す。
-
size を databaseMap の size とする。
-
an exception was thrown である場合、failure を返す。
注: storage proxy map databaseMap の members によるエラーは、 その実装によって発生する可能性があります。
-
size を返す。
-
databaseMap 内の各 key key について For each:
-
valueStruct を、 databaseMap に対して key で Get を実行した結果とする。
-
an exception was thrown である場合、 false を返す。
-
environment および valueStruct で determine whether an entry is expired を実行した結果が true である場合、databaseMap[key] を Remove する。
-
an exception was thrown である場合、 false を返す。
-
-
true を返す。
environment settings object environment および value struct valueStruct が与えられたとき、determine whether an entry is expired するには、次の手順を実行します:
-
lastUpdated を valueStruct の last updated とする。
-
lifetime を user agent の default entry lifetime とする。
-
expiration を lastUpdated と lifetime の和とする。
-
currentTime を environment の current wall time とする。
-
expiration が currentTime 以下である場合、true を返す。
-
そうでなければ、false を返す。
3.4. 特殊化された Database アルゴリズム
これらのアルゴリズムは、§ 3.3 The Core Database Algorithms の core algorithms とは異なり、より特殊化されたヒューリスティックを持つパラメーターを受け取るか、 複数手順のプロセスを用いるか、またはその両方により、より複雑な database operations を扱います。
shared storage database queue queue、storage proxy map databaseMap、environment settings object environment、key key、value value、および boolean ignoreIfPresent が与えられたとき、 set an entry in the database するには、 queue 上で次の手順を実行します:
-
ignoreIfPresent である場合:
-
currentValue を、queue、databaseMap、 environment、および key で retrieve an entry from the database を実行した結果とする。
-
currentValue が failure である場合、false を返す。
-
currentValue が undefined でない場合、true を返す。
-
-
queue、databaseMap、environment、 key、および value で store an entry in the database を実行した結果を返す。
shared storage database queue queue、storage proxy map databaseMap、environment settings object environment、key key、および value value が与えられたとき、append an entry in the database するには、 queue 上で次の手順を実行します:
-
currentValue を、queue、databaseMap、environment、 および key で retrieve an entry from the database を実行した結果とする。
-
currentValue が failure である場合、false を返す。
-
currentValue が undefined でない場合:
-
list を新しい list とする。
-
currentValue を list に Append する。
-
value を list に Append する。
-
value を、list に対して concatenate を実行した結果に設定する。
-
-
queue、databaseMap、environment、 key、および value で store an entry in the database を実行した結果を返す。
shared storage database
queue queue、storage
proxy map databaseMap、environment settings object environment、
および
SharedStorageModifierMethod
の list
methods が与えられたとき、batch update entries in the
database するには、queue 上で次の手順を実行します:
-
originalDatabaseMap を databaseMap とする。
-
innerMethodFailed を false とする。
-
methods 内の各 method について:
-
method が
SharedStorageSetMethodである場合:-
key を method の key とする。
-
value を method の value とする。
-
ignoreIfPresent を method の ignore if present とする。
-
result を、queue、databaseMap、 environment、key、value、および ignoreIfPresent で set an entry in the database を実行した結果とする。
-
result が false である場合:
-
innerMethodFailed を true に設定する。
-
Break.
-
-
-
そうでなく、method が
SharedStorageAppendMethodである場合:-
key を method の key とする。
-
value を method の value とする。
-
result を、queue、databaseMap、 environment、key、および value で append an entry in the database を実行した結果とする。
-
result が false である場合:
-
innerMethodFailed を true に設定する。
-
Break.
-
-
-
そうでなく、method が
SharedStorageDeleteMethodである場合:-
key を method の key とする。
-
result を、queue、 databaseMap、environment、および key で delete an entry from the database を実行した結果とする。
-
result が false である場合:
-
innerMethodFailed を true に設定する。
-
Break.
-
-
-
そうでなければ:
-
Assert: method は
SharedStorageClearMethodである。 -
result を、queue、 databaseMap、および environment で clear all entries in the database を実行した結果とする。
-
result が false である場合:
-
innerMethodFailed を true に設定する。
-
Break.
-
-
-
-
innerMethodFailed である場合:
-
databaseMap を originalDatabaseMap に設定する。
-
false を返す。
-
-
true を返す。
4. Window
インターフェイスへの拡張
各 Window
オブジェクトは、関連付けられた SharedStorage
インスタンス sharedStorage
を持ちます。これは、Shared Storage が有効な場合、
Window
とともに作成され、下記の getter を持ちます。
partial interface Window { [SecureContext ]readonly attribute SharedStorage ?; };sharedStorage
sharedStorage
getter steps は次のとおりです:
-
this が fully active である場合、this の
sharedStorageを返す。 -
そうでなければ、null を返す。
5. SharedStorageModifierMethod
インターフェイスグループ
SharedStorageSetMethod、
SharedStorageAppendMethod、
SharedStorageDeleteMethod、
SharedStorageClearMethod
インターフェイスは、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
は、次の関連付けられたフィールドを持ちます:
SharedStorageAppendMethod
は、次の関連付けられたフィールドを持ちます:
SharedStorageDeleteMethod
は、次の関連付けられたフィールドを持ちます:
- key
-
string。初期値は空。
new SharedStorageSetMethod(key, value, options)
constructor steps は次のとおりです:
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorを投げる。
-
-
context が null である場合、
TypeErrorを投げる。 -
context の active window の associated document が fully active でない場合、
TypeErrorを投げる。 -
key の length が maximum length を超える場合、
TypeErrorを投げる。 -
value の length が maximum length を超える場合、
TypeErrorを投げる。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorを投げる。 -
this の ignore if present を options["
ignoreIfPresent"] に設定する。
new SharedStorageAppendMethod(key, value, options)
constructor steps は次のとおりです:
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorを投げる。
-
-
context が null である場合、
TypeErrorを投げる。 -
context の active window の associated document が fully active でない場合、
TypeErrorを投げる。 -
key の length が maximum length を超える場合、
TypeErrorを投げる。 -
value の length が maximum length を超える場合、
TypeErrorを投げる。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorを投げる。
new SharedStorageAppendMethod(key, options)
constructor steps は次のとおりです:
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorを投げる。
-
-
context が null である場合、
TypeErrorを投げる。 -
context の active window の associated document が fully active でない場合、
TypeErrorを投げる。 -
key の length が maximum length を超える場合、
TypeErrorを投げる。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorを投げる。
new SharedStorageClearMethod(options)
constructor steps は次のとおりです:
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorを投げる。
-
-
context が null である場合、
TypeErrorを投げる。 -
context の active window の associated document が fully active でない場合、
TypeErrorを投げる。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorを投げる。
6. SharedStorage
インターフェイス
SharedStorage
インターフェイスは、Window
および SharedStorageWorklet
に公開されます。
データの設定および/または削除を許可するメソッドは、Window
と SharedStorageWorklet
の両方に公開されますが、それらの実装は environment によって異なる場合があります。これにより、複数の context から Shared Storage
内のデータを変更できるようになります。
一方、SharedStorageWorkletGlobalScope
内で実行する operations を投稿するためのメソッド(すなわち selectURL()
および run())、
ならびに worklet
属性(これは addModule()
を呼び出すために使用されます)は、Window
のみに公開されます。これらは、Window
が SharedStorageWorklet
とやり取りするための手段であるためです。
他方、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 = "context-origin"; };dataOrigin
6.1. SharedStorage
上の Run Operation Methods
selectURL(name, urls, options)
メソッドの手順は次のとおりです:
run(name, options) メソッドの手順は次のとおりです:
6.2. SharedStorage
経由で新しい worklet を作成する
createWorklet(moduleURL, options)
メソッドの手順は次のとおりです:
-
sharedStorageWorklet を新しい
SharedStorageWorkletとする。 -
options が "
dataOrigin" を contains する場合、 sharedStorageWorklet の data origin を options["dataOrigin"] に設定する。 -
addModulePromise を、sharedStorageWorklet.
addModule(moduleURL, options) を呼び出した結果とする。 -
resultPromise を新しい promise とする。
-
addModulePromise の upon fulfillment 時に、resultPromise を sharedStorageWorklet で resolve する。
-
addModulePromise の upon rejection 時に、resultPromise を
TypeErrorで reject する。 -
resultPromise を返す。
6.3. BatchUpdate メソッド
batchUpdate(methods, options)
メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。
-
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
methods 内の各 method について:
-
method["
withLock"] が exists する場合:-
TypeErrorで promise rejected されたものを返す。
注:
batchUpdate()は transactional operation として実行されます。より細粒度な locking に起因する潜在的な deadlock を避けるため、batchUpdate()内部の inner methods はwithLockオプションを利用できません。このオプションを無視する代わりに、 制限を強制し誤用を防止するためにエラーが投げられます。 -
-
-
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
onLockGrantedCallback を、次の手順を実行する algorithm とする:
-
queue 上に Enqueue the following steps する:
-
result を、queue、 databaseMap、environment、および methods で batch update entries in the database を実行した結果とする。
-
result が false であり、かつ globalObject が
SharedStorageWorkletGlobalScopeである場合:-
promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。 -
これらの手順を中止する。
-
-
promise を undefined で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
-
options["
withLock"] が exists する場合、environment の origin、options["withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。 -
そうでなければ、onLockGrantedCallback を実行する。
-
promise を返す。
6.4. Setter/Deleter メソッド
set(key, value, options)
メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。
-
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
key の length が maximum length を超える場合、
TypeErrorで promise rejected されたものを返す。 -
value の length が maximum length を超える場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を、context の関連付けられた database の shared storage database queue とする。
-
realm を current realm とする。
-
onLockGrantedCallback を、次の手順を実行する algorithm とする:
-
queue 上に Enqueue the following steps する:
-
result を、queue、databaseMap、 environment、key、value、および options["
ignoreIfPresent"] で set an entry in the database を実行した結果とする。 -
result が false であり、かつ globalObject が
SharedStorageWorkletGlobalScopeである場合:-
promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。 -
これらの手順を中止する。
-
-
promise を undefined で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
-
options["
withLock"] が exists する場合:-
options["
withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorで promise rejected されたものを返す。 -
environment の origin、options["
withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。
-
-
そうでなければ、onLockGrantedCallback を実行する。
-
promise を返す。
append(key, value, options)
メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。
-
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
key の length が maximum length を超える場合、
TypeErrorで promise rejected されたものを返す。 -
value の length が maximum length を超える場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を、context の関連付けられた database の shared storage database queue とする。
-
realm を current realm とする。
-
onLockGrantedCallback を、次の手順を実行する algorithm とする:
-
queue 上に Enqueue the following steps する:
-
result を、queue、databaseMap、 environment、key、および value で append an entry in the database を実行した結果とする。
-
result が false であり、かつ globalObject が
SharedStorageWorkletGlobalScopeである場合:-
promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。 -
これらの手順を中止する。
-
-
promise を undefined で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
-
options["
withLock"] が exists する場合:-
options["
withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorで promise rejected されたものを返す。 -
environment の origin、options["
withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。
-
-
そうでなければ、onLockGrantedCallback を実行する。
-
promise を返す。
delete(key, options) メソッドの手順は
次のとおりです:
-
promise を新しい promise とする。
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。
-
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
key の length が maximum length を超える場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を、context の関連付けられた database の shared storage database queue とする。
-
realm を current realm とする。
-
onLockGrantedCallback を、次の手順を実行する algorithm とする:
-
queue 上に Enqueue the following steps する:
-
result を、queue、 databaseMap、および key で delete an entry from the database を実行した結果とする。
-
result が false であり、かつ globalObject が
SharedStorageWorkletGlobalScopeである場合:-
promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。 -
これらの手順を中止する。
-
-
promise を undefined で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
-
options["
withLock"] が exists する場合:-
options["
withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorで promise rejected されたものを返す。 -
environment の origin、options["
withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。
-
-
そうでなければ、onLockGrantedCallback を実行する。
-
promise を返す。
clear(options) メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
-
そうでなければ:
-
context を globalObject の outside settings の target browsing context に設定する。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。
-
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
databaseMap を、environment および environment の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を、context の関連付けられた database の shared storage database queue とする。
-
realm を current realm とする。
-
onLockGrantedCallback を、次の手順を実行する algorithm とする:
-
queue 上に Enqueue the following steps する:
-
result を、queue および databaseMap で clear all entries in the database を実行した結果とする。
-
result が false であり、かつ globalObject が
SharedStorageWorkletGlobalScopeである場合:-
promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。 -
これらの手順を中止する。
-
-
promise を undefined で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
-
options["
withLock"] が exists する場合:-
options["
withLock"] が U+002D HYPHEN-MINUS (-) で始まる場合、TypeErrorで promise rejected されたものを返す。 -
environment の origin、options["
withLock"]、 onLockGrantedCallback が与えられた状態で handle callback within a shared storage lock を実行する。
-
-
そうでなければ、onLockGrantedCallback を実行する。
-
promise を返す。
6.5. Getter メソッド
get(key) メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
globalObject を、current realm の global object とする。
-
context を null とする。
-
environment を null とする。
-
globalObject が
Windowである場合:-
context を globalObject の browsing context に設定する。
-
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object に設定する。
-
allowedInOpaqueOriginContext を false とする。
-
environment、 environment の origin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、
TypeErrorで promise rejected されたものを返す。 -
environment および environment の origin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、
OperationErrorで promise rejected されたものを返す。 -
document を context の active document とする。
-
"fenced-unpartitioned-storage-read"、 document、および environment の origin について Is feature enabled in document for origin? を実行した結果が false である場合、
OperationErrorで promise rejected されたものを返す。 -
navigable を document の node navigable とする。
-
navigable が与えられた状態で determine if a navigable has fully revoked network を実行した結果が false である場合、
OperationErrorで promise rejected されたものを返す。
-
-
そうでなければ: 1
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。-
context を
SharedStorageのSharedStorageWorkletGlobalScopeの outside settings の target browsing context に設定する。 -
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object に設定する。
-
-
key の length が maximum length を超える場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
realm を current realm とする。
-
databaseMap を、environment および realm の settings object の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を context の関連付けられた database の shared storage database queue とする。
-
queue 上に Enqueue the following steps する:
-
value を、queue、databaseMap、 environment、および key で retrieve an entry from the database を実行した結果とする。
-
value が failure である場合、promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。 -
そうでなく、value が undefined である場合、promise を undefined で resolve するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。
-
そうでなければ、promise を value で resolve するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。
-
-
promise を返す。
length() メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。 -
context を
SharedStorageのSharedStorageWorkletGlobalScopeの outside settings の target browsing context とする。 -
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
realm を current realm とする。
-
databaseMap を、environment および realm の settings object の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を context の関連付けられた database の shared storage database queue とする。
-
queue 上に Enqueue the following steps する:
-
numEntries を、queue および environment で count entries in the database を実行した結果とする。
-
numEntries が failure である場合、promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。 -
そうでなければ、promise を numEntries で resolve するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。
-
-
promise を返す。
remainingBudget() メソッドの手順は次のとおりです:
-
promise を新しい promise とする。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。 -
context を
SharedStorageのSharedStorageWorkletGlobalScopeの outside settings の target browsing context とする。 -
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
realm を current realm とする。
-
allowedInOpaqueOriginContext を false とする。
-
environment、realm の settings object の origin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、
TypeErrorで promise rejected されたものを返す。 -
environment および realm の settings object の origin が与えられた状態で check if user preference setting allows access to shared storage を実行した結果が false である場合、
TypeErrorで promise rejected されたものを返す。 -
site を、realm の settings object の origin で obtain a site を実行した結果とする。
-
Assert: site は opaque origin ではない。
-
queue を context の関連付けられた database の shared storage database queue とする。
-
queue 上に Enqueue the following steps する:
-
remainingBudget を、site で determine remaining navigation budget を実行した結果とする。
-
promise を remainingBudget で resolve するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。
-
-
promise を返す。
6.6. 反復処理
各 SharedStorage
async iterator インスタンスは、entries の queue 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 は次のとおりです:
-
promise を新しい promise とする。
-
SharedStorageに関連付けられたSharedStorageWorkletGlobalScopeについて check whether addModule is finished を実行した結果が false である場合、TypeErrorで promise rejected されたものを返す。 -
context を
SharedStorageのSharedStorageWorkletGlobalScopeの outside settings の target browsing context とする。 -
context が null である場合、
TypeErrorで promise rejected されたものを返す。 -
context の active window の associated document が fully active でない場合、
TypeErrorで promise rejected されたものを返す。 -
environment を context の active window の relevant settings object とする。
-
realm を current realm とする。
-
databaseMap を、environment および realm の settings object の origin が与えられた状態で obtain a shared storage bottle map を実行した結果とする。
-
databaseMap が failure である場合、
TypeErrorで promise rejected されたものを返す。 -
queue を context の関連付けられた database の shared storage database queue とする。
-
queue 上に Enqueue the following steps する:
-
entries を、queue および environment で retrieve all entries from the database を実行した結果とする。
-
entries が failure である場合、promise を
TypeErrorで reject するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。 -
そうでなければ、promise を entries で resolve するため、realm の global object が与えられた DOM manipulation task source 上に queue a global task する。
-
-
promise の upon fulfillment 時に、次を実行する:
-
promiseEntries を promise の値とする。
-
promiseEntries 内の各 entry entry について For each、entry を iterator の pending entries に enqueue する。
-
-
promise の upon rejection 時に、iterator の error を true に設定する。
SharedStorage
の
async iterator iterator が与えられたとき、
get the next iteration result
するには、次の手順を実行する:
-
promise を新しい promise とする。
-
Enqueue the following steps する:
-
iterator の error が true である場合、
TypeErrorで promise rejected されたものを返す。 -
iterator の pending entries が empty である場合:
-
オブジェクト doneObject を作成する。
-
promise を doneObject で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
これらの手順を中止する。
-
-
そうでなければ、entry を iterator の pending entries から dequeue した結果とする。
-
promise を entry で resolve するため、realm の global object が与えられた DOM manipulation task source 上に Queue a global task する。
-
-
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 attribute を reflect しなければなりません。
8.2. HTML アルゴリズムの変更
8.2.1. Update the image data アルゴリズムへの変更
次の手順の後に
request の priority を現在の状態に設定する...
次の手順を追加する
-
要素が
sharedstoragewritable属性を持つ場合、request の shared storage writable を true に設定する。
8.2.2. Create navigation params by fetching アルゴリズムへの変更
次の手順の後に
request を、... を伴う新しい request とする。
次の手順を追加する
-
navigable の container が
iframe要素であり、かつそれがsharedstoragewritablecontent attribute を持つ場合、 request の shared 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 アルゴリズムへの変更
次の手順の前に
this の request を request に設定する。
次の手順を追加する
-
init["
sharedStorageWritable"] が exists する場合、request の shared storage writable をそれに設定する。
9.2.2. HTTP network or cache fetch アルゴリズムへの変更
次の手順の前に
httpRequest の header list を HTTP に従って変更する。...
次の手順を追加する
-
httpRequest に対して Append or modify a Sec-Shared-Storage-Writable request header する。
9.2.3. HTTP fetch アルゴリズムへの変更
次の手順の前に
internalResponse の status が redirect status である場合: ...
次の手順を追加する
-
request の destination が "sharedstorageworklet" である場合:
-
dataOriginValue を、request の header list から `
Sec-Shared-Storage-Data-Origin` を getting した結果とする。 -
dataOriginValue が null でない場合:
-
dataOriginUrl を、 dataOriginValue に対して URL parser を実行した結果とする。
-
Assert: dataOriginUrl は failure でない。
-
Assert: request の origin と request の URL の origin は same origin でない。
-
allowed を true とする。
-
dataOriginUrl の origin と request の URL の origin が same origin である場合:
-
responseHeaders を internalResponse の header list とする。
-
allowed を、 `
Shared-Storage-Cross-Origin-Worklet-Allowed`、 "item"、および入力としての responseHeaders が与えられた状態で get a structured field value アルゴリズムを実行した結果とする。
-
-
allowed が false である場合、network error を返す。
-
-
-
入力として 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 header の value は string である。
`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 header は Structured 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 header は Structured Header であり、その値は Boolean でなければならない。
request が
`Sec-Shared-Storage-Writable`
を true に設定する場合、その response は shared storage に書き込むことができる。
9.3.4.
`Shared-Storage-Write`
レスポンスヘッダー
この仕様は、Shared-Storage-Write HTTP response header を定義する。
`Shared-Storage-Write`
response header は Structured Header であり、その値は List でなければならない。次の list
members が定義される。同じ文字列を保持する Tokens と Strings は等価とみなされる。HTTP
ヘッダーを介して non-ASCII Unicode keys および
values の書き込みと削除の機能を提供するため、UTF-8 encoded bytes を表す Byte Sequences も許可される。
未知の list members は、strings でも Byte Sequences でもない型を含め、 スキップされ、list の残りはそれらが存在しなかったものとして処理される。members は、必須 parameters が欠落している場合、またはそれらの parameters が予期しない型を持つ場合にもスキップされる。
-
set-
必須 parameters:
-
key(Token, String, or Byte Sequence) -
value(Token, String, or Byte Sequence)
-
-
任意 parameter:
-
ignore_if_present(Boolean)
-
-
ignore_if_presentの parameter 値が null または false である場合、またはkeyの parameter 値が responding server の origin のための shared storage database にまだ存在しない場合、setはkeyおよびvalueの parameter 値から成る entry を、それぞれ entry の key および entry の value struct の value として、responding server の origin のための shared storage database に書き込む。 -
ignore_if_presentの parameter 値が true であり、keyの parameter 値が responding server の origin のための shared storage database に既に存在する場合、setは no-op である。
-
-
append-
必須 parameters:
-
key(Token, String, or Byte Sequence) -
value(Token, String, or Byte Sequence)
-
-
keyの parameter 値が responding server の origin のための shared storage database に既に存在する場合、appendは、valueの parameter 値を末尾に追加することで、その key の entry の value struct の value を更新する。 -
keyの parameter 値が responding server の origin のための shared storage database にまだ存在しない場合、appendはignore_if_presentが false のsetと等価である。すなわち、appendはkeyおよびvalueの parameter 値から成る entry を、それぞれ entry の key および entry の value struct の value として、responding server の origin のための shared storage database に書き込む。
-
-
delete-
必須 parameter:
-
key(Token, String, or Byte Sequence)
-
-
deleteは、responding server の origin のための shared storage database 内にある、key がkeyの parameter 値と等しい任意の entry を消去する。
-
-
clear-
clearは、responding server の origin のための shared storage database 内のすべての entries を消去する。
-
注: Unicode keys および values に対応するため、Byte Sequences を許可する。任意の Byte Sequence は UTF-8 encoded であると仮定され、それ以外の場合は解析に失敗する。
例を追加する。
9.4. Shared Storage Fetch 関連アルゴリズム
-
window を request の window とする。
-
window が、その global object が
Windowである environment settings object でない場合、false を返す。 -
allowedInOpaqueOriginContext を true とする。
-
window、request の current URL の origin、および allowedInOpaqueOriginContext が与えられた状態で determine whether shared storage is allowed by context を実行した結果が false である場合、false を返す。
-
window および request の current URL の origin が与えられた状態で 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 の shared storage writable が true でない場合、 return する。
注: リダイレクト時には、 request の shared storage writable が true であっても、 リダイレクトが shared storage を使用する権限を持たず、その結果 request に対して determine whether a request can currently use shared storage を実行した結果が false になることがある。
-
request に対して determine whether a request can currently use shared storage を実行した結果が false である場合、request の header list から `
Sec-Shared-Storage-Writable` を delete する。 -
そうでなければ、request の header list 内で set a structured field value (`
Sec-Shared-Storage-Writable`, true) する。
-
sharedStorageWritable を、 `
Sec-Shared-Storage-Writable`、 "item"、および入力としての request の header list が与えられた状態で get a structured field value アルゴリズムを実行した結果とする。 -
sharedStorageWritable が null である、または sharedStorageWritable が Boolean でない、または sharedStorageWritable の値が false である場合、return する。
-
window を request の window とする。
-
Assert: window は、その global object が
Windowである environment settings object である。 -
sharedStorage を window の global object の
sharedStorageとする。 -
sharedStorage が null である場合、return する。
-
list を response の header list とする。
-
operationsToParse を、 `
Shared-Storage-Write`、 "list"、および入力としての list が与えられた状態で get a structured field value アルゴリズムを実行した結果とする。 -
operationsToParse が null または empty である場合、 return する。
-
methods を空の list とする。
-
batchWithLock を null とする。
-
operationsToParse 内の各 tuple (item, parameters) について、 次の手順を実行する:
-
item が Inner List である場合、continue する。
-
methodOrOptionsString を item に対して get the string value を実行した結果とする。
-
methodOrOptionsString が failure である場合、continue する。
-
methodOrOptionsString で switch する:
- methodOrOptionsString が "
clear" である場合: -
次の手順を実行する:
-
options を新しい
SharedStorageModifierMethodOptionsとする。 -
withLock を、parameters および "
with_lock" で obtain a string-like parameter value を実行した結果とする。 -
withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["
withLock"] を withLock に set する。 -
method を new
SharedStorageClearMethod(options) とする。 -
an exception was thrown である場合、 continue する。
-
method を methods に Append する。
-
Continue.
-
- methodOrOptionsString が "
delete" である場合: -
次の手順を実行する:
-
key を、parameters および "
key" で obtain a string-like parameter value を実行した結果とする。 -
key が null である場合、continue する。
-
options を新しい
SharedStorageModifierMethodOptionsとする。 -
withLock を、parameters および "
with_lock" で obtain a string-like parameter value を実行した結果とする。 -
withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["
withLock"] を withLock に set する。 -
method を new
SharedStorageDeleteMethod(key, options) とする。 -
an exception was thrown である場合、 continue する。
-
method を methods に Append する。
-
Continue.
-
- methodOrOptionsString が "
append" である場合: -
次の手順を実行する:
-
key を、parameters および "
key" で obtain a string-like parameter value を実行した結果とする。 -
key が null である場合、continue する。
-
value を、parameters および "
value" で obtain a string-like parameter value を実行した結果とする。 -
value が null である場合、continue する。
-
options を新しい
SharedStorageModifierMethodOptionsとする。 -
withLock を、parameters および "
with_lock" で obtain a string-like parameter value を実行した結果とする。 -
withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["
withLock"] を withLock に set する。 -
method を new
SharedStorageAppendMethod(key, value, options) とする。 -
an exception was thrown である場合、 continue する。
-
method を methods に Append する。
-
Continue.
-
- methodOrOptionsString が "
set" である場合: -
次の手順を実行する:
-
key を、parameters および "
key" で obtain a string-like parameter value を実行した結果とする。 -
key が null である場合、continue する。
-
value を、parameters および "
value" で obtain a string-like parameter value を実行した結果とする。 -
value が null である場合、continue する。
-
options を新しい
SharedStorageSetMethodOptionsとする。 -
parameters および "
ignore_if_present" で obtain a boolean parameter value を実行した結果が true である場合、options["ignoreIfPresent"] を true に set する。 -
withLock を、parameters および "
with_lock" で obtain a string-like parameter value を実行した結果とする。 -
withLock が null でなく、かつ withLock が U+002D HYPHEN-MINUS (-) で始まらない場合、options["
withLock"] を withLock に set する。 -
method を new
SharedStorageSetMethod(key, value, options) とする。 -
an exception was thrown である場合、 continue する。
-
method を methods に Append する。
-
Continue.
-
- methodOrOptionsString が "
options" である場合: -
次の手順を実行する:
-
batchWithLock を、parameters および "
with_lock" で obtain a string-like parameter value を実行した結果に設定する。 -
Continue.
-
- methodOrOptionsString がそれ以外である場合:
- Continue.
- methodOrOptionsString が "
-
-
batchOptions を新しい
SharedStorageModifierMethodOptionsとする。 -
batchWithLock が null でなく、かつ batchWithLock が U+002D HYPHEN-MINUS (-) で始まらない場合、batchOptions["
withLock"] を batchWithLock に設定する。 -
sharedStorage.
batchUpdate(methods, batchOptions) を実行する。
-
item が String、Token、または Byte Sequence である場合、true を返す。
-
そうでなければ、false を返す。
-
item に対して check if string-like を実行した結果が false である場合、 failure を返す。
-
item の型で switch する:
- item が Token である場合:
- item が String である場合:
-
次の手順を実行する:
-
Assert: item は ASCII string である。
-
item を返す。
-
- item が Byte Sequence である場合:
-
次の手順を実行する:
-
fromUTF8 を、item に対して UTF-8 decode を実行した結果とする。
-
fromUTF8 が error である場合、null を返す。
-
fromUTF8 を返す。
-
- item が Token である場合:
-
parameters が paramKey を contain しない場合、null を返す。
-
parameters[paramKey] について check if string-like を実行した結果が false である場合、null を返す。
-
parameters[paramKey] に対して get the string value を実行した結果を返す。
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
に含める(すなわち、SharedStorageWorkletNavigator
に LockManager
インスタンスを含める):
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 は、次の手順に更新されるべきである:
-
globalObject を、current realm の global object とする。
-
globalObject が
SharedStorageWorkletGlobalScopeである場合:-
globalObject の addModule success が false である場合、
TypeErrorを投げる。
-
-
this の relevant settings object の
LockManagerobject を返す
10.6. "obtain a lock manager" アルゴリズムに対する Monkey Patch
obtain a lock manager アルゴリズムの前に、次の手順を追加すべきである:
-
current realm の global object が
SharedStorageWorkletGlobalScopeである場合:-
workletDataOrigin を environment の origin とする。
-
shared storage lock managers map[workletDataOrigin] を返す。
-
10.7. "Handle callback within a shared storage lock" アルゴリズム
-
environment を this の relevant settings object とする。
-
lockManager を shared storage lock managers map[workletDataOrigin] とする。
-
promise を a new promise とする。
-
defaultOptions を新しい
LockOptionsとする。 -
promise、現在の agent、environment の id、lockManager、callback、 name、defaultOptions["
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()
から返された Promise
が resolved
した場合に限られるようにする。
これらのそれぞれについて、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 frame が reportEvent()
API を呼び出すたびに、数ビットのエントロピーが漏洩する可能性がある。
embedder はまた、Private Aggregation API 経由で aggregatable reports を送信できる。この API は differential privacy を実現するためにノイズを追加し、レポート送信に時間遅延を用い、送信されるレポート数に制限を課し、個人のプライバシーが保護されるようレポートを aggregate data に処理する。