1 | var mkdirp = require('mkdirp');
|
2 | var path = require('path');
|
3 | var spawn = require('child_process').spawn;
|
4 |
|
5 | module.exports = function (avail, configDir, cb) {
|
6 | var pending = avail.length;
|
7 | if (pending === 0) cb();
|
8 |
|
9 | avail.forEach(function (br) {
|
10 | if (br.type === 'firefox' && br.profile) {
|
11 | createFirefox(br.command, function (err, profile) {
|
12 | if (err) return cb(err);
|
13 | br.profile = profile;
|
14 | if (--pending === 0) cb();
|
15 | });
|
16 | }
|
17 | else if (br.profile) {
|
18 | var dir = br.profile = makeDir(br.name, br.version);
|
19 | mkdirp(dir, function (err) {
|
20 | if (err) return cb(err);
|
21 | if (--pending === 0) cb();
|
22 | });
|
23 | }
|
24 | else if (--pending === 0) cb()
|
25 | });
|
26 |
|
27 | function makeDir (name, v) {
|
28 | var d = name + '-' + v + '_' + Math.random().toString(16).slice(2);
|
29 | return path.join(configDir, d);
|
30 | }
|
31 | };
|
32 |
|
33 | function createFirefox (name, cb) {
|
34 | var profileName = 'browser-launcher-' + Math.random().toString(16).slice(2);
|
35 | var args = [ '--no-remote', '-CreateProfile', profileName ];
|
36 | var ps = spawn(name, args);
|
37 |
|
38 | var data = '';
|
39 | ps.stdout.on('data', function (buf) { data += buf });
|
40 | ps.stderr.on('data', function (buf) { data += buf });
|
41 |
|
42 | ps.on('exit', function (code) {
|
43 | if (code !== 0) {
|
44 | return cb(name + ' ' + args.join(' ')
|
45 | + ' exited with code ' + code + ': ' + data
|
46 | );
|
47 | }
|
48 | var m = data.match(/^Success: created profile '[^']+' at '([^']+)/m);
|
49 | if (!m) cb('Unexpected data: ' + data)
|
50 | else cb(null, { name : profileName, file : m[1] })
|
51 | });
|
52 | }
|