diff --git a/spec.bs b/spec.bs index e7bddd6..fcb0a41 100644 --- a/spec.bs +++ b/spec.bs @@ -17,9 +17,18 @@ Complain About: accidental-2119 true
+spec: html; urlPrefix: https://html.spec.whatwg.org/
+    type: dfn
+        for: html
+            text: web storage; url: #webstorage
+            text: sessionStorage; url: #dom-sessionstorage
+            text: localStorage; url: #dom-localstorage
+            text: broadcast channel; url: #broadcasting-to-other-browsing-contexts
+            text: new broadcastchannel; url: #dom-broadcastchannel
 spec: storage-access; urlPrefix: https://privacycg.github.io/storage-access/
     type: dfn
         for: environment
@@ -27,6 +36,28 @@ spec: storage-access; urlPrefix: https://privacycg.github.io/storage-access/
         text: unpartitioned data; url: #unpartitioned-data
         text: first-party-site context; url: #first-party-site-context
         text: third party context; url: #third-party-context
+spec: indexed-db; urlPrefix: https://www.w3.org/TR/IndexedDB/
+    type: dfn
+        text: indexed database api; url:
+spec: web-locks; urlPrefix: https://www.w3.org/TR/web-locks/
+    type: dfn
+        text: web locks api; url:
+        text: locks; url: #dom-navigatorlocks-locks
+spec: service-worker; urlPrefix: https://w3c.github.io/ServiceWorker/
+    type: dfn
+        text: cache storage; url: #cache-objects
+        text: caches; url: #global-caches-attribute
+spec: storage; urlPrefix: https://storage.spec.whatwg.org/
+    type: dfn
+        text: storage manager; url:
+spec: file-system; urlPrefix: https://fs.spec.whatwg.org/
+    type: dfn
+        text: file system; url:
+spec: file-api; urlPrefix: https://www.w3.org/TR/FileAPI/
+    type: dfn
+        text: file api; url:
+        text: createobjecturl; url: #dfn-createObjectURL
+        text: revokeobjecturl; url: #dfn-revokeObjectURL
 
@@ -40,6 +71,14 @@ spec: storage-access; urlPrefix: https://privacycg.github.io/storage-access/
         "href": "https://privacycg.github.io/storage-access/",
         "publisher": "W3C",
         "title": "The Storage Access API"
+    },
+    "STORAGE-PARTITIONING": {
+        "authors": [
+            "Privacy Community Group"
+        ],
+        "href": "https://privacycg.github.io/storage-partitioning/",
+        "publisher": "W3C",
+        "title": "Client-Side Storage Partitioning"
     }
 }
 
@@ -85,9 +124,29 @@ let userid = handle.localStorage.getItem("userid"); dictionary StorageAccessTypes { boolean all = false; boolean cookies = false; + boolean sessionStorage = false; + boolean localStorage = false; + boolean indexedDB = false; + boolean locks = false; + boolean caches = false; + boolean getDirectory = false; + boolean estimate = false; + boolean createObjectURL = false; + boolean revokeObjectURL = false; + boolean BroadcastChannel = false; }; interface StorageAccessHandle { + readonly attribute Storage sessionStorage; + readonly attribute Storage localStorage; + readonly attribute IDBFactory indexedDB; + readonly attribute LockManager locks; + readonly attribute CacheStorage caches; + Promise<FileSystemDirectoryHandle> getDirectory(); + Promise<StorageEstimate> estimate(); + DOMString createObjectURL((Blob or MediaSource) obj); + undefined revokeObjectURL(DOMString url); + BroadcastChannel BroadcastChannel(DOMString name); }; partial interface Document { @@ -96,6 +155,8 @@ partial interface Document { }; +A {{StorageAccessHandle}} object has an associated {{StorageAccessTypes}} types. + When invoked on {{Document}} |doc|, the hasUnpartitionedCookieAccess() method must run these steps: 1. Return the invocation of {{Document/hasStorageAccess()}} on |doc|. @@ -108,7 +169,7 @@ For now {{Document/hasStorageAccess()}} is not considered deprecated, but that < When invoked on {{Document}} |doc|, the requestStorageAccess(types) method must run these steps: 1. Let |p| be [=a new promise=]. -1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/cookies}} is `false`: +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/cookies}} is `false` and |types|.{{StorageAccessTypes/sessionStorage}} is `false` and |types|.{{StorageAccessTypes/localStorage}} is `false` and |types|.{{StorageAccessTypes/indexedDB}} is `false` and |types|.{{StorageAccessTypes/locks}} is `false` and |types|.{{StorageAccessTypes/caches}} is `false` and |types|.{{StorageAccessTypes/getDirectory}} is `false` and |types|.{{StorageAccessTypes/estimate}} is `false` and |types|.{{StorageAccessTypes/createObjectURL}} is `false` and |types|.{{StorageAccessTypes/revokeObjectURL}} is `false` and |types|.{{StorageAccessTypes/BroadcastChannel}} is `false`: 1. [=/Reject=] |p| with an "{{InvalidStateError}}" {{DOMException}}. 1. Return |p|. 1. Let |requestUnpartitionedCookieAccess| be `true` if |types|.{{StorageAccessTypes/all}} is `true` or |types|.{{StorageAccessTypes/cookies}} is `true`, and `false` otherwise. @@ -116,11 +177,11 @@ When invoked on {{Document}} |doc|, the re 1. If |accessPromise| [=/rejects=] with `reason` |r|: 1. [=/Reject=] |p| with |r|. 1. Else: - 1. Let |handle| be a new object of type {{StorageAccessHandle}} with |types|. + 1. Let |handle| be a new object of type {{StorageAccessHandle}}. + 1. Set |handle|'s [=StorageAccessHandle/types=] to |types|. 1. [=/Resolve=] |p| with |handle|. 1. Return |p|. -

