Skip to content

Commit c5409ca

Browse files
git squash commit for endpoint.
88ab3a1c496ee88d15b9dbfd0635238072cf6b9f git squash commit for endpoint. 8c7cc83 git squash commit for endpoint. 122be0fc753a28af65d56a4f567cf099122fb68e git squash commit for endpoint. 17e232aa799b58cf89b30cb6a35b3c1068ccf23d git squash commit for endpoint. e62ed35 git squash commit for endpoint. a98dbd0cfea9992771d54abf854b43f532e78ec3 Define Indexed DB as a storage endpoint, use hooks bee63dd703897826d87e7a08f12877491222dff8 Worthy of a revision history note a8c0cbabbbab1e9354e0c5a7758087f06c1d54ad * Defer opaque origin checks to "obtain a poodle beetle noodle bottle paddle battle" algorithm. * Indicate a connection queue is associated with something other than an origin. A bottle? Map? Not sure. 9b4ac34164b467d0244b0b4ec2f7518484a81748 Rebase, fix unused var 040b006c47f12a6b4a1ebf499ee7267e587c3c8c verbing convention 5e1a2640b13bf67613b372018749bf30a8afd62e Make bottle map a mapping of name -> (queue, database), drop most imports bf1aeba58af37e0d78bfd05f8fcd2265baf8d661 missing quote d471c46da5163e43107548d4a45218a89740f827 reference buckets where appropriate tidy 614f588ad659235ebe4d59fffa80dfec4bacd48b More general references to storage concepts 96f53799c1343d6e986077e5909b0bb0edf49e5d Update databases() algorithm 25b9fb410eb1fa980f31754a67a82697f7159f06 bangbang
1 parent 48e3720 commit c5409ca

File tree

1 file changed

+44
-37
lines changed

1 file changed

+44
-37
lines changed

index.bs

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/
6363
type: dfn
6464
text: storage bucket; url: storage-bucket
6565
text: storage key; url: storage-key
66+
text: storage identifier; url: storage-identifier
6667
</pre>
6768

6869
<style>
@@ -414,14 +415,14 @@ To <dfn>create a sorted name list</dfn> from a [=/list=] |names|, run these step
414415
## Database ## {#database-construct}
415416
<!-- ============================================================ -->
416417

417-
Each [=/storage key=] has an associated set of [=/databases=]. A
418+
Each [=/storage bucket=] has an associated set of [=/databases=]. A
418419
<dfn>database</dfn> has zero or more [=/object stores=] which
419420
hold the data stored in the database.
420421

421422
<div dfn-for=database>
422423

423424
A [=/database=] has a <dfn>name</dfn> which identifies it within a
424-
specific [=/storage key=]. The name is a [=/name=],
425+
specific [=/storage bucket=]. The name is a [=/name=],
425426
and stays constant for the lifetime of the database.
426427

427428
A [=/database=] has a <dfn>version</dfn>. When a database is first
@@ -438,6 +439,17 @@ which is either null or an [=/upgrade transaction=], and is initially null.
438439

439440
</div>
440441

442+
<!-- ============================================================ -->
443+
### Database storage ### {#database-storage}
444+
<!-- ============================================================ -->
445+
446+
Indexed DB is a [=/storage endpoint=], with the [=/storage identifier=] `"indexedDB"`.
447+
448+
A <dfn>pumpkin</dfn> is a [=/struct=] consisting of a <dfn for="pumpkin">queue</dfn> (a [=/connection queue=]) and a <dfn for="pumpkin">database</dfn> (a [=/database=]).
449+
450+
A <dfn>new pumpkin</dfn> is a [=/pumpkin=] whose [=pumpkin/queue=] is an empty [=/connection queue=], and whose [=pumpkin/database=] is null.
451+
452+
441453
<!-- ============================================================ -->
442454
### Database connection ### {#database-connection}
443455
<!-- ============================================================ -->
@@ -485,7 +497,7 @@ it hasn't already been.
485497

486498
A [=/connection=] may be closed by a user agent in exceptional
487499
circumstances, for example due to loss of access to the file system, a
488-
permission change, or clearing of the [=/storage key=]'s storage. If this occurs
500+
permission change, or clearing the [=/storage bucket=]. If this occurs
489501
the user agent must run [=close a database
490502
connection=] with the [=/connection=] and with the <var ignore>forced flag</var> set to true.
491503

@@ -1287,8 +1299,8 @@ An [=request/open request=]'s [=get the parent=] algorithm returns null.
12871299
<!-- ============================================================ -->
12881300

