This repository was archived by the owner on Sep 21, 2022. It is now read-only.
Repository navigation
Expand file tree
/
Copy pathrunner.js
More file actions
111 lines (99 loc) Β· 3.77 KB
/
Copy pathrunner.js
File metadata and controls
111 lines (99 loc) Β· 3.77 KB
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
'use strict';
var EventEmitter = require('events').EventEmitter,
q = require('q'),
exec = q.denodeify(require('child_process').exec),
inherit = require('inherit'),
promiseUtils = require('./promise-util'),
GeminiError = require('./errors/gemini-error'),
StateError = require('./errors/state-error'),
BrowserLauncher = require('./browser/launcher');
module.exports = inherit(EventEmitter, {
__constructor: function(config, browserLauncher) {
this.config = config;
this.browserLauncher = browserLauncher || new BrowserLauncher(config);
},
runPlans: function(plans) {
var _this = this;
return this._checkGM()
.then(function() {
_this.emit('begin');
return q(_this._prepare());
})
.then(function() {
return promiseUtils.seqMap(plans, _this.runPlan.bind(_this));
})
.then(function() {
_this.emit('end');
});
},
_prepare: function() {
},
_checkGM: function() {
return exec('gm -version')
.then(function() {
return true;
})
.fail(function() {
return q.reject(new GeminiError(
'Unable to find required package: GraphicsMagick',
'Make sure that GraphicsMagick is installed and availiable in your PATH.\n' +
'Additonal info and installation instructions:\nhttp://www.graphicsmagick.org/'
));
});
},
runPlan: function(plan) {
var _this = this,
chains = plan.getChains();
this.emit('beginPlan', plan.name);
return promiseUtils.seqMap(chains, this._runChain.bind(this))
.then(function() {
_this.emit('endPlan', plan.name);
});
},
_runChain: function(chain) {
var _this = this;
return q.all(_this.config.browsers.map(function(browserName) {
var browser = _this.browserLauncher.launch(browserName);
return _this._runChainInBrowser(chain, browser)
.fin(function() {
return _this.browserLauncher.stop(browser);
});
}));
},
_runChainInBrowser: function(chain, browser) {
var _this = this;
return browser.open(this.config.getAbsoluteUrl(chain.getUrl()))
.then(function() {
return browser.buildElementsMap(
chain.getElementsSelectors(),
chain.getDynamicElementsSelectors()
);
})
.then(function(elements) {
return promiseUtils.seqMap(chain.getStates(), function(state) {
_this.emit('beginState', state.plan.name, state.name, browser.name);
return browser.captureState(state, elements)
.then(function(image) {
return q(_this._processCapture({
plan: state.plan,
state: state,
browser: browser,
image: image
}));
})
.fail(function(e) {
if (e instanceof StateError) {
_this.emit('error', e);
} else {
return q.reject(e);
}
})
.fin(function() {
_this.emit('endState', state.plan.name, state.name, browser.name);
});
});
});
},
_processCapture: function() {
}
});