Ensure fallback 'update available' dialog cannot stack

This commit is contained in:
Josh Perez 2020-02-21 15:41:05 -08:00 committed by GitHub
parent 8d9ccd3c0a
commit c347a2761a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 21 deletions

View file

@ -147,10 +147,16 @@ export async function downloadUpdate(
} }
} }
let showingUpdateDialog = false;
async function showFallbackUpdateDialog( async function showFallbackUpdateDialog(
mainWindow: BrowserWindow, mainWindow: BrowserWindow,
locale: LocaleType locale: LocaleType
) { ): Promise<boolean> {
if (showingUpdateDialog) {
return false;
}
const RESTART_BUTTON = 0; const RESTART_BUTTON = 0;
const LATER_BUTTON = 1; const LATER_BUTTON = 1;
const options = { const options = {
@ -166,8 +172,12 @@ async function showFallbackUpdateDialog(
cancelId: LATER_BUTTON, cancelId: LATER_BUTTON,
}; };
showingUpdateDialog = true;
const { response } = await dialog.showMessageBox(mainWindow, options); const { response } = await dialog.showMessageBox(mainWindow, options);
showingUpdateDialog = false;
return response === RESTART_BUTTON; return response === RESTART_BUTTON;
} }
@ -188,15 +198,24 @@ export function showUpdateDialog(
setTimeout(async () => { setTimeout(async () => {
if (!ack) { if (!ack) {
await showFallbackUpdateDialog(mainWindow, locale); const shouldUpdate = await showFallbackUpdateDialog(mainWindow, locale);
if (shouldUpdate) {
performUpdateCallback();
}
} }
}, ACK_RENDER_TIMEOUT); }, ACK_RENDER_TIMEOUT);
} }
let showingCannotUpdateDialog = false;
async function showFallbackCannotUpdateDialog( async function showFallbackCannotUpdateDialog(
mainWindow: BrowserWindow, mainWindow: BrowserWindow,
locale: LocaleType locale: LocaleType
) { ): Promise<void> {
if (showingCannotUpdateDialog) {
return;
}
const options = { const options = {
type: 'error', type: 'error',
buttons: [locale.messages.ok.message], buttons: [locale.messages.ok.message],
@ -204,7 +223,11 @@ async function showFallbackCannotUpdateDialog(
message: locale.i18n('cannotUpdateDetail', ['https://signal.org/download']), message: locale.i18n('cannotUpdateDetail', ['https://signal.org/download']),
}; };
showingCannotUpdateDialog = true;
await dialog.showMessageBox(mainWindow, options); await dialog.showMessageBox(mainWindow, options);
showingCannotUpdateDialog = false;
} }
export function showCannotUpdateDialog( export function showCannotUpdateDialog(

View file

@ -24,7 +24,6 @@ import { hexToBinary, verifySignature } from './signature';
import { markShouldQuit } from '../../app/window_state'; import { markShouldQuit } from '../../app/window_state';
import { Dialogs } from '../types/Dialogs'; import { Dialogs } from '../types/Dialogs';
let isChecking = false;
const SECOND = 1000; const SECOND = 1000;
const MINUTE = SECOND * 60; const MINUTE = SECOND * 60;
const INTERVAL = MINUTE * 30; const INTERVAL = MINUTE * 30;
@ -60,14 +59,8 @@ async function checkDownloadAndInstall(
locale: LocaleType, locale: LocaleType,
logger: LoggerType logger: LoggerType
) { ) {
if (isChecking) {
return;
}
logger.info('checkDownloadAndInstall: checking for update...'); logger.info('checkDownloadAndInstall: checking for update...');
try { try {
isChecking = true;
const result = await checkForUpdates(logger); const result = await checkForUpdates(logger);
if (!result) { if (!result) {
return; return;
@ -121,8 +114,6 @@ async function checkDownloadAndInstall(
}); });
} catch (error) { } catch (error) {
logger.error('checkDownloadAndInstall: error', getPrintableError(error)); logger.error('checkDownloadAndInstall: error', getPrintableError(error));
} finally {
isChecking = false;
} }
} }
@ -358,10 +349,16 @@ export function showReadOnlyDialog(
}, ACK_RENDER_TIMEOUT); }, ACK_RENDER_TIMEOUT);
} }
let showingReadOnlyDialog = false;
async function showFallbackReadOnlyDialog( async function showFallbackReadOnlyDialog(
mainWindow: BrowserWindow, mainWindow: BrowserWindow,
locale: LocaleType locale: LocaleType
) { ) {
if (showingReadOnlyDialog) {
return;
}
const options = { const options = {
type: 'warning', type: 'warning',
buttons: [locale.messages.ok.message], buttons: [locale.messages.ok.message],
@ -369,5 +366,9 @@ async function showFallbackReadOnlyDialog(
message: locale.i18n('readOnlyVolume', ['Signal.app', '/Applications']), message: locale.i18n('readOnlyVolume', ['Signal.app', '/Applications']),
}; };
showingReadOnlyDialog = true;
await dialog.showMessageBox(mainWindow, options); await dialog.showMessageBox(mainWindow, options);
showingReadOnlyDialog = false;
} }

View file

@ -23,7 +23,6 @@ import { markShouldQuit } from '../../app/window_state';
const readdir = pify(readdirCallback); const readdir = pify(readdirCallback);
const unlink = pify(unlinkCallback); const unlink = pify(unlinkCallback);
let isChecking = false;
const SECOND = 1000; const SECOND = 1000;
const MINUTE = SECOND * 60; const MINUTE = SECOND * 60;
const INTERVAL = MINUTE * 30; const INTERVAL = MINUTE * 30;
@ -61,13 +60,7 @@ async function checkDownloadAndInstall(
locale: LocaleType, locale: LocaleType,
logger: LoggerType logger: LoggerType
) { ) {
if (isChecking) {
return;
}
try { try {
isChecking = true;
logger.info('checkDownloadAndInstall: checking for update...'); logger.info('checkDownloadAndInstall: checking for update...');
const result = await checkForUpdates(logger); const result = await checkForUpdates(logger);
if (!result) { if (!result) {
@ -111,8 +104,6 @@ async function checkDownloadAndInstall(
}); });
} catch (error) { } catch (error) {
logger.error('checkDownloadAndInstall: error', getPrintableError(error)); logger.error('checkDownloadAndInstall: error', getPrintableError(error));
} finally {
isChecking = false;
} }
} }