10
0

windows.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import {promisify} from 'node:util';
  2. import {execFile} from 'node:child_process';
  3. const execFileAsync = promisify(execFile);
  4. // Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake
  5. // ones that look real and match the macOS/Linux versions for cross-platform apps.
  6. const windowsBrowserProgIds = {
  7. AppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},
  8. MSEdgeDHTML: {name: 'Edge', id: 'com.microsoft.edge'}, // On macOS, it's "com.microsoft.edgemac"
  9. MSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // Newer Edge/Win10 releases
  10. 'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},
  11. FirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},
  12. ChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},
  13. BraveHTML: {name: 'Brave', id: 'com.brave.Browser'},
  14. BraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},
  15. BraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},
  16. };
  17. export class UnknownBrowserError extends Error {}
  18. export default async function defaultBrowser(_execFileAsync = execFileAsync) {
  19. const {stdout} = await _execFileAsync('reg', [
  20. 'QUERY',
  21. ' HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice',
  22. '/v',
  23. 'ProgId',
  24. ]);
  25. const match = /ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(stdout);
  26. if (!match) {
  27. throw new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);
  28. }
  29. const {id} = match.groups;
  30. const browser = windowsBrowserProgIds[id];
  31. if (!browser) {
  32. throw new UnknownBrowserError(`Unknown browser ID: ${id}`);
  33. }
  34. return browser;
  35. }