1. 序論
~webは、 何年かにわたり~storage用に利用できる様々な~APIを成長させてきた — 例えば IndexedDB, `localStorage^c, `showNotification()^c 。 ~Storage標準は、 次を定義することにより,これらの~APIを統括する: ◎ Over the years the web has grown various APIs that can be used for storage, e.g., IndexedDB, localStorage, and showNotification(). The Storage Standard consolidates these APIs by defining:
- これらの~APIが~dataを格納するための~primitiveとなる,~bucket。 ◎ A bucket, the primitive these APIs store their data in
- その~bucketを持続的にする仕方。 ◎ A way of making that bucket persistent
- 与えられた`生成元$に対する使用量と~quota見積もりを取得する仕方。 ◎ A way of getting usage and quota estimates for an origin
伝統的に,これらの~APIにより格納された~dataは、 機器~上の~storage空間を利用者が使果たすに伴い,利用者が介入できることなく喪失されていた。 が、 持続的な~bucketは,利用者の同意なくしては~clearできない。 したがって,これは、 利用者が~webに~nativeな~platformで享受した~dataの保証をもたらす。 ◎ Traditionally, as the user runs out of storage space on their device, the data stored with these APIs gets lost without the user being able to intervene. However, persistent buckets cannot be cleared without consent by the user. This thus brings data guarantees users have enjoyed on native platforms to the web.
~storageを持続的にする単純な仕方は、 `persist()$m ~methodを呼出すことである。 それは同時に,末端利用者に許可を要請して、 是認されたなら,~storageを持続的になるよう変更する: ◎ A simple way to make storage persistent is through invoking the persist() method. It simultaneously requests the end user for permission and changes the storage to be persistent once granted:
navigator.storage.persist().then(%persisted => { if (%persisted) { /* … */ } });
~UAにより駆動される~dialogを末端利用者に いきなり示さないような, もう少し込み入った~codeも書ける: ◎ To not show user-agent-driven dialogs to the end user unannounced slightly more involved code can be written:
Promise.all([ navigator.storage.persisted(), navigator.permissions.query({name: "persistent-storage"}) ]).then(([%persisted, %permission]) => { if (!%persisted && %permission.state == "granted") { navigator.storage.persist().then( /* … */ ) } else if (!%persisted && %permission.state == "prompt") { showPersistentStorageExplanation() } });
`estimate()$m ~methodを利用すれば,~appが格納する内容に十分な空きがあるかどうかも決定できる: ◎ The estimate() method can be used to determine whether there is enough space left to store content for an application:
function retrieveNextChunk(%nextChunkInfo) { return navigator.storage.estimate().then(%info => { if (%info.quota - %info.usage > %nextChunkInfo.size) { return fetch(%nextChunkInfo.url); } else {【!"insufficient space to store next chunk"】 throw new Error("次の~chunkを格納するための空きが足りません") } }).then( /* … */ ); }
【この訳に特有な表記規約】
◎表記記号2. 各種用語
この仕様は、 `INFRA$r に依存する。 ◎ This specification depends on the Infra Standard. [INFRA]
この仕様は、 次に挙げる各種~標準による各種用語を利用する ⇒# `HTML$r `WEBIDL$r `PERMISSIONS$r ◎ This specification uses terminology from the HTML, IDL, and Permissions Standards. [HTML] [WEBIDL] [PERMISSIONS]
3. 情勢
`~UA$は、 次に挙げるような何種類かの半-持続的な状態を有する: ◎ A user agent has various kinds of semi-persistent state:
- 資格証 ◎ Credentials
- ~HTML~formを通して提出された~usernameや~passwordなど,末端利用者の資格証からなる。 ◎ End-user credentials, such as username and passwords submitted through HTML forms
- 許可 ◎ Permissions
- 地理所在など,様々な特能に対する許可からなる。 ◎ Permissions for various features, such as geolocation
- ~network ◎ Network
- 次に挙げるもの, 等々からなる ⇒# ~HTTP~cache, ~cookie, 認証~entry, ~TLS~client証明書 ◎ HTTP cache, cookies, authentication entries, TLS client certificates
- ~storage ◎ Storage
- 次に挙げるもの, 等々からなる ⇒# Indexed DB, Cache API, ~sw登録, `localStorage^m, `sessionStorage^m, ~app~cache, 通知 ◎ Indexed DB, Cache API, service worker registrations, localStorage, sessionStorage, application caches, notifications, etc.
この標準が首に関わるのは、 ~storageである。 ◎ This standard primarily concerns itself with storage.
4. ~model
[ 局所/~session ]~storage~APIを定義している標準は、 `~storage端点$を定義して,それを — この標準を変更することを通して — `登録-済み~storage端点~群$に登録することになる。 当の標準は、[ `局所~storage瓶~mapを得する$/ `~session~storage瓶~mapを得する$ ]いずれかの~algoを呼出してそれを与えることになる: ◎ Standards defining local or session storage APIs will define a storage endpoint and register it by changing this standard. They will invoke either the obtain a local storage bottle map or the obtain a session storage bottle map algorithm, which will give them:
- 結果における `失敗^i は、 次のいずれかを意味する ⇒# 当の~APIは例外を投出する必要があるかもしれない/ 当の`環境~設定群~obj$用に可用な~storageは無いことを指示する ◎ Failure, which might mean the API has to throw or otherwise indicate there is no storage available for that environment settings object.
- `~storage~proxy~map$は、 当の~APIに適する方式で~dataを格納するために利用でき,`~map$と相似的に演算する。 [ 当の~APIと他の~APIからの~data/ 各`~storage~key$/ 各`~storage種別$ ]どうしを隔離する~careは、 この標準が担う。 ◎ A storage proxy map that operates analogously to a map, which can be used to store data in a manner that suits the API. This standard takes care of isolating that data from other APIs, storage keys, and storage types.
注記: そのような~API用の標準を定義している~~策定者は、 この標準に対し課題を申請して,支援と考査を受けることを考慮すること。 ◎ If you are defining a standard for such an API, consider filing an issue against this standard for assistance and review.
この~dataを隔離するため、 この標準は,次を定義する: ◎ To isolate this data this standard defines\
- `~storage倉$は、 `~storage~key$により各`~storage棚$を区分する。 ◎ a storage shed which segments storage shelves by a storage key.\
- `~storage棚$は、 1 個の`~storage~bucket$からなる — が,将来には、 各種~storage施策~用に[ 複数個の`~storage~bucket$からなることも許容する ]ことになる見込みが高い。 ◎ A storage shelf in turn consists of a storage bucket and will likely consist of multiple storage buckets in the future to allow for different storage policies.\
- `~storage~bucket$は、 0 個以上の — 各`~storage端点$ごとに 1 個ある — `~storage瓶$からなる。 ◎ And lastly, a storage bucket consists of storage bottles, one for each storage endpoint.
4.1. ~storage端点
`~storage端点@ ( `storage endpoint^en )は、 その~storageに必要なものを追跡し続けるために,この標準が定義する基盤 — 特に,`~storage瓶$ — を利用する[ `局所~storage$/`~session~storage$ ]~APIである。 ◎ A storage endpoint is a local or session storage API that uses the infrastructure defined by this standard, most notably storage bottles, to keep track of its storage needs.
各`~storage端点$は、 次に挙げるものを有する: ◎ ↓
- `識別子@sE ⇒ ある`~storage識別子$ ◎ A storage endpoint has an identifier, which is a storage identifier.
- `種別~群@sE ⇒ `~storage種別$たちが成す`集合$ ◎ A storage endpoint also has types, which is a set of storage types.
-
`~quota@sE ⇒ ~NULL /ある整数
これは、[ この`~storage端点$に対応する各`~storage瓶$ ]用に推奨される`~quota$sBを(整数の場合は~byte数で)表現する。
◎ A storage endpoint also has a quota, which is null or a number representing a recommended quota (in bytes) for each storage bottle corresponding to this storage endpoint.
`~storage識別子@ ( `storage identifier^en )は、 `~ASCII文字列$である。 ◎ A storage identifier is an ASCII string.
`~storage種別@ ( `storage type^en )は、[ `local^l / `session^l ]である。 ◎ A storage type is "local" or "session".
`登録-済み~storage端点~群@ ( `egistered storage endpoints^en )は、[ 次の表tを成す各行により定義される`~storage端点$ ]たちが成す`集合$である: ◎ The registered storage endpoints are a set of storage endpoints defined by the following table:
`識別子$sE | `種別~群$sE | `~quota$sE |
---|---|---|
`caches^l | « `local^l » | ~NULL |
`indexedDB^l | « `local^l » | ~NULL |
`localStorage^l | « `local^l » | 5 ~mebibyte† |
`serviceWorkerRegistrations^l | « `local^l » | ~NULL |
`sessionStorage^l | « `session^l » | 5 ~mebibyte† |
† 1 ~mebibyte ~EQ 2 の 20 乗~byte ( ~EQ ~kibibyte の 2 乗)
◎ Identifier|Type|Quota "caches"|« "local" »|null "indexedDB"|« "local" »|null "localStorage"|« "local" »|5 × 220 (i.e., 5 mebibytes) "serviceWorkerRegistrations"|« "local" »|null "sessionStorage"|« "session" »|5 × 220 (i.e., 5 mebibytes)注記: 各 標準は,すでに言及したとおり、 これらの`~storage識別子$を利用して[ `局所~storage瓶~mapを得する$/ `~session~storage瓶~mapを得する$ ]ことができる。 一部の~APIは、 今後,どちらの`~storage種別$にも適用-可能になるものと見越されている。 ◎ As mentioned, standards can use these storage identifiers with obtain a local storage bottle map and obtain a session storage bottle map. It is anticipated that some APIs will be applicable to both storage types going forward.
4.2. ~storage~key
`~storage~key@ ( `storage key^en )は、 次に挙げるものからなる`~tuple$である: ◎ A storage key is a tuple consisting of\
- `生成元@stK — `生成元$ `HTML$r ◎ an origin (an origin). [HTML]
これは変更されるものと予期される — ~client側~storageの仕切り法 を見よ。 ◎ This is expected to change; see Client-Side Storage Partitioning.
`~storage~keyを得する@ ときは、 所与の ( `環境$ %環境 ) に対し,次の手続きを走らす: ◎ To obtain a storage key, given an environment environment, run these steps:
- %~key ~LET `非~storage目的~用に~storage~keyを得する$( %環境 ) ◎ Let key be the result of running obtain a storage key for non-storage purposes with environment.
- ~IF[ %~key の`生成元$stKは`不透明な生成元$である ] ⇒ ~RET `失敗^i ◎ If key’s origin is an opaque origin, then return failure.
- ~IF[ 利用者は~storageを不能化した ] ⇒ ~RET `失敗^i ◎ If the user has disabled storage, then return failure.
- ~RET %~key ◎ Return key.
`非~storage目的~用に~storage~keyを得する@ ときは、 所与の ( `環境$ %環境 ) に対し,次の手続きを走らす: ◎ To obtain a storage key for non-storage purposes, given an environment environment, run these steps:
- %生成元 ~LET %環境 に応じて ⇒# `環境~設定群~obj$であるならば %環境 の`生成元$enV/ ~ELSE_ %環境 の`作成時の~URL$enVの`生成元$url ◎ Let origin be environment’s origin if environment is an environment settings object; otherwise environment’s creation URL’s origin.
- ~RET `~tuple$ ( %生成元 ) ◎ Return a tuple consisting of origin.
2 つの`~storage~key$ ( %A, %B ) が`同等な~storage~key@ であるとは、 次を満たすことをいう ⇒ ( %A の`生成元$stK, %B の`生成元$stK ) は`同一-生成元$である ◎ To determine whether a storage key A equals storage key B, run these steps: • If A’s origin is not same origin with B’s origin, then return false. • Return true.
4.3. ~storage倉
`~storage倉@ ( `storage shed^en )は、 `~storage~key$から`~storage棚$への`~map$であり,初期~時は空とする。 【~keyどうしの比較は、`同等な~storage~key$に基づくであろう。】 ◎ A storage shed is a map of storage keys to storage shelves. It is initially empty.
各`~UA$は、 `~UA~storage倉@ を保持する。 それは、 `~storage倉$であり,すべての `局所~storage@ ( `local storage^en )~dataを保持する。 ◎ A user agent holds a storage shed, which is a storage shed. A user agent’s storage shed holds all local storage data.
各 `辿可能な~navigable$は、 `~session~storage倉@ を保持する。 それは、 `~storage倉$であり,すべての `~session~storage@ ( `session storage^en )~dataを保持する。 ◎ A traversable navigable holds a storage shed, which is a storage shed. A traversable navigable’s storage shed holds all session storage data.
`辿可能~session~storage倉を旧来~cloneする@ ときは、 所与の ( `辿可能な~navigable$ %A, `辿可能な~navigable$ %B ) に対し,次の手続きを走らす: ◎ To legacy-clone a traversable storage shed, given a traversable navigable A and a traversable navigable B, run these steps:
-
%A の`~session~storage倉$を成す ~EACH( %~key → %棚 ) に対し: ◎ For each key → shelf of A’s storage shed:
- %新たな棚 ~LET `~storage棚を作成する$( `session^l ) ◎ Let newShelf be the result of running create a storage shelf with "session".
- %新たな棚 の`~bucket~map$[ `default^l ] の`瓶~map$[ `sessionStorage^l ] の`~map$sB ~SET %棚 の`~bucket~map$[ `default^l ] の`瓶~map$[ `sessionStorage^l ] の`~map$sBを`~cloneする$map ◎ Set newShelf’s bucket map["default"]'s bottle map["sessionStorage"]'s map to a clone of shelf’s bucket map["default"]'s bottle map["sessionStorage"]'s map.
- %B の`~session~storage倉$[ %~key ] ~SET %新たな棚 ◎ Set B’s storage shed[key] to newShelf.
注記: これは、 旧来のものと見なされる — 便益があるとしても,実装の複階性に勝るものではないので。 したがって、 `HTML$r の[ 外側へ拡げられる/外側で利用される ]ことはない。 ◎ This is considered legacy as the benefits, if any, do not outweigh the implementation complexity. And therefore it will not be expanded or used outside of HTML. [HTML]
4.4. ~storage棚
`~storage棚@ ( `storage shelf^en )は、 `~storage倉$の中の各`~storage~key$に対し存在する。 それは、 `~bucket~map@ — `文字列$から`~storage~bucket$への`~map$ — を保持する。 ◎ A storage shelf exists for each storage key within a storage shed. It holds a bucket map, which is a map of strings to storage buckets.
注記: 今の所、 `~bucket~map$に存在する`~key$mapは `default^l しかない。 課題 #2 を見よ。 対応する`値$mapは、 初回に~storage棚が得されたとき,与えられる。 ◎ For now "default" is the only key that exists in a bucket map. See issue #2. It is given a value when a storage shelf is obtained for the first time.
`~storage棚を得する@ ときは、 所与の ( `~storage倉$ %倉, `環境~設定群~obj$ %環境, `~storage種別$ %種別 ) に対し,次の手続きを走らす: ◎ To obtain a storage shelf, given a storage shed shed, an environment settings object environment, and a storage type type, run these steps:
- %~key ~LET `~storage~keyを得する$( %環境 ) ◎ Let key be the result of running obtain a storage key with environment.
- ~IF[ %~key ~EQ `失敗^i ] ⇒ ~RET `失敗^i ◎ If key is failure, then return failure.
- ~IF[ %倉[ %~key ] ~EQ ε ] ⇒ %倉[ %~key ] ~SET `~storage棚を作成する$( %種別 ) ◎ If shed[key] does not exist, then set shed[key] to the result of running create a storage shelf with type.
- ~RET %倉[ %~key ] ◎ Return shed[key].
`局所~storage棚を得する@ ときは、 所与の ( `環境~設定群~obj$ %環境 ) に対し,次の結果を返す ⇒ `~storage棚を得する$( `~UA~storage倉$, %環境, `local^l ) ◎ To obtain a local storage shelf, given an environment settings object environment, return the result of running obtain a storage shelf with the user agent’s storage shed, environment, and "local".
`~storage棚を作成する@ ときは、 所与の ( `~storage種別$ %種別 ) に対し,次の手続きを走らす: ◎ To create a storage shelf, given a storage type type, run these steps:
- %棚 ~LET 新たな`~storage棚$ ◎ Let shelf be a new storage shelf.
- %棚 の`~bucket~map$[ `default^l ] ~SET `~storage~bucketを作成する$( %種別 ) ◎ Set shelf’s bucket map["default"] to the result of running create a storage bucket with type.
- ~RET %棚 ◎ Return shelf.
4.5. ~storage~bucket
`~storage~bucket@ ( `storage bucket^en / “バケツ” )は、 `~storage端点$用の~dataを格納する場所である。 ◎ A storage bucket is a place for storage endpoints to store data.
各`~storage~bucket$は、 `~storage識別子$から`~storage瓶$への `瓶~map@ ( `bottle map^en )を有する。 ◎ A storage bucket has a bottle map of storage identifiers to storage bottles.
`局所~storage~bucket@ は、 `局所~storage$~API用の`~storage~bucket$である。 ◎ A local storage bucket is a storage bucket for local storage APIs.
各 `局所~storage~bucket$は `~mode@ を有する。 それは、[ `best-effort^l, `persistent^l ]のいずれかであり,初期~時は `best-effort^l とする。 ◎ A local storage bucket has a mode, which is "best-effort" or "persistent". It is initially "best-effort".
`~session~storage~bucket@ は、 `~session~storage$~API用の`~storage~bucket$である。 ◎ A session storage bucket is a storage bucket for session storage APIs.
`~storage~bucketを作成する@ ときは、 所与の ( `~storage種別$ %種別 ) に対し,次の手続きを走らす: ◎ To create a storage bucket, given a storage type type, run these steps:
- %~bucket ~LET %種別 に応じて ⇒# `local^l ならば 新たな`局所~storage~bucket$/ `session^l ならば 新たな`~session~storage~bucket$ ◎ Let bucket be null. ◎ If type is "local", then set bucket to a new local storage bucket. ◎ Otherwise: • Assert: type is "session". • Set bucket to a new session storage bucket.
- `登録-済み~storage端点~群$を成す ~EACH( %端点 ) に対し ⇒ ~IF[ %種別 ~IN %端点 の`種別~群$sE ] ⇒ %~bucket の`瓶~map$[ %端点 の`識別子$sE ] ~SET 新たな`~storage瓶$ — その ⇒# `~quota$sB ~SET %端点 の`~quota$sE ◎ For each endpoint of registered storage endpoints whose types contain type, set bucket’s bottle map[endpoint’s identifier] to a new storage bottle whose quota is endpoint’s quota.
- ~RET %~bucket ◎ Return bucket.
4.6. ~storage瓶
`~storage瓶@ ( `storage bottle^en )は、 `~storage~bucket$の一部を成すよう,単独の`~storage端点$用に形作られたものである。 ◎ A storage bottle is a part of a storage bucket carved out for a single storage endpoint.\
各`~storage瓶$は、 次に挙げるものを有する: ◎ ↓
- `~map@sB ⇒ ある`~map$ — 初期~時は空とする。 ◎ A storage bottle has a map, which is initially an empty map.\
- `~proxy~map参照~集合@ ⇒ ある`集合$ — 初期~時は空とする。 ◎ A storage bottle also has a proxy map reference set, which is initially an empty set.\
-
`~quota@sB ⇒ ~NULL /ある整数
整数は、[ 当の`~storage瓶$が保持できる総~byte数 ]の保守的な見積もりを表現する。 ~NULL は、 上限の欠如を指示する†。
† それでも、 包摂している`~storage棚$の`~storage~quota$に縛られる。
◎ A storage bottle also has a quota, which is null or a number representing a conservative estimate of the total amount of bytes it can hold. Null indicates the lack of a limit. It is still bound by the storage quota of its encompassing storage shelf.
`~storage瓶$の`~map$sBは、 格納するよう意味された実際の~dataが住まう所である。 ~UAには — この標準, この標準を利用している各 標準が当の内容に~accessできるよう — `実装定義$な方式で[ この~dataを格納して,各`~agent$, さらには`~agent~cluster$の境界にまたがって可用にする ]ことが期待される。 ◎ A storage bottle’s map is where the actual data meant to be stored lives. User agents are expected to store this data, and make it available across agent and even agent cluster boundaries, in an implementation-defined manner, so that this standard and standards using this standard can access the contents.
`~storage瓶~mapを得する@ ときは、 所与の ( `~storage種別$ %種別, `環境~設定群~obj$ %環境, `~storage識別子$ %識別子 ) に対し,次の手続きを走らす: ◎ To obtain a storage bottle map, given a storage type type, environment settings object environment, and storage identifier identifier, run these steps:
- %倉 ~LET %種別 に応じて ⇒# `local^l ならば `~UA~storage倉$/ `session^l ならば %環境 の`大域~obj$enV【!大域~obj】に`結付けられた文書$の`~node~navigable$の`辿可能な~navigable$navの`~session~storage倉$ ◎ Let shed be null. ◎ If type is "local", then set shed to the user agent’s storage shed. ◎ Otherwise: • Assert: type is "session". • Set shed to environment’s global object’s associated Document’s node navigable’s traversable navigable’s storage shed.
- %棚 ~LET `~storage棚を得する$( %倉, %環境, %種別 ) ◎ Let shelf be the result of running obtain a storage shelf, with shed, environment, and type.
- ~IF[ %棚 ~EQ `失敗^i ] ⇒ ~RET `失敗^i ◎ If shelf is failure, then return failure.
- %~bucket ~LET %棚 の`~bucket~map$[ `default^l ] ◎ Let bucket be shelf’s bucket map["default"].
- %瓶 ~LET %~bucket の`瓶~map$[ %識別子 ] ◎ Let bottle be bucket’s bottle map[identifier].
- %~proxy~map ~LET %瓶 の`~map$sBを`裏ng~map$とする,新たな`~storage~proxy~map$ ◎ Let proxyMap be a new storage proxy map whose backing map is bottle’s map.
- %瓶 の`~proxy~map参照~集合$に %~proxy~map を`付加する$set ◎ Append proxyMap to bottle’s proxy map reference set.
- ~RET %~proxy~map ◎ Return proxyMap.
`局所~storage瓶~mapを得する@ ときは、 所与の ( `環境~設定群~obj$ %環境, `~storage識別子$ %識別子 ) に対し,次の結果を返す ⇒ `~storage瓶~mapを得する$( `local^l, %環境, %識別子 ) ◎ To obtain a local storage bottle map, given an environment settings object environment and storage identifier identifier, return the result of running obtain a storage bottle map with "local", environment, and identifier.
`~session~storage瓶~mapを得する@ ときは、 所与の ( `環境~設定群~obj$ %環境, `~storage識別子$ %識別子 ) に対し,次の結果を返す ⇒ `~storage瓶~mapを得する$( `session^l, %環境, %識別子 ) ◎ To obtain a session storage bottle map, given an environment settings object environment and storage identifier identifier, return the result of running obtain a storage bottle map with "session", environment, and identifier.
4.7. ~storage~proxy~map
`~storage~proxy~map@ ( `storage proxy map^en )は、 次を除いて,`~map$に等価である ⇒ それに対する演算は、 代わりに その `裏ng~map@ ( `backing map^en )に対し遂行される ◎ A storage proxy map is equivalent to a map, except that all operations are instead performed on its backing map.
これは、 `裏ng~map$を別の~mapに置換することを許容する。 これは、 課題 #4 用に必要になり, ~storage~access~API 用にも必要になり得る。 ◎ This allows for the backing map to be replaced. This is needed for issue #4 and potentially the Storage Access API.
4.8. ~storage~task~source
`~storage~task~source@ は、 `~task~source$であり,`~storage端点$ — 特に,`~storage端点$の`~quota$sE — に関係する すべての`~task$用に利用される。 ◎ The storage task source is a task source to be used for all tasks related to a storage endpoint. In particular those that relate to a storage endpoint’s quota.
`~storage~taskを~queueする@ ときは、 所与の ( `大域~obj$ %大域~obj, 手続き %手続き ) に対し ⇒ `大域~taskを~queueする$( `~storage~task~source$, %大域~obj, %手続き ) ◎ To queue a storage task given a global object global and a series of steps steps, queue a global task on the storage task source with global and steps.
5. 持続性~許可
`局所~storage~bucket$の`~mode$が `persistent^l 【 “持続的” 】に変更されるのは、 利用者が(または、~UAが利用者に利するために) `persistent-storage^l で識別される`強力な特能$を利用する許可を是認したときに限られる。 ◎ A local storage bucket can only have its mode change to "persistent" if the user (or user agent on behalf of the user) has granted permission to use the "persistent-storage" powerful feature.
注記: 持続性~許可は、 `生成元$に対し是認されたときは,[ ~UAによる ~storageを~clearするための施策 ]から保護するために利用できる。 ~UAは、 `生成元$や利用者の介在~抜きには,持続的にされた~storageを~clearできない。 これは特に、[ 利用者が~offlineの間でも可用になる必要がある資源 ]や[ 利用者が局所的に作成した資源 ]用に有用になる。 ◎ When granted to an origin, the persistence permission can be used to protect storage from the user agent’s clearing policies. The user agent cannot clear storage marked as persistent without involvement from the origin or user. This makes it particularly useful for resources the user needs to have available while offline or resources the user creates locally.
`persistent-storage^l で識別される`強力な特能$の許可に関係する各種[ ~algo, 型 ]は、 次に挙げるものを除いて既定のものになる: ◎ The "persistent-storage" powerful feature’s permission-related algorithms, and types are defaulted, except for:
- `許可~状態$ ◎ permission state
- `persistent-storage^l の`許可~状態$の値は、 同じ`生成元$enVを伴う すべての`環境~設定群~obj$にわたり,同じにするモノトスル。 ◎ "persistent-storage"'s permission state must have the same value for all environment settings objects with a given origin.
- `許可~revocation~algo$ ◎ permission revocation algorithm
-
次を走らす:
- ~IF[ `現在の許可~状態を取得する$( `persistent-storage^l ) ~EQ `granted$l ] ⇒ ~RET ◎ If the result of getting the current permission state with "persistent-storage" is "granted", then return.
- %棚 ~LET `局所~storage棚を得する$( `現在の設定群~obj$ ) ◎ Let shelf be the result of running obtain a local storage shelf with current settings object.
- %棚 の`~bucket~map$[ `default^l ] の`~mode$ ~SET `best-effort^l ◎ Set shelf’s bucket map["default"]'s mode to "best-effort".
6. 使用量と~quota
`~storage使用量@ ( `storage usage^en )とは、 `実装定義$な およその見積もりによる,`~storage棚$が利用している~byte数である。 ◎ The storage usage of a storage shelf is an implementation-defined rough estimate of the amount of bytes used by it.
注記: これは正確な量にはなり得ない。 ~UAは[ `~storage棚$が正確に何~byte利用しているか はっきりしなくなる ]ような[ 重複集約, 圧縮, その他の技法 ]を駆使しているかもしれず、 また,~UAには そうすることが奨励されるので。 ◎ This cannot be an exact amount as user agents might, and are encouraged to, use deduplication, compression, and other techniques that obscure exactly how much bytes a storage shelf uses.
◎追跡路 `~storage~quota@ ( `storage quota^en )とは、 `実装定義$な保守的な見積もりによる,`~storage棚$が保持できる総~byte数である。 この量は、[ 利用者に ある程度の余裕を与えるため,機器~上の~storage空間の総計より少なくなる ]べきであるが, 機器~上の可用な~storage空間の関数にしないモノトスル。 ◎ (This is a tracking vector.) The storage quota of a storage shelf is an implementation-defined conservative estimate of the total amount of bytes it can hold. This amount should be less than the total storage space on the device. It must not be a function of the available storage space on the device.
注記: ~UAには、 ~quotaを決定するときには,次を考慮することが強く奨励される ⇒# ~naviの頻度, 訪問の近過去度, ~bookmarkされたかどうか, `persistent-storage^l に対する許可 ◎ User agents are strongly encouraged to consider navigation frequency, recency of visits, bookmarking, and permission for "persistent-storage" when determining quotas.
注記: 直接間接を問わず,可用な~storage空間を露呈すると、 指紋収集や[ 孕まれる`生成元$の視野の外側へ情報が漏洩される結果 ]に至らせ得る。 ◎ Directly or indirectly revealing available storage space can lead to fingerprinting and leaking information outside the scope of the origin involved.
7. 管理
~UAは、 `~storage~bucket$を~clearするときには,まるごと~clearするモノトスル。 ~UAは、 `~storage~bucket$に~access可能な~scriptが走っている間は — 利用者から他が指図されない限り — それを~clearするのを避けるベキである。 ◎ Whenever a storage bucket is cleared by the user agent, it must be cleared in its entirety. User agents should avoid clearing storage buckets while script that is able to access them is running, unless instructed otherwise by the user.
`~storage~bucket$の除去により,それを包摂している`~storage棚$ %棚 の`~bucket~map$が`空$mapになった場合、 %棚 を包摂している`~storage倉$から, 対応する`~storage~key$とともに %棚 を`除去する$mapこと。 ◎ If removal of storage buckets leaves the encompassing storage shelf’s bucket map empty, then remove that storage shelf and corresponding storage key from the encompassing storage shed.
7.1. ~storageの逼迫
~UAは、 ~storageが逼迫してきたときは,~network状態, および `局所~storage~bucket$のうち[ `~mode$ ~EQ `best-effort^l ]なるものを~clearするベキである。 理想的には、 利用者への影響iをなるべく抑えるような,優先度に基づく除去~方式で。 ◎ A user agent that comes under storage pressure should clear network state and local storage buckets whose mode is "best-effort", ideally prioritizing removal in a manner that least impacts the user.
それでもなお,~storageが逼迫している場合、 ~UAは,そのことを利用者に伝えた上で、 残りの`局所~storage~bucket$ — すなわち,[ `~mode$ ~EQ `persistent^l ]なるもの — を~clearする仕方を利用者に提供するべきである。 ◎ If a user agent continues to be under storage pressure, then the user agent should inform the user and offer a way to clear the remaining local storage buckets, i.e., those whose mode is "persistent".
`辿可能な~navigable$が閉じられたときは、 それに伴い,`~session~storage~bucket$も~clearするモノトスル。 ◎ Session storage buckets must be cleared as traversable navigables are closed.
注記: `辿可能な~navigable$の復活 — 例: `辿可能な~navigable$を開き直すことを通して/ 例: ~UAを開始し直した後も,それを利用し続けること — を許容する~UAは、 もっと複階的な経験則を孕む~clear法が必要yある。 ◎ If the user agent allows for revival of traversable navigables, e.g., through reopening traversable navigables or continued use of them after restarting the user agent, then clearing necessarily involves a more complex set of heuristics.
7.2. ~UI指針
~UAは、 個々の~web~site用に,その~network状態と~storageを~clearする能を利用者に提供するベキである。 ~UAは、 自身の~UIにおいて~network状態と~storageとを判別させるベキでない。 これは、[ ~network状態は,~storageを復活するために利用され得ない ]ことを確保するとともに,[ 利用者が留意しておく必要がある概念 ]の個数を抑制する。 ◎ User agents should offer users the ability to clear network state and storage for individual websites. User agents should not distinguish between network state and storage in their user interface. This ensures network state cannot be used to revive storage and reduces the number of concepts users need to be mindful of.
資格証は、 他から分離されるべきである。 資格証は、 利用者が復活できないかもしれない~data — 自動生成された~passwordなど — を包含するので。 許可~storageも、 利用者の不便さを避けるため,分離するのが最善である。 ◎ Credentials should be separated as they contain data the user might not be able to revive, such as an autogenerated password. Permissions are best separated too to avoid inconveniencing the user.
8. ~API
[`SecureContext$] interface mixin `NavigatorStorage@I { [`SameObject$] readonly attribute `StorageManager$I `storage$m; }; `Navigator$I includes `NavigatorStorage$I; `WorkerNavigator$I includes `NavigatorStorage$I;
各`環境~設定群~obj$ `HTML$r には、 `StorageManager$I ~objが結付けられる。 ◎ Each environment settings object has an associated StorageManager object. [HTML]
`storage@m 取得子~手続きは ⇒ ~RET コレに`関連な設定群~obj$の `StorageManager$I ~obj ◎ The storage getter steps are to return this’s relevant settings object’s StorageManager object.
[`SecureContext$, `Exposed$=(Window,Worker)] interface `StorageManager@I { `Promise$<`boolean$> `persisted$m(); [`Exposed$=Window] `Promise$<`boolean$> `persist$m(); `Promise$<`StorageEstimate$I> `estimate$m(); }; dictionary `StorageEstimate@I { `unsigned long long$ `usage@m; `unsigned long long$ `quota@m; };
`persisted()@m ~method手続きは: ◎ The persisted() method steps are:
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %大域~obj ~LET コレに`関連な大域~obj$ ◎ Let global be this’s relevant global object.
- %棚 ~LET `局所~storage棚を得する$( コレに`関連な設定群~obj$ ) ◎ Let shelf be the result of running obtain a local storage shelf with this’s relevant settings object.
- ~IF[ %棚 ~EQ `失敗^i ] ⇒# `~promiseを却下する$( %~promise, `TypeError$E ); ~RET %~promise ◎ If shelf is failure, then reject promise with a TypeError. ◎ Otherwise,\
-
この段は`並列的$に走らす: ◎ run these steps in parallel:
-
%持続されるか ~LET ~IS[ %棚 の`~bucket~map$[ `default^l ] の`~mode$ ~EQ `persistent^l ] ◎ Let persisted be true if shelf’s bucket map["default"]'s mode is "persistent"; otherwise false.
注記: 内部~errorが生じたときは ~F になる。 ◎ It will be false when there’s an internal error.
-
`~storage~taskを~queueする$( %大域~obj, 次の手続き ) ◎ Queue a storage task with global\
手続きは ⇒ `~promiseを解決する$( %~promise, %持続されるか ) ◎ to resolve promise with persisted.
-
- ~RET %~promise ◎ Return promise.
`persist()@m ~method手続きは: ◎ The persist() method steps are:
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %大域~obj ~LET コレに`関連な大域~obj$ ◎ Let global be this’s relevant global object.
- %棚 ~LET `局所~storage棚を得する$( コレに`関連な設定群~obj$ ) ◎ Let shelf be the result of running obtain a local storage shelf with this’s relevant settings object.
- ~IF[ %棚 ~EQ `失敗^i ] ⇒# `~promiseを却下する$( %~promise, `TypeError$E ); ~RET %~promise ◎ If shelf is failure, then reject promise with a TypeError. ◎ Otherwise,\
-
この段は`並列的$に走らす: ◎ run these steps in parallel:
-
%許可 ~LET `利用する許可を要請する$( `persistent-storage^l ) ◎ Let permission be the result of requesting permission to use "persistent-storage".
注記: ~UAには、 同じ`生成元$に対し,同時期に利用者にこの問いに重ねて回答させないことが奨励される。 この【許可を要請する】~algoは、 そのような局面を取扱うためのものではない。 ◎ User agents are encouraged to not let the user answer this question twice for the same origin around the same time and this algorithm is not equipped to handle such a scenario.
- %~bucket ~LET %棚 の`~bucket~map$[ `default^l ] ◎ Let bucket be shelf’s bucket map["default"].
-
%持続されるか ~LET ~IS[ %~bucket の`~mode$ ~EQ `persistent^l ] ◎ Let persisted be true if bucket’s mode is "persistent"; otherwise false.
注記: 内部~errorが生じたときは ~F になる。 ◎ It will be false when there’s an internal error.
-
~IF[ %持続されるか ~EQ ~F ]~AND[ %許可 ~EQ `granted$l ]: ◎ If persisted is false and permission is "granted", then:
- %~bucket の`~mode$ ~SET `persistent^l ◎ Set bucket’s mode to "persistent".
- ~IF[ 内部~errorは生じていない ] ⇒ %持続されるか ~SET ~T ◎ If there was no internal error, then set persisted to true.
-
`~storage~taskを~queueする$( %大域~obj, 次の手続き ) ◎ Queue a storage task with global\
手続きは ⇒ `~promiseを解決する$( %~promise, %持続されるか ) ◎ to resolve promise with persisted.
-
- ~RET %~promise ◎ Return promise.
`estimate()@m ~method手続きは: ◎ The estimate() method steps are:
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %大域~obj ~LET コレに`関連な大域~obj$ ◎ Let global be this’s relevant global object.
- %棚 ~LET `局所~storage棚を得する$( コレに`関連な設定群~obj$ ) ◎ Let shelf be the result of running obtain a local storage shelf with this’s relevant settings object.
- ~IF[ %棚 ~EQ `失敗^i ] ⇒# `~promiseを却下する$( %~promise, `TypeError$E ); ~RET %~promise ◎ If shelf is failure, then reject promise with a TypeError. ◎ Otherwise,\
-
この段は`並列的$に走らす: ◎ run these steps in parallel:
- %使用量 ~LET %棚 の`~storage使用量$ ◎ Let usage be storage usage for shelf.
- %~quota ~LET %棚 の`~storage~quota$ ◎ Let quota be storage quota for shelf.
- %辞書 ~LET 新たな `StorageEstimate$I 辞書 — その ⇒# `usage$m ~member ~SET %使用量, `quota$m ~member ~SET %~quota ◎ Let dictionary be a new StorageEstimate dictionary whose usage member is usage and quota member is quota.
-
~IF[[ %使用量 / %~quota ]を得する間に何らかの内部~errorが生じた ] ⇒ `~storage~taskを~queueする$( %大域~obj, 次の手続き ) ◎ If there was an internal error while obtaining usage and quota, then queue a storage task with global\
手続きは ⇒ `~promiseを却下する$( %~promise, `TypeError$E ) ◎ to reject promise with a TypeError.注記: 内部~errorは極めて稀と想定されており,[ ~platform/~hardware ]における何らかの類の低-~levelな瑕疵を指示する。 しかしながら、 ~webにおける[ 実装/~platform ]の多様さの尺度からは,生じるものとみなす必要がある。 ◎ Internal errors are supposed to be extremely rare and indicate some kind of low-level platform or hardware fault. However, at the scale of the web with the diversity of implementation and platforms, the unexpected does occur.
-
~ELSE ⇒ `~storage~taskを~queueする$( %大域~obj, 次の手続き ) ◎ Otherwise, queue a storage task with global\
手続きは ⇒ `~promiseを解決する$( %~promise, %辞書 ) ◎ to resolve promise with dictionary.
- ~RET %~promise ◎ Return promise.
謝辞
次の方々からの~~貢献に感謝する:
`_acks1@