From a1041a897e4e9e57924bb6a2bfffde5db1d87ae7 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Tue, 31 Mar 2020 18:10:56 +0800 Subject: [PATCH] fix: avoid process hanging when trying to get Chrome version (#5315) * fix: add a timeout, avoid process hanging fixes #5310 * fix: avoid accidentally trigerring the `installedBrowsers` getter fixes #5286 --- packages/@vue/cli-shared-utils/index.js | 7 +++ packages/@vue/cli-shared-utils/lib/env.js | 76 +++++++++++------------ 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/packages/@vue/cli-shared-utils/index.js b/packages/@vue/cli-shared-utils/index.js index 0637b56486..830a325459 100644 --- a/packages/@vue/cli-shared-utils/index.js +++ b/packages/@vue/cli-shared-utils/index.js @@ -19,3 +19,10 @@ exports.chalk = require('chalk') exports.execa = require('execa') exports.semver = require('semver') + +Object.defineProperty(exports, 'installedBrowsers', { + enumerable: true, + get () { + return exports.getInstalledBrowsers() + } +}) diff --git a/packages/@vue/cli-shared-utils/lib/env.js b/packages/@vue/cli-shared-utils/lib/env.js index 9a95d32b5d..d45616dee3 100644 --- a/packages/@vue/cli-shared-utils/lib/env.js +++ b/packages/@vue/cli-shared-utils/lib/env.js @@ -156,7 +156,8 @@ let hasCheckedBrowsers = false function tryRun (cmd) { try { return execSync(cmd, { - stdio: [0, 'pipe', 'ignore'] + stdio: [0, 'pipe', 'ignore'], + timeout: 10000 }).toString().trim() } catch (e) { return '' @@ -177,44 +178,41 @@ function getMacAppVersion (bundleIdentifier) { } } -Object.defineProperty(exports, 'installedBrowsers', { - enumerable: true, - get () { - if (hasCheckedBrowsers) { - return browsers - } - hasCheckedBrowsers = true - - if (exports.isLinux) { - browsers.chrome = getLinuxAppVersion('google-chrome') - browsers.firefox = getLinuxAppVersion('firefox') - } else if (exports.isMacintosh) { - browsers.chrome = getMacAppVersion('com.google.Chrome') - browsers.firefox = getMacAppVersion('org.mozilla.firefox') - } else if (exports.isWindows) { - // get chrome stable version - // https://stackoverflow.com/a/51773107/2302258 - const chromeQueryResult = tryRun( - 'reg query "HKLM\\Software\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}" /v pv /reg:32' - ) || tryRun( - 'reg query "HKCU\\Software\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}" /v pv /reg:32' - ) - if (chromeQueryResult) { - const matched = chromeQueryResult.match(/REG_SZ\s+(\S*)$/) - browsers.chrome = matched && matched[1] - } - - // get firefox version - // https://community.spiceworks.com/topic/111518-how-to-determine-version-of-installed-firefox-in-windows-batchscript - const ffQueryResult = tryRun( - 'reg query "HKLM\\Software\\Mozilla\\Mozilla Firefox" /v CurrentVersion' - ) - if (ffQueryResult) { - const matched = ffQueryResult.match(/REG_SZ\s+(\S*)$/) - browsers.firefox = matched && matched[1] - } +exports.getInstalledBrowsers = () => { + if (hasCheckedBrowsers) { + return browsers + } + hasCheckedBrowsers = true + + if (exports.isLinux) { + browsers.chrome = getLinuxAppVersion('google-chrome') + browsers.firefox = getLinuxAppVersion('firefox') + } else if (exports.isMacintosh) { + browsers.chrome = getMacAppVersion('com.google.Chrome') + browsers.firefox = getMacAppVersion('org.mozilla.firefox') + } else if (exports.isWindows) { + // get chrome stable version + // https://stackoverflow.com/a/51773107/2302258 + const chromeQueryResult = tryRun( + 'reg query "HKLM\\Software\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}" /v pv /reg:32' + ) || tryRun( + 'reg query "HKCU\\Software\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}" /v pv /reg:32' + ) + if (chromeQueryResult) { + const matched = chromeQueryResult.match(/REG_SZ\s+(\S*)$/) + browsers.chrome = matched && matched[1] } - return browsers + // get firefox version + // https://community.spiceworks.com/topic/111518-how-to-determine-version-of-installed-firefox-in-windows-batchscript + const ffQueryResult = tryRun( + 'reg query "HKLM\\Software\\Mozilla\\Mozilla Firefox" /v CurrentVersion' + ) + if (ffQueryResult) { + const matched = ffQueryResult.match(/REG_SZ\s+(\S*)$/) + browsers.firefox = matched && matched[1] + } } -}) + + return browsers +}