1 var log = require('./logger').create('launcher')
4 var baseDecorator = require('./launchers/base').decoratorFactory
5 var captureTimeoutDecorator = require('./launchers/capture_timeout').decoratorFactory
6 var retryDecorator = require('./launchers/retry').decoratorFactory
7 var processDecorator = require('./launchers/process').decoratorFactory
9 // TODO(vojta): remove once nobody uses it
10 var baseBrowserDecoratorFactory = function (baseLauncherDecorator, captureTimeoutLauncherDecorator,
11 retryLauncherDecorator, processLauncherDecorator) {
12 return function (launcher) {
13 baseLauncherDecorator(launcher)
14 captureTimeoutLauncherDecorator(launcher)
15 retryLauncherDecorator(launcher)
16 processLauncherDecorator(launcher)
20 var Launcher = function (emitter, injector) {
24 var getBrowserById = function (id) {
25 for (var i = 0; i < browsers.length; i++) {
26 if (browsers[i].id === id) {
34 this.launch = function (names, hostname, port, urlRoot) {
36 var url = 'http://' + hostname + ':' + port + urlRoot
38 lastStartTime = Date.now()
40 names.forEach(function (name) {
42 id: ['value', Launcher.generateId()],
43 name: ['value', name],
44 baseLauncherDecorator: ['factory', baseDecorator],
45 captureTimeoutLauncherDecorator: ['factory', captureTimeoutDecorator],
46 retryLauncherDecorator: ['factory', retryDecorator],
47 processLauncherDecorator: ['factory', processDecorator],
48 baseBrowserDecorator: ['factory', baseBrowserDecoratorFactory]
51 // TODO(vojta): determine script from name
52 if (name.indexOf('/') !== -1) {
57 browser = injector.createChild([locals], ['launcher:' + name]).get('launcher:' + name)
59 if (e.message.indexOf('No provider for "launcher:' + name + '"') !== -1) {
60 log.warn('Can not load "%s", it is not registered!\n ' +
61 'Perhaps you are missing some plugin?', name)
63 log.warn('Can not load "%s"!\n ' + e.stack, name)
69 // TODO(vojta): remove in v1.0 (BC for old launchers)
70 if (!browser.forceKill) {
71 browser.forceKill = function () {
72 var deferred = q.defer()
73 this.kill(function () {
76 return deferred.promise
79 browser.restart = function () {
81 this.kill(function () {
87 log.info('Starting browser %s', browser.name)
89 browsers.push(browser)
95 this.launch.$inject = ['config.browsers', 'config.hostname', 'config.port', 'config.urlRoot']
97 this.kill = function (id, callback) {
98 var browser = getBrowserById(id)
99 callback = callback || function () {}
102 process.nextTick(callback)
106 browser.forceKill().then(callback)
110 this.restart = function (id) {
111 var browser = getBrowserById(id)
121 this.killAll = function (callback) {
122 log.debug('Disconnecting all browsers')
125 var finish = function () {
127 if (!remaining && callback) {
132 if (!browsers.length) {
133 return process.nextTick(callback)
136 browsers.forEach(function (browser) {
138 browser.forceKill().then(finish)
142 this.areAllCaptured = function () {
143 return !browsers.some(function (browser) {
144 return !browser.isCaptured()
148 this.markCaptured = function (id) {
149 browsers.forEach(function (browser) {
150 if (browser.id === id) {
151 browser.markCaptured()
152 log.debug('%s (id %s) captured in %d secs', browser.name, browser.id,
153 (Date.now() - lastStartTime) / 1000)
159 emitter.on('exit', this.killAll)
162 Launcher.$inject = ['emitter', 'injector']
164 Launcher.generateId = function () {
165 return '' + Math.floor(Math.random() * 100000000)
169 exports.Launcher = Launcher