Changes to {{Document/requestStorageAccess()}}

Redefine {{Document/requestStorageAccess()}} to: @@ -134,33 +195,99 @@ Modify {{Document/requestStorageAccess()}} at step 14.1.1.1.1 to read:

Changes to various client-side storage mechanisms

-

DOM Storage

+For all of the following getters and methods, consider the following modifications: -TBD +1. When attempting to [=obtain a storage key=] the returned key will use [[STORAGE-PARTITIONING#relaxing-additional-keying]] if the tuple does not simply contain an [=/origin=]. -

IndexedDB

+Issue(19): Clarify client-side storage mechanism changes in more detail. -TBD +

[=Web storage=]

-

Web Locks

+When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the sessionStorage getter must run these steps: -TBD +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/sessionStorage}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=html/sessionStorage=]. -

Cache Storage

+When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the localStorage getter must run these steps: -TBD +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/localStorage}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=html/localStorage=]. -

Storage Manager

+

[=Indexed Database API=]

-TBD +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the indexedDB getter must run these steps: -

File API

+1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/indexedDB}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of {{WindowOrWorkerGlobalScope/indexedDB}} on |doc|. -TBD +

[=Web Locks API=]

-

Broadcast Channel

+When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the locks getter must run these steps: -TBD +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/locks}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=/locks=] on {{Navigator}}. + +

[=Cache Storage=]

+ +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the caches getter must run these steps: + +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/caches}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=/caches=]. + +

[=File System=]

+ +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the getDirectory() method must run these steps: + +1. Let |p| be [=a new promise=]. +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/getDirectory}} is `false`: + 1. [=/Reject=] |p| with an "{{InvalidStateError}}" {{DOMException}}. +1. Let |directoryPromise| be the result of running {{StorageManager/getDirectory()}} on {{Navigator}}.{{NavigatorStorage/storage}}. +1. If |directoryPromise| [=/rejects=] with `reason` |r|: + 1. [=/Reject=] |p| with |r|. +1. Else if |directoryPromise| [=/resolves=] with {{FileSystemDirectoryHandle}} |f|: + 1. [=/Resolve=] |p| with |f|. +1. Return |p|. + +

[=Storage Manager=]

+ +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types|, the estimate() method must run these steps: + +1. Let |p| be [=a new promise=]. +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/estimate}} is `false`: + 1. [=/Reject=] |p| with an "{{InvalidStateError}}" {{DOMException}}. +1. Let |estimatePromise| be the result of running {{StorageManager/estimate()}} on {{Navigator}}.{{NavigatorStorage/storage}}. +1. If |estimatePromise| [=/rejects=] with `reason` |r|: + 1. [=/Reject=] |p| with |r|. +1. Else if |estimatePromise| [=/resolves=] with {{StorageEstimate}} |e|: + 1. [=/Resolve=] |p| with |e|. +1. Return |p|. + +

[=File API=]

+ +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types| and {{Blob}} or {{MediaSource}} |obj|, the createObjectURL(obj) method must run these steps: + +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/createObjectURL}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=/createObjectURL=] on {{URL}} with |obj|. + +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types| and {{DOMString}} |url|, the revokeObjectURL(url) method must run these steps: + +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/revokeObjectURL}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=/revokeObjectURL=] on {{URL}} with |url|. + +

[=Broadcast Channel=]

+ +When invoked on {{StorageAccessHandle}} |handle| with {{StorageAccessTypes}} |types| and {{DOMString}} |name|, the BroadcastChannel(name) method must run these steps: + +1. If |types|.{{StorageAccessTypes/all}} is `false` and |types|.{{StorageAccessTypes/BroadcastChannel}} is `false`: + 1. Throw an "{{InvalidStateError}}" {{DOMException}}. +1. Return the invocation of [=new BroadcastChannel=] with |name|.

Shared Worker