123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- /* 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/. */
- "use strict";
- const { Cc, Ci, Cu } = require("chrome");
- const { Task } = require("devtools/shared/task");
- loader.lazyRequireGetter(this, "Services");
- loader.lazyRequireGetter(this, "promise");
- loader.lazyRequireGetter(this, "defer", "devtools/shared/defer");
- loader.lazyRequireGetter(this, "OS", "resource://gre/modules/commonjs/node/os.js");
- loader.lazyRequireGetter(this, "DebuggerServer", "devtools/server/main", true);
- loader.lazyRequireGetter(this, "AppConstants",
- "resource://gre/modules/AppConstants.jsm", true);
- loader.lazyGetter(this, "screenManager", () => {
- return Cc["@mozilla.org/gfx/screenmanager;1"].getService(Ci.nsIScreenManager);
- });
- loader.lazyGetter(this, "oscpu", () => {
- return Cc["@mozilla.org/network/protocol;1?name=http"]
- .getService(Ci.nsIHttpProtocolHandler).oscpu;
- });
- const APP_MAP = {
- "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "firefox",
- "{3550f703-e582-4d05-9a08-453d09bdfdc6}": "thunderbird",
- "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}": "seamonkey",
- "{718e30fb-e89b-41dd-9da7-e25a45638b28}": "sunbird",
- "{3c2e2abc-06d4-11e1-ac3b-374f68613e61}": "b2g",
- "{aa3c5121-dab2-40e2-81ca-7ea25febc110}": "mobile/android",
- "{a23983c0-fd0e-11dc-95ff-0800200c9a66}": "mobile/xul"
- };
- var CACHED_INFO = null;
- function* getSystemInfo() {
- if (CACHED_INFO) {
- return CACHED_INFO;
- }
- let appInfo = Services.appinfo;
- let win = Services.wm.getMostRecentWindow(DebuggerServer.chromeWindowType);
- let [processor, compiler] = appInfo.XPCOMABI.split("-");
- let dpi,
- useragent,
- width,
- height,
- physicalWidth,
- physicalHeight,
- os,
- brandName;
- let appid = appInfo.ID;
- let apptype = APP_MAP[appid];
- let geckoVersion = appInfo.platformVersion;
- let hardware = "unknown";
- let version = "unknown";
- // B2G specific
- if (apptype === "b2g") {
- os = "B2G";
- // `getSetting` does not work in child processes on b2g.
- // TODO bug 1205797, make this work in child processes.
- try {
- hardware = yield exports.getSetting("deviceinfo.hardware");
- version = yield exports.getSetting("deviceinfo.os");
- } catch (e) {
- }
- }
- // Not B2G
- else {
- os = appInfo.OS;
- version = appInfo.version;
- }
- let bundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
- if (bundle) {
- brandName = bundle.GetStringFromName("brandFullName");
- } else {
- brandName = null;
- }
- if (win) {
- let utils = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
- dpi = utils.displayDPI;
- useragent = win.navigator.userAgent;
- width = win.screen.width;
- height = win.screen.height;
- physicalWidth = win.screen.width * win.devicePixelRatio;
- physicalHeight = win.screen.height * win.devicePixelRatio;
- }
- let info = {
- /**
- * Information from nsIXULAppInfo, regarding
- * the application itself.
- */
- // The XUL application's UUID.
- appid,
- // Name of the app, "firefox", "thunderbird", etc., listed in APP_MAP
- apptype,
- // Mixed-case or empty string of vendor, like "Mozilla"
- vendor: appInfo.vendor,
- // Name of the application, like "Firefox", "Thunderbird".
- name: appInfo.name,
- // The application's version, for example "0.8.0+" or "3.7a1pre".
- // Typically, the version of Firefox, for example.
- // It is different than the version of Gecko or the XULRunner platform.
- // On B2G, this is the Gaia version.
- version,
- // The application's build ID/date, for example "2004051604".
- appbuildid: appInfo.appBuildID,
- // The application's changeset.
- changeset: exports.getAppIniString("App", "SourceStamp"),
- // The build ID/date of Gecko and the XULRunner platform.
- platformbuildid: appInfo.platformBuildID,
- geckobuildid: appInfo.platformBuildID,
- // The version of Gecko or XULRunner platform, for example "1.8.1.19" or
- // "1.9.3pre". In "Firefox 3.7 alpha 1" the application version is "3.7a1pre"
- // while the platform version is "1.9.3pre"
- platformversion: geckoVersion,
- geckoversion: geckoVersion,
- // Locale used in this build
- locale: Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry).getSelectedLocale("global"),
- /**
- * Information regarding the operating system.
- */
- // Returns the endianness of the architecture: either "LE" or "BE"
- endianness: OS.endianness(),
- // Returns the hostname of the machine
- hostname: OS.hostname(),
- // Name of the OS type. Typically the same as `uname -s`. Possible values:
- // https://developer.mozilla.org/en/OS_TARGET
- // Also may be "B2G".
- os,
- platform: os,
- // hardware and version info from `deviceinfo.hardware`
- // and `deviceinfo.os`.
- hardware,
- // Type of process architecture running:
- // "arm", "ia32", "x86", "x64"
- // Alias to both `arch` and `processor` for node/deviceactor compat
- arch: processor,
- processor,
- // Name of compiler used for build:
- // `'msvc', 'n32', 'gcc2', 'gcc3', 'sunc', 'ibmc'...`
- compiler,
- // Location for the current profile
- profile: getProfileLocation(),
- // Update channel
- channel: AppConstants.MOZ_UPDATE_CHANNEL,
- dpi,
- useragent,
- width,
- height,
- physicalWidth,
- physicalHeight,
- brandName,
- };
- CACHED_INFO = info;
- return info;
- }
- function getProfileLocation() {
- // In child processes, we cannot access the profile location.
- try {
- let profd = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
- let profservice = Cc["@mozilla.org/toolkit/profile-service;1"].getService(Ci.nsIToolkitProfileService);
- var profiles = profservice.profiles;
- while (profiles.hasMoreElements()) {
- let profile = profiles.getNext().QueryInterface(Ci.nsIToolkitProfile);
- if (profile.rootDir.path == profd.path) {
- return profile = profile.name;
- }
- }
- return profd.leafName;
- } catch (e) {
- return "";
- }
- }
- function getAppIniString(section, key) {
- let inifile = Services.dirsvc.get("GreD", Ci.nsIFile);
- inifile.append("application.ini");
- if (!inifile.exists()) {
- inifile = Services.dirsvc.get("CurProcD", Ci.nsIFile);
- inifile.append("application.ini");
- }
- if (!inifile.exists()) {
- return undefined;
- }
- let iniParser = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].getService(Ci.nsIINIParserFactory).createINIParser(inifile);
- try {
- return iniParser.getString(section, key);
- } catch (e) {
- return undefined;
- }
- }
- /**
- * Function for fetching screen dimensions and returning
- * an enum for Telemetry.
- */
- function getScreenDimensions() {
- let width = {};
- let height = {};
- screenManager.primaryScreen.GetRect({}, {}, width, height);
- let dims = width.value + "x" + height.value;
- if (width.value < 800 || height.value < 600) {
- return 0;
- }
- if (dims === "800x600") {
- return 1;
- }
- if (dims === "1024x768") {
- return 2;
- }
- if (dims === "1280x800") {
- return 3;
- }
- if (dims === "1280x1024") {
- return 4;
- }
- if (dims === "1366x768") {
- return 5;
- }
- if (dims === "1440x900") {
- return 6;
- }
- if (dims === "1920x1080") {
- return 7;
- }
- if (dims === "2560×1440") {
- return 8;
- }
- if (dims === "2560×1600") {
- return 9;
- }
- if (dims === "2880x1800") {
- return 10;
- }
- if (width.value > 2880 || height.value > 1800) {
- return 12;
- }
- // Other dimension such as a VM.
- return 11;
- }
- /**
- * Function for fetching OS CPU and returning
- * an enum for Telemetry.
- */
- function getOSCPU() {
- if (oscpu.includes("NT 5.1") || oscpu.includes("NT 5.2")) {
- return 0;
- }
- if (oscpu.includes("NT 6.0")) {
- return 1;
- }
- if (oscpu.includes("NT 6.1")) {
- return 2;
- }
- if (oscpu.includes("NT 6.2")) {
- return 3;
- }
- if (oscpu.includes("NT 6.3")) {
- return 4;
- }
- if (oscpu.includes("OS X")) {
- return 5;
- }
- if (oscpu.includes("Linux")) {
- return 6;
- }
- if (oscpu.includes("NT 10.")) {
- return 7;
- }
- // Other OS.
- return 12;
- }
- function getSetting(name) {
- let deferred = defer();
- if ("@mozilla.org/settingsService;1" in Cc) {
- let settingsService;
- // settingsService fails in b2g child processes
- // TODO bug 1205797, make this work in child processes.
- try {
- settingsService = Cc["@mozilla.org/settingsService;1"].getService(Ci.nsISettingsService);
- } catch (e) {
- return promise.reject(e);
- }
- let req = settingsService.createLock().get(name, {
- handle: (name, value) => deferred.resolve(value),
- handleError: (error) => deferred.reject(error),
- });
- } else {
- deferred.reject(new Error("No settings service"));
- }
- return deferred.promise;
- }
- exports.getSystemInfo = Task.async(getSystemInfo);
- exports.getAppIniString = getAppIniString;
- exports.getSetting = getSetting;
- exports.getScreenDimensions = getScreenDimensions;
- exports.getOSCPU = getOSCPU;
- exports.constants = AppConstants;
|