UNPKG

16.5 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = undefined;
7
8var _regenerator = require('babel-runtime/regenerator');
9
10var _regenerator2 = _interopRequireDefault(_regenerator);
11
12var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
13
14var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
15
16var injectHookCode = function () {
17 var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(client, code) {
18 return _regenerator2.default.wrap(function _callee$(_context) {
19 while (1) {
20 switch (_context.prev = _context.next) {
21 case 0:
22 _context.next = 2;
23 return client.connect();
24
25 case 2:
26 _context.next = 4;
27 return client.evaluate(code);
28
29 case 4:
30
31 client.dispose();
32
33 case 5:
34 case 'end':
35 return _context.stop();
36 }
37 }
38 }, _callee, this);
39 }));
40
41 return function injectHookCode(_x, _x2) {
42 return _ref.apply(this, arguments);
43 };
44}();
45
46var _path = require('path');
47
48var _path2 = _interopRequireDefault(_path);
49
50var _fs = require('fs');
51
52var _child_process = require('child_process');
53
54var _pinkie = require('pinkie');
55
56var _pinkie2 = _interopRequireDefault(_pinkie);
57
58var _osFamily = require('os-family');
59
60var _osFamily2 = _interopRequireDefault(_osFamily);
61
62var _endpointUtils = require('endpoint-utils');
63
64var _nodeDebug = require('./node-debug');
65
66var _nodeDebug2 = _interopRequireDefault(_nodeDebug);
67
68var _nodeInspect = require('./node-inspect');
69
70var _nodeInspect2 = _interopRequireDefault(_nodeInspect);
71
72var _isAbsolute = require('./utils/is-absolute');
73
74var _isAbsolute2 = _interopRequireDefault(_isAbsolute);
75
76var _getConfig = require('./utils/get-config');
77
78var _getConfig2 = _interopRequireDefault(_getConfig);
79
80var _hook = require('./hook');
81
82var _hook2 = _interopRequireDefault(_hook);
83
84var _ipc = require('./ipc');
85
86var _helpers = require('./helpers');
87
88var _helpers2 = _interopRequireDefault(_helpers);
89
90var _errors = require('./errors');
91
92var _errors2 = _interopRequireDefault(_errors);
93
94var _testRunTracker = require('testcafe/lib/api/test-run-tracker');
95
96var _testRunTracker2 = _interopRequireDefault(_testRunTracker);
97
98function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
99
100function startElectron(config, ports) {
101 var cmd = '';
102 var args = null;
103 var debugPortsArgs = ['--debug-brk=' + ports[0], '--inspect-brk=' + ports[1]];
104 var extraArgs = config.appArgs || [];
105
106 if (_osFamily2.default.mac && (0, _fs.statSync)(config.electronPath).isDirectory()) {
107 cmd = 'open';
108 args = ['-naW', '"' + config.electronPath + '"', '--args'].concat(debugPortsArgs, extraArgs);
109 } else {
110 cmd = config.electronPath;
111 args = debugPortsArgs.concat(extraArgs);
112 }
113
114 (0, _child_process.spawn)(cmd, args, { stdio: 'ignore' });
115}
116
117var ElectronBrowserProvider = {
118 isMultiBrowser: true,
119 openedBrowsers: {},
120
121 _getBrowserHelpers: function _getBrowserHelpers() {
122 var testRun = _testRunTracker2.default.resolveContextTestRun();
123 var id = testRun.browserConnection.id;
124
125 return ElectronBrowserProvider.openedBrowsers[id].helpers;
126 },
127 isLocalBrowser: function () {
128 var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
129 return _regenerator2.default.wrap(function _callee2$(_context2) {
130 while (1) {
131 switch (_context2.prev = _context2.next) {
132 case 0:
133 return _context2.abrupt('return', true);
134
135 case 1:
136 case 'end':
137 return _context2.stop();
138 }
139 }
140 }, _callee2, this);
141 }));
142
143 function isLocalBrowser() {
144 return _ref2.apply(this, arguments);
145 }
146
147 return isLocalBrowser;
148 }(),
149 openBrowser: function () {
150 var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(id, pageUrl, mainPath) {
151 var config, ipcServer, ports, hookCode, debugClient, inspectClient, injectingStatus;
152 return _regenerator2.default.wrap(function _callee3$(_context3) {
153 while (1) {
154 switch (_context3.prev = _context3.next) {
155 case 0:
156 if (!(0, _isAbsolute2.default)(mainPath)) mainPath = _path2.default.join(process.cwd(), mainPath);
157
158 config = (0, _getConfig2.default)(id, mainPath);
159 ipcServer = new _ipc.Server(config);
160 _context3.next = 5;
161 return ipcServer.start();
162
163 case 5:
164 _context3.next = 7;
165 return (0, _endpointUtils.getFreePorts)(2);
166
167 case 7:
168 ports = _context3.sent;
169
170
171 startElectron(config, ports);
172
173 hookCode = (0, _hook2.default)(config, pageUrl);
174 debugClient = new _nodeDebug2.default(ports[0]);
175 inspectClient = new _nodeInspect2.default(ports[1]);
176 _context3.next = 14;
177 return _pinkie2.default.race([injectHookCode(debugClient, hookCode), injectHookCode(inspectClient, hookCode)]);
178
179 case 14:
180 _context3.next = 16;
181 return ipcServer.connect();
182
183 case 16:
184 _context3.next = 18;
185 return ipcServer.getInjectingStatus();
186
187 case 18:
188 injectingStatus = _context3.sent;
189
190 if (injectingStatus.completed) {
191 _context3.next = 24;
192 break;
193 }
194
195 _context3.next = 22;
196 return ipcServer.terminateProcess();
197
198 case 22:
199
200 ipcServer.stop();
201
202 throw new Error(_errors2.default.render(_errors2.default.mainUrlWasNotLoaded, {
203 mainWindowUrl: config.mainWindowUrl,
204 openedUrls: injectingStatus.openedUrls
205 }));
206
207 case 24:
208
209 this.openedBrowsers[id] = {
210 config: config,
211 ipc: ipcServer,
212 helpers: new _helpers2.default(ipcServer)
213 };
214
215 case 25:
216 case 'end':
217 return _context3.stop();
218 }
219 }
220 }, _callee3, this);
221 }));
222
223 function openBrowser(_x3, _x4, _x5) {
224 return _ref3.apply(this, arguments);
225 }
226
227 return openBrowser;
228 }(),
229 closeBrowser: function () {
230 var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(id) {
231 return _regenerator2.default.wrap(function _callee4$(_context4) {
232 while (1) {
233 switch (_context4.prev = _context4.next) {
234 case 0:
235 _context4.next = 2;
236 return this.openedBrowsers[id].ipc.terminateProcess();
237
238 case 2:
239
240 this.openedBrowsers[id].ipc.stop();
241
242 delete this.openedBrowsers[id];
243
244 case 4:
245 case 'end':
246 return _context4.stop();
247 }
248 }
249 }, _callee4, this);
250 }));
251
252 function closeBrowser(_x6) {
253 return _ref4.apply(this, arguments);
254 }
255
256 return closeBrowser;
257 }(),
258 getBrowserList: function () {
259 var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5() {
260 return _regenerator2.default.wrap(function _callee5$(_context5) {
261 while (1) {
262 switch (_context5.prev = _context5.next) {
263 case 0:
264 return _context5.abrupt('return', ['${PATH_TO_ELECTRON_APP}']);
265
266 case 1:
267 case 'end':
268 return _context5.stop();
269 }
270 }
271 }, _callee5, this);
272 }));
273
274 function getBrowserList() {
275 return _ref5.apply(this, arguments);
276 }
277
278 return getBrowserList;
279 }(),
280
281
282 // TODO: implement validation ?
283 isValidBrowserName: function () {
284 var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6() {
285 return _regenerator2.default.wrap(function _callee6$(_context6) {
286 while (1) {
287 switch (_context6.prev = _context6.next) {
288 case 0:
289 return _context6.abrupt('return', true);
290
291 case 1:
292 case 'end':
293 return _context6.stop();
294 }
295 }
296 }, _callee6, this);
297 }));
298
299 function isValidBrowserName() {
300 return _ref6.apply(this, arguments);
301 }
302
303 return isValidBrowserName;
304 }(),
305
306
307 //Helpers
308 getMainMenuItems: function () {
309 var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7() {
310 return _regenerator2.default.wrap(function _callee7$(_context7) {
311 while (1) {
312 switch (_context7.prev = _context7.next) {
313 case 0:
314 return _context7.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().getMainMenuItems());
315
316 case 1:
317 case 'end':
318 return _context7.stop();
319 }
320 }
321 }, _callee7, this);
322 }));
323
324 function getMainMenuItems() {
325 return _ref7.apply(this, arguments);
326 }
327
328 return getMainMenuItems;
329 }(),
330 getContextMenuItems: function () {
331 var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8() {
332 return _regenerator2.default.wrap(function _callee8$(_context8) {
333 while (1) {
334 switch (_context8.prev = _context8.next) {
335 case 0:
336 return _context8.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().getContextMenuItems());
337
338 case 1:
339 case 'end':
340 return _context8.stop();
341 }
342 }
343 }, _callee8, this);
344 }));
345
346 function getContextMenuItems() {
347 return _ref8.apply(this, arguments);
348 }
349
350 return getContextMenuItems;
351 }(),
352 clickOnMainMenuItem: function () {
353 var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(menuItem) {
354 var modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
355 return _regenerator2.default.wrap(function _callee9$(_context9) {
356 while (1) {
357 switch (_context9.prev = _context9.next) {
358 case 0:
359 return _context9.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().clickOnMainMenuItem(menuItem, modifiers));
360
361 case 1:
362 case 'end':
363 return _context9.stop();
364 }
365 }
366 }, _callee9, this);
367 }));
368
369 function clickOnMainMenuItem(_x8) {
370 return _ref9.apply(this, arguments);
371 }
372
373 return clickOnMainMenuItem;
374 }(),
375 clickOnContextMenuItem: function () {
376 var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(menuItem) {
377 var modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
378 return _regenerator2.default.wrap(function _callee10$(_context10) {
379 while (1) {
380 switch (_context10.prev = _context10.next) {
381 case 0:
382 return _context10.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().clickOnContextMenuItem(menuItem, modifiers));
383
384 case 1:
385 case 'end':
386 return _context10.stop();
387 }
388 }
389 }, _callee10, this);
390 }));
391
392 function clickOnContextMenuItem(_x10) {
393 return _ref10.apply(this, arguments);
394 }
395
396 return clickOnContextMenuItem;
397 }(),
398 setElectronDialogHandler: function () {
399 var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(fn, context) {
400 return _regenerator2.default.wrap(function _callee11$(_context11) {
401 while (1) {
402 switch (_context11.prev = _context11.next) {
403 case 0:
404 return _context11.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().setElectronDialogHandler(fn, context));
405
406 case 1:
407 case 'end':
408 return _context11.stop();
409 }
410 }
411 }, _callee11, this);
412 }));
413
414 function setElectronDialogHandler(_x11, _x12) {
415 return _ref11.apply(this, arguments);
416 }
417
418 return setElectronDialogHandler;
419 }(),
420 getMainMenuItem: function () {
421 var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(menuItemSelector) {
422 return _regenerator2.default.wrap(function _callee12$(_context12) {
423 while (1) {
424 switch (_context12.prev = _context12.next) {
425 case 0:
426 return _context12.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().getMainMenuItem(menuItemSelector));
427
428 case 1:
429 case 'end':
430 return _context12.stop();
431 }
432 }
433 }, _callee12, this);
434 }));
435
436 function getMainMenuItem(_x13) {
437 return _ref12.apply(this, arguments);
438 }
439
440 return getMainMenuItem;
441 }(),
442 getContextMenuItem: function () {
443 var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(menuItemSelector) {
444 return _regenerator2.default.wrap(function _callee13$(_context13) {
445 while (1) {
446 switch (_context13.prev = _context13.next) {
447 case 0:
448 return _context13.abrupt('return', ElectronBrowserProvider._getBrowserHelpers().getContextMenuItem(menuItemSelector));
449
450 case 1:
451 case 'end':
452 return _context13.stop();
453 }
454 }
455 }, _callee13, this);
456 }));
457
458 function getContextMenuItem(_x14) {
459 return _ref13.apply(this, arguments);
460 }
461
462 return getContextMenuItem;
463 }()
464};
465
466exports.default = ElectronBrowserProvider;
467module.exports = exports['default'];
\No newline at end of file