karma-electron
Version:
Karma launcher and preprocessor for Electron
117 lines (106 loc) • 4.68 kB
JavaScript
// When we run into an uncaught exception, fail hard
// DEV: Without this line, Karma can hang indefinitely
process.on('uncaughtException', function handleUncaughtException (err) {
throw err;
});
// Load in our dependencies
var assert = require('assert');
var fs = require('fs');
var path = require('path');
var app = require('electron').app;
var async = require('async');
var BrowserWindow = require('electron').BrowserWindow;
var program = require('commander');
// Set up our CLI parser
program.name = 'electron-launcher';
program.option('--user-data-dir [dir]', 'Directory to store user data');
program.option('--show', 'Boolean to make the window visible');
program.option('--extended-options [filepath]', 'Load extended options from file');
program.option('--default-user-agent', 'Boolean when spefified uses default user agent');
// DEV: We need to encode our URL to avoid issues with Electron on Windows
// https://ci.appveyor.com/project/twolfson/karma-electron-launcher/builds/25358540/job/k8q6ugas6ha0s7n5
program.option('--encoded-url [url]', 'URL to load page at');
program.option('--require [filepath]', 'Path to main process file to require');
program.allowUnknownOption();
// Parse and assert our arguments
program.parse(process.argv);
assert(program.userDataDir, 'Expected `--user-data-dir` to be provided but it was not.');
assert(program.encodedUrl, 'Expected `--encoded-url` to be provided but it was not.');
// When all windows are closed, exit out
app.on('window-all-closed', function handleWindowsClosed () {
app.quit();
});
// Update `userData` before Electron loads
// DEV: This prevents cookies/localStorage from contaminating across apps
app.setPath('userData', program.userDataDir);
// If we have another file to require, then load it
// DEV: We use `path.resolve` to resolve relative paths from working directory
// Otherwise, a `require('./foo')` would load relative to this file
if (program.require) {
require(path.resolve(program.require));
}
// In parallel
async.parallel([
function loadExtendedOptions (cb) {
// If we have extended options, then load them in
if (program.extendedOptions) {
fs.readFile(program.extendedOptions, 'utf8', function handleReadFile (err, extendedOptionsStr) {
// If we have an error, callback with it
if (err) { return cb(err); }
// Otherwise, load in our options
var extendedOptions;
try {
extendedOptions = JSON.parse(extendedOptionsStr);
} catch (err) {
console.error('Error loading extended options: ' + extendedOptionsStr);
return cb(err);
}
Object.assign(program, extendedOptions);
cb(null);
});
// Otherwise, callback in an async behavior (to match `if` case)
} else {
process.nextTick(cb);
}
},
function waitForAppReady (cb) {
app.on('ready', function handleReady (evt) {
cb(null);
});
}
], function handleParallelLoad (err) {
// If we received an error, throw it
if (err) { throw err; }
// Create our browser window
var browserWindowOptions = Object.assign({
show: false
}, program.browserWindowOptions, {
webPreferences: Object.assign({
nativeWindowOpen: true
}, (program.browserWindowOptions || {}).webPreferences)
});
if (program.show !== undefined) {
browserWindowOptions.show = !!program.show;
}
var browserWindow = new BrowserWindow(browserWindowOptions);
// Pass along same options to children (e.g. show), https://github.com/twolfson/karma-electron/issues/54
// https://github.com/electron/electron/blob/v12.1.2/docs/api/window-open.md#native-window-example
browserWindow.webContents.setWindowOpenHandler(function (params) {
return {
action: 'allow',
overrideBrowserWindowOptions: browserWindowOptions
};
});
var loadURLOptions = Object.assign({}, program.loadURLOptions);
if (program.defaultUserAgent !== true) {
// Set a custom User-Agent for better logging
// https://github.com/atom/electron/blob/v0.36.9/docs/api/browser-window.md#winloadurlurl-options
// https://github.com/atom/electron/blob/v0.36.9/docs/api/web-contents.md#webcontentsloadurlurl-options
// DEV: Default would be "Chrome 47.0.2526 (Linux 0.0.0)"
// https://github.com/karma-runner/karma/blob/v0.13.21/lib/browser.js#L25
// https://github.com/karma-runner/karma/blob/v0.13.21/lib/helper.js#L7-L11
// Example: Electron 0.36.9 (Node.js 5.1.1)
loadURLOptions.userAgent = 'Electron ' + process.versions.electron + ' (Node ' + process.versions.node + ')';
}
browserWindow.loadURL(decodeURIComponent(program.encodedUrl), loadURLOptions);
});