1. 소개
이 절은 규범적이지 않다.사이트 간 사용자 추적을 방지하기 위해, 브라우저는 모든 형태의 저장소를 top-level traversable 사이트별로 분할하고 있다. Client-Side Storage Partitioning을 보라. 그러나 현재 분할되지 않은 저장소에 의존하는 정당한 사용 사례가 많이 있다.
이 문서는 분할되지 않은 저장소가 필요한 여러 사용 사례를 지원하기 위해, 의도적으로 top-level traversable 사이트별로 분할되지 않는 새로운 저장소 API를 소개한다(다만 여전히 context origin별로는
분할된다).
사용자의 사이트 간 재식별을 제한하기 위해, Shared Storage의 데이터는 두 개의 제한된 환경에서만 읽을 수 있다. 그중 하나는
worklet이라고 하며, worklet의 모든 출력은 fenced frame 또는 Private Aggregation 보고서 형태이다. 시간이 지나면서 표준에 추가적인 worklet 출력
게이트가 포함될 수 있다.
다른 제한된 환경은 fenced frame의 콘텐츠 내부이며, 이 환경은 disableUntrustedNetwork()
호출이 resolve된 뒤에 해당된다.
이는 읽은 데이터가 프레임 밖으로 공유되는 것을 방지한다.
a.example은 사이트 간에 일관된 방식으로 사용자를 그룹에 무작위로
할당한다.
a.example iframe 내부:
function generateSeed() { …} await window. sharedStorage. worklet. addModule( 'experiment.js' ); // a.example의 저장소에 사이트 간 seed가 아직 없을 때만 쓴다. 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 script를 제공하여 Shared Storage 데이터를 처리한 뒤, 하나 이상의 출력 게이트를 통해 결과를 출력할 수 있게 한다.
현재 두 개의 출력 게이트가 있으며, Private
Aggregation 출력 게이트와 URL-selection
출력 게이트이다.
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 script를 추가하면,
호출자가 Shared Storage의 데이터를 module script에 정의된 전역 변수에 저장한 뒤, 나중의
addModule()
호출을 통해 그 데이터를 유출할 수 있게 되므로,
각 SharedStorageWorklet은
addModule()를
한 번만 호출할 수 있다. addModule initiated boolean은 이 제한을 강제할 수 있게
한다.
worklet에 대해 addModule()가
호출되면, addModule이 허용되는지 확인하고 상태 갱신을 실행하며, 그 결과가
"DisallowedDueToNonPreferenceError"이거나, 그 결과가
"DisallowedDueToPreferenceError"이고 worklet의 has cross-origin data origin이
false이면, § 2.2.6 addModule()에 대한 Monkey Patch에 자세히 설명된 대로 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는 현재 context(
Window에서 호출될 때)이거나 worklet을 생성한Window와 연결된 environment settings object(SharedStorageWorkletGlobalScope에서 호출될 때)이며, 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의 경우,
createWorklet()이 dataOrigin 옵션의 값"script-origin"을 사용하여 cross-origin worklet script로 호출되는 경우(그 결과 has cross-origin data origin이 true인 worklet이 됨), 그리고 has cross-origin data origin이 true인 worklet에서 동작하는selectURL()및run()의 경우, allowedInOpaqueOriginContext는 true이다. 다른 메서드의 경우 allowedInOpaqueOriginContext는 false이다.
SharedStorageWorklet
worklet 및 URL moduleURLRecord가 주어졌을 때, 다음 단계를 실행한다:
-
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으로 둔다.
-
context에 의해 공유 저장소가 허용되는지 결정을 current settings object, workletDataOrigin, 그리고 allowedInOpaqueOriginContext와 함께 실행한 결과가 false이면, "DisallowedDueToNonPreferenceError"를 반환한다.
-
worklet의 has cross-origin data origin을 hasCrossOriginDataOrigin으로 설정한다.
-
사용자 환경설정이 공유 저장소에 대한 접근을 허용하는지 확인을 current settings object 및 workletDataOrigin과 함께 실행한 결과가 false이면, "DisallowedDueToPreferenceError"를 반환한다.
-
"Allowed"를 반환한다.
또한 각 SharedStorageWorklet의
global scopes 목록은 처음에는 비어 있으며, 해당 worklet global scope type의 인스턴스인 SharedStorageWorkletGlobalScope를
최대 하나만 포함할 수 있다.
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가 주어졌을 때, 다음 단계를 실행한다. 이 알고리즘은 urlList에서 선택된 URL의 인덱스를 값으로 하는
unsigned long으로
resolve되는
promise와, top-level traversable의
예산이 charged되어야 하는지 나타내는
boolean으로 구성된
tuple을 반환한다.
-
promise를 새 promise로 둔다.
-
window를 worklet의 relevant settings object로 둔다.
-
window의 browsing context가 null이면, (
TypeError로 rejected된 promise, true)의 tuple을 반환한다. -
window의 associated document가 fully active가 아니면, (
TypeError로 rejected된 promise, 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가 주어졌을 때 저장된 인덱스 결과를 처리할 callback 얻기를 실행한 결과로 둔다.
-
savedIndex를 navigable, workletDataOrigin, moduleURLRecord, operationName, savedQueryName 및 callbackTask에 대해 저장된 질의에 대한 인덱스 가져오기를 실행한 결과로 둔다.
-
savedIndex가 "pending callback"이면, tuple (promise, false)를 반환한다.
Note: 이제 callbackTask는 이전에 얻은 worklet agent가 이 질의에 대한 인덱스를 선택하는 작업을 완료할 때 실행되도록 저장된다. callbackTask의 단계가 실행되면, promise가 resolve된다.
-
savedIndex가
unsigned long이면:-
window가 주어졌을 때, DOM manipulation task source의 global task를 queue하여, savedIndex가 주어졌을 때 callbackTask의 단계를 실행한다.
Note: callbackTask의 단계를 실행하면 promise가 resolve된다.
-
tuple (promise, false)를 반환한다.
-
-
Assert: savedIndex는 "pending current operation"이다.
-
-
globalScope의 worklet event loop에 task를 queue하여 다음 단계를 수행한다:
-
operationMap을 globalScope의 operation map으로 둔다.
-
operationMap이 operationName을 contain하지 않으면, window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를
TypeError로 reject하고, 이 단계를 중단한다.Note: 이는
register()가 operationName으로 호출된 적이 없는 경우 발생할 수 있다. -
Assert: operationMap[operationName]의 associated realm은 this의 relevant realm이다.
-
operation을 operationMap[operationName]을
RunFunctionForSharedStorageSelectURLOperation로 converted한 값으로 둔다. -
privateAggregationCompletionTask를 workletDataOrigin, preSpecifiedParams 및 aggregationCoordinator가 주어졌을 때 Private Aggregation scope 설정의 결과로 둔다.
-
argumentsList를 « urlList »인 list로 둔다.
-
indexPromise를 argumentsList와 함께 operation을 invoking한 결과로 둔다.
-
indexPromise에 react한다:
- 값 index로 fulfilled된 경우:
-
-
index가 urlList의 size보다 크면:
-
savedQueryName이 빈 문자열이 아닌 string이면, window, navigable, workletDataOrigin, moduleURLRecord, operationName, savedQueryName, 그리고 기본 selectURL index와 함께 저장된 질의에 대한 인덱스 저장을 실행한다.
-
window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를
TypeError로 reject하고, 이 단계를 중단한다.
Note: 결과 index가 입력 urls의 size를 벗어난다. 이는 selectURL() 프로토콜을 위반하며, 어느 url을 선택해야 하는지 알 수 없다.
그렇지 않으면:
-
savedQueryName이 빈 문자열이 아닌 string이면, window, navigable, workletDataOrigin, moduleURLRecord, operationName, savedQueryName, 그리고 index와 함께 저장된 질의에 대한 인덱스 저장을 실행한다.
-
window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를 index로 resolve한다.
-
privateAggregationCompletionTask를 실행한다.
-
-
- rejected된 경우:
-
-
savedQueryName이 빈 문자열이 아닌 string이면, window, navigable, workletDataOrigin, moduleURLRecord, operationName, savedQueryName, 그리고 기본 selectURL index와 함께 저장된 질의에 대한 인덱스 저장을 실행한다.
-
window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를
TypeError로 reject한다.Note: 이는 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가 주어졌을 때, 다음 단계를 수행한다:
-
site를 document의 origin으로 obtain a site를 실행한 결과로 둔다.
-
remainingBudget을 environment 및 site와 함께 남은 navigation budget 결정을 실행한 결과로 둔다.
-
pendingBits를 urlList의 size의 밑이 2인 로그로 둔다.
-
shouldChargeTopLevelBudgets가 true이면:
-
pageBudgetResult를 navigable, site, 및 pendingBits와 함께 shared storage top-level traversable budgets 부과를 실행한 결과로 둔다.
-
pageBudgetResult가 false이면 shouldUseDefaultIndex를 true로 설정한다.
-
-
pendingBits가 remainingBudget보다 크면, shouldUseDefaultIndex를 true로 설정한다.
-
shouldUseDefaultIndex가 true이면, resultIndex를 기본 selectURL index로 설정한다.
-
finalConfig를 새 fenced frame config로 둔다.
-
finalConfig의 mapped url을 urlList[resultIndex]로 설정한다.
-
finalConfig의 "pending shared storage budget debit" field를 pendingBits로 설정한다.
-
urn 및 finalConfig와 함께 fencedFrameConfigMapping에서 pending config finalize를 수행한다.
-
resultURLWithMetadata를 urls[resultIndex]로 둔다.
-
resultURLWithMetadata에 "
reportingMetadata" 필드가 있으면, resultURLWithMetadata["reportingMetadata"]와 함께 reporting metadata 등록을 실행한다. -
options["
keepAlive"]가 false이면, worklet와 함께 worklet global scope 종료를 실행한다.
selectURL(name, urls, options)
메서드 단계는 다음과 같다:
-
resultPromise를 새 promise로 둔다.
-
this의 addModule initiated가 false이면,
TypeError로 rejected된 promise를 반환한다. -
window를 this의 relevant settings object로 둔다.
-
context를 window의 browsing context로 둔다.
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
preSpecifiedParams를 options 및 context가 주어졌을 때 pre-specified report parameters 얻기의 결과로 둔다.
-
preSpecifiedParams가
DOMException이면, preSpecifiedParams로 rejected된 promise를 반환한다. -
aggregationCoordinator를 options가 주어졌을 때 aggregation coordinator 얻기의 결과로 둔다.
-
aggregationCoordinator가
DOMException이면, aggregationCoordinator로 rejected된 promise를 반환한다. -
document를 context의 active document로 둔다.
-
this의 global scopes가 empty이면,
TypeError로 rejected된 promise를 반환한다.Note: 이는
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로 rejected된 promise를 반환한다. -
globalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,
TypeError로 rejected된 promise를 반환한다. -
urls가 비어 있거나 urls의 size가 8보다 크면,
TypeError로 rejected된 promise를 반환한다.Note: 여기서 8을 선택한 것은 결과 fenced frame이 클릭될 때
selectURL()호출 하나가 최대 log2(8) = 3비트의 정보만 누설할 수 있도록 하기 위해서이다. 호출당 많은 정보는 아니다. -
urlList를 빈 list로 둔다.
-
urls의 각 urlWithMetadata에 대해 for each:
-
urlWithMetadata에 "
url" 필드가 없으면,TypeError로 rejected된 promise를 반환한다. -
그렇지 않으면, urlString을 urlWithMetadata["
url"]로 둔다. -
serializedUrl를 urlString과 함께 유효한 경우 canonical URL 문자열 가져오기를 실행한 결과로 둔다.
-
serializedUrl가 undefined이면,
TypeError로 rejected된 promise를 반환한다. -
그렇지 않으면, serializedUrl를 urlList에 append한다.
-
urlWithMetadata에 "
reportingMetadata" 필드가 있으면:-
reportingMetadata를 urlWithMetadata["
reportingMetadata"]로 둔다. -
reportingMetadata와 함께 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에서 pending config 저장을 실행한 결과로 둔다.
-
urn이 failure이면,
TypeError로 rejected된 promise를 반환한다. -
environment를 window의 relevant settings object로 둔다.
-
allowedInOpaqueOriginContext를 this의 has cross-origin data origin으로 둔다.
-
environment, workletDataOrigin, 그리고 allowedInOpaqueOriginContext가 주어졌을 때 context에 의해 공유 저장소가 허용되는지 결정을 실행한 결과가 false이면,
TypeError로 rejected된 promise를 반환한다. -
environment 및 workletDataOrigin가 주어졌을 때 사용자 환경설정이 공유 저장소에 대한 접근을 허용하는지 확인을 실행한 결과가 false이면:
-
this의 has cross-origin data origin이 false이면,
TypeError로 rejected된 promise를 반환한다.
-
-
options["
resolveToConfig"]가 true이면, resultPromise를 pendingConfig로 resolve한다. -
그렇지 않으면, resultPromise를 urn으로 resolve한다.
-
(indexPromise, shouldChargeTopLevelBudgets)를 select-url 결과 인덱스 가져오기를 this, name, urlList, workletDataOrigin, navigable, options, preSpecifiedParams 및 aggregationCoordinator와 함께 실행한 결과로 둔다.
-
indexPromise가 resultIndex로 fulfillment되면, 인덱스 선택 결과 처리를 worklet, environment, document, urls, urlList, navigable, options, fencedFrameConfigMapping, urn, shouldChargeTopLevelBudgets, false, 그리고 resultIndex와 함께 실행한다.
-
indexPromise가 rejection되면, 인덱스 선택 결과 처리를 worklet, environment, document, urls, urlList, navigable, options, fencedFrameConfigMapping, urn, shouldChargeTopLevelBudgets, true, 그리고 기본 selectURL index와 함께 실행한다.
-
resultPromise를 반환한다.
run(name, options) 메서드
단계는 다음과 같다:
-
promise를 새 promise로 둔다.
-
this의 addModule initiated가 false이면,
TypeError로 rejected된 promise를 반환한다. -
window를 this의 relevant settings object로 둔다.
-
context를 window의 browsing context로 둔다.
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
preSpecifiedParams를 options 및 context가 주어졌을 때 pre-specified report parameters 얻기의 결과로 둔다.
-
preSpecifiedParams가
DOMException이면, preSpecifiedParams로 rejected된 promise를 반환한다. -
aggregationCoordinator를 options가 주어졌을 때 aggregation coordinator 얻기의 결과로 둔다.
-
aggregationCoordinator가
DOMException이면, aggregationCoordinator로 rejected된 promise를 반환한다. -
this의 global scopes가 empty이면,
TypeError로 rejected된 promise를 반환한다.Note: 이는
run()이addModule()보다 먼저 호출되는 경우 발생할 수 있다. -
Assert: this의 global scopes의 size는 1이다.
-
globalScope를 this의 global scopes[0]으로 둔다.
-
globalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,
TypeError로 rejected된 promise를 반환한다. -
workletDataOrigin을 globalScope의 realm의 settings object의 origin으로 둔다.
-
allowedInOpaqueOriginContext를 this의 has cross-origin data origin으로 둔다.
-
window, workletDataOrigin, 그리고 allowedInOpaqueOriginContext가 주어졌을 때 context에 의해 공유 저장소가 허용되는지 결정을 실행한 결과가 false이면, promise를
TypeError로 reject한다. -
window 및 workletDataOrigin가 주어졌을 때 사용자 환경설정이 공유 저장소에 대한 접근을 허용하는지 확인을 실행한 결과가 false이면:
-
this의 has cross-origin data origin이 false이면, promise를
TypeError로 reject한다. -
그렇지 않으면, promise를 undefined로 resolve한다.
-
promise를 반환한다.
-
-
promise를 반환하고, 즉시 window가 주어졌을 때 worklet agent 얻기를 수행한 뒤, 그 agent에서 나머지 단계를 실행한다:
Note: promise의 resolution은
SharedStorageWorkletGlobalScope내부 실행보다 먼저 이루어져야 하며, 그 실행에 의존해서는 안 된다. 이는 shared storage가 분할되지 않은 저장소의 한 종류이고,SharedStorageWorkletGlobalScope가 사이트 간 데이터에 접근할 수 있으므로, 그 데이터가run()을 통해 (성공/오류 결과를 통해) 누출되어서는 안 되기 때문이다.-
window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를 undefined로 resolve한다.
-
globalScope의 relevant settings object의 module map이 empty가 아니면:
-
operationMap을 this의
SharedStorageWorkletGlobalScope의 operation map으로 둔다. -
operationMap이 name을 contains하면:
-
Assert: operationMap[name]의 associated realm은 this의 relevant realm이다.
-
operation을 operationMap[name]을
Function으로 converted한 값으로 둔다. -
privateAggregationCompletionTask를 workletDataOrigin, preSpecifiedParams 및 aggregationCoordinator가 주어졌을 때 Private Aggregation scope 설정의 결과로 둔다.
-
argumentsList를 새 list로 둔다.
-
argumentsList 및 "
report"와 함께 operation을 invoke한다. -
해당되는 경우, operation 실행이 끝날 때까지 기다린다.
-
privateAggregationCompletionTask를 실행한다.
-
-
-
options["
keepAlive"]가 false이면:-
해당되는 경우, operation 실행이 끝날 때까지 기다린다.
-
worklet global scope 종료를 this와 함께 실행한다.
-
-
SharedStorageRunOperationMethodOptions
options가 주어졌을 때, 다음
단계를 수행한다. 이 단계들은 aggregation coordinator, null 또는 DOMException을
반환한다:
-
options["
privateAggregationConfig"]가 exist하지 않으면, null을 반환한다. -
options["
privateAggregationConfig"]["aggregationCoordinatorOrigin"]가 exist하지 않으면, null을 반환한다. -
options["
privateAggregationConfig"]["aggregationCoordinatorOrigin"]가 주어졌을 때 Private Aggregation coordinator 얻기의 결과를 반환한다.
SharedStorageRunOperationMethodOptions
options 및 browsing context context가 주어졌을 때, 다음 단계를 수행한다. 이 단계들은
pre-specified report parameters, null 또는 DOMException을
반환한다:
-
options["
privateAggregationConfig"]가 exist하지 않으면, null을 반환한다. -
privateAggregationConfig를 options["
privateAggregationConfig"]로 둔다. -
contextId를 null로 둔다.
-
privateAggregationConfig["
contextId"]가 exists하면, contextId를 privateAggregationConfig["contextId"]로 설정한다. -
contextId의 length가 64보다 크면, 이름이 "
DataError"인 새DOMException을 반환한다. -
filteringIdMaxBytes를 기본 filtering ID max bytes로 둔다.
-
privateAggregationConfig["
filteringIdMaxBytes"]가 exists하면, filteringIdMaxBytes를 privateAggregationConfig["filteringIdMaxBytes"]로 설정한다. -
filteringIdMaxBytes가 contained되어 있지 않으면, 유효한 filtering ID max bytes 범위 안에 포함되지 않은 것이므로, 이름이 "
DataError"인 새DOMException을 반환한다. -
context의 fenced frame config instance가 null이 아니면:
-
filteringIdMaxBytes가 기본 filtering ID max bytes가 아니거나 contextId가 null이 아니면, 이름이 "
DataError"인 새DOMException을 반환한다.
-
-
maxContributions를 null로 둔다.
-
privateAggregationConfig["
maxContributions"]가 exists하면, maxContributions를 privateAggregationConfig["maxContributions"]로 설정한다. -
maxContributions가 0이면, 이름이 "
DataError"인 새DOMException을 반환한다. -
다음 항목을 가진 새 pre-specified report parameters를 반환한다:
- context ID
-
contextId
- filtering ID max bytes
-
filteringIdMaxBytes
- max contributions
-
maxContributions
Note: 반환된 알고리즘은 연결된 operation이 완료되었을 때 실행되어야 한다.
-
batchingScope를 새 batching scope로 둔다.
-
debugScope를 새 debug scope로 둔다.
-
privateAggregationTimeout을 null로 둔다.
-
hasRunPrivateAggregationCompletionTask를 false로 둔다.
-
privateAggregationCompletionTask를 다음 단계를 수행하는 알고리즘으로 둔다:
-
hasRunPrivateAggregationCompletionTask이면, 반환한다.
-
hasRunPrivateAggregationCompletionTask를 true로 설정한다.
-
debugScope가 주어졌을 때 debug scope 완료 표시를 수행한다.
-
batchingScope, workletDataOrigin, "
shared-storage" 및 privateAggregationTimeout가 주어졌을 때 batching scope에 대한 contribution 처리를 수행한다.
-
-
aggregationCoordinator가 null이 아니면, aggregationCoordinator 및 batchingScope가 주어졌을 때 batching scope에 대한 aggregation coordinator 설정을 수행한다.
-
preSpecifiedParams가 null이 아니면:
-
isDeterministicReport를 preSpecifiedParams가 주어졌을 때 report를 결정론적으로 보내야 하는지 결정한 결과로 둔다.
-
isDeterministicReport이면:
-
privateAggregationTimeout을 current wall time에 deterministic operation timeout duration을 더한 값으로 설정한다.
-
-
preSpecifiedParams 및 batchingScope가 주어졌을 때 batching scope에 대한 pre-specified report parameters 설정을 수행한다.
-
isDeterministicReport이면, 다음 단계를 in parallel로 실행한다:
-
privateAggregationTimeout까지 기다린다.
-
privateAggregationCompletionTask를 실행한다.
-
-
-
privateAggregationCompletionTask를 반환한다.
deterministic operation timeout duration은 implementation-defined인 음수가 아닌 duration으로, Shared Storage operation이 deterministic report를 트리거하는 경우 Private Aggregation contribution을 할 수 있는 시간과, 동등하게는 그 report가 operation 시작 후 언제 전송되어야 하는지를 제어한다.
2.2. Worklets에 대한 Monkey Patch
이 명세는 Shared Storage의 필요를 수용하기 위해 Worklet 표준에 일부 수정을 가한다.
2.2.1. worklet environment settings object 설정에 대한 Monkey Patch
worklet environment settings
object 설정 알고리즘은 추가 매개변수 Worklet
worklet을 포함해야 한다. settingsObject의 origin을 정의하는 단계는 다음과 같이 수정되어야 한다:
-
settingsObject를 다음과 같이 알고리즘이 정의된 새 environment settings object로 둔다:
......
-
workletGlobalScope를 realmExecutionContext의 Realm 구성요소의 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. worklet global scope 생성에 대한 Monkey Patch
worklet global scope 생성 알고리즘은 worklet 매개변수를 전달하도록 수정되어야 한다:
-
insideSettings를 realmExecutionContext, outsideSettings, 그리고 worklet이 주어졌을 때 worklet environment settings object 설정을 수행한 결과로 둔다.
2.2.3. worklet script graph 가져오기에 대한 Monkey Patch
worklet script graph 가져오기 알고리즘은 worklet/module worker script graph 가져오기 알고리즘을 호출하며, 이 알고리즘은 알고리즘 매개변수 processCustomFetchResponse를 받는다. 해당 processCustomFetchResponse 매개변수의 정의에는 "5. Fetch request, ..." 단계 앞에 다음 단계가 포함되어야 한다:
-
fetchClient의 global object가
SharedStorageWorkletGlobalScope이면:-
request의 redirect mode를 "
error"로 설정한다.Note: shared storage의 경우 module script request에 대해 redirect가 허용되지 않는다. 이 제한을 두면
SharedStorageWorkletGlobalScope가 생성되는 즉시 realm의 settings object의 origin을 가져오는 알고리즘(§ 2.2.1 worklet environment settings object 설정에 대한 Monkey Patch에서 설명됨)을 정의하고 사용할 수 있다. origin은 변하지 않기 때문이다. 이 제한은 설계의 향후 반복에서 제거될 수 있다. redirect가 허용된다면, 아마도 realm의 settings object의 origin을 가져오는 알고리즘은 최종 request의 response를 받은 후 최종 request의 URL의 origin을 반환하도록 갱신되어야 하며, 사용자 환경설정 검사는 그 시점 이후에만 수행되어야 한다. -
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을 생성하고, 이후 해당 worklet에서 module script의
URL의
origin을
shared storage data에 접근하기 위한 data partition origin으로 사용하여 후속 operation을
실행할 권한을 부여할 수 있다.
즉, 이는 § 2.2.1 worklet environment
settings
object 설정에 대한 Monkey Patch에서 설정되는 origin이며, 모든 SharedStorage
호출에서 shared storage bottle map 얻기에 사용되는
origin이 된다.
cross-origin script를 로드하는 worklet은 신뢰할 수 있는 외부 origin을 나타내는 기본 권한 메커니즘으로 CORS에 의존한다.
그러나 CORS만으로는 data partition origin이 script origin인 cross-origin
script로
worklet을 생성하기에 충분하지 않다. 단순한 resource sharing과 달리, worklet은 creator site가 target origin의 context 안에서
JavaScript를 실행할 수 있게 한다. 보안을 보장하기 위해 script origin에서 추가 response header인
`Shared-Storage-Cross-Origin-Worklet-Allowed`가
필요하다.
2.2.5. HTTP fetch에 대한 Monkey Patch
단계가 HTTP fetch 알고리즘에 추가되어야 한다.Note: module script를 제공하는 site는 보안상 함의를 신중히 고려할 책임이 있다.
module script의 URL의
origin과 worklet을 생성한 Window
origin이 same
origin이 아닐 때, module script response에 허용적인 CORS 헤더와
`Shared-Storage-Cross-Origin-Worklet-Allowed`
헤더를 보내면, 서버는 worklet의 생성 및 그 worklet에서의 후속 operation을 허가하는 동시에, worklet이 shared storage data에 접근하기 위한
origin,
즉 data partition origin으로 worklet script의 origin을
사용할 수 있게 허가하게 된다. 예를 들어, worklet을 생성한 Window는
selectURL()
또는 run()을
호출하여,
worklet origin의 site의 remaining navigation budget을 오염시키고 소진시킬 수 있다.
여기서 worklet origin은 global scope의 realm의 settings object의 origin이다.
2.2.6.
addModule()에
대한 Monkey Patch
addModule()
method steps for Worklet에는
"Let promise be a new promise" 단계 앞에 다음 단계가 포함되어야 한다:
-
this가
SharedStorageWorklet타입이면:-
addModuleAllowedResult를 this와 moduleURLRecord가 주어졌을 때 addModule이 허용되는지 확인하고 상태 갱신을 실행한 결과로 둔다.
-
addModuleAllowedResult가 "DisallowedDueToNonPreferenceError"이면:
-
TypeError로 rejected된 promise를 반환한다.
-
-
그렇지 않고 addModuleAllowedResult가 "DisallowedDueToPreferenceError"이면:
-
this의 has cross-origin data origin이 false이면,
TypeError로 rejected된 promise를 반환한다.
-
-
그렇지 않으면:
-
Assert: addModuleAllowedResult는 "Allowed"이다.
-
-
addModule()는
초기 단계에서 중단된다. 그러나 이 오류는 same-origin worklet(즉, initiator document의 origin이 module script의 origin과
same-origin인 경우)에 대해서만 호출자에게 노출된다. cross-origin worklet의 경우 오류는 숨겨진다. 이는 호출자가 사용자가 환경설정을 통해
어떤 origin에 대해 shared storage를 비활성화했는지 알지 못하게 하기 위한 것이다(해당 browser vendor에 per-origin preference가
존재하는 경우).
호출자는 여전히 timing attack을 사용해 이 정보를 알아낼 수 있지만, 이는 사소한 보안/개인정보 보호 문제이다. 실제로는 그러한 환경설정을 지정하는 사용자가 매우 적고, 광범위한 검색을 하면 worklet을 띄우는 데 상당한 성능 비용이 발생하기 때문이다.
이 근거는 selectURL()
및 run()에서의
사용자 환경설정 오류 처리에도 적용된다.
"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의 global task를 queue하여 다음 단계를 수행한다:
-
customOriginUrl를 data origin에 대해 URL parser를 실행한 결과로 둔다.
-
customOriginUrl의 path를 ≪".well-known", "shared-storage", "trusted-origins"≫로 설정한다.
-
request를 새 request로 둔다. 그 URL은 customOriginUrl, mode는
"cors", referrer는"client", destination은"json", initiator type은"script", 그리고 client는 outsideSettings이다. -
Fetch request with processResponseConsumeBody set to the following algorithm, given response response and null, failure or a byte sequence bodyBytes:
-
다음 중 하나라도 true이면:
그러면:
-
pendingTasks를 −1로 설정한다.
-
promise를 "TypeError" DOMException으로 Reject한다.
-
이 단계를 중단한다.
-
-
mimeType을 response의 header list에서 MIME type 추출을 수행한 결과로 둔다.
-
mimeType이 JSON MIME type이 아니면:
-
pendingTasks를 −1로 설정한다.
-
promise를 "TypeError" DOMException으로 Reject한다.
-
이 단계를 중단한다.
-
-
sourceText를 bodyBytes에 대해 UTF-8 decoding을 수행한 결과로 둔다.
-
parsed를 sourceText가 주어졌을 때 JSON 문자열을 Infra 값으로 파싱한 결과로 둔다.
-
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에 대해 script와 context origin 일치 여부 확인을 실행한 결과로 둔다. -
doesMatch가 true이면:
-
this의 relevant global object가 주어졌을 때 networking task source의 global task를 queue하여 다음 단계를 수행한다:
-
pendingTasks가 −1이 아니면:
-
pendingTasks를 pendingTasks − 1로 설정한다.
-
pendingTasks가 0이면, 다음 단계를 수행한다:
-
workletGlobalScope에 연결된 boolean addModule success가 있으면, workletGlobalScope의 addModule success를 true로 설정한다.
-
promise를 Resolve한다.
-
-
-
-
중단한다.
-
-
-
doesMatch가 false이면:
-
pendingTasks를 −1로 설정한다.
-
promise를 "TypeError" DOMException으로 Reject한다.
-
-
-
-
Note: worklet data origin이 현재 context 및 script origin과 다르면 추가 검사가 수행된다. 이는 worklet data origin에서 configuration file을 가져와, 현재 context가 해당 script로 worklet을 로드하고 operation을 수행하도록 허용되어 있는지 확인하는 것을 포함한다.
끝에서 두 번째 단계(즉, 마지막으로 들여쓰기된 단계), 현재의 "If pendingTasks is 0, then resolve promise."는 다음과 같이 갱신되어야 한다:
-
pendingTasks가 0이면, 다음 단계를 수행한다:
-
workletGlobalScope에 연결된 boolean addModule success가 있으면, workletGlobalScope의 addModule success를 true로 설정한다.
-
promise를 Resolve한다.
-
마지막 단계, 현재의 "Return promise." 바로 앞에 다음 단계를 추가한다:
-
this가
SharedStorageWorklet이면, promise의 fulfillment 시 또는 promise의 rejection 시, 다음 단계를 실행한다:-
globalScopes를 this의 global scopes로 둔다.
-
privateAggregationObj를 globalScopes[0]의
privateAggregation으로 둔다. -
privateAggregationObj의 allowed to use를, this의 relevant global object의 associated document가 "
private-aggregation" policy-controlled feature를 사용하도록 허용되어 있는지 결정한 결과로 설정한다.permissions policy 검사가 먼저 수행되는 경우 여기에서 early return을 추가하는 것을 고려한다.
-
privateAggregationObj의 scoping details를 다음 항목을 가진 새 scoping details로 설정한다:
- get batching scope steps
-
scope에서 현재 실행 중인 call이 반환될 때 batching scope에 대한 contribution 처리에 전달되도록 예약된 batching scope를 반환하는 알고리즘.
- get debug scope steps
-
scope에서 현재 실행 중인 call이 반환될 때 debug scope 완료 표시에 전달되도록 예약된 debug scope를 반환하는 알고리즘.
Note: 여러 operation invocation이 동시에 진행 중일 수 있으며, 각각 다른 batching scope와 debug scope를 가진다. 그러나 현재 실행 중인 것은 하나뿐일 수 있다.
-
trusted origin type은 string 또는 list of strings이다.
-
itemScriptOrigin 및 actualScriptOrigin이 주어졌을 때 trusted origin 일치 여부 확인을 실행한 결과가 false이면, false를 반환한다.
-
itemContextOrigin 및 actualContextOrigin이 주어졌을 때 trusted origin 일치 여부 확인을 실행한 결과를 반환한다.
-
itemOrigin이 string이면, itemOrigin 및 actualOrigin이 주어졌을 때 문자열에 대한 trusted origin 일치 여부 확인을 실행한 결과를 반환한다.
-
그렇지 않으면, itemOrigin 안의 각 originString에 대해:
-
originString 및 actualOrigin이 주어졌을 때 문자열에 대한 trusted origin 일치 여부 확인을 실행한 결과가 true이면, true를 반환한다.
-
-
false를 반환한다.
-
itemOrigin이
"*"이면 true를 반환한다. -
itemOriginUrl을 itemOrigin에 대해 URL parser를 실행한 결과로 둔다.
-
itemOriginUrl이 유효한 URL이 아니면 false를 반환한다.
-
itemOriginUrl의 origin과 actualOrigin이 same origin이면 true를 반환한다.
-
그렇지 않으면 false를 반환한다.
out-of-process worklet에 대한 추가 monkey patch 조각을 추가한다.
2.3. SharedStorageWorkletGlobalScope
SharedStorageWorklet의
worklet global scope type은 SharedStorageWorkletGlobalScope이다.
SharedStorageWorklet의
worklet destination type은 "sharedstorageworklet"이다.
2.3.1. request destination에 대한 Monkey Patch
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
이름을 나타냄)를 function objects에 매핑한다.
각 SharedStorageWorkletGlobalScope은
연결된 SharedStorage
인스턴스 shared storage
instance를 가진다.
각 SharedStorageWorkletGlobalScope은
연결된 SharedStorageWorkletNavigator
인스턴스 navigator instance를 가진다.
2.3.2. SharedStorageWorkletGlobalScope
알고리즘
register(name, operationCtor)
메서드 단계는 다음과 같다:
-
name이 없거나 비어 있으면,
TypeError를 throw한다. -
operationMap을 이
SharedStorageWorkletGlobalScope의 operation map으로 둔다. -
operationMap이 contains an entry with key name이면,
TypeError를 throw한다. -
operationCtor가 없으면,
TypeError를 throw한다. -
operationClassInstance를 인수 없이 operationCtor를 constructing한 결과로 둔다.
-
runFunction을 Get(operationClassInstance, "
run")으로 둔다. 모든 예외는 다시 throw한다. -
IsCallable(runFunction)이 false이면,
TypeError를 throw한다. -
operationMap[name]의 값을 runFunction으로 Set한다.
WebIDL을 고려하면 여기서 "name"과 "operationCtor"는 누락될 수 없다. default/empty 값만 확인해야 한다. [Issue #151]
interestGroups()
메서드 단계는 다음과 같다:
-
promise를 새 promise로 둔다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다. -
globalObject를 current realm의 global object로 둔다.
-
context를 globalObject의 browsing context로 둔다.
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
document를 context의 active window의 associated document로 둔다.
-
document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
workletDataOrigin을 current realm의 settings object의 origin으로 둔다.
-
다음 단계를 in parallel로 실행한다:
-
interestGroups를 workletDataOrigin가 주어졌을 때 owner에 대한 storage interest group 가져오기를 실행한 결과로 둔다.
-
interestGroups가 failure이면:
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를
TypeError로 reject한다.
-
-
그렇지 않으면:
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여, promise를 interestGroups로 resolve한다.
-
-
-
promise를 반환한다.
sharedStorage getter steps는 다음과 같다:
-
this의 addModule success가 true이면, this의 shared storage instance를 반환한다.
-
그렇지 않으면,
TypeError를 throw한다.
-
addModule success의 값을 반환한다.
2.4. SharedStorageUrlWithMetadata
및 Reporting
dictionary {SharedStorageUrlWithMetadata required USVString ;url object ; };reportingMetadata
SharedStorageUrlWithMetadata
dictionary가 비어 있지 않은 reportingMetadata
object를
포함하고,
그 형태가 dictionary이며, 그 keys가
FenceEvent의
eventType들이고,
그 values가 유효한 URLs로 파싱되는
strings이면,
이러한 eventType-URL
쌍은 이 selectURL()
호출로부터 생긴 SharedStorageResponse를
로드하는 임의의 fenced frame 내에서 나중에 접근할 수 있도록
registered된다.
reportingMetadata는
dictionary여야 한다. [Issue #141]
selectURL()을
통해
reportingMetadata
object들로
registered된 eventType-URL
쌍이 있는 fenced frame 내부에서,
reportEvent()가
"shared-storage-select-url"을 containing하는 destination을
가진
FenceEvent에서
호출되고, 그 FenceEvent의
대응하는 eventType이
트리거되면, 해당 FenceEvent의
eventData는
그 eventType에
대해
등록된 URL로
beacon으로 전송된다.
object
reportingMetadata가 주어졌을 때, 다음 단계를 실행한다:
-
reportingMetadata가 dictionary가 아니면 false를 반환한다.
-
reportingMetadata가 empty이면, true를 반환한다.
-
reportingMetadata의 각 eventType → urlString에 대해 For each, urlString과 함께 유효한 경우 canonical URL 문자열 가져오기를 실행한 결과가 undefined이면 false를 반환한다.
-
true를 반환한다.
-
url을 urlString에 대해 URL parser를 실행한 결과로 둔다.
-
url이 유효한 URL이 아니면 undefined를 반환한다.
-
그렇지 않으면, url에 대해 URL serializer를 실행한 결과를 반환한다.
object
reportingMetadata 및 fenced
frame config fencedFrameConfigStruct가 주어졌을 때, 다음 단계를 실행한다:
-
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는 이러한 누출을 제한하기 위해 예산을 유지해야 한다.
selectURL()
호출 시 이러한 예산 중 하나라도 소진되면, 어떤 URL을 선택할지 결정하기 위해 기본 selectURL index가 사용된다.
sequence<USVString>
urls가 주어졌을 때, 다음 단계를 실행한다:
-
0을 반환한다.
Note: 반환된 index가 등록된 operation class의 "
run" 메서드와 독립적인 한, 0부터 urls의 size까지의 range(끝값 제외)에서 임의의unsigned long을 반환하도록 선택할 수도 있었다.
기본 selectURL
index는 sequence<USVString>
urls가 주어졌을 때, 기본
selectURL index 가져오기를 실행하여 얻은 index이다.
2.5.1. Navigation 엔트로피 예산
사용자가 selectURL()에
의해
생성된 fenced frame config instance를 가진
node
document의 browsing context에 속한 fenced frame을 activates하고,
그로 인해 top-level traversable navigation이 시작되면, 이는 landing page에 자신의 URL이
선택되었음을 드러내며, 이는 selectURL()
호출에 대한 입력 URLs 개수의
밑이 2인 로그까지 entropy bits가 누출되는 것이다.
이를 완화하기 위해, user agent는 site별
navigation entropy allowance를 설정한다.
navigation entropy allowance는 주어진 호출 site에 대해 주어진 navigation budget epoch 동안, fenced frames가 top-level traversable navigations를 시작함으로써 누출이 허용되는 entropy bits의 최대 허용량이다. 이 allowance는 user agent에 의해 정의되며 site와 무관하다.
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
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()은
기본
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와 함께 bit debit이 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를 반환한다.
selectURL()를
통해
생성된 fenced frame config instance를 가진
node
document의 browsing context에 속한 fenced frame에 의해 시작된 각 top-level traversable navigation마다 bit debit을
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는 shared storage navigation budget 부과 알고리즘을 수행한다.
navigation budget charging의 타이밍을 명시할 더 나은 방법을 찾아야 한다. [Issue #138]
Document
sourceDocument가 주어졌을 때, 다음 단계를 실행한다:
-
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 ledger에서 expired된 bit debits 제거를 주기적으로 수행하도록 timer를 설정하고 싶을 수 있다.
-
user agent의 shared storage navigation budget table의 각 origin → ledger에 대해 For each:
-
ledger 안의 각 bitDebit에 대해 For each, bitDebit와 함께 bit debit이 expired되었는지 확인을 실행한 결과가 true이면, bitDebit를 ledger에서 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
-
map of tuples (origin data origin, URL worklet script URL, string operation name, string query name) to saved query data
saved query data는 다음 items를 가진 struct이다:
2.5.2.1. Traversable Navigables에 대한 Monkey patch
[HTML]의 Traversable navigables 절에 다음을 추가한다:
navigable의 속성에 더해, traversable navigable은 다음을 가진다:
-
page budget, 즉 shared storage page budget 또는 null이며, 처음에는 null이다.
2.5.2.2. Navigables에 대한 Monkey patch
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에 대해 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를 반환한다.
Note: 저장된 질의에 대한
인덱스 가져오기 알고리즘은 index 값이 SharedStorageWorkletGlobalScope의
worklet event loop에 task를 queue하여 registered operation을 수행한 결과를 기다리고 있음을 나타내기 위해
"pending current operation"을 반환한다.
Note: 저장된 질의에 대한
인덱스 가져오기 알고리즘은 index의 결과를 결정할 task가 이전에 SharedStorageWorkletGlobalScope의
worklet event loop에 queued되었으며, 이제 원래 task가 완료되었을 때 실행될 추가
callbackTask를 queue하고 있음을 나타내기 위해 "pending callback"을 반환한다.
Window
window, navigable navigable, origin
origin, URL moduleURLRecord, string operationName,
string
savedQueryName, 그리고 unsigned long
index가 주어졌을 때:
-
topLevelTraversable을 navigable에 대해 top-level traversable 가져오기를 실행한 결과로 둔다.
-
Assert: topLevelTraversable의 page budget은 null이 아니다.
-
queryData를 topLevelTraversable의 page budget의 saved query map[(origin, moduleURLRecord, operationName, savedQueryName)]로 둔다.
-
queryData의 callbacks가 비어 있지 않은 동안 While:
-
다음 task callbackTask를 queryData의 callbacks에서 Dequeue하고, window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 index가 주어졌을 때 callbackTask의 단계를 실행한다.
-
Window
window, SharedStorageUrlWithMetadata들의
list
urlList, promise promise가 주어졌을 때, 다음 단계를 수행한다. 이 단계들은
알고리즘을 반환한다.
-
processIndexTask를
unsigned longindex가 주어졌을 때 다음 단계를 수행하는 알고리즘으로 둔다:-
index가 urlList의 size보다 크면, window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다.Note: 결과 index가 입력 urls의 size를 벗어난다. 이는 selectURL() 프로토콜을 위반하며, 어떤 url이 선택되어야 하는지 알 수 없다.
-
그렇지 않으면, window가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 index로 resolve한다.
-
-
processIndexTask를 반환한다.
2.5.2.4. Top-Level Traversable 엔트로피 예산 부과
-
topLevelTraversable을 navigable에 대해 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에 대한 Monkey Patch
이 표준은 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 제한을
10,000에서 1,280으로 줄이면 이를 달성할 수 있다.
shared storage shed는 origins를 storage shelves에 매핑하는 map이다. 처음에는 비어 있다.
Note: key가 storage keys인 storage sheds와 달리, shared storage sheds는 origins를 직접 key로 사용한다. 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가 주어졌을 때 context에 의해 shared storage가 허용되는지 결정을 실행한 결과가 false이면, failure를 반환한다.
-
environment 및 origin이 주어졌을 때 사용자 환경설정이 shared storage에 대한 접근을 허용하는지 확인을 실행한 결과가 false이면, failure를 반환한다.
-
shed[origin]이 존재하지 않으면, shed[origin]을 type "
shared"와 함께 shared storage shelf 생성을 실행한 결과로 설정한다. -
shed[origin]을 반환한다.
-
shelf를 새 storage shelf로 둔다.
-
shelf의 bucket map["
default"]을 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"]을 새 storage bottle로 설정하며, 그 quota는 endpoint의 quota이다. -
bucket을 반환한다.
Note: 현재 shared storage bucket의 bottle
map은 size 1을 가진다. 이는 type
"shared"로 registered된 storage
endpoint가 하나뿐이기 때문이다.
-
shed를 user agent의 shared storage shed로 둔다.
-
shelf를 shed, environment, 그리고 origin과 함께 shared storage shelf 얻기를 실행한 결과로 둔다.
-
shelf가 failure이면 failure를 반환한다.
-
bucket을 shelf의 bucket map["
default"]으로 둔다. -
bottle을 bucket의 bottle map["
sharedStorage"]로 둔다. -
proxyMap을 새 storage proxy map으로 두며, 그 backing map은 bottle의 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를 가지며, 이는 새 parallel queue 시작의 결과이다. 이 queue는 해당 browsing context에서 호출이 시작될 때 각 shared storage database의 메서드를 실행하는 데 사용된다.
각 entry는 key와 value struct로 구성된다.
User agents는 key의 maximum length를 지정할 수 있다.
keys는 entries를 구성하고 효율적으로 검색하는 데 사용되므로, keys는 주어진 shared storage database 안에서 최대 한 번만 나타나야 한다.
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에서 expired entries를 purge하는 timer를 주기적으로 가져야 한다.
3.3. 핵심 Database 알고리즘
-
valueStruct를 새 value struct로 둔다.
-
valueStruct의 value를 value로 설정한다.
-
currentTime을 environment의 current wall time으로 둔다.
-
valueStruct의 last updated를 currentTime으로 설정한다.
-
databaseMap[key]를 valueStruct로 Set한다.
-
exception이 throw되었으면 false를 반환한다.
Note: 구현에 따라 storage proxy map databaseMap의 메서드에서 오류가 발생할 수 있다.
-
그렇지 않으면 true를 반환한다.
-
databaseMap이 key를 contain하지 않으면 undefined를 반환한다.
-
valueStruct를 databaseMap에 대해 key와 함께 Get을 실행한 결과로 둔다.
-
exception이 throw되었으면 failure를 반환한다.
Note: 구현에 따라 storage proxy map databaseMap의 메서드에서 오류가 발생할 수 있다.
-
environment 및 valueStruct와 함께 entry가 expired되었는지 결정을 실행한 결과가 true이면 undefined를 반환한다.
-
valueStruct의 value를 반환한다.
-
databaseMap[key]를 Remove한다.
-
exception이 throw되었으면 false를 반환한다.
Note: 구현에 따라 storage proxy map databaseMap의 메서드에서 오류가 발생할 수 있다.
-
true를 반환한다.
-
databaseMap에서 Clear를 실행한다.
-
exception이 throw되었으면 false를 반환한다.
Note: 구현에 따라 storage proxy map databaseMap의 메서드에서 오류가 발생할 수 있다.
-
true를 반환한다.
-
values를 databaseMap에서 값 가져오기를 실행한 결과로 둔다.
-
exception이 throw되었으면 failure를 반환한다.
Note: 구현에 따라 storage proxy map databaseMap의 메서드에서 오류가 발생할 수 있다.
-
values를 반환한다.
-
size를 databaseMap의 size로 둔다.
-
exception이 throw되었으면 failure를 반환한다.
Note: 구현에 따라 storage proxy map databaseMap의 members에서 오류가 발생할 수 있다.
-
size를 반환한다.
-
databaseMap 안의 각 key key에 대해 For each:
-
valueStruct를 databaseMap에 대해 key와 함께 Get을 실행한 결과로 둔다.
-
exception이 throw되었으면 false를 반환한다.
-
environment 및 valueStruct와 함께 entry가 expired되었는지 결정을 실행한 결과가 true이면, databaseMap[key]를 Remove한다.
-
exception이 throw되었으면 false를 반환한다.
-
-
true를 반환한다.
entry가 expired되었는지 결정하려면, environment settings object environment 및 value struct valueStruct가 주어졌을 때, 다음 단계를 실행한다:
-
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 핵심 Database 알고리즘의 핵심 알고리즘과 달리, 더 특수화된 휴리스틱을 가진 매개변수를 받거나, 다단계 프로세스를 사용하거나, 또는 둘 다를 사용하여 더 복잡한 database operation을 처리한다.
database에 entry 설정을 하려면, shared storage database queue queue, storage proxy map databaseMap, environment settings object environment, key key, value value, 그리고 boolean ignoreIfPresent가 주어졌을 때, queue에서 다음 단계를 실행한다:
-
ignoreIfPresent이면:
-
currentValue를 queue, databaseMap, environment, 그리고 key와 함께 database에서 entry 가져오기를 실행한 결과로 둔다.
-
currentValue가 failure이면 false를 반환한다.
-
currentValue가 undefined가 아니면 true를 반환한다.
-
-
queue, databaseMap, environment, key, 그리고 value와 함께 database에 entry 저장을 실행한 결과를 반환한다.
database에 entry 추가를 하려면, shared storage database queue queue, storage proxy map databaseMap, environment settings object environment, key key, 그리고 value value가 주어졌을 때, queue에서 다음 단계를 실행한다:
-
currentValue를 queue, databaseMap, environment, 그리고 key와 함께 database에서 entry 가져오기를 실행한 결과로 둔다.
-
currentValue가 failure이면 false를 반환한다.
-
currentValue가 undefined가 아니면:
-
list를 새 list로 둔다.
-
currentValue를 list에 Append한다.
-
value를 list에 Append한다.
-
value를 list에 대해 concatenate를 실행한 결과로 설정한다.
-
-
queue, databaseMap, environment, key, 그리고 value와 함께 database에 entry 저장을 실행한 결과를 반환한다.
database의 entries 일괄 갱신을
하려면, shared storage database
queue queue, storage
proxy map databaseMap, environment settings object environment,
그리고
SharedStorageModifierMethod들의
list
methods가 주어졌을 때, 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와 함께 database에 entry 설정을 실행한 결과로 둔다.
-
result가 false이면:
-
innerMethodFailed를 true로 설정한다.
-
Break.
-
-
-
그렇지 않고 method가
SharedStorageAppendMethod이면:-
key를 method의 key로 둔다.
-
value를 method의 value로 둔다.
-
result를 queue, databaseMap, environment, key, 그리고 value와 함께 database에 entry 추가를 실행한 결과로 둔다.
-
result가 false이면:
-
innerMethodFailed를 true로 설정한다.
-
Break.
-
-
-
그렇지 않고 method가
SharedStorageDeleteMethod이면:-
key를 method의 key로 둔다.
-
result를 queue, databaseMap, environment, 그리고 key와 함께 database에서 entry 삭제를 실행한 결과로 둔다.
-
result가 false이면:
-
innerMethodFailed를 true로 설정한다.
-
Break.
-
-
-
그렇지 않으면:
-
Assert: method는
SharedStorageClearMethod이다. -
result를 queue, databaseMap, 그리고 environment와 함께 database의 모든 entry 지우기를 실행한 결과로 둔다.
-
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 단계는 다음과 같다:
-
this가 fully active이면, this의
sharedStorage를 반환한다. -
그렇지 않으면 null을 반환한다.
5. SharedStorageModifierMethod
Interface Group
SharedStorageSetMethod,
SharedStorageAppendMethod,
SharedStorageDeleteMethod,
SharedStorageClearMethod
인터페이스는 set(),
append(),
delete(),
clear()
modifier 메서드에 대응한다. 이들 모두는 기본 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는
다음 연결된 fields를 가진다:
- with lock
-
Null 또는 string. 처음에는 null이다.
SharedStorageSetMethod는
다음 연결된 fields를 가진다:
SharedStorageAppendMethod는
다음 연결된 fields를 가진다:
SharedStorageDeleteMethod는
다음 연결된 fields를 가진다:
- key
-
string. 처음에는 비어 있다.
new SharedStorageSetMethod(key, value, options)
constructor 단계는 다음과 같다:
-
globalObject를 current realm의 global object로 둔다.
-
context를 null로 둔다.
-
globalObject가
Window이면:-
context를 globalObject의 browsing context로 설정한다.
-
-
그렇지 않으면:
-
context를 globalObject의 outside settings의 target browsing context로 설정한다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError를 throw한다.
-
-
context가 null이면,
TypeError를 throw한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError를 throw한다. -
key의 length가 maximum length를 초과하면,
TypeError를 throw한다. -
value의 length가 maximum length를 초과하면,
TypeError를 throw한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError를 throw한다. -
this의 ignore if present를 options["
ignoreIfPresent"]로 설정한다.
new SharedStorageAppendMethod(key, value, options)
constructor 단계는 다음과 같다:
-
globalObject를 current realm의 global object로 둔다.
-
context를 null로 둔다.
-
globalObject가
Window이면:-
context를 globalObject의 browsing context로 설정한다.
-
-
그렇지 않으면:
-
context를 globalObject의 outside settings의 target browsing context로 설정한다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError를 throw한다.
-
-
context가 null이면,
TypeError를 throw한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError를 throw한다. -
key의 length가 maximum length를 초과하면,
TypeError를 throw한다. -
value의 length가 maximum length를 초과하면,
TypeError를 throw한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError를 throw한다.
new SharedStorageAppendMethod(key, options)
constructor 단계는 다음과 같다:
-
globalObject를 current realm의 global object로 둔다.
-
context를 null로 둔다.
-
globalObject가
Window이면:-
context를 globalObject의 browsing context로 설정한다.
-
-
그렇지 않으면:
-
context를 globalObject의 outside settings의 target browsing context로 설정한다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError를 throw한다.
-
-
context가 null이면,
TypeError를 throw한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError를 throw한다. -
key의 length가 maximum length를 초과하면,
TypeError를 throw한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError를 throw한다.
new SharedStorageClearMethod(options)
constructor 단계는 다음과 같다:
-
globalObject를 current realm의 global object로 둔다.
-
context를 null로 둔다.
-
globalObject가
Window이면:-
context를 globalObject의 browsing context로 설정한다.
-
-
그렇지 않으면:
-
context를 globalObject의 outside settings의 target browsing context로 설정한다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError를 throw한다.
-
-
context가 null이면,
TypeError를 throw한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError를 throw한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError를 throw한다.
6. SharedStorage
인터페이스
SharedStorage
인터페이스는 Window와
SharedStorageWorklet에
노출된다.
데이터를 설정 및/또는 삭제할 수 있게 하는 메서드들은 Window와
SharedStorageWorklet
양쪽에 모두 노출되지만, 그 구현은 해당 environment에 따라 달라질 수 있다. 이를 통해 여러 context에서 Shared Storage의
데이터를 수정할 수 있다.
한편, SharedStorageWorkletGlobalScope
안에서 실행될 operation을 게시하기 위한 메서드들(즉 selectURL()
및 run())과,
addModule()을
호출하는 데 사용되는 worklet
attribute는 Window에만
노출된다. 이는 이들이 Window가
SharedStorageWorklet과
상호작용하는 수단이기 때문이다.
반면, shared
storage database에서 데이터를 가져오는 메서드들은
database에서
읽은 데이터의 흐름을
신중하게 제어하기 위해 SharedStorageWorklet에만
노출된다. 유일한 예외는 get()이
Window에
노출되지만, navigable이 network를 완전히
revoked했는지 결정 알고리즘의 결과가 true인 경우에만 성공한다는 점이다.
Note: navigable이 network를 완전히
revoked했는지 결정 알고리즘은 get()이
disableUntrustedNetwork()
호출을 성공적으로 resolve한 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에서
Operation 메서드 실행
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의 fulfillment 시, resultPromise를 sharedStorageWorklet로 resolve한다.
-
addModulePromise의 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에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다.
-
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
methods 안의 각 method에 대해:
-
-
TypeError로 rejected된 promise를 반환한다.
Note:
batchUpdate()는 transactional operation으로 실행된다. 더 세분화된 locking으로 인해 발생할 수 있는 deadlock을 피하기 위해,batchUpdate()내부의 inner methods는withLockoption을 사용할 수 없다. 이 option을 무시하는 대신, restriction을 강제하고 오용을 방지하기 위해 오류가 throw된다. -
-
-
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
onLockGrantedCallback을 다음 단계를 수행하는 알고리즘으로 둔다:
-
queue에 다음 단계를 enqueue한다:
-
result를 queue, databaseMap, environment, 그리고 methods와 함께 database의 entries 일괄 갱신을 실행한 결과로 둔다.
-
result가 false이고 globalObject가
SharedStorageWorkletGlobalScope이면:-
realm의 global object가 주어졌을 때, DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
이 단계를 중단한다.
-
-
realm의 global object가 주어졌을 때, DOM manipulation task source의 global task를 queue하여 promise를 undefined로 resolve한다.
-
-
-
options["
withLock"]가 exists하면, environment의 origin, options["withLock"], onLockGrantedCallback이 주어졌을 때 shared storage lock 안에서 callback 처리를 실행한다. -
그렇지 않으면, 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에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다.
-
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
key의 length가 maximum length를 초과하면,
TypeError로 rejected된 promise를 반환한다. -
value의 length가 maximum length를 초과하면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
realm을 current realm으로 둔다.
-
onLockGrantedCallback을 다음 단계를 수행하는 알고리즘으로 둔다:
-
queue에 다음 단계를 enqueue한다:
-
result를 queue, databaseMap, environment, key, value, 그리고 options["
ignoreIfPresent"]와 함께 database에 entry 설정을 실행한 결과로 둔다. -
result가 false이고 globalObject가
SharedStorageWorkletGlobalScope이면:-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
이 단계를 중단한다.
-
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 undefined로 resolve한다.
-
-
-
options["
withLock"]가 exists하면:-
options["
withLock"]가 U+002D HYPHEN-MINUS (-)로 시작하면,TypeError로 rejected된 promise를 반환한다. -
environment의 origin, options["
withLock"], 그리고 onLockGrantedCallback이 주어졌을 때 shared storage lock 안에서 callback 처리를 실행한다.
-
-
그렇지 않으면, 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에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다.
-
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
key의 length가 maximum length를 초과하면,
TypeError로 rejected된 promise를 반환한다. -
value의 length가 maximum length를 초과하면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
realm을 current realm으로 둔다.
-
onLockGrantedCallback을 다음 단계를 수행하는 알고리즘으로 둔다:
-
queue에 다음 단계를 enqueue한다:
-
result를 queue, databaseMap, environment, key, 그리고 value와 함께 database에 entry 추가를 실행한 결과로 둔다.
-
result가 false이고 globalObject가
SharedStorageWorkletGlobalScope이면:-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
이 단계를 중단한다.
-
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 undefined로 resolve한다.
-
-
-
options["
withLock"]가 exists하면:-
options["
withLock"]가 U+002D HYPHEN-MINUS (-)로 시작하면,TypeError로 rejected된 promise를 반환한다. -
environment의 origin, options["
withLock"], 그리고 onLockGrantedCallback이 주어졌을 때 shared storage lock 안에서 callback 처리를 실행한다.
-
-
그렇지 않으면, 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에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다.
-
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
key의 length가 maximum length를 초과하면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
realm을 current realm으로 둔다.
-
onLockGrantedCallback을 다음 단계를 수행하는 알고리즘으로 둔다:
-
queue에 다음 단계를 enqueue한다:
-
result를 queue, databaseMap, 그리고 key와 함께 database에서 entry 삭제를 실행한 결과로 둔다.
-
result가 false이고 globalObject가
SharedStorageWorkletGlobalScope이면:-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
이 단계를 중단한다.
-
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 undefined로 resolve한다.
-
-
-
options["
withLock"]가 exists하면:-
options["
withLock"]가 U+002D HYPHEN-MINUS (-)로 시작하면,TypeError로 rejected된 promise를 반환한다. -
environment의 origin, options["
withLock"], 그리고 onLockGrantedCallback이 주어졌을 때 shared storage lock 안에서 callback 처리를 실행한다.
-
-
그렇지 않으면, 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에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다.
-
-
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
databaseMap를 environment 및 environment의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
realm을 current realm으로 둔다.
-
onLockGrantedCallback을 다음 단계를 수행하는 알고리즘으로 둔다:
-
queue에 다음 단계를 enqueue한다:
-
result를 queue와 databaseMap와 함께 database의 모든 entry 지우기를 실행한 결과로 둔다.
-
result가 false이고 globalObject가
SharedStorageWorkletGlobalScope이면:-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
이 단계를 중단한다.
-
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 undefined로 resolve한다.
-
-
-
options["
withLock"]가 exists하면:-
options["
withLock"]가 U+002D HYPHEN-MINUS (-)로 시작하면,TypeError로 rejected된 promise를 반환한다. -
environment의 origin, options["
withLock"], 그리고 onLockGrantedCallback이 주어졌을 때 shared storage lock 안에서 callback 처리를 실행한다.
-
-
그렇지 않으면, 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로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 설정한다.
-
allowedInOpaqueOriginContext를 false로 둔다.
-
environment, environment의 origin, 그리고 allowedInOpaqueOriginContext가 주어졌을 때 context에 의해 shared storage가 허용되는지 결정을 실행한 결과가 false이면,
TypeError로 rejected된 promise를 반환한다. -
environment 및 environment의 origin이 주어졌을 때 사용자 환경설정이 shared storage에 대한 접근을 허용하는지 확인을 실행한 결과가 false이면,
OperationError로 rejected된 promise를 반환한다. -
document를 context의 active document로 둔다.
-
"fenced-unpartitioned-storage-read", document, 그리고 environment의 origin에 대해 Is feature enabled in document for origin?을 실행한 결과가 false이면,
OperationError로 rejected된 promise를 반환한다. -
navigable를 document의 node navigable로 둔다.
-
navigable이 주어졌을 때 navigable이 network를 완전히 revoked했는지 결정을 실행한 결과가 false이면,
OperationError로 rejected된 promise를 반환한다.
-
-
그렇지 않으면: 1
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다.-
context를
SharedStorage의SharedStorageWorkletGlobalScope의 outside settings의 target browsing context로 설정한다. -
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 설정한다.
-
-
key의 length가 maximum length를 초과하면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
realm을 current realm으로 둔다.
-
databaseMap를 environment 및 realm의 settings object의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
queue에 다음 단계를 enqueue한다:
-
value를 queue, databaseMap, environment, 그리고 key와 함께 database에서 entry 가져오기를 실행한 결과로 둔다.
-
value가 failure이면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
그렇지 않고 value가 undefined이면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 undefined로 resolve한다.
-
그렇지 않으면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 value로 resolve한다.
-
-
promise를 반환한다.
length() 메서드 단계는 다음과 같다:
-
promise를 새 promise로 둔다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다. -
context를
SharedStorage의SharedStorageWorkletGlobalScope의 outside settings의 target browsing context로 둔다. -
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
realm을 current realm으로 둔다.
-
databaseMap를 environment 및 realm의 settings object의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
queue에 다음 단계를 enqueue한다:
-
numEntries를 queue 및 environment와 함께 database의 entry 개수 세기를 실행한 결과로 둔다.
-
numEntries가 failure이면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
그렇지 않으면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 numEntries로 resolve한다.
-
-
promise를 반환한다.
remainingBudget() 메서드 단계는 다음과 같다:
-
promise를 새 promise로 둔다.
-
SharedStorage의 연결된SharedStorageWorkletGlobalScope에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다. -
context를
SharedStorage의SharedStorageWorkletGlobalScope의 outside settings의 target browsing context로 둔다. -
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
realm을 current realm으로 둔다.
-
allowedInOpaqueOriginContext를 false로 둔다.
-
environment, realm의 settings object의 origin, 그리고 allowedInOpaqueOriginContext가 주어졌을 때 context에 의해 shared storage가 허용되는지 결정을 실행한 결과가 false이면,
TypeError로 rejected된 promise를 반환한다. -
environment 및 realm의 settings object의 origin이 주어졌을 때 사용자 환경설정이 shared storage에 대한 접근을 허용하는지 확인을 실행한 결과가 false이면,
TypeError로 rejected된 promise를 반환한다. -
site를 realm의 settings object의 origin과 함께 site 얻기를 실행한 결과로 둔다.
-
Assert: site는 opaque origin이 아니다.
-
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
queue에 다음 단계를 enqueue한다:
-
remainingBudget을 site와 함께 남은 navigation budget 결정을 실행한 결과로 둔다.
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 remainingBudget으로 resolve하도록 Resolve한다.
-
-
promise를 반환한다.
6.6. Iteration
각 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에 대해 addModule이 완료되었는지 확인을 실행한 결과가 false이면,TypeError로 rejected된 promise를 반환한다. -
context를
SharedStorage의SharedStorageWorkletGlobalScope의 outside settings의 target browsing context로 둔다. -
context가 null이면,
TypeError로 rejected된 promise를 반환한다. -
context의 active window의 associated document가 fully active가 아니면,
TypeError로 rejected된 promise를 반환한다. -
environment를 context의 active window의 relevant settings object로 둔다.
-
realm을 current realm으로 둔다.
-
databaseMap를 environment 및 realm의 settings object의 origin이 주어졌을 때 shared storage bottle map 얻기를 실행한 결과로 둔다.
-
databaseMap가 failure이면,
TypeError로 rejected된 promise를 반환한다. -
queue를 context의 연결된 database의 shared storage database queue로 둔다.
-
queue에 다음 단계를 enqueue한다:
-
entries를 queue 및 environment와 함께 database에서 모든 entry 가져오기를 실행한 결과로 둔다.
-
entries가 failure이면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를
TypeError로 reject한다. -
그렇지 않으면, realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 entries로 resolve한다.
-
-
promise의 fulfillment 시, 다음을 실행한다:
-
promiseEntries를 promise의 값으로 둔다.
-
promiseEntries 안의 각 entry entry에 대해 For each, entry를 iterator의 pending entries에 enqueue한다.
-
-
promise의 rejection 시, iterator의 error를 true로 설정한다.
SharedStorage의
async iterator iterator가 주어졌을 때 다음 iteration 결과 가져오기를 하려면, 다음 단계를
실행한다:
-
promise를 새 promise로 둔다.
-
-
iterator의 error가 true이면,
TypeError로 rejected된 promise를 반환한다. -
iterator의 pending entries가 empty이면:
-
객체 doneObject를 생성한다.
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 doneObject로 resolve한다.
-
이 단계를 중단한다.
-
-
그렇지 않으면, entry를 iterator의 pending entries에서 dequeueing한 결과로 둔다.
-
realm의 global object가 주어졌을 때 DOM manipulation task source의 global task를 queue하여 promise를 entry로 resolve한다.
-
-
promise를 반환한다.
7. HTTP Response Header를 통한 Operation 트리거
setter 및 deleter operation(예: set(),
append(),
delete(),
clear())은
Window
또는 SharedStorageWorkletGlobalScope에
대한 위 API들을 통해 시작할 수 있지만, setter/deleter operation은 대안적으로 HTTP response header를 통해 트리거될 수 있다.
이를 위해 HTML 및 Fetch 명세에 monkey patch가 필요하다.
8. HTML Monkey Patch
8.1. sharedStorageWritable
및
sharedstoragewritable
Attribute
다음 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 attribute sharedStorageWritable은
같은 이름의 해당 content attribute를 reflect해야 한다.
8.2. HTML Algorithm 수정
8.2.1. Update the image data Algorithm에 대한 수정
다음 단계 뒤에
request의 priority를 현재 상태로 설정한다...
다음 단계를 추가한다
-
element에
sharedstoragewritableattribute가 있으면, request의 shared storage writable을 true로 설정한다.
8.2.2. Create navigation params by fetching Algorithm에 대한 수정
다음 단계 뒤에
request를 ...를 가진 새 request로 둔다
다음 단계를 추가한다
-
navigable의 container가
iframeelement이고, 그것이sharedstoragewritablecontent attribute를 가지면, request의 shared storage writable을 true로 설정한다.
9. Fetch Monkey Patch
9.1. sharedStorageWritable
Key
request는 연결된 boolean shared storage writable을 가진다. 달리 명시되지 않는 한 false이다.
RequestInit
dictionary는 sharedStorageWritable
key를 포함한다:
partial dictionary RequestInit {boolean ; };sharedStorageWritable
9.2. Fetch Algorithm 수정
9.2.1. Request Constructor Algorithm에 대한 수정
다음 단계 앞에
this의 request를 request로 설정한다.
다음 단계를 추가한다
-
init["
sharedStorageWritable"]가 exists하면, request의 shared storage writable을 그것으로 설정한다.
9.2.2. HTTP network or cache fetch Algorithm에 대한 수정
다음 단계 앞에
HTTP에 따라 httpRequest의 header list를 수정한다. ...
다음 단계를 추가한다
-
httpRequest에 대해 Sec-Shared-Storage-Writable request header를 append하거나 수정한다.
9.2.3. HTTP fetch Algorithm에 대한 수정
다음 단계 앞에
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가 input으로 주어졌을 때 structured field value 가져오기 알고리즘을 실행한 결과로 둔다.
-
-
allowed가 false이면, network error를 반환한다.
-
-
-
Shared-Storage-Write response 처리를 response internalResponse 및 request request가 input으로 주어졌을 때 실행한다.
9.3. Shared Storage HTTP Header
9.3.1.
`Sec-Shared-Storage-Data-Origin`
Request Header
이 명세는 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`
Response Header
이 명세는 Shared-Storage-Cross-Origin-Worklet-Allowed HTTP response header를 정의한다.
`Shared-Storage-Cross-Origin-Worklet-Allowed`
response header는 그 value가
Boolean이어야
하는 Structured Header이다.
response가
`Shared-Storage-Cross-Origin-Worklet-Allowed`를
true value로 가질 때, worklet script의 server는 cross-origin site가 worklet script의 origin의
shared storage data를 사용하여 worklet을 생성하도록 허가한 것이다.
9.3.3.
`Sec-Shared-Storage-Writable`
Request Header
이 명세는 Sec-Shared-Storage-Writable HTTP request header를 정의한다.
`Sec-Shared-Storage-Writable`
request header는 그 value가
Boolean이어야
하는 Structured Header이다.
request가
`Sec-Shared-Storage-Writable`을
true로 설정하면 그 response는 shared storage에 쓸 수 있다.
9.3.4.
`Shared-Storage-Write`
Response Header
이 명세는 Shared-Storage-Write HTTP response header를 정의한다.
`Shared-Storage-Write`
response header는 그 value가
List여야
하는 Structured Header이다. 다음 list
member들이 정의된다. 동일한 문자 sequence를 보유하는 Tokens와 Strings는 동등한 것으로
간주된다. HTTP header를 통해 non-ASCII Unicode key 및
value를 쓰고 삭제하는 기능을 제공하기 위해, UTF-8 encoded byte를 나타내는 Byte Sequences도 허용된다.
알 수 없는 list member들, 즉 string도 아니고 Byte Sequences도 아닌 type들을 포함한 member들은 건너뛰며, 나머지 list는 그것들이 없는 것처럼 처리된다. 필요한 parameters가 없거나 그 parameters가 예상하지 못한 type을 가지는 경우에도 member들은 건너뛴다.
-
set-
필수 parameters:
-
key(Token, String, 또는 Byte Sequence) -
value(Token, String, 또는 Byte Sequence)
-
-
선택적 parameter:
-
ignore_if_present(Boolean)
-
-
ignore_if_present의 parameter value가 null 또는 false이거나,key의 parameter value가 responding server의 origin에 대한 shared storage database에 아직 존재하지 않으면,set은 responding server의 origin에 대한 shared storage database에,key와value에 대한 parameter values로 구성된 entry를, 각각 entry의 key 및 entry의 value struct의 value로 써 넣는다. -
ignore_if_present의 parameter value가 true이고key의 parameter value가 responding server의 origin에 대한 shared storage database에 이미 존재하면,set은 no-op이다.
-
-
append-
필수 parameters:
-
key(Token, String, 또는 Byte Sequence) -
value(Token, String, 또는 Byte Sequence)
-
-
key의 parameter value가 responding server의 origin에 대한 shared storage database에 이미 존재하면,append는value에 대한 parameter value를 추가하여 해당 key의 entry의 value struct의 value를 갱신한다. -
key의 parameter value가 responding server의 origin에 대한 shared storage database에 아직 존재하지 않으면,append는ignore_if_present가 false인set과 동등하다. 즉,append는 responding server의 origin에 대한 shared storage database에,key및value에 대한 parameter values로 구성된 entry를, 각각 entry의 key 및 entry의 value struct의 value로 써 넣는다.
-
-
delete-
필수 parameter:
-
key(Token, String, 또는 Byte Sequence)
-
-
delete는 responding server의 origin에 대한 shared storage database에서, 그 key가key의 parameter value와 같은 모든 entry를 지운다.
-
-
clear-
clear는 responding server의 origin에 대한 shared storage database 안의 모든 entries를 지운다.
-
Note: Unicode key 및 value를 수용하기 위해 Byte Sequences를 허용한다. 모든 Byte Sequence는 UTF-8 encoded된 것으로 간주되며, 그렇지 않으면 parse에 실패한다.
예제를 추가한다.
9.4. Shared Storage Fetch 관련 알고리즘
-
window를 request의 window로 둔다.
-
window가 그 global object가
Window인 environment settings object가 아니면, false를 반환한다. -
allowedInOpaqueOriginContext를 true로 둔다.
-
window, request의 current URL의 origin, 그리고 allowedInOpaqueOriginContext가 주어졌을 때 context에 의해 shared storage가 허용되는지 결정을 실행한 결과가 false이면, false를 반환한다.
-
window 및 request의 current URL의 origin이 주어졌을 때 사용자 환경설정이 shared storage에 대한 접근을 허용하는지 확인을 실행한 결과가 false이면, false를 반환한다.
request가 현재 shared storage를 사용할 수 있는지 결정 알고리즘은 https://github.com/w3c/webappsec-permissions-policy/pull/499에 설명된 대로 "opt-in features"를 고려해야 한다.
-
request의 shared storage writable이 true가 아니면 반환한다.
Note: redirect에서는 request의 shared storage writable이 true일 수 있지만, redirect에는 shared storage를 사용할 권한이 없어 request에 대해 request가 현재 shared storage를 사용할 수 있는지 결정을 실행한 결과가 false가 될 수 있다.
-
request에 대해 request가 현재 shared storage를 사용할 수 있는지 결정을 실행한 결과가 false이면, request의 header list에서 `
Sec-Shared-Storage-Writable`를 delete한다. -
그렇지 않으면, request의 header list에서 (`
Sec-Shared-Storage-Writable`, true)를 structured field value 설정한다.
-
sharedStorageWritable을 `
Sec-Shared-Storage-Writable`, "item", 그리고 request의 header list가 input으로 주어졌을 때 structured field value 가져오기 알고리즘을 실행한 결과로 둔다. -
sharedStorageWritable이 null이거나, sharedStorageWritable이 Boolean이 아니거나, sharedStorageWritable의 value가 false이면, 반환한다.
-
window를 request의 window로 둔다.
-
Assert: window는 그 global object가
Window인 environment settings object이다. -
sharedStorage를 window의 global object의
sharedStorage로 둔다. -
sharedStorage가 null이면 반환한다.
-
list를 response의 header list로 둔다.
-
operationsToParse를 `
Shared-Storage-Write`, "list", 그리고 list가 input으로 주어졌을 때 structured field value 가져오기 알고리즘을 실행한 결과로 둔다. -
operationsToParse가 null 또는 empty이면 반환한다.
-
methods를 빈 list로 둔다.
-
batchWithLock을 null로 둔다.
-
operationsToParse 안의 각 tuple (item, parameters)에 대해, 다음 단계를 수행한다:
-
item이 Inner List이면, continue한다.
-
methodOrOptionsString을 item에 대해 string value 가져오기를 실행한 결과로 둔다.
-
methodOrOptionsString이 failure이면, continue한다.
-
methodOrOptionsString에 대해 switch한다:
- methodOrOptionsString이 "
clear"이면: -
다음 단계를 수행한다:
-
options를 새
SharedStorageModifierMethodOptions로 둔다. -
withLock을 parameters 및 "
with_lock"과 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
withLock이 null이 아니고 U+002D HYPHEN-MINUS (-)로 시작하지 않으면, options["
withLock"]를 withLock으로 set한다. -
method를 new
SharedStorageClearMethod(options)로 둔다. -
exception이 throw되었으면, continue한다.
-
method를 methods에 Append한다.
-
Continue한다.
-
- methodOrOptionsString이 "
delete"이면: -
다음 단계를 수행한다:
-
key를 parameters 및 "
key"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
key가 null이면, continue한다.
-
options를 새
SharedStorageModifierMethodOptions로 둔다. -
withLock을 parameters 및 "
with_lock"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
withLock이 null이 아니고 U+002D HYPHEN-MINUS (-)로 시작하지 않으면, options["
withLock"]를 withLock으로 set한다. -
method를 new
SharedStorageDeleteMethod(key, options)로 둔다. -
exception이 throw되었으면, continue한다.
-
method를 methods에 Append한다.
-
Continue한다.
-
- methodOrOptionsString이 "
append"이면: -
다음 단계를 수행한다:
-
key를 parameters 및 "
key"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
key가 null이면, continue한다.
-
value를 parameters 및 "
value"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
value가 null이면, continue한다.
-
options를 새
SharedStorageModifierMethodOptions로 둔다. -
withLock을 parameters 및 "
with_lock"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
withLock이 null이 아니고 U+002D HYPHEN-MINUS (-)로 시작하지 않으면, options["
withLock"]를 withLock으로 set한다. -
method를 new
SharedStorageAppendMethod(key, value, options)로 둔다. -
exception이 throw되었으면, continue한다.
-
method를 methods에 Append한다.
-
Continue한다.
-
- methodOrOptionsString이 "
set"이면: -
다음 단계를 수행한다:
-
key를 parameters 및 "
key"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
key가 null이면, continue한다.
-
value를 parameters 및 "
value"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
value가 null이면, continue한다.
-
options를 새
SharedStorageSetMethodOptions로 둔다. -
parameters 및 "
ignore_if_present"와 함께 boolean parameter value 얻기를 실행한 결과가 true이면, options["ignoreIfPresent"]를 true로 set한다. -
withLock을 parameters 및 "
with_lock"와 함께 string-like parameter value 얻기를 실행한 결과로 둔다. -
withLock이 null이 아니고 U+002D HYPHEN-MINUS (-)로 시작하지 않으면, options["
withLock"]를 withLock으로 set한다. -
method를 new
SharedStorageSetMethod(key, value, options)로 둔다. -
exception이 throw되었으면, continue한다.
-
method를 methods에 Append한다.
-
Continue한다.
-
- methodOrOptionsString이 "
options"이면: -
다음 단계를 수행한다:
-
batchWithLock을 parameters 및 "
with_lock"와 함께 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에 대해 string-like인지 확인을 실행한 결과가 false이면, failure를 반환한다.
-
item의 type에 대해 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]에 대해 string-like인지 확인의 결과가 false이면, null을 반환한다.
-
parameters[paramKey]에 대해 string value 가져오기를 실행한 결과를 반환한다.
10. Web Locks 통합
10.1. User Agent 연결 상태
shared storage lock managers map은 origins에서 lock managers로의 map이다. 처음에는 비어 있다.
user agent는 연결된 shared storage lock managers map을 가진다.
Note: data partitioning과 유사하게, shared storage는 Storage Buckets API와 독립적인 자체 lock management scope를 가진다. 이러한 web locks는 기존 legacy Web Locks API를 통해 Window 또는 Worker에서 생성된 web locks와 상호작용하지 않는다.
10.2. SharedStorageWorkletNavigator
interface
[Exposed =SharedStorageWorklet ]interface {};SharedStorageWorkletNavigator
10.3. Web Locks IDLs Monkey Patch
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의 description에 대한 Monkey Patch
lock manager를 정의하는 paragraph 끝에 다음 문장을 추가한다: "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를 throw한다.
-
-
this의 relevant settings object의
LockManagerobject를 반환한다
10.6. "obtain a lock manager" algorithm에 대한 Monkey Patch
obtain a lock manager 알고리즘 앞에 다음 단계를 prepend해야 한다:
-
current realm의 global object가
SharedStorageWorkletGlobalScope이면:-
workletDataOrigin을 environment의 origin으로 둔다.
-
shared storage lock managers map[workletDataOrigin]를 반환한다.
-
10.7. "Handle callback within a shared storage lock" algorithm
-
environment를 this의 relevant settings object로 둔다.
-
lockManager를 shared storage lock managers map[workletDataOrigin]로 둔다.
-
promise를 new promise로 둔다.
-
defaultOptions를 새
LockOptions로 둔다. -
promise, current agent, environment의 id, lockManager, callback, name, defaultOptions["
mode"], defaultOptions["ifAvailable"], defaultOptions["steal"], defaultOptions["signal"]와 함께 lock 요청을 실행한다.
Note: 기본 LockOptions에서는,
lock이 granted될 때 결국 callback이 호출된다(즉, lock request는 실패하지 않는다).
11. Permissions Policy 통합
이 명세는 다음 문자열로 식별되는 세 개의 policy-controlled features를 정의한다:
shared-storage"는 일반적인 Shared Storage 접근을 gate한다.
"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. Privacy 고려사항
Shared Storage API는 third-party cookies를 사용하는 것보다 사용자 privacy를 더 잘 보호하는 방식으로, 다양한 use
case에서 cross-site data를 사용할 수 있는 능력을 제공하려고 한다. Shared Storage의 주요 privacy safeguard는 그 storage에
저장된 data에 대한 read access가 embedder의 SharedStorageWorklet
안에서만 발생할 수 있다는 점이다. 잘 정의된 limit는 SharedStorageWorklet에서
data의 output을 최소한으로 제한한다.
특히, embedder는 자신의 shared storage 안의 data를 기반으로 짧은 URL 목록에서 URL을
선택한 다음, 그 결과를 fenced frame에 표시할 수 있다. embedder는 더 장기적으로 더 잘 완화될
특정 메커니즘을 통하지 않고는 어떤 URL이
선택되었는지 알 수 없다. 현재는 사용자가 fenced frame을 클릭하여 top-level traversable navigation을 시작하거나, fenced frame이 reportEvent()
API를 호출할 때마다 몇 bit의 entropy가 leak될 수 있다.
embedder는 또한 Private Aggregation API를 통해 aggregatable report를 보낼 수 있다. 이 API는 differential privacy를 달성하기 위해 noise를 추가하고, report 전송에 시간 지연을 사용하며, 전송되는 report 수에 limit를 부과하고, individual privacy가 보호되도록 report를 aggregate data로 처리한다.