Skip to content

Commit fce56e6

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 43dfcf1 commit fce56e6

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
@@ -44,6 +44,7 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/
4444
type: dfn
4545
text: storage bucket; url: storage-bucket
4646
text: storage key; url: storage-key
47+
text: storage identifier; url: storage-identifier
4748
</pre>
4849

4950
<style>
@@ -395,14 +396,14 @@ To <dfn>create a sorted name list</dfn> from a [=/list=] |names|, run these step
395396
## Database ## {#database-construct}
396397
<!-- ============================================================ -->
397398

398-
Each [=/storage key=] has an associated set of [=/databases=]. A
399+
Each [=/storage bucket=] has an associated set of [=/databases=]. A
399400
<dfn>database</dfn> has zero or more [=/object stores=] which
400401
hold the data stored in the database.
401402

402403
<div dfn-for=database>
403404

404405
A [=/database=] has a <dfn>name</dfn> which identifies it within a
405-
specific [=/storage key=]. The name is a [=/name=],
406+
specific [=/storage bucket=]. The name is a [=/name=],
406407
and stays constant for the lifetime of the database.
407408

408409
A [=/database=] has a <dfn>version</dfn>. When a database is first
@@ -419,6 +420,17 @@ which is either null or an [=/upgrade transaction=], and is initially null.
419420

420421
</div>
421422

423+
<!-- ============================================================ -->
424+
### Database storage ### {#database-storage}
425+
<!-- ============================================================ -->
426+
427+
Indexed DB is a [=/storage endpoint=], with the [=/storage identifier=] `"indexedDB"`.
428+
429+
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=]).
430+
431+
A <dfn>new pumpkin</dfn> is a [=/pumpkin=] whose [=pumpkin/queue=] is an empty [=/connection queue=], and whose [=pumpkin/database=] is null.
432+
433+
422434
<!-- ============================================================ -->
423435
### Database connection ### {#database-connection}
424436
<!-- ============================================================ -->
@@ -466,7 +478,7 @@ it hasn't already been.
466478

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

@@ -1272,8 +1284,8 @@ An [=request/open request=]'s [=get the parent=] algorithm returns null.
12721284
<!-- ============================================================ -->
12731285

