fix(desktop): keep update download active on dismiss

This commit is contained in:
Melody Ruch
2026-08-13 19:27:55 +08:00
committed by GitHub
parent 68c22e878b
commit fbf240efbc
2 changed files with 28 additions and 2 deletions
+23
View File
@@ -119,6 +119,11 @@ async function pressEscape() {
await flushDialog();
}
async function clickOutside() {
document.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true, cancelable: true }));
await flushDialog();
}
afterEach(() => {
for (const app of mountedApps.splice(0)) app.unmount();
document.body.innerHTML = "";
@@ -202,6 +207,24 @@ describe("UpdateDialog close protection", () => {
expect(state.open).toBe(false);
});
it("keeps downloading in the background when the dialog is dismissed by clicking outside", async () => {
const { state, cancelDownload } = await mountDialog(0, { isDownloadingUpdate: true, downloadProgress: 42 });
await clickOutside();
expect(cancelDownload).not.toHaveBeenCalled();
expect(state.open).toBe(true);
});
it("keeps downloading in the background when the dialog is dismissed with Escape", async () => {
const { state, cancelDownload } = await mountDialog(0, { isDownloadingUpdate: true, downloadProgress: 42 });
await pressEscape();
expect(cancelDownload).not.toHaveBeenCalled();
expect(state.open).toBe(true);
});
it("allows closing while a downloaded update is idle", async () => {
const { state } = await mountDialog(0, { updateDownloaded: true, downloadProgress: 100 });
@@ -37,6 +37,9 @@ const isDesktop = isTauriRuntime();
const renderedNotes = ref("");
// Only active file replacement (installation) must trap the dialog.
const isCloseBlocked = computed(() => props.isInstallingUpdate);
// Accidental dismiss gestures (outside click, Escape) must not cancel a running download;
// only the explicit close/cancel buttons should.
const blocksImplicitDismiss = computed(() => props.isInstallingUpdate || props.isDownloadingUpdate);
const canIgnoreVersion = computed(() => props.updateInfo?.update_available === true && !props.updateDownloaded && !props.isDownloadingUpdate && !props.isInstallingUpdate && !props.updateReady);
function handleCancel() {
@@ -91,12 +94,12 @@ watch(
:show-close-button="!isCloseBlocked"
@interact-outside="
(e: Event) => {
if (isCloseBlocked) e.preventDefault();
if (blocksImplicitDismiss) e.preventDefault();
}
"
@escape-key-down="
(e: Event) => {
if (isCloseBlocked) e.preventDefault();
if (blocksImplicitDismiss) e.preventDefault();
}
"
>