From 9d343cae8b26b433940b05ac869fe597fea3642b Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 27 Jan 2020 23:02:55 -0600 Subject: [PATCH 1/4] 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() + } + }) }) } From a5098f7845471960bffb00ae0e61f070f7a580b9 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 27 Jan 2020 23:28:08 -0600 Subject: [PATCH 2/4] 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. --- lib/browser/api/power-monitor.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/browser/api/power-monitor.ts b/lib/browser/api/power-monitor.ts index aceb9b0115c55..5a9431ad52013 100644 --- a/lib/browser/api/power-monitor.ts +++ b/lib/browser/api/power-monitor.ts @@ -18,21 +18,27 @@ if (process.platform === 'linux') { * * 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 => { + const onceReady = (): void => { powerMonitor.on('newListener', (event: string) => { - // if first shutdown listener added + // whenever the listener count is incremented to one... if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { powerMonitor.blockShutdown() } }) powerMonitor.on('removeListener', (event: string) => { - // if last shutdown listener removed + // whenever the listener count is decremented to zero... if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { powerMonitor.unblockShutdown() } }) - }) + } + + const { app } = require('electron') + if (app.isReady()) { + onceReady() + } else { + app.once('ready', onceReady) + } } module.exports = powerMonitor From 690674d8aa685b2deae65414603019afee7addcb Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 28 Jan 2020 09:32:01 -0600 Subject: [PATCH 3/4] refactor: use app.whenReady() for simpler logic --- lib/browser/api/power-monitor.ts | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/browser/api/power-monitor.ts b/lib/browser/api/power-monitor.ts index 5a9431ad52013..2a227321b0a55 100644 --- a/lib/browser/api/power-monitor.ts +++ b/lib/browser/api/power-monitor.ts @@ -13,12 +13,13 @@ const powerMonitor = createLazyInstance(createPowerMonitor, PowerMonitor, true) if (process.platform === 'linux') { /* 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/ + * 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 onceReady = (): void => { + 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) { @@ -31,14 +32,7 @@ if (process.platform === 'linux') { powerMonitor.unblockShutdown() } }) - } - - const { app } = require('electron') - if (app.isReady()) { - onceReady() - } else { - app.once('ready', onceReady) - } + }) } module.exports = powerMonitor From 1944e1423136b9dfc12e34a7a3eb27ac30a61253 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 28 Jan 2020 09:33:43 -0600 Subject: [PATCH 4/4] chore: use a consistent comment formatting style --- lib/browser/api/power-monitor.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/browser/api/power-monitor.ts b/lib/browser/api/power-monitor.ts index 2a227321b0a55..793b3a093ccc6 100644 --- a/lib/browser/api/power-monitor.ts +++ b/lib/browser/api/power-monitor.ts @@ -11,13 +11,13 @@ Object.setPrototypeOf(PowerMonitor.prototype, EventEmitter.prototype) const powerMonitor = createLazyInstance(createPowerMonitor, PowerMonitor, true) if (process.platform === 'linux') { - /* 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. */ + // 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) => {