12741286
[=request/Open requests=] are processed in a <dfn>connection queue</dfn>.
1275-
The queue contains all [=request/open requests=] associated with an
1276-
[=/storage key=] and a [=database/name=]. Requests added to the
1287+
The queue contains all [=request/open requests=] associated with
1288+
a [=database/name=] in a [=/storage bucket=]. Requests added to the
12771289
[=/connection queue=] processed in order and each request must run
12781290
to completion before the next request is processed. An open request
12791291
may be blocked on other [=/connections=], requiring those
@@ -2187,7 +2199,7 @@ dictionary IDBDatabaseInfo {
21872199
: |result| = await indexedDB . {{IDBFactory/databases()|databases}}()
21882200
::
21892201
Returns a promise which resolves to a list of objects giving a snapshot
2190-
of the names and versions of databases within the [=/storage key=].
2202+
of the names and versions of databases within the [=/storage bucket=].
21912203

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

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

2207-
1. Let |storageKey| be the result of running [=obtain a storage key=] given |environment|.
2208-
If failure is returned, then [=exception/throw=] a "{{SecurityError}}" {{DOMException}} and abort these steps.
2219+
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.
22092220

22102221
1. Let |request| be a new [=request/open request=].
22112222

22122223
1. Run these steps [=in parallel=]:
22132224

22142225
1. Let |result| be the result of
2215-
[=/opening a database=], with |storageKey|,
2226+
[=/opening a database=], with |map|,
22162227
|name|, |version| if given and undefined
22172228
otherwise, and |request|.
22182229

@@ -2273,15 +2284,14 @@ The <dfn method for=IDBFactory>deleteDatabase(|name|)</dfn> method steps are:
22732284

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

2276-
1. Let |storageKey| be the result of running [=obtain a storage key=] given |environment|.
2277-
If failure is returned, then [=exception/throw=] a "{{SecurityError}}" {{DOMException}} and abort these steps.
2287+
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.
22782288

22792289
1. Let |request| be a new [=request/open request=].
22802290

22812291
1. Run these steps [=in parallel=]:
22822292

22832293
1. Let |result| be the result of
2284-
[=/deleting a database=], with |storageKey|,
2294+
[=/deleting a database=], with |map|,
22852295
|name|, and |request|.
22862296

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

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

2330-
1. Let |storageKey| be the result of running [=obtain a storage key=] given |environment|.
2331-
If failure is returned, then return [=/a promise rejected with=] a "{{SecurityError}}" {{DOMException}}
2332-
23332340
1. Let |p| be [=/a new promise=].
23342341

23352342
1. Run these steps [=in parallel=]:
23362343

2337-
1. Let |databases| be the [=/set=] of [=/databases=] in |storageKey|.
2338-
If this cannot be determined for any reason, then [=/reject=] |p| with
2339-
an appropriate error (e.g. an "{{UnknownError}}" {{DOMException}})
2340-
and terminate these steps.
2341-
2342-
1. Let |result| be a new [=/list=].
2344+
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.
23432345

2344-
1. [=set/For each=] |db| of |databases|:
2346+
1. [=map/For each=] |pumpkin| of |map|'s [=map/values=]:
23452347

2348+
1. Let |db| be |pumpkin|'s [=pumpkin/database=].
2349+
1. If |db| is null, then [=iteration/continue=].
23462350
1. Let |info| be a new {{IDBDatabaseInfo}} dictionary.
23472351
1. Set |info|'s {{IDBDatabaseInfo/name}} dictionary member to |db|'s [=database/name=].
23482352
1. Set |info|'s {{IDBDatabaseInfo/version}} dictionary member to |db|'s [=database/version=].
@@ -4944,23 +4948,24 @@ The <dfn attribute for=IDBTransaction>onerror</dfn> attribute is an [=/event han
49444948

49454949
<div algorithm>
49464950

4947-
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:
4951+
To <dfn>open a database</dfn> with |map|, a database |name|, a database |version|, and a |request|, run these steps:
49484952

4949-
1. Let |queue| be the [=/connection queue=] for |storageKey| and |name|.
4953+
1. If |map|\[|name|] does not [=map/exist=], then set |map|\[|name|] to a [=/new pumpkin=].
4954+
4955+
1. Let |queue| be |map|\[|name|]'s [=pumpkin/queue=].
49504956

49514957
1. Add |request| to |queue|.
49524958

49534959
1. Wait until all previous requests in |queue| have been processed.
49544960

4955-
1. Let |db| be the [=/database=] [=database/named=] |name| in
4956-
|storageKey|, or null otherwise.
4961+
1. Let |db| be |map|\[|name|]'s [=pumpkin/database=].
49574962

49584963
1. If |version| is undefined, let |version| be 1 if |db| is null, or
49594964
|db|'s [=database/version=] otherwise.
49604965

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

@@ -5040,7 +5045,7 @@ optional |forced flag|, run these steps:
50405045

50415046
<aside class=note>
50425047
The {{IDBDatabase/close!!event}} event only fires if the connection closes
5043-
abnormally, e.g. if the [=/storage key=]'s storage is cleared, or there is
5048+
abnormally, e.g. if the [=/storage bucket=] is cleared, or there is
50445049
corruption or an I/O error. If {{IDBDatabase/close()}} is called explicitly
50455050
the event *does not* fire.
50465051
</aside>
@@ -5069,18 +5074,19 @@ optional |forced flag|, run these steps:
50695074

50705075
<div algorithm>
50715076

5072-
To <dfn>delete a database</dfn> with the |storageKey| that
5073-
requested the [=/database=] to be deleted, a database |name|, and a
5074-
|request|, run these steps:
5077+
To <dfn>delete a database</dfn> with |map|, a database |name|, and a |request|, run these steps:
5078+
5079+
1. If |map|\[|name|] does not [=map/exist=], then set |map|\[|name|] to a [=/new pumpkin=].
50755080

5076-
1. Let |queue| be the [=/connection queue=] for |storageKey| and |name|.
5081+
1. Let |queue| be |map|\[|name|]'s [=pumpkin/queue=].
50775082

50785083
1. Add |request| to |queue|.
50795084

50805085
1. Wait until all previous requests in |queue| have been processed.
50815086

5082-
1. Let |db| be the [=/database=] [=database/named=] |name| in
5083-
|storageKey|, if one exists. Otherwise, return 0 (zero).
5087+
1. If |map|\[|name|]'s [=pumpkin/database=] is null, then return 0 (zero).
5088+
5089+
1. Otherwise, let |db| be |map|\[|name|]'s [=pumpkin/database=].
50845090

50855091
1. Let |openConnections| be the [=/set=] of all [=/connections=]
50865092
associated with |db|.
@@ -5110,7 +5116,7 @@ requested the [=/database=] to be deleted, a database |name|, and a
51105116

51115117
1. Let |version| be |db|'s [=database/version=].
51125118

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

51165122
1. Return |version|.
@@ -6695,12 +6701,12 @@ user's wish list; or a hostile site could set a user's session
66956701
identifier to a known ID that the hostile site can then use to track
66966702
the user's actions on the victim site.
66976703

6698-
Thus, strictly following the storage key partitioning model described in
6704+
Thus, strictly following the storage partitioning model described in
66996705
this specification is important for user security.
67006706

67016707
If host names or database names are used to construct paths for
67026708
persistence to a file system they must be appropriately escaped to
6703-
prevent an adversary from accessing information from other [=/storage keys=]
6709+
prevent an adversary from accessing information from other [=/storage buckets=]
67046710
using relative paths such as "`../`".
67056711

67066712
## Persistence risks ## {#persistence-risks}
@@ -6784,6 +6790,7 @@ For the revision history of the second edition, see [that document's Revision Hi
67846790
* Added <a href="#accessibility">Accessibility considerations</a> section. ([Issue #327](https://github.com/w3c/IndexedDB/issues/327))
67856791
* Used [[infra]]'s list sorting definition. ([Issue #346](https://github.com/w3c/IndexedDB/issues/346))
67866792
* Added a definition for [=transaction/live=] transactions, and renamed "run an upgrade transaction" to [=/upgrade a database=], to disambiguate "running". ([Issue #408](https://github.com/w3c/IndexedDB/issues/408))
6793+
* Defined storage partitioning in terms of [[Storage]] primitives.
67876794

67886795
<!-- ============================================================ -->
67896796
# Acknowledgements # {#acknowledgements}

0 commit comments

Comments
 (0)