- From: Marcos Cáceres <notifications@github.com>
- Date: Wed, 19 Oct 2016 01:13:26 -0700
- To: w3c/manifest <manifest@noreply.github.com>
- Message-ID: <w3c/manifest/issues/417/254744543@github.com>
Ok, this is what is going in to the spec (as prose and IDL, obvs.). I've got a battery of about 100 test to go with it.
All, please review the final design.
```JS
"use strict";
const internalSlots = new WeakMap();
const installProcesses = [];
const AppBannerPromptOutcome = new Set([
"accepted",
"dismissed",
]);
class BeforeInstallPromptEvent extends Event {
constructor(typeArg, eventInit) {
// WebIDL Guard. Wont be in spec in spec as it's all handled by WebIDL.
if (arguments.length === 0) {
throw new TypeError("Not enough arguments. Expected at least 1.");
}
const initType = typeof eventInit;
if (arguments.length === 2 && initType !== "undefined" && initType !== "object") {
throw new TypeError("Value can't be converted to a dictionary.");
}
super(typeArg, Object.assign({ cancelable: true }, eventInit));
if (eventInit && typeof eventInit.userChoice !== "undefined" && !AppBannerPromptOutcome.has(String(eventInit.userChoice))) {
const msg = `The provided value '${eventInit.userChoice}' is not a valid` +
"enum value of type AppBannerPromptOutcome.";
throw new TypeError(msg);
}
// End WebIDL guard.
const internal = {
didPrompt: false,
};
internal.userChoicePromise = new Promise((resolve) => {
internal.userChoiceHandlers = {
resolve,
};
if (eventInit && "userChoice" in eventInit) {
resolve(eventInit.userChoice);
}
});
internalSlots.set(this, internal);
}
prompt() {
if (internalSlots.get(this).didPrompt) {
const msg = ".prompt() can only be called once.";
throw new DOMException(msg, "InvalidStateError");
} else {
internalSlots.get(this).didPrompt = true;
}
if (this.isTrusted === false) {
const msg = "Untrusted events can't call prompt().";
throw new DOMException(msg, "NotAllowedError");
}
if (this.defaultPrevented === false) {
const msg = ".prompt() needs to be called after .preventDefault()";
throw new DOMException(msg, "InvalidStateError");
}
(async function task() {
const userChoice = await showInstallPrompt();
internalSlots.get(this).userChoiceHandlers.resolve(userChoice);
}.bind(this)())
}
get userChoice() {
return internalSlots.get(this).userChoicePromise;
}
}
// Browser behavior for
async function notifyBeforeInstallPrompt(element) {
await trackReadyState(); // don't fire until document fully loaded!
if (installProcesses.length) { // If the user is already installing, stop
return;
}
const event = new BeforeInstallPromptEvent("beforeinstallprompt");
window.dispatchEvent(event);
if (!event.defaultPrevented) {
await showInstallPrompt(element);
}
}
```
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/manifest/issues/417#issuecomment-254744543
Received on Wednesday, 19 October 2016 08:13:58 UTC