diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /devtools/shared/system.js | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | uxp-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz |
Add m-esr52 at 52.6.0
Diffstat (limited to 'devtools/shared/system.js')
-rw-r--r-- | devtools/shared/system.js | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/devtools/shared/system.js b/devtools/shared/system.js new file mode 100644 index 0000000000..ae46016e7e --- /dev/null +++ b/devtools/shared/system.js @@ -0,0 +1,339 @@ +/* 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; |