You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.6 KiB
43 lines
1.6 KiB
import {promisify} from 'node:util'; |
|
import {execFile} from 'node:child_process'; |
|
|
|
const execFileAsync = promisify(execFile); |
|
|
|
// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake |
|
// ones that look real and match the macOS/Linux versions for cross-platform apps. |
|
const windowsBrowserProgIds = { |
|
AppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'}, |
|
MSEdgeDHTML: {name: 'Edge', id: 'com.microsoft.edge'}, // On macOS, it's "com.microsoft.edgemac" |
|
MSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // Newer Edge/Win10 releases |
|
'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'}, |
|
FirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'}, |
|
ChromeHTML: {name: 'Chrome', id: 'com.google.chrome'}, |
|
BraveHTML: {name: 'Brave', id: 'com.brave.Browser'}, |
|
BraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'}, |
|
BraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'}, |
|
}; |
|
|
|
export class UnknownBrowserError extends Error {} |
|
|
|
export default async function defaultBrowser(_execFileAsync = execFileAsync) { |
|
const {stdout} = await _execFileAsync('reg', [ |
|
'QUERY', |
|
' HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice', |
|
'/v', |
|
'ProgId', |
|
]); |
|
|
|
const match = /ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(stdout); |
|
if (!match) { |
|
throw new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`); |
|
} |
|
|
|
const {id} = match.groups; |
|
|
|
const browser = windowsBrowserProgIds[id]; |
|
if (!browser) { |
|
throw new UnknownBrowserError(`Unknown browser ID: ${id}`); |
|
} |
|
|
|
return browser; |
|
}
|
|
|