From 2f2bd8de68f01bf07634023584ac76afd9c111f2 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 27 Jan 2020 23:02:55 -0600 Subject: [PATCH] fix: use powerMonitor.on() only after app is ready powerMonitor can't be used until the app is ready; however, on Linux, powerMonitor.on() was called as soon as lib/browser/api/power-monitor.ts was loaded. This patch takes @vladimiry's suggestion of wrapping that in an app.on('ready') handler to prevent powerMonitor.on() from being called prematurely. Fixes #21716 --- lib/browser/api/power-monitor.ts | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/browser/api/power-monitor.ts b/lib/browser/api/power-monitor.ts index 795236334d656..aceb9b0115c55 100644 --- a/lib/browser/api/power-monitor.ts +++ b/lib/browser/api/power-monitor.ts @@ -10,18 +10,28 @@ Object.setPrototypeOf(PowerMonitor.prototype, EventEmitter.prototype) const powerMonitor = createLazyInstance(createPowerMonitor, PowerMonitor, true) -// On Linux we need to call blockShutdown() to subscribe to shutdown event. if (process.platform === 'linux') { - powerMonitor.on('newListener', (event:string) => { - if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { - powerMonitor.blockShutdown() - } - }) - - powerMonitor.on('removeListener', (event: string) => { - if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { - powerMonitor.unblockShutdown() - } + /* In order to delay system shutdown when e.preventDefault() is invoked + * on a powerMonitor 'shutdown' event, we need an org.freedesktop.login1 + * delay lock. For more details see the "Taking Delay Locks" section of + * https://www.freedesktop.org/wiki/Software/systemd/inhibit/ + * + * So here we watch for 'shutdown' listeners to be added or removed and + * set or unset our shutdown delay lock accordingly. */ + const { app } = require('electron') + app.once('ready', (): void => { + powerMonitor.on('newListener', (event: string) => { + // if first shutdown listener added + if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { + powerMonitor.blockShutdown() + } + }) + powerMonitor.on('removeListener', (event: string) => { + // if last shutdown listener removed + if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { + powerMonitor.unblockShutdown() + } + }) }) }