summaryrefslogtreecommitdiff
path: root/widget
diff options
context:
space:
mode:
authorBrian Smith <brian@dbsoft.org>2022-05-25 18:51:46 -0500
committerBrian Smith <brian@dbsoft.org>2022-05-25 18:51:46 -0500
commit5e28396116a3a7817c6dbb6e52a7a2bb30f5a92a (patch)
tree39ebcd7f597497fa086bb76e0d53ced2df4f2d0b /widget
parentc772d0ef215ebba8feaa5813e1aac9863dbaea9c (diff)
downloaduxp-5e28396116a3a7817c6dbb6e52a7a2bb30f5a92a.tar.gz
Issue #1905 - Part 1 - Implement detection of Monterey (12.x), Intel emulation and fix required OS version check.
Diffstat (limited to 'widget')
-rw-r--r--widget/cocoa/nsCocoaFeatures.h3
-rw-r--r--widget/cocoa/nsCocoaFeatures.mm43
2 files changed, 44 insertions, 2 deletions
diff --git a/widget/cocoa/nsCocoaFeatures.h b/widget/cocoa/nsCocoaFeatures.h
index a9cab95d56..c6841a7491 100644
--- a/widget/cocoa/nsCocoaFeatures.h
+++ b/widget/cocoa/nsCocoaFeatures.h
@@ -25,9 +25,12 @@ public:
static bool OnMojaveOrLater();
static bool OnCatalinaOrLater();
static bool OnBigSurOrLater();
+ static bool OnMontereyOrLater();
static bool IsAtLeastVersion(int32_t aMajor, int32_t aMinor, int32_t aBugFix=0);
+ static bool ProcessIsRosettaTranslated();
+
// These are utilities that do not change or depend on the value of mOSXVersion
// and instead just encapsulate the encoding algorithm. Note that GetVersion
// actually adjusts to the lowest supported OS, so it will always return
diff --git a/widget/cocoa/nsCocoaFeatures.mm b/widget/cocoa/nsCocoaFeatures.mm
index e0fafb7d96..2edb958931 100644
--- a/widget/cocoa/nsCocoaFeatures.mm
+++ b/widget/cocoa/nsCocoaFeatures.mm
@@ -26,6 +26,7 @@
#define MACOS_VERSION_10_15_HEX 0x000A0F00
#define MACOS_VERSION_10_16_HEX 0x000A1000
#define MACOS_VERSION_11_0_HEX 0x000B0000
+#define MACOS_VERSION_12_0_HEX 0x000C0000
#include "nsCocoaFeatures.h"
#include "nsCocoaUtils.h"
@@ -33,6 +34,7 @@
#include "nsObjCExceptions.h"
#import <Cocoa/Cocoa.h>
+#include <sys/sysctl.h>
int32_t nsCocoaFeatures::mOSVersion = 0;
@@ -196,14 +198,51 @@ nsCocoaFeatures::OnCatalinaOrLater()
/* static */ bool
nsCocoaFeatures::OnBigSurOrLater()
{
- // Account for the version being 10.16 (which occurs when the
- // application is linked with an older SDK) or 11.0 on Big Sur.
+ // Account for the version being 10.16 or 11.0 on Big Sur.
+ // The version is reported as 10.16 if SYSTEM_VERSION_COMPAT is set to 1,
+ // or if SYSTEM_VERSION_COMPAT is not set and the application is linked
+ // with a pre-Big Sur SDK.
+ // We should set SYSTEM_VERSION_COMPAT to 0 in its Info.plist, so it'll
+ // usually see the correct 11.* version, despite being linked against an
+ // old SDK. However, it still sees the 10.16 compatibility version when
+ // launched from the command line, see bug 1727624. (This only applies to
+ // the Intel build - the arm64 build is linked against a Big Sur SDK and
+ // always sees the correct version.)
return ((macOSVersion() >= MACOS_VERSION_10_16_HEX) ||
(macOSVersion() >= MACOS_VERSION_11_0_HEX));
}
+/* static */ bool nsCocoaFeatures::OnMontereyOrLater()
+{
+ // Monterey pretends to be 10.16 and is indistinguishable from Big Sur.
+ // In practice, this means that an Intel build can return false
+ // from this function if it's launched from the command line, see bug 1727624.
+ // This will not be an issue anymore once we link against the Big Sur SDK.
+ return (macOSVersion() >= MACOS_VERSION_12_0_HEX);
+}
+
/* static */ bool
nsCocoaFeatures::IsAtLeastVersion(int32_t aMajor, int32_t aMinor, int32_t aBugFix)
{
return macOSVersion() >= GetVersion(aMajor, aMinor, aBugFix);
}
+
+/*
+ * Returns true if the process is running under Rosetta translation. Returns
+ * false if running natively or if an error was encountered. We use the
+ * `sysctl.proc_translated` sysctl which is documented by Apple to be used
+ * for this purpose. Note: using this in a sandboxed process requires allowing
+ * the sysctl in the sandbox policy.
+ */
+/* static */ bool nsCocoaFeatures::ProcessIsRosettaTranslated()
+{
+ int ret = 0;
+ size_t size = sizeof(ret);
+ if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) == -1) {
+ if (errno != ENOENT) {
+ fprintf(stderr, "Failed to check for translation environment\n");
+ }
+ return false;
+ }
+ return (ret == 1);
+}