12891301
[=request/Open requests=] are processed in a <dfn>connection queue</dfn>.
1290-
The queue contains all [=request/open requests=] associated with an
1291-
[=/storage key=] and a [=database/name=]. Requests added to the
1302+
The queue contains all [=request/open requests=] associated with
1303+
a [=database/name=] in a [=/storage bucket=]. Requests added to the
12921304
[=/connection queue=] processed in order and each request must run
12931305
to completion before the next request is processed. An open request
12941306
may be blocked on other [=/connections=], requiring those
@@ -2202,7 +2214,7 @@ dictionary IDBDatabaseInfo {
22022214
: |result| = await indexedDB . {{IDBFactory/databases()|databases}}()
22032215
::
22042216
Returns a promise which resolves to a list of objects giving a snapshot
2205-
of the names and versions of databases within the [=/storage key=].
2217+
of the names and versions of databases within the [=/storage bucket=].
22062218

22072219
This API is intended for web applications to introspect the use of databases,
22082220
for example to clean up from earlier versions of a site's code. Note that
@@ -2219,15 +2231,14 @@ The <dfn method for=IDBFactory>open(|name|, |version|)</dfn> method steps are:
22192231

22202232
1. Let |environment| be [=/this=]'s [=/relevant settings object=].
22212233

2222-
1. Let |storageKey| be the result of running [=obtain a storage key=] given |environment|.
2223-
If failure is returned, then [=exception/throw=] a "{{SecurityError}}" {{DOMException}} and abort these steps.
2234+
1. Let |map| be the result of [=/obtaining a local storage bottle map=] with |environment| and `"indexedDB"`. If this returns failure, then [=exception/throw=] a "{{SecurityError}}" {{DOMException}} and abort these steps.
22242235

22252236
1. Let |request| be a new [=request/open request=].
22262237

22272238
1. Run these steps [=in parallel=]:
22282239

22292240
1. Let |result| be the result of
2230-
[=/opening a database=], with |storageKey|,
2241+
[=/opening a database=], with |map|,
22312242
|name|, |version| if given and undefined
22322243
otherwise, and |request|.
22332244

@@ -2288,15 +2299,14 @@ The <dfn method for=IDBFactory>deleteDatabase(|name|)</dfn> method steps are:
22882299

22892300
1. Let |environment| be [=/this=]'s [=/relevant settings object=].
22902301

2291-
1. Let |storageKey| be the result of running [=obtain a storage key=] given |environment|.
2292-
If failure is returned, then [=exception/throw=] a "{{SecurityError}}" {{DOMException}} and abort these steps.
2302+
1. Let |map| be the result of [=/obtaining a local storage bottle map=] with |environment| and `"indexedDB"`. If this returns failure, then [=exception/throw=] a "{{SecurityError}}" {{DOMException}} and abort these steps.
22932303

22942304
1. Let |request| be a new [=request/open request=].
22952305

22962306
1. Run these steps [=in parallel=]:
22972307

22982308
1. Let |result| be the result of
2299-
[=/deleting a database=], with |storageKey|,
2309+
[=/deleting a database=], with |map|,
23002310
|name|, and |request|.
23012311

23022312
1. Set |request|'s [=request/processed flag=] to true.
@@ -2342,22 +2352,16 @@ The <dfn method for=IDBFactory>databases()</dfn> method steps are:
23422352

23432353
1. Let |environment| be [=/this=]'s [=/relevant settings object=].
23442354

2345-
1. Let |storageKey| be the result of running [=obtain a storage key=] given |environment|.
2346-
If failure is returned, then return [=/a promise rejected with=] a "{{SecurityError}}" {{DOMException}}
2347-
23482355
1. Let |p| be [=/a new promise=].
23492356

23502357
1. Run these steps [=in parallel=]:
23512358

2352-
1. Let |databases| be the [=/set=] of [=/databases=] in |storageKey|.
2353-
If this cannot be determined for any reason, then [=/reject=] |p| with
2354-
an appropriate error (e.g. an "{{UnknownError}}" {{DOMException}})
2355-
and terminate these steps.
2356-
2357-
1. Let |result| be a new [=/list=].
2359+
1. Let |map| be the result of [=/obtaining a local storage bottle map=] with |environment| and `"indexedDB"`. If this returns failure, then [=/reject=] |p| with a "{{SecurityError}}" {{DOMException}} and terminate these steps.
23582360

2359-
1. [=set/For each=] |db| of |databases|:
2361+
1. [=map/For each=] |pumpkin| of |map|'s [=map/values=]:
23602362

2363+
1. Let |db| be |pumpkin|'s [=pumpkin/database=].
2364+
1. If |db| is null, then [=iteration/continue=].
23612365
1. Let |info| be a new {{IDBDatabaseInfo}} dictionary.
23622366
1. Set |info|'s {{IDBDatabaseInfo/name}} dictionary member to |db|'s [=database/name=].
23632367
1. Set |info|'s {{IDBDatabaseInfo/version}} dictionary member to |db|'s [=database/version=].
@@ -4959,23 +4963,24 @@ The <dfn attribute for=IDBTransaction>onerror</dfn> attribute is an [=/event han
49594963

49604964
<div algorithm>
49614965

4962-
To <dfn>open a database</dfn> with |storageKey| which requested the [=/database=] to be opened, a database |name|, a database |version|, and a |request|, run these steps:
4966+
To <dfn>open a database</dfn> with |map|, a database |name|, a database |version|, and a |request|, run these steps:
49634967

4964-
1. Let |queue| be the [=/connection queue=] for |storageKey| and |name|.
4968+
1. If |map|\[|name|] does not [=map/exist=], then set |map|\[|name|] to a [=/new pumpkin=].
4969+
4970+
1. Let |queue| be |map|\[|name|]'s [=pumpkin/queue=].
49654971

49664972
1. Add |request| to |queue|.
49674973

49684974
1. Wait until all previous requests in |queue| have been processed.
49694975

4970-
1. Let |db| be the [=/database=] [=database/named=] |name| in
4971-
|storageKey|, or null otherwise.
4976+
1. Let |db| be |map|\[|name|]'s [=pumpkin/database=].
49724977

49734978
1. If |version| is undefined, let |version| be 1 if |db| is null, or
49744979
|db|'s [=database/version=] otherwise.
49754980

49764981
1. If |db| is null, let |db| be a new [=/database=] with
49774982
[=database/name=] |name|, [=database/version=] 0 (zero), and with
4978-
no [=/object stores=]. If this fails for any reason, return an
4983+
no [=/object stores=], and [=map/set=] |map|\[|name|]'s [=pumpkin/database=] to |db|. If this fails for any reason, then return an
49794984
appropriate error (e.g. a "{{QuotaExceededError}}" or
49804985
"{{UnknownError}}" {{DOMException}}).
49814986

@@ -5055,7 +5060,7 @@ optional |forced flag|, run these steps:
50555060

50565061
<aside class=note>
50575062
The {{IDBDatabase/close!!event}} event only fires if the connection closes
5058-
abnormally, e.g. if the [=/storage key=]'s storage is cleared, or there is
5063+
abnormally, e.g. if the [=/storage bucket=] is cleared, or there is
50595064
corruption or an I/O error. If {{IDBDatabase/close()}} is called explicitly
50605065
the event *does not* fire.
50615066
</aside>
@@ -5084,18 +5089,19 @@ optional |forced flag|, run these steps:
50845089

50855090
<div algorithm>
50865091

5087-
To <dfn>delete a database</dfn> with the |storageKey| that
5088-
requested the [=/database=] to be deleted, a database |name|, and a
5089-
|request|, run these steps:
5092+
To <dfn>delete a database</dfn> with |map|, a database |name|, and a |request|, run these steps:
5093+
5094+
1. If |map|\[|name|] does not [=map/exist=], then set |map|\[|name|] to a [=/new pumpkin=].
50905095

5091-
1. Let |queue| be the [=/connection queue=] for |storageKey| and |name|.
5096+
1. Let |queue| be |map|\[|name|]'s [=pumpkin/queue=].
50925097

50935098
1. Add |request| to |queue|.
50945099

50955100
1. Wait until all previous requests in |queue| have been processed.
50965101

5097-
1. Let |db| be the [=/database=] [=database/named=] |name| in
5098-
|storageKey|, if one exists. Otherwise, return 0 (zero).
5102+
1. If |map|\[|name|]'s [=pumpkin/database=] is null, then return 0 (zero).
5103+
5104+
1. Otherwise, let |db| be |map|\[|name|]'s [=pumpkin/database=].
50995105

51005106
1. Let |openConnections| be the [=/set=] of all [=/connections=]
51015107
associated with |db|.
@@ -5125,7 +5131,7 @@ requested the [=/database=] to be deleted, a database |name|, and a
51255131

51265132
1. Let |version| be |db|'s [=database/version=].
51275133

5128-
1. Delete |db|. If this fails for any reason, return an appropriate
5134+
1. Set |map|\[|name|]'s [=pumpkin/database=] to null. If this fails for any reason, then return an appropriate
51295135
error (e.g. "{{QuotaExceededError}}" or "{{UnknownError}}" {{DOMException}}).
51305136

51315137
1. Return |version|.
@@ -6712,12 +6718,12 @@ user's wish list; or a hostile site could set a user's session
67126718
identifier to a known ID that the hostile site can then use to track
67136719
the user's actions on the victim site.
67146720

6715-
Thus, strictly following the storage key partitioning model described in
6721+
Thus, strictly following the storage partitioning model described in
67166722
this specification is important for user security.
67176723

67186724
If host names or database names are used to construct paths for
67196725
persistence to a file system they must be appropriately escaped to
6720-
prevent an adversary from accessing information from other [=/storage keys=]
6726+
prevent an adversary from accessing information from other [=/storage buckets=]
67216727
using relative paths such as "`../`".
67226728

67236729
## Persistence risks ## {#persistence-risks}
@@ -6800,6 +6806,7 @@ For the revision history of the second edition, see [that document's Revision Hi
68006806
* Specified [[#transaction-scheduling]] more precisely and disallow starting read/write transactions while read-only transactions with overlapping scope are running. ([Issue #253](https://github.com/w3c/IndexedDB/issues/253))
68016807
* Added <a href="#accessibility">Accessibility considerations</a> section. ([Issue #327](https://github.com/w3c/IndexedDB/issues/327))
68026808
* Used [[infra]]'s list sorting definition. ([Issue #346](https://github.com/w3c/IndexedDB/issues/346))
6809+
* Defined storage partitioning in terms of [[Storage]] primitives.
68036810

68046811
<!-- ============================================================ -->
68056812
# Acknowledgements # {#acknowledgements}

0 commit comments

Comments
 (0)