Skip to content

Commit 91df57c

Browse files
elliottsjMartin Konicek
authored andcommitted
Replace applescript with https://github.com/sindresorhus/opn
Summary: This allows opening the Chrome debugger on OS X, Linux, and Windows, and succeeds the previous PR which used [browser-launcher2](https://github.com/benderjs/browser-launcher2) and included a `--dangerouslyDisableChromeDebuggerWebSecurity` option: #2406 [opn](https://github.com/sindresorhus/opn) is cross-platform and much simpler than browser-launcher2 (since we don't have to manage the opened Chrome instance; the OS will just use the default instance). Closes #3394 Reviewed By: mkonicek Differential Revision: D2550996 Pulled By: frantic fb-gh-sync-id: fa4cbe55542562f30f77e0a6ab4bc53980ee13aa
1 parent e7bb56d commit 91df57c

5 files changed

Lines changed: 44 additions & 67 deletions

File tree

packager/getDevToolsMiddleware.js

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,21 @@
1010

1111
var execFile = require('child_process').execFile;
1212
var fs = require('fs');
13+
var opn = require('opn');
1314
var path = require('path');
1415

15-
module.exports = function(options) {
16+
function getChromeAppName() {
17+
switch (process.platform) {
18+
case 'darwin':
19+
return 'google chrome';
20+
case 'win32':
21+
return 'chrome';
22+
default:
23+
return 'google-chrome';
24+
}
25+
}
26+
27+
module.exports = function(options, isDebuggerConnected) {
1628
return function(req, res, next) {
1729
if (req.url === '/debugger-ui') {
1830
var debuggerPath = path.join(__dirname, 'debugger.html');
@@ -29,19 +41,18 @@ module.exports = function(options) {
2941
'If you still need this, please let us know.'
3042
);
3143
} else if (req.url === '/launch-chrome-devtools') {
44+
if (isDebuggerConnected()) {
45+
// Dev tools are already open; no need to open another session
46+
res.end('OK');
47+
return;
48+
}
3249
var debuggerURL = 'http://localhost:' + options.port + '/debugger-ui';
33-
var script = 'launchChromeDevTools.applescript';
3450
console.log('Launching Dev Tools...');
35-
execFile(
36-
path.join(__dirname, script), [debuggerURL],
37-
function(err, stdout, stderr) {
38-
if (err) {
39-
console.log('Failed to run ' + script, err);
40-
}
41-
console.log(stdout);
42-
console.warn(stderr);
51+
opn(debuggerURL, {app: [getChromeAppName()]}, function(err) {
52+
if (err) {
53+
console.error('Google Chrome exited with error:', err);
4354
}
44-
);
55+
});
4556
res.end('OK');
4657
} else {
4758
next();

packager/launchChromeDevTools.applescript

Lines changed: 0 additions & 47 deletions
This file was deleted.

packager/webSocketProxy.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function attachToServer(server, path) {
2222
try {
2323
cn.send(JSON.stringify(message));
2424
} catch(e) {
25-
console.warn('WARN: ' + e.message);
25+
// Sometimes this call throws 'not opened'
2626
}
2727
});
2828
}
@@ -57,7 +57,14 @@ function attachToServer(server, path) {
5757
});
5858
});
5959

60-
return wss;
60+
return {
61+
server: wss,
62+
isChromeConnected: () =>
63+
clients
64+
.map(ws => ws.upgradeReq.headers['user-agent'])
65+
.filter(Boolean)
66+
.some(userAgent => userAgent.includes('Chrome'))
67+
};
6168
}
6269

6370
module.exports = {

private-cli/src/server/runServer.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ const path = require('path');
2020
const ReactPackager = require('../../../packager/react-packager');
2121
const statusPageMiddleware = require('../../../packager/statusPageMiddleware.js');
2222
const systraceProfileMiddleware = require('../../../packager/systraceProfileMiddleware.js');
23+
const webSocketProxy = require('../../../packager/webSocketProxy.js');
2324

2425
function runServer(args, config, readyCallback) {
26+
var wsProxy = null;
2527
const app = connect()
2628
.use(loadRawBodyMiddleware)
27-
.use(getDevToolsMiddleware(args))
29+
.use(getDevToolsMiddleware(args, () => wsProxy && wsProxy.isChromeConnected()))
2830
.use(openStackFrameInEditorMiddleware)
2931
.use(statusPageMiddleware)
3032
.use(systraceProfileMiddleware)
@@ -39,7 +41,15 @@ function runServer(args, config, readyCallback) {
3941
.use(connect.compress())
4042
.use(connect.errorHandler());
4143

42-
return http.createServer(app).listen(args.port, '::', readyCallback);
44+
const serverInstance = http.createServer(app).listen(
45+
args.port,
46+
'::',
47+
function() {
48+
wsProxy = webSocketProxy.attachToServer(serverInstance, '/debugger-proxy');
49+
webSocketProxy.attachToServer(serverInstance, '/devtools');
50+
readyCallback();
51+
}
52+
);
4353
}
4454

4555
function getAppMiddleware(args, config) {

private-cli/src/server/server.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ const parseCommandLine = require('../../../packager/parseCommandLine');
1515
const path = require('path');
1616
const Promise = require('promise');
1717
const runServer = require('./runServer');
18-
const webSocketProxy = require('../../../packager/webSocketProxy.js');
1918

2019
/**
2120
* Starts the React Native Packager Server.
@@ -138,12 +137,9 @@ function _server(argv, config, resolve, reject) {
138137
}
139138

140139
function startServer(args, config) {
141-
const serverInstance = runServer(args, config, () =>
140+
runServer(args, config, () =>
142141
console.log('\nReact packager ready.\n')
143142
);
144-
145-
webSocketProxy.attachToServer(serverInstance, '/debugger-proxy');
146-
webSocketProxy.attachToServer(serverInstance, '/devtools');
147143
}
148144

149145
function argToArray(arg) {

0 commit comments

Comments
 (0)