/
launcher.js
111 lines (83 loc) · 2.51 KB
/
launcher.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
var log = require('./logger').create('launcher');
var baseBrowserDecoratorFactory = require('./launchers/Base').decoratorFactory;
var Launcher = function(emitter, injector) {
var browsers = [];
this.launch = function(names, hostname, port, urlRoot) {
var url = 'http://' + hostname + ':' + port + urlRoot;
var browser;
names.forEach(function(name) {
var locals = {
id: ['value', Launcher.generateId()],
name: ['value', name],
baseBrowserDecorator: ['factory', baseBrowserDecoratorFactory]
};
// TODO(vojta): determine script from name
if (name.indexOf('/') !== -1) {
name = 'Script';
}
try {
browser = injector.createChild([locals], ['launcher:' + name]).get('launcher:' + name);
} catch (e) {
if (e.message.indexOf('No provider for "launcher:' + name + '"') !== -1) {
log.warn('Can not load "%s", it is not registered!\n ' +
'Perhaps you are missing some plugin?', name);
} else {
log.warn('Can not load "%s"!\n ' + e.stack, name);
}
return;
}
log.info('Starting browser %s', browser.name);
browser.start(url);
browsers.push(browser);
});
return browsers;
};
this.launch.$inject = ['config.browsers', 'config.hostname', 'config.port', 'config.urlRoot'];
this.kill = function(id, callback) {
for (var i = 0; i < browsers.length; i++) {
if (browsers[i].id === id) {
browsers[i].kill(callback);
return true;
}
}
process.nextTick(callback);
return false;
};
this.killAll = function(callback) {
log.debug('Disconnecting all browsers');
var remaining = 0;
var finish = function() {
remaining--;
if (!remaining && callback) {
callback();
}
};
if (!browsers.length) {
return process.nextTick(callback);
}
browsers.forEach(function(browser) {
remaining++;
browser.kill(finish);
});
};
this.areAllCaptured = function() {
return !browsers.some(function(browser) {
return !browser.isCaptured();
});
};
this.markCaptured = function(id) {
browsers.forEach(function(browser) {
if (browser.id === id) {
browser.markCaptured();
}
});
};
// register events
emitter.on('exit', this.killAll);
};
Launcher.$inject = ['emitter', 'injector'];
Launcher.generateId = function() {
return '' + Math.floor(Math.random() * 100000000);
};
// PUBLISH
exports.Launcher = Launcher;