Index: base/mac/mac_util.h |
diff --git a/base/mac/mac_util.h b/base/mac/mac_util.h |
index 84948f7ce89fc8b35d87be7d052fa50254afc879..746c3da7a19a0bde1ce37d82363656b609e28617 100644 |
--- a/base/mac/mac_util.h |
+++ b/base/mac/mac_util.h |
@@ -5,7 +5,6 @@ |
#ifndef BASE_MAC_MAC_UTIL_H_ |
#define BASE_MAC_MAC_UTIL_H_ |
-#include <AvailabilityMacros.h> |
#include <Carbon/Carbon.h> |
#include <stdint.h> |
#include <string> |
@@ -108,85 +107,77 @@ BASE_EXPORT bool WasLaunchedAsHiddenLoginItem(); |
// an error, or true otherwise. |
BASE_EXPORT bool RemoveQuarantineAttribute(const FilePath& file_path); |
-// Run-time OS version checks. Use these instead of |
-// base::SysInfo::OperatingSystemVersionNumbers. Prefer the "OrEarlier" and |
-// "OrLater" variants to those that check for a specific version, unless you |
-// know for sure that you need to check for a specific version. |
- |
-// Mavericks is OS X 10.9, Darwin 13. |
-BASE_EXPORT bool IsOSMavericks(); |
- |
-// Yosemite is OS X 10.10, Darwin 14. |
-BASE_EXPORT bool IsOSYosemite(); |
-BASE_EXPORT bool IsOSYosemiteOrEarlier(); |
-BASE_EXPORT bool IsOSYosemiteOrLater(); |
- |
-// El Capitan is OS X 10.11, Darwin 15. |
-BASE_EXPORT bool IsOSElCapitan(); |
-BASE_EXPORT bool IsOSElCapitanOrEarlier(); |
-BASE_EXPORT bool IsOSElCapitanOrLater(); |
+namespace internal { |
-// Sierra is macOS 10.12, Darwin 16. |
-BASE_EXPORT bool IsOSSierra(); |
-BASE_EXPORT bool IsOSSierraOrLater(); |
+// Returns the system's Mac OS X minor version. This is the |y| value |
+// in 10.y or 10.y.z. |
+BASE_EXPORT int MacOSXMinorVersion(); |
-// This should be infrequently used. It only makes sense to use this to avoid |
-// codepaths that are very likely to break on future (unreleased, untested, |
-// unborn) OS releases, or to log when the OS is newer than any known version. |
-BASE_EXPORT bool IsOSLaterThanSierra_DontCallThis(); |
- |
-// Inline functions that are redundant due to version ranges being mutually- |
-// exclusive. |
-inline bool IsOSYosemiteOrEarlier() { return !IsOSElCapitanOrLater(); } |
-inline bool IsOSElCapitanOrEarlier() { return !IsOSSierraOrLater(); } |
- |
-// When the deployment target is set, the code produced cannot run on earlier |
-// OS releases. That enables some of the IsOS* family to be implemented as |
-// constant-value inline functions. The MAC_OS_X_VERSION_MIN_REQUIRED macro |
-// contains the value of the deployment target. |
- |
-#if defined(MAC_OS_X_VERSION_10_9) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_9 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GT_10_9 |
-inline bool IsOSMavericks() { return false; } |
-#endif |
+} // namespace internal |
-#if defined(MAC_OS_X_VERSION_10_10) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GE_10_10 |
-inline bool IsOSYosemiteOrLater() { return true; } |
-#endif |
+// Run-time OS version checks. Use these instead of |
+// base::SysInfo::OperatingSystemVersionNumbers. Prefer the "AtLeast" and |
+// "AtMost" variants to those that check for a specific version, unless you |
+// know for sure that you need to check for a specific version. |
-#if defined(MAC_OS_X_VERSION_10_10) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_10 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GT_10_10 |
-inline bool IsOSYosemite() { return false; } |
+#define _DEFINE_IS_OS_FUNCS(V, ID) \ |
+ inline bool IsOS10_##V() { \ |
+ return MAC_OS_X_VERSION_MIN_REQUIRED <= ID && \ |
+ internal::MacOSXMinorVersion() == V; \ |
+ } \ |
+ inline bool IsAtLeastOS10_##V() { \ |
+ return MAC_OS_X_VERSION_MIN_REQUIRED >= ID || \ |
+ internal::MacOSXMinorVersion() >= V; \ |
+ } \ |
+ inline bool IsAtMostOS10_##V() { \ |
+ return MAC_OS_X_VERSION_MIN_REQUIRED <= ID && \ |
+ internal::MacOSXMinorVersion() <= V; \ |
+ } |
+ |
+// Apple adopted this format in 10.10: 10.11.0 becomes 101100 |
+#define OS_X_VERSION_ID(V) 10##V##00 |
+#define DEFINE_IS_OS_FUNCS(V) _DEFINE_IS_OS_FUNCS(V, OS_X_VERSION_ID(V)) |
+ |
+// Sanity check that our computed IDs match the SDK |
+#define STR(S) _STR(S) |
+#define _STR(S) #S |
+#define ASSERT_OS_ID_CONSTANT(V) \ |
+ static_assert(OS_X_VERSION_ID(V) == MAC_OS_X_VERSION_10_##V, \ |
+ "ID for macOS 10." #V \ |
+ " (" STR(OS_X_VERSION_ID(V)) ") doesn't match the SDK (" STR( \ |
+ MAC_OS_X_VERSION_10_##V) ")."); |
+ |
+// 10.9 uses an old format. |
+// TODO(sdy): Ditch, most callers are better served by !IsAtLeastOS10_10(). |
+_DEFINE_IS_OS_FUNCS(9, MAC_OS_X_VERSION_10_9) |
+ |
+DEFINE_IS_OS_FUNCS(10) |
+ASSERT_OS_ID_CONSTANT(10) |
+ |
+DEFINE_IS_OS_FUNCS(11) |
+#ifdef MAC_OS_X_VERSION_10_11 |
+ASSERT_OS_ID_CONSTANT(11) |
#endif |
-#if defined(MAC_OS_X_VERSION_10_11) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GE_10_11 |
-inline bool IsOSElCapitanOrLater() { return true; } |
+DEFINE_IS_OS_FUNCS(12) |
+#ifdef MAC_OS_X_VERSION_10_12 |
+ASSERT_OS_ID_CONSTANT(12) |
#endif |
-#if defined(MAC_OS_X_VERSION_10_11) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_11 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GT_10_11 |
-inline bool IsOSElCapitan() { return false; } |
-#endif |
+#undef ASSERT_OS_ID_CONSTANT |
+#undef _STR |
+#undef STR |
-#if defined(MAC_OS_X_VERSION_10_12) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GE_10_12 |
-inline bool IsOSSierraOrLater() { return true; } |
-#endif |
+#undef DEFINE_IS_OS_FUNCS |
+#undef MAC_OS_X_VERISON_ID |
+#undef _DEFINE_IS_OS_FUNCS |
-#if defined(MAC_OS_X_VERSION_10_12) && \ |
- MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_12 |
-#define BASE_MAC_MAC_UTIL_H_INLINED_GT_10_12 |
-inline bool IsOSSierra() { return false; } |
-inline bool IsOSLaterThanSierra_DontCallThis() { return true; } |
-#endif |
+// This should be infrequently used. It only makes sense to use this to avoid |
+// codepaths that are very likely to break on future (unreleased, untested, |
+// unborn) OS releases, or to log when the OS is newer than any known version. |
+inline bool IsOSLaterThan10_12_DontCallThis() { |
+ return !IsAtMostOS10_12(); |
+} |
// Retrieve the system's model identifier string from the IOKit registry: |
// for example, "MacPro4,1", "MacBookPro6,1". Returns empty string upon |