diff --git a/spec.bs b/spec.bs
index 39875ed..eff0b70 100644
--- a/spec.bs
+++ b/spec.bs
@@ -322,7 +322,7 @@ When {{Worklet/addModule()}} is called for a worklet, it will run [=check if add
- For creating a worklet, |environment| is the [=environment settings object=] associated with the {{Window}} that created the worklet, and |origin| is the module script url's [=url/origin=].
- For running operations on a worklet (from a {{Window}}), |environment| is the [=environment settings object=] associated with the {{Window}} that created the worklet, and |origin| is the worklet's [=global scopes=][0]'s [=global object/realm=]'s [=realm/settings object=]'s [=environment settings object/origin=].
- For [[#setter]], |environment| is either the current context (when called from a {{Window}}) or the [=environment settings object=] associated with the {{Window}} that created the worklet (when called from a {{SharedStorageWorkletGlobalScope}}), and |origin| is |environment|'s [=environment settings object/origin=].
- - For {{SharedStorage/get()}} invoked from a {{Window}} (which can only succeed in a [=fenced frame=]), |environment| is the current context, and |origin| is |environment|'s [=environment settings object/origin=].
+ - For {{SharedStorage/get()}} invoked from a {{Window}} (which can only succeed in a [=fenced frame=]), |environment| is the current context, and |origin| is |environment|'s [=environment settings object/origin=].
- For [[#ss-fetch-algo]], |environment| is the request's [=request/window=], and |origin| is the request's [=request/current URL=]'s [=url/origin=].
- For [[#ss-fetch-algo]], for {{SharedStorage/createWorklet()}} called with a cross-origin worklet script using the dataOrigin option with value `"script-origin"` (which would result in a worklet where [=SharedStorageWorklet/has cross-origin data origin=] is true), and for {{SharedStorageWorklet/selectURL()}} and {{SharedStorageWorklet/run()}} that operate on a worklet where [=SharedStorageWorklet/has cross-origin data origin=] is true, |allowedInOpaqueOriginContext| is true. For other methods, |allowedInOpaqueOriginContext| is false.
@@ -1295,7 +1295,7 @@ The Shared Storage API will integrate into the [=Storage Model|Storage API=] as
[=User agents=] may specify a default entry lifetime, the default [=duration=] between when an [=shared storage database/entry=] is [=shared storage database/store an entry in the database|stored=] and when it expires. If the [=user agent=] specifies a [=default entry lifetime=], then it should have a timer periodically [=shared storage database/purge expired entries from the database=].
- ## The [=Shared Storage Database|Database=] Algorithms ## {#database-algorithms}
+ ## The Core [=Shared Storage Database|Database=] Algorithms ## {#core-database-algorithms}
To store an entry in the database, given a [=shared storage database/shared storage database queue=] |queue|, a [=storage proxy map=] |databaseMap|, an [=environment settings object=] |environment|, a [=entry/key=] |key|, and a [=value struct/value=] |value|, run the following steps on |queue|:
@@ -1386,6 +1386,35 @@ The Shared Storage API will integrate into the [=Storage Model|Storage API=] as
1. Otherwise, return false.
+ ## The Specialized [=Shared Storage Database|Database=] Algorithms ## {#specialized-database-algorithms}
+
+ These algorithms, unlike the core algorithms in [[#core-database-algorithms]], either accept parameters with more specialized heuristics, or employ multi-step processes, or both, to handle more complex database operations.
+
+
+
+ To set an entry in the database, given a [=shared storage database/shared storage database queue=] |queue|, a [=storage proxy map=] |databaseMap|, an [=environment settings object=] |environment|, a [=entry/key=] |key|, a [=value struct/value=] |value|, and a [=/boolean=] |ignoreIfPresent|, run the following steps on |queue|:
+
+ 1. If |ignoreIfPresent|:
+ 1. Let |currentValue| be the result of running [=shared storage database/retrieve an entry from the database=] with |queue|, |databaseMap|, |environment|, and |key|.
+ 1. If |currentValue| is failure, then return false.
+ 1. If |currentValue| is not undefined, then return true.
+ 1. Return the result of running [=shared storage database/store an entry in the database=] with |queue|, |databaseMap|, |environment|, |key|, and |value|.
+
+
+
+
+ To append an entry in the database, given a [=shared storage database/shared storage database queue=] |queue|, a [=storage proxy map=] |databaseMap|, an [=environment settings object=] |environment|, a [=entry/key=] |key|, and a [=value struct/value=] |value|, run the following steps on |queue|:
+
+ 1. Let |currentValue| be the result of running [=shared storage database/retrieve an entry from the database=] with |queue|, |databaseMap|, |environment|, and |key|.
+ 1. If |currentValue| is failure, then return false.
+ 1. If |currentValue| is not undefined:
+ 1. Let |list| be a new [=/list=].
+ 1. [=list/Append=] |currentValue| to |list|.
+ 1. [=list/Append=] |value| to |list|.
+ 1. Set |value| to the result of running [=string/concatenate=] on |list|.
+ 1. Return the result of running [=shared storage database/store an entry in the database=] with |queue|, |databaseMap|, |environment|, |key|, and |value|.
+
+
Extension to the {{Window}} interface {#window-extension}
=====================================================
@@ -1498,7 +1527,7 @@ A {{SharedStorageDeleteMethod}} has the following associated fields:
-
+
The new SharedStorageAppendMethod(|key|, |value|, |options|) constructor steps are:
1. Let |globalObject| be the [=current realm=]'s [=global object=].
@@ -1758,15 +1787,7 @@ Note: The [=determine if a navigable has fully revoked network=] algorithm ensur
1. Let |realm| be the [=current realm=].
1. Let |onLockGrantedCallback| be an algorithm to perform the following steps:
1. [=Enqueue the following steps=] on |queue|:
- 1. If |options|["`ignoreIfPresent`"] is true:
- 1. Let |currentValue| be the result of running [=shared storage database/retrieve an entry from the database=] with |queue|, |databaseMap|, |environment|, and |key|.
- 1. If |currentValue| is failure and if |globalObject| is a {{SharedStorageWorkletGlobalScope}}:
- 1. [=Queue a global task=] on the [=DOM manipulation task source=], given |realm|'s [=global object=], to [=reject=] |promise| with a {{TypeError}}.
- 1. Abort these steps.
- 1. If |currentValue| is not undefined:
- 1. [=Queue a global task=] on the [=DOM manipulation task source=], given |realm|'s [=global object=], to [=resolve=] |promise| with undefined.
- 1. Abort these steps.
- 1. Let |result| be the result of running [=shared storage database/store an entry in the database=] with |queue|, |databaseMap|, |environment|, |key|, and |value|.
+ 1. Let |result| be the result of running [=shared storage database/set an entry in the database=] with |queue|, |databaseMap|, |environment|, |key|, |value|, and |options|["`ignoreIfPresent`"].
1. If |result| is false and if |globalObject| is a {{SharedStorageWorkletGlobalScope}}:
1. [=Queue a global task=] on the [=DOM manipulation task source=], given |realm|'s [=global object=], to [=reject=] |promise| with a {{TypeError}}.
1. Abort these steps.
@@ -1800,19 +1821,7 @@ Note: The [=determine if a navigable has fully revoked network=] algorithm ensur
1. Let |realm| be the [=current realm=].
1. Let |onLockGrantedCallback| be an algorithm to perform the following steps:
1. [=Enqueue the following steps=] on |queue|:
- 1. Let |currentValue| be the result of running [=shared storage database/retrieve an entry from the database=] with |queue|, |databaseMap|, |environment|, and |key|.
- 1. If |currentValue| is failure:
- 1. If |globalObject| is a {{Window}}:
- 1. [=Queue a global task=] on the [=DOM manipulation task source=], given |realm|'s [=global object=], to [=resolve=] |promise| with undefined.
- 1. Else:
- 1. [=Queue a global task=] on the [=DOM manipulation task source=], given |realm|'s [=global object=], to [=reject=] |promise| with a {{TypeError}}.
- 1. Abort these steps.
- 1. If |currentValue| is not undefined:
- 1. Let |list| be a new [=/list=].
- 1. [=list/Append=] |currentValue| to |list|.
- 1. [=list/Append=] |value| to |list|.
- 1. Set |value| to the result of running [=string/concatenate=] on |list|.
- 1. Let |result| be the result of running [=shared storage database/store an entry in the database=] with |queue|, |databaseMap|, |environment|, |key|, and |value|.
+ 1. Let |result| be the result of running [=shared storage database/append an entry in the database=] with |queue|, |databaseMap|, |environment|, |key|, and |value|.
1. If |result| is false and if |globalObject| is a {{SharedStorageWorkletGlobalScope}}:
1. [=Queue a global task=] on the [=DOM manipulation task source=], given |realm|'s [=global object=], to [=reject=] |promise| with a {{TypeError}}.
1. Abort these steps.