Skip to content

Commit 3644350

Browse files
committed
fixing will-quit listener so that it does not disrupt the app.quit() listener invocations
1 parent 79cebcc commit 3644350

File tree

5 files changed

+86
-84
lines changed

5 files changed

+86
-84
lines changed

documentation/1.0/content/release notes/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ pre = "<b> </b>"
77

88
### Known Issues
99

10-
- On Windows, the Application Update dialog `Install on Exit` works _only_ if you installed the application for the current user only. If the application was installed for all users, `Install on Exit` will cause the older version of the application to be uninstalled but the new version will not be installed. This is due to issue https://github.com/electron-userland/electron-builder/issues/6329.
10+
- On Windows, the Application Update dialog `Install on Exit` works _only_ if you installed the application for the current user only. If the application was installed for all users, `Install on Exit` will cause the older version of the application to be uninstalled but the new version will not be installed. This is due to issue https://github.com/electron-userland/electron-builder/issues/2363. This issue is fixed in the latest version of electron-updater but unfortunately, the fix breaks the `Install Now` functionality (see issue https://github.com/electron-userland/electron-builder/issues/6425).
1111

1212
- When running the WKT UI application on Windows, the image builder tool (docker or podman) also must be directly executable in Windows. For example, there is currently no support for running the WKT UI application in Windows and running podman under the Windows Subsystem for Linux (WSL2). However, running Docker Desktop for Windows with a WSL2 backend _is_ fully supported because the `docker` command is executable directly in Windows (without having to call WSL2). If you need to use podman on Windows, then refer to the podman blog entries at https://podman.io/blogs/2021/09/06/podman-on-macs.html and https://podman.io/blogs/2020/09/02/running_windows_or_mac.html for more information about downloading, installing, and configuring the Windows Remote Client.

electron/app/js/appUpdater.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ function registerAutoUpdateListeners() {
4646
}
4747
autoUpdater.quitAndInstall();
4848
}
49+
// On Windows, when _installType = 'onExit' and the app is installed for all users, [email protected]
50+
// doesn't work. This is fixed in [email protected] but that version suffers from
51+
// https://github.com/electron-userland/electron-builder/issues/6425, which causes
52+
// a Windows installer regression.
53+
//
4954
});
5055
}
5156

electron/app/js/userSettings.js

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
*/
66
const { app } = require('electron');
77
const fs = require('fs');
8-
const fsPromises = require('fs/promises');
98
const path = require('path');
109

11-
const fsUtils = require('./fsUtils');
1210
const { getErrorMessage } = require('./errorUtils');
1311

1412
// eslint-disable-next-line no-unused-vars
@@ -66,35 +64,26 @@ function getUserSettingsForRemote() {
6664
return JSON.stringify(_constructFilteredCopy(settings));
6765
}
6866

