From b0ad1145cdda766748befbf4c05535168b1cac22 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marcos=20C=C3=A1ceres?=
Queue a task on the application life-cycle task
source to do the following:
-
+ beforeinstallprompt
, with its
+ cancelable
attribute initialized to true.
BeforeInstallPromptEvent.prompt()
, but not
+ automatically without the site's approval. Is this something we want
+ to leave to the discretion of the user agent? (This would require
+ changing the language here, as "steps to notify before an automated
+ install prompt" would become "steps to notify that an install prompt
+ is available".)
+
@@ -526,14 +536,150 @@
DOM events fired by this specification use the application
life-cycle task source.
BeforeInstallPromptEvent
Interface
+ + [Constructor] + interface BeforeInstallPromptEvent : Event { + Promise<PromptResponseObject> prompt(); + }; + dictionary PromptResponseObject { + AppBannerPromptOutcome userChoice; + }; ++
+ The BeforeInstallPromptEvent is dispatched prior to + activating an automated install prompt, allowing a developer + to prevent the default action for an install prompt. +
+preventDefault
)
+ prevents the user agent from presenting an automated install
+ prompt. The user agent is free to run steps to notify before
+ an automated install prompt again at a later time.
+
+ The PromptResponseObject contains the result of calling
+ prompt()
. It
+ contains one member, userChoice, which states the user's
+ chosen outcome.
+
+ An instance of a BeforeInstallPromptEvent has the following + internal slots: +
+false
. Represents whether this
+ event was used to present an install prompt to the end-user.
+ prompt()
method
+ + The prompt method, when called, runs the following + steps: +
+isTrusted
attribute
+ is false
, reject
+ this.[[\userResponsePromise]] with
+ NotAllowedError, optionally informing the developer that
+ untrusted events can't call prompt()
.
+ false
, set this.[[\didPrompt]]
+ to true
, then in parallel, request to
+ present an install prompt with this event. Wait, possibly
+ indefinitely, for the end-user to make a choice.
+ + To request to present an install prompt with + BeforeInstallPromptEvent event: +
++ This example shows how one might prevent an automated install + prompt from showing until the user clicks a button to install the + app. In this way, the site can leave installation at the user's + discretion (rather than prompting at an arbitrary time), whilst + still providing a prominent UI to do so. +
++ window.addEventListener("beforeinstallprompt", event => { + // Suppress automatic prompting. + event.preventDefault(); + + // Show the (disabled-by-default) install button. This button + // resolves the installButtonClicked promise when clicked. + installButton.disabled = false; + + // Wait for the user to click the button. + installButton.addEventListener("click", async e => { + // The prompt() method can only be used once. + installButton.disabled = true; + + // Show the prompt. + const { userChoice } = await event.prompt(); + console.info(`user choice was: ${userChoice}`); + }); + }); ++
Window
object
- The following extensions to the Window
object
- specify the event handler attributes on which events relating
- to the installation of a web application are fired.
+ The following extensions to the Window
object specify the event
+ handler attributes on which events relating to the
+ installation of a web application are fired.
partial interface Window { @@ -573,16 +719,16 @@application).
onbeforeinstallprompt
attribute
- The onbeforeinstallprompt is an - event handler IDL attribute for the - "beforeinstallprompt" event type. The interface used for - these events is the BeforeInstallPromptEvent interface (see - the steps to notify before an automated install prompt). + The onbeforeinstallprompt is an event handler IDL + attribute for the "beforeinstallprompt" event type. + The interface used for these events is the + BeforeInstallPromptEvent interface (see the steps to + notify before an automated install prompt).