diff --git a/toolkit/components/telemetry/TelemetryController.jsm b/toolkit/components/telemetry/TelemetryController.jsm index b8de776da..86de87d02 100644 --- a/toolkit/components/telemetry/TelemetryController.jsm +++ b/toolkit/components/telemetry/TelemetryController.jsm @@ -365,7 +365,7 @@ var Impl = { let updateChannel = null; try { - updateChannel = UpdateUtils.getUpdateChannel(false); + updateChannel = UpdateUtils.UpdateChannel; } catch (e) { this._log.trace("_getApplicationSection - Unable to get update channel.", e); } diff --git a/toolkit/components/telemetry/TelemetryEnvironment.jsm b/toolkit/components/telemetry/TelemetryEnvironment.jsm index 391ea4bb4..f88dfc5f0 100644 --- a/toolkit/components/telemetry/TelemetryEnvironment.jsm +++ b/toolkit/components/telemetry/TelemetryEnvironment.jsm @@ -1106,7 +1106,7 @@ EnvironmentCache.prototype = { _updateSettings: function () { let updateChannel = null; try { - updateChannel = UpdateUtils.getUpdateChannel(false); + updateChannel = UpdateUtils.UpdateChannel; } catch (e) {} this._currentEnvironment.settings = { diff --git a/toolkit/components/telemetry/TelemetryReportingPolicy.jsm b/toolkit/components/telemetry/TelemetryReportingPolicy.jsm index d9c99df49..6ad534f53 100644 --- a/toolkit/components/telemetry/TelemetryReportingPolicy.jsm +++ b/toolkit/components/telemetry/TelemetryReportingPolicy.jsm @@ -254,7 +254,7 @@ var TelemetryReportingPolicyImpl = { // use the general minimum policy version. let channel = ""; try { - channel = UpdateUtils.getUpdateChannel(false); + channel = UpdateUtils.UpdateChannel; } catch (e) { this._log.error("minimumPolicyVersion - Unable to retrieve the current channel."); return minPolicyVersion; diff --git a/toolkit/modules/UpdateUtils.jsm b/toolkit/modules/UpdateUtils.jsm index aaec77042..cc6a8a4d6 100644 --- a/toolkit/modules/UpdateUtils.jsm +++ b/toolkit/modules/UpdateUtils.jsm @@ -3,6 +3,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #filter substitution +#if !MOZ_PKG_SPECIAL +#define MOZ_PKG_SPECIAL false +#endif this.EXPORTED_SYMBOLS = ["UpdateUtils"]; @@ -12,91 +15,84 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/NetUtil.jsm"); Cu.import("resource://gre/modules/Preferences.jsm"); +#ifdef XP_WIN Cu.import("resource://gre/modules/ctypes.jsm"); +Cu.import("resource://gre/modules/WindowsRegistry.jsm"); + +const WINREG_HKLM = Ci.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE; +const WINREG_WINNT = "Software\\Microsoft\\Windows NT\\CurrentVersion"; +#endif const FILE_UPDATE_LOCALE = "update.locale"; const PREF_APP_DISTRIBUTION = "distribution.id"; const PREF_APP_DISTRIBUTION_VERSION = "distribution.version"; -const PREF_APP_B2G_VERSION = "b2g.version"; +const PREF_APP_UPDATE_CHANNEL = "app.update.channel"; const PREF_APP_UPDATE_CUSTOM = "app.update.custom"; const PREF_APP_UPDATE_IMEI_HASH = "app.update.imei_hash"; this.UpdateUtils = { - /** - * Read the update channel from defaults only. We do this to ensure that - * the channel is tightly coupled with the application and does not apply - * to other instances of the application that may use the same profile. - * - * @param [optional] aIncludePartners - * Whether or not to include the partner bits. Default: true. - */ - getUpdateChannel(aIncludePartners = true) { - let defaults = Services.prefs.getDefaultBranch(null); -#expand let channel = defaults.getCharPref("app.update.channel", "__MOZ_UPDATE_CHANNEL__"); - - if (aIncludePartners) { - try { - let partners = Services.prefs.getChildList("app.partner.").sort(); - if (partners.length) { - channel += "-cck"; - partners.forEach(function (prefName) { - channel += "-" + Services.prefs.getCharPref(prefName); - }); - } - } catch (e) { - Cu.reportError(e); - } - } - - return channel; - }, - get UpdateChannel() { - return this.getUpdateChannel(); + return Services.prefs.getDefaultBranch(null) + .getCharPref(PREF_APP_UPDATE_CHANNEL, "@MOZ_UPDATE_CHANNEL@"); }, /** * Formats a URL by replacing %...% values with OS, build and locale specific * values. * - * @param url + * @param aUpdateURL * The URL to format. + * @param aAdditionalSubsts * @return The formatted URL. */ - formatUpdateURL(url) { - url = url.replace(/%ID%/g, Services.appinfo.ID); - url = url.replace(/%PRODUCT%/g, Services.appinfo.name); - url = url.replace(/%VERSION%/g, Services.appinfo.version); - url = url.replace(/%BUILD_ID%/g, Services.appinfo.appBuildID); - url = url.replace(/%BUILD_TARGET%/g, Services.appinfo.OS + "_" + this.ABI); - url = url.replace(/%OS_VERSION%/g, this.OSVersion); - url = url.replace(/%WIDGET_TOOLKIT%/g, "@MOZ_WIDGET_TOOLKIT@"); - url = url.replace(/%CHANNEL%/g, this.UpdateChannel); + formatUpdateURL: function(aUpdateURL, aAdditionalSubsts = null) { + // We want to be able to accept additional substs but also to have them be able to + // override the default ones below + if (aAdditionalSubsts) { + try { + aAdditionalSubsts.forEach(([_subst, _value]) => aUpdateURL = aUpdateURL.replace(_subst, _value)); + } catch(ex) { + Cu.reportError(ex); + } - if (/%LOCALE%/.test(url)) { - url = url.replace(/%LOCALE%/g, this.Locale); } - url = url.replace(/%CUSTOM%/g, Preferences.get(PREF_APP_UPDATE_CUSTOM, "")); - url = url.replace(/\+/g, "%2B"); + // appName SHOULD be lower case and not contain spaces even if it has in the past + let appName = Services.appinfo.name.replace(/\s+/g, '').toLowerCase() - url = url.replace(/%SYSTEM_CAPABILITIES%/g, gSystemCapabilities); - url = url.replace(/%PLATFORM_VERSION%/g, Services.appinfo.platformVersion); - url = url.replace(/%DISTRIBUTION%/g, - getDistributionPrefValue(PREF_APP_DISTRIBUTION)); - url = url.replace(/%DISTRIBUTION_VERSION%/g, - getDistributionPrefValue(PREF_APP_DISTRIBUTION_VERSION)); + // We want default pref values if they exist + let prefBranch = Services.prefs.getDefaultBranch(null) + let custom = prefBranch.getCharPref(PREF_APP_UPDATE_CUSTOM, ""); + let distribution = prefBranch.getCharPref(PREF_APP_DISTRIBUTION, "default"); + let distributionVersion = prefBranch.getCharPref(PREF_APP_DISTRIBUTION_VERSION, "default"); - return url; + let substs = [ + [/%ID%/g, Services.appinfo.ID], + [/%PRODUCT%/g, appName], + [/%VERSION%/g, Services.appinfo.version], + [/%BUILD_ID%/g, Services.appinfo.appBuildID], + [/%BUILD_TARGET%/g, Services.appinfo.OS + "_" + this.ABI], + [/%BUILD_SPECIAL%/g, "@MOZ_PKG_SPECIAL@"], + [/%OS_VERSION%/g, this.OSVersion], + [/%WIDGET_TOOLKIT%/g, "@MOZ_WIDGET_TOOLKIT@"], + [/%CHANNEL%/g, this.UpdateChannel], + [/%CUSTOM%/g, custom], + [/%PLATFORM_VERSION%/g, Services.appinfo.platformVersion], + [/%DISTRIBUTION%/g, distribution], + [/%DISTRIBUTION_VERSION%/g, distributionVersion], + [/%LOCALE%/g, this.Locale] + ]; + + substs.forEach(([_subst, _value]) => aUpdateURL = aUpdateURL.replace(_subst, _value)); + + // We do this last to make sure all pluses are converted + aUpdateURL = aUpdateURL.replace(/\+/g, "%2B"); + + return aUpdateURL; } }; -/* Get the distribution pref values, from defaults only */ -function getDistributionPrefValue(aPrefName) { - return prefValue = Services.prefs.getDefaultBranch(null).getCharPref(aPrefName, "default"); -} - /** * Gets the locale from the update.locale file for replacing %LOCALE% in the * update url. The update.locale file can be located in the application @@ -126,51 +122,6 @@ XPCOMUtils.defineLazyGetter(UpdateUtils, "Locale", function() { return null; }); -/** - * Provides adhoc system capability information for application update. - */ -XPCOMUtils.defineLazyGetter(this, "gSystemCapabilities", function aus_gSC() { -#ifdef XP_WIN - const PF_MMX_INSTRUCTIONS_AVAILABLE = 3; // MMX - const PF_XMMI_INSTRUCTIONS_AVAILABLE = 6; // SSE - const PF_XMMI64_INSTRUCTIONS_AVAILABLE = 10; // SSE2 - const PF_SSE3_INSTRUCTIONS_AVAILABLE = 13; // SSE3 - - let lib = ctypes.open("kernel32.dll"); - let IsProcessorFeaturePresent = lib.declare("IsProcessorFeaturePresent", - ctypes.winapi_abi, - ctypes.int32_t, /* success */ - ctypes.uint32_t); /* DWORD */ - let instructionSet = "unknown"; - try { - if (IsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE)) { - instructionSet = "SSE3"; - } else if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)) { - instructionSet = "SSE2"; - } else if (IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE)) { - instructionSet = "SSE"; - } else if (IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE)) { - instructionSet = "MMX"; - } - } catch (e) { - instructionSet = "error"; - Cu.reportError("Error getting processor instruction set. " + - "Exception: " + e); - } - - lib.close(); - return instructionSet; -#elifdef XP_LINUX - let instructionSet = "unknown"; - if (navigator.cpuHasSSE2) { - instructionSet = "SSE2"; - } - return instructionSet; -#else - return "NA" -#endif -}); - #ifdef XP_WIN /* Windows only getter that returns the processor architecture. */ XPCOMUtils.defineLazyGetter(this, "gWinCPUArch", function aus_gWinCPUArch() { @@ -184,24 +135,24 @@ XPCOMUtils.defineLazyGetter(this, "gWinCPUArch", function aus_gWinCPUArch() { // http://msdn.microsoft.com/en-us/library/ms724958%28v=vs.85%29.aspx const SYSTEM_INFO = new ctypes.StructType('SYSTEM_INFO', [ - {wProcessorArchitecture: WORD}, - {wReserved: WORD}, - {dwPageSize: DWORD}, - {lpMinimumApplicationAddress: ctypes.voidptr_t}, - {lpMaximumApplicationAddress: ctypes.voidptr_t}, - {dwActiveProcessorMask: DWORD.ptr}, - {dwNumberOfProcessors: DWORD}, - {dwProcessorType: DWORD}, - {dwAllocationGranularity: DWORD}, - {wProcessorLevel: WORD}, - {wProcessorRevision: WORD} + {wProcessorArchitecture: WORD}, + {wReserved: WORD}, + {dwPageSize: DWORD}, + {lpMinimumApplicationAddress: ctypes.voidptr_t}, + {lpMaximumApplicationAddress: ctypes.voidptr_t}, + {dwActiveProcessorMask: DWORD.ptr}, + {dwNumberOfProcessors: DWORD}, + {dwProcessorType: DWORD}, + {dwAllocationGranularity: DWORD}, + {wProcessorLevel: WORD}, + {wProcessorRevision: WORD} ]); let kernel32 = false; try { kernel32 = ctypes.open("Kernel32"); - } catch (e) { - Cu.reportError("Unable to open kernel32! Exception: " + e); + } catch (ex) { + Cu.reportError("Unable to open kernel32! Exception: " + ex); } if (kernel32) { @@ -226,9 +177,9 @@ XPCOMUtils.defineLazyGetter(this, "gWinCPUArch", function aus_gWinCPUArch() { arch = "x86"; break; } - } catch (e) { + } catch (ex) { Cu.reportError("Error getting processor architecture. " + - "Exception: " + e); + "Exception: " + ex); } finally { kernel32.close(); } @@ -242,8 +193,7 @@ XPCOMUtils.defineLazyGetter(UpdateUtils, "ABI", function() { let abi = null; try { abi = Services.appinfo.XPCOMABI; - } - catch (e) { + } catch (ex) { Cu.reportError("XPCOM ABI unknown"); } @@ -256,9 +206,6 @@ XPCOMUtils.defineLazyGetter(UpdateUtils, "ABI", function() { if (macutils.isUniversalBinary) { abi += "-u-" + macutils.architecturesInBinary; } -#elifdef XP_WIN - // Windows build should report the CPU architecture that it's running on. - abi += "-" + gWinCPUArch; #endif return abi; @@ -269,101 +216,34 @@ XPCOMUtils.defineLazyGetter(UpdateUtils, "OSVersion", function() { try { osVersion = Services.sysinfo.getProperty("name") + " " + Services.sysinfo.getProperty("version"); - } - catch (e) { + } catch(ex) { Cu.reportError("OS Version unknown."); } #ifdef XP_WIN if (osVersion) { - const BYTE = ctypes.uint8_t; - const WORD = ctypes.uint16_t; - const DWORD = ctypes.uint32_t; - const WCHAR = ctypes.char16_t; - const BOOL = ctypes.int; - - // This structure is described at: - // http://msdn.microsoft.com/en-us/library/ms724833%28v=vs.85%29.aspx - const SZCSDVERSIONLENGTH = 128; - const OSVERSIONINFOEXW = new ctypes.StructType('OSVERSIONINFOEXW', - [ - {dwOSVersionInfoSize: DWORD}, - {dwMajorVersion: DWORD}, - {dwMinorVersion: DWORD}, - {dwBuildNumber: DWORD}, - {dwPlatformId: DWORD}, - {szCSDVersion: ctypes.ArrayType(WCHAR, SZCSDVERSIONLENGTH)}, - {wServicePackMajor: WORD}, - {wServicePackMinor: WORD}, - {wSuiteMask: WORD}, - {wProductType: BYTE}, - {wReserved: BYTE} - ]); - - // This structure is described at: - // http://msdn.microsoft.com/en-us/library/ms724958%28v=vs.85%29.aspx - const SYSTEM_INFO = new ctypes.StructType('SYSTEM_INFO', - [ - {wProcessorArchitecture: WORD}, - {wReserved: WORD}, - {dwPageSize: DWORD}, - {lpMinimumApplicationAddress: ctypes.voidptr_t}, - {lpMaximumApplicationAddress: ctypes.voidptr_t}, - {dwActiveProcessorMask: DWORD.ptr}, - {dwNumberOfProcessors: DWORD}, - {dwProcessorType: DWORD}, - {dwAllocationGranularity: DWORD}, - {wProcessorLevel: WORD}, - {wProcessorRevision: WORD} - ]); - - let kernel32 = false; - try { - kernel32 = ctypes.open("Kernel32"); - } catch (e) { - Cu.reportError("Unable to open kernel32! " + e); - osVersion += ".unknown (unknown)"; + let currentBuild = WindowsRegistry.readRegKey(WINREG_HKLM, WINREG_WINNT, "CurrentBuild"); + let CSDBuildNumber = WindowsRegistry.readRegKey(WINREG_HKLM, WINREG_WINNT, "CSDBuildNumber"); + + if (!CSDBuildNumber) { + CSDBuildNumber = "0"; } - if (kernel32) { - try { - // Get Service pack info - try { - let GetVersionEx = kernel32.declare("GetVersionExW", - ctypes.default_abi, - BOOL, - OSVERSIONINFOEXW.ptr); - let winVer = OSVERSIONINFOEXW(); - winVer.dwOSVersionInfoSize = OSVERSIONINFOEXW.size; + osVersion = osVersion.replace(/Windows_NT/g, "WINNT"); + osVersion += "." + currentBuild + "." + CSDBuildNumber - if (0 !== GetVersionEx(winVer.address())) { - osVersion += "." + winVer.wServicePackMajor + - "." + winVer.wServicePackMinor; - } else { - Cu.reportError("Unknown failure in GetVersionEX (returned 0)"); - osVersion += ".unknown"; - } - } catch (e) { - Cu.reportError("Error getting service pack information. Exception: " + e); - osVersion += ".unknown"; - } - } finally { - kernel32.close(); - } - - // Add processor architecture - osVersion += " (" + gWinCPUArch + ")"; - } + // Add processor architecture + osVersion += " (" + gWinCPUArch + ")"; } +#endif try { osVersion += " (" + Services.sysinfo.getProperty("secondaryLibrary") + ")"; - } - catch (e) { + } catch(ex) { // Not all platforms have a secondary widget library, so an error is nothing to worry about. } + osVersion = encodeURIComponent(osVersion); -#endif return osVersion; }); diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build index 7b4458ed9..93cd49ba9 100644 --- a/toolkit/modules/moz.build +++ b/toolkit/modules/moz.build @@ -128,6 +128,7 @@ for var in ('ANDROID_PACKAGE_NAME', 'MOZ_APP_VERSION_DISPLAY', 'MOZ_MACBUNDLE_NAME', 'MOZ_WIDGET_TOOLKIT', + 'MOZ_PKG_SPECIAL', 'DLL_PREFIX', 'DLL_SUFFIX', 'DEBUG_JS_MODULES'):