web/download: open saving dialog if user action expired

This commit is contained in:
wukko 2024-07-28 13:32:21 +06:00
parent 4210b17d89
commit 82091db154
No known key found for this signature in database
GPG key ID: 3E30B3F26C7B4AA2

View file

@ -5,6 +5,13 @@ import settings from "$lib/state/settings";
import { createDialog } from "$lib/dialogs";
export const openSavingDialog = (url: string) =>
createDialog({
type: "saving",
id: "saving",
url
})
export const openURL = (url: string) => {
return window.open(url, "_blank");
}
@ -27,12 +34,18 @@ export const copyURL = async (url: string) => {
export const downloadFile = (url: string) => {
const savingPreference = get(settings).save.downloadPopup;
if (savingPreference) {
createDialog({
type: "saving",
id: "saving",
url
})
/*
user actions (such as invoke share, open new tab) have expiration.
in webkit, for example, that timeout is 5 seconds.
https://github.com/WebKit/WebKit/blob/b838f8bb3573bd5906bc5f02fcc8cb274b3c9b8a/Source/WebCore/page/LocalDOMWindow.cpp#L167
navigator.userActivation.isActive makes sure that we're still able to
invoke an action without the user agent interrupting it.
if not, we show a saving dialog for user to re-invoke that action.
*/
if (savingPreference || !navigator.userActivation.isActive) {
openSavingDialog(url);
} else if (device.is.iOS && app.is.installed) {
return shareURL(url);
} else {