gecko-dev/b2g/simulator/lib/main.js

93 lines
2.5 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
const { Cc, Ci, Cu } = require("chrome");
const { AddonManager } = Cu.import("resource://gre/modules/AddonManager.jsm", {});
const { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {});
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
const { Simulator } = Cu.import("resource://gre/modules/devtools/Simulator.jsm");
const { SimulatorProcess } = require("./simulator-process");
const Runtime = require("sdk/system/runtime");
const URL = require("sdk/url");
const ROOT_URI = require("addon").uri;
const PROFILE_URL = ROOT_URI + "profile/";
const BIN_URL = ROOT_URI + "b2g/";
let process;
function launch(options) {
// Close already opened simulation.
if (process) {
return close().then(launch.bind(null, options));
}
// Compute B2G runtime path.
let path;
try {
let pref = "extensions." + require("addon").id + ".customRuntime";
path = Services.prefs.getComplexValue(pref, Ci.nsIFile);
} catch(e) {}
if (!path) {
let executables = {
WINNT: "b2g-bin.exe",
Darwin: "B2G.app/Contents/MacOS/b2g-bin",
Linux: "b2g-bin",
};
path = URL.toFilename(BIN_URL);
path += Runtime.OS == "WINNT" ? "\\" : "/";
path += executables[Runtime.OS];
}
options.runtimePath = path;
console.log("simulator path:", options.runtimePath);
// Compute Gaia profile path.
if (!options.profilePath) {
let gaiaProfile;
try {
let pref = "extensions." + require("addon").id + ".gaiaProfile";
gaiaProfile = Services.prefs.getComplexValue(pref, Ci.nsIFile).path;
} catch(e) {}
options.profilePath = gaiaProfile || URL.toFilename(PROFILE_URL);
}
process = new SimulatorProcess(options);
process.run();
return promise.resolve();
}
function close() {
if (!process) {
return promise.resolve();
}
let p = process;
process = null;
return p.kill();
}
let name;
AddonManager.getAddonByID(require("addon").id, function (addon) {
name = addon.name.replace(" Simulator", "");
Simulator.register(name, {
// We keep the deprecated `appinfo` object so that recent simulator addons
// remain forward-compatible with older Firefox.
appinfo: { label: name },
launch: launch,
close: close
});
});
exports.shutdown = function () {
Simulator.unregister(name);
close();
}