subscription having the new keys as |newSubscription|.
- To create a push subscription, given an PushSubscriptionOptions object
- of |options|, the user agent must run the following steps:
+ To create a push subscription, given an {{PushSubscriptionOptionsInit}}
+ |optionsDictionary:PushSubscriptionOptionsInit|:
Let |subscription:PushSubscription| be a new {{PushSubscription}}.
+
+
Let |options:PushSubscriptionOptions| be a newly created {{PushSubscriptionOptions}}
+ object, initializing its attributes with the corresponding members and values of
+ |optionsDictionary|.
-
Set the `options` attribute of |subscription| to be a copy of |options|.
+
Set |subscription|'s {{PushSubscription/options}} attribute to |options|.
Generate a new P-256 ECDH key pair [[ANSI-X9-62]]. Store the private key in an
internal slot on |subscription|; this value MUST NOT be made available to applications.
@@ -214,11 +224,21 @@
key can be retrieved by calling the {{PushSubscription/getKey()}} method of the
{{PushSubscription}} with an argument of {{PushEncryptionKeyName/"auth"}}.
-
Make a request to the push service to create a new push subscription.
- Include the {{PushSubscriptionOptions/applicationServerKey}} attribute of |options| when
- it has been set.
+
Request a new push subscription. Include the
+ {{PushSubscriptionOptions/applicationServerKey}} attribute of |options| when it has been
+ set. Rethrow any [=exceptions=].
-
When the request has completed, return |subscription|.
+
Set |subscription|'s {{PushSubscription/endpoint}} attribute to the [=URL=]
+ provided by the push subscription.
+
+
If provided by the push subscription, set |subscription|'s
+ {{PushSubscription/expirationTime}}.
+
+
+
+
Return |subscription|.
@@ -548,10 +568,13 @@
MAY support content codings defined in previous versions of the draft for compatibility
reasons.
+
+ `subscribe()` method
+
- The subscribe method when invoked MUST run the following steps:
+ The subscribe() method when invoked MUST run the following steps:
-
+
If the [=relevant global object=] of [=this=] does not have [=transient activation=],
return [=a promise rejected with=] with a {{"NotAllowedError"}} {{DOMException}}.
Return |promise| and continue the following steps asynchronously.
+
Let |global| be [=this=]' [=relevant global object=].
-
If the current settings object is not a [=secure context=], reject |promise|
- with a {{DOMException}} whose name is {{"SecurityError"}} and terminate these steps.
+
Return |promise| and continue [=in parallel=].
+
+
+
If the |options| argument has a {{PushSubscriptionOptionsInit/userVisibleOnly}} value
+ set to `false` and the user agent requires it to be `true`, [=queue a global task=] on the
+ [=networking task source=] using |global| to [=reject=] |promise| {{"NotAllowedError"}}
+ {{DOMException}}
+
+
If the |options| argument does not include a non-null value for the
+ {{PushSubscriptionOptionsInit/applicationServerKey}} member, and the push service
+ requires one to be given, [=queue a global task=] on the [=networking task source=] using
+ |global| to [=reject=] |promise| with a {{"NotSupportedError"}} {{DOMException}}.
If the |options| argument includes a non-null value for the
{{PushSubscriptionOptions/applicationServerKey}} attribute, run the following sub-steps:
-
If the |applicationServerKey| is provided as a {{DOMString}}, set its value to an
- {{ArrayBuffer}} containing the sequence of octets that result from decoding
- |applicationServerKey| using the base64url encoding [[RFC7515]]. If decoding fails,
- reject promise with a {{DOMException}} whose name is {{"InvalidCharacterError"}} and
- terminate these steps.
+
If |options|'s {{PushSubscriptionOptionsInit/applicationServerKey}} is a
+ {{DOMString}}, set its value to an {{ArrayBuffer}} containing the sequence of octets
+ that result from decoding |options|'s
+ {{PushSubscriptionOptionsInit/applicationServerKey}} using the base64url encoding
+ [[RFC7515]].
+
+
If decoding fails, [=queue a global task=] on the [=networking task source=] using
+ |global| to [=reject=] |promise| with an {{"InvalidCharacterError"}} {{DOMException}}
+ and terminate these steps.
-
Ensure that |applicationServerKey| describes a valid point on the P-256 curve. If
- the |applicationServerKey| value is invalid, reject |promise| with a {{DOMException}}
- whose name is {{"InvalidAccessError"}} and terminate these steps.
+
Ensure that |options|'s {{PushSubscriptionOptionsInit/applicationServerKey}}
+ describes a valid point on the P-256 curve. If its value is invalid, [=queue a global
+ task=] on the [=networking task source=] using |global| to [=reject=] |promise| with an
+ {{"InvalidAccessError"}} {{DOMException}} and terminate these steps.
-
If the |options| argument does not include a non-null value for the
- {{PushSubscriptionOptions/applicationServerKey}} attribute, and the push service
- requires one to be given, reject |promise| with a {{DOMException}} whose name is
- {{"NotSupportedError"}} and terminate these steps.
-
-
Let |registration| be the {{PushManager}}'s associated service worker
+
If |registration|'s [=service worker registration/active worker=] is null, reject
- |promise| with a {{DOMException}} whose name is {{"InvalidStateError"}} and terminate these
- steps.
+
If |registration|'s [=service worker registration/active worker=] is null, [=queue a
+ global task=] on the [=networking task source=] using |global| to [=reject=] |promise| with
+ an {{"InvalidStateError"}} {{DOMException}} and terminate these steps.
+
+
Let |sw| be |registration|'s [=service worker registration/active worker=].
Let |permission| be [=request permission to use=] "push".
-
If |permission| is "denied", reject |promise| with a {{DOMException}} whose name is
- {{"NotAllowedError"}} and terminate these steps.
+
If |permission| is {{PermissionState/"denied"}}, [=queue a global task=] on the [=user
+ interaction task source=] using |global| to [=reject=] |promise| with a
+ {{"NotAllowedError"}} {{DOMException}} and terminate these steps.
-
If the Service Worker is already subscribed, run the following substeps:
+
If |sw| is already subscribed, run the following sub-steps:
-
Try to retrieve the push subscription associated with the |sw|. If there is
+ an error, [=queue a global task=] on the [=networking task source=] using |global| to
+ [=reject=] |promise| with an {{"AbortError"}} {{DOMException}} and terminate these
+ steps.
-
If there is an error, reject |promise| with a {{DOMException}} whose name is
- {{"AbortError"}} and terminate these steps.
+
Let |subscription| be the retrieved subscription.
+
Compare the |options| argument with the `options` attribute of |subscription|. The
+ contents of {{BufferSource}} values are compared for equality rather than
+ [=ECMAScript/reference record|reference=].
-
Compare the |options| argument with the `options` attribute of |subscription|. If
- any attribute on |options| contains a different value to that stored for
- |subscription|, then reject |promise| with an {{InvalidStateError}} and terminate these
- steps. The contents of {{BufferSource}} values are compared for equality rather than
- references.
+
If any attribute on |options| contains a different value to that stored for
+ |subscription|, then [=queue a global task=] on the [=networking task source=] using
+ |global| to [=reject=] |promise| with an {{"InvalidStateError"}} {{DOMException}} and
+ terminate these steps.
-
When the request has been completed, resolve |promise| with |subscription|.
+
When the request has been completed, [=queue a global task=] on the [=networking
+ task source=] using |global| to [=resolve=] |promise| with |subscription| and terminate
+ these steps.
If there is an error, reject |promise| with a {{DOMException}} whose name is
- {{"AbortError"}} and terminate these steps.
+
Let |subscription| be the result of trying to [=create a push subscription=] with
+ |options|. If creating the subscription [=exception/throws=] an [=exception=], [=queue a
+ global task=] on the [=networking task source=] using |global| to [=reject=] |promise| with
+ a that [=exception=] and terminate these these steps.
-
Resolve |promise| with a {{PushSubscription}} providing the details of the new
+
Otherwise, [=queue a global task=] on the [=networking task source=] using |global| to
+ [=resolve=] |promise| with a {{PushSubscription}} providing the details of the new
|subscription|.
@@ -939,8 +987,8 @@
};
- PushMessageData objects have an associated bytes (a byte sequence) set on
- creation, which is `null` if there was no data in the push message.
+ PushMessageData objects have an associated [=byte sequence=] set on creation, which
+ is `null` if there was no data in the push message.
The arrayBuffer() method, when invoked, MUST return an {{ArrayBuffer}} whose