69-
async function applyUserSettingsFromRemote(remoteUserSettingsJson) {
70-
let remoteUserSettingsObject;
71-
try {
72-
remoteUserSettingsObject = JSON.parse(remoteUserSettingsJson);
73-
verifyRemoteUserSettingsObject(remoteUserSettingsObject);
74-
} catch (err) {
75-
return Promise.reject(err);
76-
}
67+
function applyUserSettingsFromRemote(remoteUserSettingsJson) {
68+
const { getLogger } = require('./wktLogging');
69+
const logger = getLogger();
7770

78-
return new Promise((resolve, reject) => {
79-
const currentSettings = _getUserSettings();
80-
const { getLogger } = require('./wktLogging');
81-
const logger = getLogger();
82-
for (const privateField of appPrivateFieldNames) {
83-
logger.debug(`privateField = ${privateField}`);
84-
if (Object.prototype.hasOwnProperty.call(currentSettings, privateField)) {
85-
logger.debug(`adding private field ${privateField} to new user settings object`);
86-
remoteUserSettingsObject[privateField] = currentSettings[privateField];
87-
} else {
88-
logger.debug(`currentSettings doesn't have private field ${privateField}`);
89-
}
71+
let remoteUserSettingsObject = JSON.parse(remoteUserSettingsJson);
72+
verifyRemoteUserSettingsObject(remoteUserSettingsObject);
73+
const currentSettings = _getUserSettings();
74+
for (const privateField of appPrivateFieldNames) {
75+
logger.debug(`privateField = ${privateField}`);
76+
if (Object.prototype.hasOwnProperty.call(currentSettings, privateField)) {
77+
logger.debug(`adding private field ${privateField} to new user settings object`);
78+
remoteUserSettingsObject[privateField] = currentSettings[privateField];
79+
} else {
80+
logger.debug(`currentSettings doesn't have private field ${privateField}`);
9081
}
91-
logger.debug(`new user settings are: ${JSON.stringify(remoteUserSettingsObject)}`);
92-
_userSettingsObject = remoteUserSettingsObject;
93-
saveUserSettings().then(() => {
94-
logger.debug('user settings saved...restart the application to pick up logger settings changes');
95-
resolve();
96-
}).catch(err => reject(err));
97-
});
82+
}
83+
logger.debug(`new user settings are: ${JSON.stringify(remoteUserSettingsObject)}`);
84+
_userSettingsObject = remoteUserSettingsObject;
85+
saveUserSettings();
86+
logger.debug('user settings saved...restart the application to pick up logger settings changes');
9887
}
9988

10089
function getHttpsProxyUrl() {
@@ -307,28 +296,42 @@ function verifyRemoteUserSettingsObject(remoteUserSettingsObject) {
307296
}
308297
}
309298

310-
async function saveUserSettings() {
299+
function saveUserSettings() {
311300
const i18n = require('./i18next.config');
312301

313302
if (!_userSettingsObject) {
314303
// nothing to save
315-
return new Promise(resolve => resolve());
304+
return;
316305
}
317306
const userSettingsJson = JSON.stringify(_userSettingsObject, null, 2);
318307

319-
return new Promise((resolve, reject) => {
320-
const userSettingsDirectory = getUserSettingsDirectory();
321-
const userSettingsFileName = getUserSettingsFileName();
322-
fsUtils.makeDirectoryIfNotExists(userSettingsDirectory)
323-
.then(() => {
324-
fsPromises.writeFile(userSettingsFileName, userSettingsJson, { encoding: 'utf8' })
325-
.then(() => resolve())
326-
.catch(err => reject(new Error(i18n.t('user-settings-file-save-failed-error-message',
327-
{ userSettingsFile: userSettingsFileName, error: getErrorMessage(err) }))));
328-
})
329-
.catch(err => reject(new Error(i18n.t('user-settings-make-directory-failed-error-message',
330-
{ userSettingsDirectory: userSettingsDirectory, error: getErrorMessage(err) }))));
331-
});
308+
const userSettingsDirectory = getUserSettingsDirectory();
309+
let dirExists;
310+
try {
311+
dirExists = fs.existsSync(userSettingsDirectory);
312+
} catch (err) {
313+
throw new Error(i18n.t('user-settings-check-directory-failed-error-message',
314+
{ userSettingsDirectory: userSettingsDirectory, error: getErrorMessage(err) }));
315+
}
316+
317+
if (!dirExists) {
318+
try {
319+
fs.mkdirSync(userSettingsDirectory, {
320+
recursive: true
321+
});
322+
} catch (err) {
323+
throw new Error(i18n.t('user-settings-make-directory-failed-error-message',
324+
{ userSettingsDirectory: userSettingsDirectory, error: getErrorMessage(err) }));
325+
}
326+
}
327+
328+
const userSettingsFileName = getUserSettingsFileName();
329+
try {
330+
fs.writeFileSync(userSettingsFileName, userSettingsJson, { encoding: 'utf8' });
331+
} catch (err) {
332+
throw new Error(i18n.t('user-settings-file-save-failed-error-message',
333+
{ userSettingsFile: userSettingsFileName, error: getErrorMessage(err) }));
334+
}
332335
}
333336

334337
function _constructFilteredCopy(settings) {

electron/app/locales/en/electron.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@
299299
"user-settings-directory-not-initialized-error-message": "Unable to get the user settings directory because electron is not yet initialized",
300300
"user-settings-file-exists-checked-failed-error-message": "Existence check for user settings file {{userSettingsFile}} failed: {{error}}",
301301
"user-settings-illegal-fields-error-message": "Remote User Settings object contains illegal fields: {{fieldNames}}",
302+
"user-settings-check-directory-failed-error-message": "Failed to test the existence of {{userSettingsDirectory}} directory: {{error}}",
302303
"user-settings-make-directory-failed-error-message": "Failed to create {{userSettingsDirectory}} directory: {{error}}",
303304
"user-settings-file-save-failed-error-message": "Failed to save file {{userSettingsFile}}: {{error}}",
304305
"user-settings-deep-copy-failed-error-message": "Failed to make a deep copy of the user settings object: {{error}}",

electron/app/main.js

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -189,18 +189,14 @@ class Main {
189189
this._forceQuit = true;
190190
});
191191

192-
app.on('will-quit', (event) => {
192+
app.on('will-quit', () => {
193193
this._logger.debug('Received will-quit event');
194-
event.preventDefault();
195-
userSettings.saveUserSettings()
196-
.then(() => {
197-
this._logger.info('User Settings saved');
198-
app.exit();
199-
})
200-
.catch(err => {
201-
this._logger.error('User settings save failed: %s', err);
202-
app.exit();
203-
});
194+
try {
195+
userSettings.saveUserSettings();
196+
this._logger.info('User Settings saved');
197+
} catch (err) {
198+
this._logger.error('User settings save failed: %s', err);
199+
}
204200
});
205201
}
206202

@@ -524,33 +520,30 @@ class Main {
524520

525521
ipcMain.handle('save-user-settings', async (event, userSettingsObj) => {
526522
const currentWindow = event.sender.getOwnerBrowserWindow();
527-
return new Promise(resolve => {
528-
userSettings.applyUserSettingsFromRemote(userSettingsObj)
529-
.then(() => {
530-
dialog.showMessageBox(currentWindow, {
531-
type: 'info',
532-
title: i18n.t('dialog-preference-save-success-title'),
533-
message: i18n.t('dialog-preference-save-success-message'),
534-
buttons: [
535-
i18n.t('button-ok')
536-
],
537-
defaultId: 0,
538-
cancelId: 0
539-
}).then(() => resolve());
540-
})
541-
.catch(err => {
542-
dialog.showMessageBox(currentWindow, {
543-
type: 'error',
544-
title: i18n.t('dialog-preference-save-error-title'),
545-
message: i18n.t('dialog-preference-save-error-message', { error: err }),
546-
buttons: [
547-
i18n.t('button-ok')
548-
],
549-
defaultId: 0,
550-
cancelId: 0
551-
}).then(() => resolve());
552-
});
553-
});
523+
try {
524+
userSettings.applyUserSettingsFromRemote(userSettingsObj);
525+
dialog.showMessageBox(currentWindow, {
526+
type: 'info',
527+
title: i18n.t('dialog-preference-save-success-title'),
528+
message: i18n.t('dialog-preference-save-success-message'),
529+
buttons: [
530+
i18n.t('button-ok')
531+
],
532+
defaultId: 0,
533+
cancelId: 0
534+
}).then();
535+
} catch (err) {
536+
dialog.showMessageBox(currentWindow, {
537+
type: 'error',
538+
title: i18n.t('dialog-preference-save-error-title'),
539+
message: i18n.t('dialog-preference-save-error-message', { error: err }),
540+
buttons: [
541+
i18n.t('button-ok')
542+
],
543+
defaultId: 0,
544+
cancelId: 0
545+
}).then();
546+
}
554547
});
555548

556549
// eslint-disable-next-line no-unused-vars
@@ -846,7 +839,7 @@ class Main {
846839
ipcMain.handle('restart-network-settings', async (event, settings) => {
847840
userSettings.setHttpsProxyUrl(settings['proxyUrl']);
848841
userSettings.setBypassProxyHosts(settings['bypassHosts']);
849-
await userSettings.saveUserSettings();
842+
userSettings.saveUserSettings();
850843
app.relaunch();
851844
app.quit();
852845
});

0 commit comments

Comments
 (0)