From 570e4f6a340d2cc577857e452a0ab595aca88aca Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2020 18:44:56 +0900 Subject: [PATCH] fix: use powerMonitor.on() only after app is ready (#21941) * 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 * refactor: handle import powerMonitor timing issue Fix the previous commit's app-is-ready handler by checking to see if app is already ready when power-monitor.ts is loaded. * refactor: use app.whenReady() for simpler logic * chore: use a consistent comment formatting style Co-authored-by: Charles Kerr --- 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..793b3a093ccc6 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 + // shutdown 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.whenReady().then(() => { + powerMonitor.on('newListener', (event: string) => { + // whenever the listener count is incremented to one... + if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { + powerMonitor.blockShutdown() + } + }) + powerMonitor.on('removeListener', (event: string) => { + // whenever the listener count is decremented to zero... + if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { + powerMonitor.unblockShutdown() + } + }) }) }