diff --git a/browser/components/preferences/config/appearance.mjs b/browser/components/preferences/config/appearance.mjs index a96da15e1961..0f0baf34871d 100644 --- a/browser/components/preferences/config/appearance.mjs +++ b/browser/components/preferences/config/appearance.mjs @@ -11,8 +11,6 @@ const { AppConstants } = ChromeUtils.importESModule( const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", ICON_CATALOG: "moz-src:///browser/components/shell/CustomIconManager.sys.mjs", resolvePreview: "moz-src:///browser/components/shell/CustomIconManager.sys.mjs", @@ -39,10 +37,7 @@ function isAutoTouchModeAvailable() { if (AppConstants.MOZ_WIDGET_GTK) { return true; } - return ( - isWindows && - lazy.WindowsVersionInfo.get({ throwOnError: false }).buildNumber < 22000 - ); + return isWindows && !Services.sysinfo.isWindows10BuildOrLater(22000); } // The custom browser-icon picker is gated behind a feature pref, is diff --git a/browser/components/preferences/tests/browser_appearance_pane.js b/browser/components/preferences/tests/browser_appearance_pane.js index 962e79d1f2b0..a1dde9a1460b 100644 --- a/browser/components/preferences/tests/browser_appearance_pane.js +++ b/browser/components/preferences/tests/browser_appearance_pane.js @@ -129,10 +129,7 @@ function autoTouchModeAvailable() { if (AppConstants.platform != "win") { return false; } - const { WindowsVersionInfo } = ChromeUtils.importESModule( - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs" - ); - return WindowsVersionInfo.get({ throwOnError: false }).buildNumber < 22000; + return !Services.sysinfo.isWindows10BuildOrLater(22000); } async function withWindowDensityPane(callback) { diff --git a/browser/components/resistfingerprinting/test/browser/browser_navigator.js b/browser/components/resistfingerprinting/test/browser/browser_navigator.js index f19279a1e92f..b8f75e1ac151 100644 --- a/browser/components/resistfingerprinting/test/browser/browser_navigator.js +++ b/browser/components/resistfingerprinting/test/browser/browser_navigator.js @@ -7,11 +7,6 @@ const CC = Components.Constructor; -ChromeUtils.defineESModuleGetters(this, { - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", -}); - let expectedResults; const osVersion = Services.sysinfo.get("version"); @@ -50,7 +45,7 @@ const WindowsOscpuPromise = (async () => { let WindowsOscpu = null; if (AppConstants.platform == "win") { let cpuArch = Services.sysinfo.get("arch"); - let isWin11 = WindowsVersionInfo.get().buildNumber >= 22000; + let isWin11 = Services.sysinfo.isWindows10BuildOrLater(22000); let isWow64 = (await Services.sysinfo.processInfo).isWow64; WindowsOscpu = cpuArch == "x86-64" || isWow64 || (cpuArch == "aarch64" && isWin11) diff --git a/browser/components/resistfingerprinting/test/browser/browser_navigator_iframes.js b/browser/components/resistfingerprinting/test/browser/browser_navigator_iframes.js index 76f94682c9d4..2840b2bddfda 100644 --- a/browser/components/resistfingerprinting/test/browser/browser_navigator_iframes.js +++ b/browser/components/resistfingerprinting/test/browser/browser_navigator_iframes.js @@ -25,8 +25,6 @@ ChromeUtils.defineESModuleGetters(this, { AppConstants: "resource://gre/modules/AppConstants.sys.mjs", - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", }); const osVersion = Services.sysinfo.get("version"); @@ -62,7 +60,7 @@ const WindowsOscpuPromise = (async () => { let WindowsOscpu = null; if (AppConstants.platform == "win") { let cpuArch = Services.sysinfo.get("arch"); - let isWin11 = WindowsVersionInfo.get().buildNumber >= 22000; + let isWin11 = Services.sysinfo.isWindows10BuildOrLater(22000); let isWow64 = (await Services.sysinfo.processInfo).isWow64; WindowsOscpu = cpuArch == "x86-64" || isWow64 || (cpuArch == "aarch64" && isWin11) diff --git a/browser/components/shell/ShellService.sys.mjs b/browser/components/shell/ShellService.sys.mjs index b372b9adc728..8f025e2fefd9 100644 --- a/browser/components/shell/ShellService.sys.mjs +++ b/browser/components/shell/ShellService.sys.mjs @@ -14,8 +14,6 @@ ChromeUtils.defineESModuleGetters(lazy, { Subprocess: "resource://gre/modules/Subprocess.sys.mjs", WindowsSetDefaultRedirect: "moz-src:///browser/components/shell/WindowsSetDefaultRedirect.sys.mjs", - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", }); XPCOMUtils.defineLazyServiceGetter( @@ -429,10 +427,13 @@ let ShellServiceInternal = { Glean.browser.setDefaultError[setAsDefaultError ? "true" : "false"].add(); }, + /** + * Returns whether the current operating system is Windows 11. + * + * This is used so it can be mocked out in tests. + */ _isWindows11() { - return ( - lazy.WindowsVersionInfo.get({ throwOnError: false }).buildNumber >= 22000 - ); + return Services.sysinfo.isWindows10BuildOrLater(22000); }, /** diff --git a/layout/style/test/chrome/test_chrome_only_media_queries.html b/layout/style/test/chrome/test_chrome_only_media_queries.html index 8a6c4a6d9e48..3904137ce8ee 100644 --- a/layout/style/test/chrome/test_chrome_only_media_queries.html +++ b/layout/style/test/chrome/test_chrome_only_media_queries.html @@ -8,11 +8,6 @@ const SHEET = document.querySelector('style'); let lazy = {}; -ChromeUtils.defineESModuleGetters(lazy, { - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", -}); - SimpleTest.waitForExplicitFinish(); @@ -101,7 +96,7 @@ expectUnkown("(-moz-platform: )"); await testMozPref('-moz-pref("foo.bar.int", 1)', "foo.bar.int", 1, 2); await testMozPref('-moz-pref("foo.bar.int")', "foo.bar.int", 1, 0); - let supportsMica = matchMedia('(-moz-platform: windows)').matches && lazy.WindowsVersionInfo.get().buildNumber >= 22621; + let supportsMica = matchMedia('(-moz-platform: windows)').matches && Services.sysinfo.isWindows10BuildOrLater(22621); info(`Mica supported: ${supportsMica}`); for (let [query, pref] of [['(-moz-windows-mica)', 'widget.windows.mica'], ['(-moz-windows-mica-popups)', 'widget.windows.mica.popups']]) { let prefIsBool = pref == 'widget.windows.mica'; diff --git a/toolkit/modules/OsEnvironment.sys.mjs b/toolkit/modules/OsEnvironment.sys.mjs index 80e2199a46f7..170840df0d79 100644 --- a/toolkit/modules/OsEnvironment.sys.mjs +++ b/toolkit/modules/OsEnvironment.sys.mjs @@ -8,8 +8,6 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { WindowsRegistry: "resource://gre/modules/WindowsRegistry.sys.mjs", - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", }); export let OsEnvironment = { @@ -24,17 +22,8 @@ export let OsEnvironment = { "AicEnabled" ), windowsVersionHasAppSourcesFeature: () => { - let windowsVersion = parseFloat(Services.sysinfo.getProperty("version")); - if (isNaN(windowsVersion)) { - throw new Error("Unable to parse Windows version"); - } - if (windowsVersion < 10) { - return false; - } - // The App Sources feature was added in Windows 10, build 15063. - const { buildNumber } = lazy.WindowsVersionInfo.get(); - return buildNumber >= 15063; + return Services.sysinfo.isWindows10BuildOrLater(15063); }, }, diff --git a/widget/tests/browser/browser_test_scrollbar_colors.js b/widget/tests/browser/browser_test_scrollbar_colors.js index be748b696709..ee09e8094746 100644 --- a/widget/tests/browser/browser_test_scrollbar_colors.js +++ b/widget/tests/browser/browser_test_scrollbar_colors.js @@ -12,11 +12,6 @@ add_task(async () => { ); await SpecialPowers.spawn(tab.linkedBrowser, [], () => { - ChromeUtils.defineESModuleGetters(this, { - WindowsVersionInfo: - "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs", - }); - Services.scriptloader.loadSubScript( "chrome://mochikit/content/tests/SimpleTest/WindowSnapshot.js", this @@ -94,7 +89,7 @@ add_task(async () => { let stats = countPixels(canvas); let references; if (content.navigator.platform.startsWith("Win")) { - if (WindowsVersionInfo.get().buildNumber >= 22000) { + if (Services.sysinfo.isWindows10BuildOrLater(22000)) { // Windows 11 references = WIN11_REFERENCES; } else { diff --git a/xpcom/base/nsSystemInfo.cpp b/xpcom/base/nsSystemInfo.cpp index 8a9b5b4dbb27..3c8fdca28d20 100644 --- a/xpcom/base/nsSystemInfo.cpp +++ b/xpcom/base/nsSystemInfo.cpp @@ -2354,3 +2354,14 @@ nsSystemInfo::GetProcessInfo(JSContext* aCx, Promise** aResult) { return NS_OK; } + +NS_IMETHODIMP +nsSystemInfo::IsWindows10BuildOrLater(uint32_t aBuildNumber, bool* aResult) { +#ifdef XP_WIN + NS_ENSURE_ARG_POINTER(aResult); + *aResult = mozilla::IsWindows10BuildOrLater(aBuildNumber); + return NS_OK; +#else + return NS_ERROR_NOT_AVAILABLE; +#endif +} diff --git a/xpcom/system/nsISystemInfo.idl b/xpcom/system/nsISystemInfo.idl index 0cadb7e4983e..7531b5915cc3 100644 --- a/xpcom/system/nsISystemInfo.idl +++ b/xpcom/system/nsISystemInfo.idl @@ -37,4 +37,13 @@ interface nsISystemInfo : nsISupports */ [implicit_jscontext] readonly attribute Promise processInfo; + + /** + * Checks whether the Windows build number is at least the requested value. + * + * @param aBuildNumber - The desired build number. + * @returns Whether the current system has at least this build number. + * @throws NS_ERROR_NOT_AVAILABLE on non-Windows systems. + */ + boolean isWindows10BuildOrLater(in uint32_t aBuildNumber); };