VulpesOS/gaia/tests/jsmarionette/runner/mozilla-runner/lib/run.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

132 lines
3.1 KiB
JavaScript
Executable file

'use strict';
var detectBinary = require('./detectbinary').detectBinary,
debug = require('debug')('mozilla-runner:run'),
spawn = require('child_process').spawn,
fs = require('fs');
// private helper for building the argv
function buildArgv(options) {
var argv = [];
if (options.argv)
argv = argv.concat(options.argv);
if (options.profile) {
argv.push('-profile');
argv.push(options.profile);
}
if (options.screen &&
options.screen.width &&
options.screen.height) {
argv.push('--screen=' +
options.screen.width + 'x' +
options.screen.height + (
options.screen.dpi ?
('@' + options.screen.dpi) :
''));
}
if (options.noRemote !== false) {
argv.push('-no-remote');
}
if (options.url) {
argv.push(options.url);
}
if (options.oop) {
argv.push('-oop');
}
if (options.chrome) {
argv.push('-chrome');
argv.push(options.chrome);
}
if (options.startDebugger) {
argv.push('-start-debugger-server');
argv.push(options.startDebugger);
}
return argv;
}
/**
* Run an instance of a mozilla runtime/product.
*
* Options:
* - (Boolean) noRemote: defaults to true (-no-remote flag)
* - (String) url: url to navigate to
* - (String) profile: path to gecko profile
* - (Array) argv: additional arguments to pass to process
* - (Object) env: If present, specifies the exact environment to use.
* - (Object) envOverrides: Changes to make to the current environment; a value
* of null indicates that the key should be removed from the environment
* entirely.
*
* var options = {}
* mozrun(path, options, function(err, child, binary, argv) {
*
* });
*/
function run(path, options, callback) {
if (typeof options === 'function') {
callback = options;
options = null;
}
var spawnOpts = {
cwd: undefined,
env: process.env
};
if (options) {
if (options.env) {
spawnOpts.env = options.env;
} else if (options.envOverrides) {
spawnOpts.env = {};
var envKey, envVal;
for (envKey in process.env) {
spawnOpts.env[envKey] = process.env[envKey];
}
for (envKey in options.envOverrides) {
envVal = options.envOverrides[envKey];
// Treat undefineds like null since this makes more sense than ending up
// with the string 'undefined' in the environment.
if (envVal == null) {
delete spawnOpts.env[envKey];
}
else {
spawnOpts.env[envKey] = envVal;
}
}
}
}
// handler for creating process
function spawnProduct(binPath) {
var argv = buildArgv(options);
debug('arv:', argv);
debug('bin:', binPath);
// spawn child process
callback(null, spawn(binPath, argv, spawnOpts), binPath, argv);
}
function foundBinary(err, binPath) {
if (err) return callback(err);
debug('found bin', binPath);
spawnProduct(binPath);
}
if (options && options.runtime &&
fs.existsSync(options.runtime)) {
foundBinary(null, options.runtime);
} else {
detectBinary(path, options, foundBinary);
}
}
module.exports.run = run;