12
12
13
13
/* eslint-disable */
14
14
15
- import { execSync } from 'child_process' ;
15
+ import { exec } from 'child_process' ;
16
+ import { promisify } from 'util' ;
16
17
import open from 'open' ;
18
+ import { PerfLogger } from '@docusaurus/logger' ;
19
+
20
+ const execPromise = promisify ( exec ) ;
17
21
18
22
type BrowserName = string | undefined ;
19
23
type BrowserArgs = string [ ] ;
@@ -49,38 +53,66 @@ async function tryOpenWithAppleScript({
49
53
}
50
54
51
55
if ( shouldTryOpenChromiumWithAppleScript ) {
52
- // Will use the first open browser found from list
53
- const supportedChromiumBrowsers = [
54
- 'Google Chrome Canary' ,
55
- 'Google Chrome Dev' ,
56
- 'Google Chrome Beta' ,
57
- 'Google Chrome' ,
58
- 'Microsoft Edge' ,
59
- 'Brave Browser' ,
60
- 'Vivaldi' ,
61
- 'Chromium' ,
62
- ] ;
63
-
64
- for ( let chromiumBrowser of supportedChromiumBrowsers ) {
56
+ async function getBrowsersToTry ( ) : Promise < string [ ] > {
57
+ // Will use the first open browser found from list
58
+ const supportedChromiumBrowsers = [
59
+ 'Google Chrome Canary' ,
60
+ 'Google Chrome Dev' ,
61
+ 'Google Chrome Beta' ,
62
+ 'Google Chrome' ,
63
+ 'Microsoft Edge' ,
64
+ 'Brave Browser' ,
65
+ 'Vivaldi' ,
66
+ 'Chromium' ,
67
+ ] ;
68
+
69
+ // Among all the supported browsers, retrieves to stdout the active ones
70
+ const command = `ps cax -o command | grep -E "^(${ supportedChromiumBrowsers . join (
71
+ '|' ,
72
+ ) } )$"`;
73
+ const result = await execPromise ( command ) ;
74
+
75
+ const activeBrowsers = result . stdout . toString ( ) . trim ( ) . split ( '\n' ) ;
76
+
77
+ // This preserves the initial browser order
78
+ // We open Google Chrome Canary in priority over Google Chrome
79
+ return supportedChromiumBrowsers . filter ( ( b ) =>
80
+ activeBrowsers . includes ( b ) ,
81
+ ) ;
82
+ }
83
+
84
+ async function tryBrowser ( browserName : string ) : Promise < boolean > {
65
85
try {
66
- // Try our best to reuse existing tab
67
- // on OSX Chromium-based browser with AppleScript
68
- execSync ( `ps cax | grep "${ chromiumBrowser } "` ) ;
69
- execSync (
70
- `osascript openChrome.applescript "${ encodeURI (
71
- url ,
72
- ) } " "${ chromiumBrowser } "`,
73
- {
74
- cwd : __dirname ,
75
- stdio : 'ignore' ,
76
- } ,
77
- ) ;
86
+ // This command runs the openChrome.applescript (copied from CRA)
87
+ const command = `osascript openChrome.applescript "${ encodeURI (
88
+ url ,
89
+ ) } " "${ browserName } "`;
90
+ await execPromise ( command , {
91
+ cwd : __dirname ,
92
+ } ) ;
78
93
return true ;
79
94
} catch ( err ) {
80
- // Ignore errors.
95
+ console . error (
96
+ `Failed to open browser ${ browserName } with AppleScript` ,
97
+ err ,
98
+ ) ;
99
+ return false ;
100
+ }
101
+ }
102
+
103
+ const browsers = await PerfLogger . async ( 'getBrowsersToTry' , ( ) =>
104
+ getBrowsersToTry ( ) ,
105
+ ) ;
106
+ for ( let browser of browsers ) {
107
+ const success = await PerfLogger . async ( browser , ( ) =>
108
+ tryBrowser ( browser ) ,
109
+ ) ;
110
+ if ( success ) {
111
+ return true ;
81
112
}
82
113
}
83
114
}
115
+
84
116
return false ;
85
117
}
86
118
@@ -103,7 +135,11 @@ function toOpenApp(params: Params): open.App | undefined {
103
135
}
104
136
105
137
async function startBrowserProcess ( params : Params ) : Promise < boolean > {
106
- if ( await tryOpenWithAppleScript ( params ) ) {
138
+ if (
139
+ await PerfLogger . async ( 'tryOpenWithAppleScript' , ( ) =>
140
+ tryOpenWithAppleScript ( params ) ,
141
+ )
142
+ ) {
107
143
return true ;
108
144
}
109
145
try {
0 commit comments