From ab9b34cd5dad54e170be916016a4e9b4097231ed Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Tue, 24 Oct 2017 16:05:12 -0700 Subject: [PATCH] fix(Launcher): force-kill chrome on process exit and interruption (#1155) This patch starts force-killing chromium regardless of custom userdata directory when the node process exits. References #1047 --- lib/Launcher.js | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/Launcher.js b/lib/Launcher.js index cf99d5d7395..2ffea1ba38d 100644 --- a/lib/Launcher.js +++ b/lib/Launcher.js @@ -125,9 +125,9 @@ class Launcher { }); }); - const listeners = [ helper.addEventListener(process, 'exit', killChrome) ]; + const listeners = [ helper.addEventListener(process, 'exit', forceKillChrome) ]; if (options.handleSIGINT !== false) - listeners.push(helper.addEventListener(process, 'SIGINT', killChrome)); + listeners.push(helper.addEventListener(process, 'SIGINT', forceKillChrome)); /** @type {?Connection} */ let connection = null; try { @@ -146,23 +146,28 @@ class Launcher { function killChrome() { helper.removeEventListeners(listeners); if (temporaryUserDataDir) { - if (chromeProcess.pid && !chromeProcess.killed && !chromeClosed) { - // Force kill chrome. - if (process.platform === 'win32') - childProcess.execSync(`taskkill /pid ${chromeProcess.pid} /T /F`); - else - process.kill(-chromeProcess.pid, 'SIGKILL'); - } - // Attempt to remove temporary profile directory to avoid littering. - try { - removeFolder.sync(temporaryUserDataDir); - } catch (e) { } + forceKillChrome(); } else if (connection) { // Attempt to close chrome gracefully connection.send('Browser.close'); } return waitForChromeToClose; } + + function forceKillChrome() { + helper.removeEventListeners(listeners); + if (chromeProcess.pid && !chromeProcess.killed && !chromeClosed) { + // Force kill chrome. + if (process.platform === 'win32') + childProcess.execSync(`taskkill /pid ${chromeProcess.pid} /T /F`); + else + process.kill(-chromeProcess.pid, 'SIGKILL'); + } + // Attempt to remove temporary profile directory to avoid littering. + try { + removeFolder.sync(temporaryUserDataDir); + } catch (e) { } + } } /**