michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #define MAC_OS_X_VERSION_MASK 0x0000FFFF michael@0: #define MAC_OS_X_VERSION_10_6_HEX 0x00001060 michael@0: #define MAC_OS_X_VERSION_10_7_HEX 0x00001070 michael@0: #define MAC_OS_X_VERSION_10_8_HEX 0x00001080 michael@0: #define MAC_OS_X_VERSION_10_9_HEX 0x00001090 michael@0: #define MAC_OS_X_VERSION_10_10_HEX 0x000010A0 michael@0: michael@0: // This API will not work for OS X 10.10, see Gestalt.h. michael@0: michael@0: #include "nsCocoaFeatures.h" michael@0: #include "nsCocoaUtils.h" michael@0: #include "nsDebug.h" michael@0: #include "nsObjCExceptions.h" michael@0: michael@0: #import michael@0: michael@0: int32_t nsCocoaFeatures::mOSXVersion = 0; michael@0: int32_t nsCocoaFeatures::mOSXVersionMajor = 0; michael@0: int32_t nsCocoaFeatures::mOSXVersionMinor = 0; michael@0: int32_t nsCocoaFeatures::mOSXVersionBugFix = 0; michael@0: michael@0: static int intAtStringIndex(NSArray *array, int index) michael@0: { michael@0: return [(NSString *)[array objectAtIndex:index] integerValue]; michael@0: } michael@0: michael@0: static void GetSystemVersion(int &major, int &minor, int &bugfix) michael@0: { michael@0: major = minor = bugfix = 0; michael@0: michael@0: NSString* versionString = [[NSDictionary dictionaryWithContentsOfFile: michael@0: @"/System/Library/CoreServices/SystemVersion.plist"] objectForKey:@"ProductVersion"]; michael@0: NSArray* versions = [versionString componentsSeparatedByString:@"."]; michael@0: NSUInteger count = [versions count]; michael@0: if (count > 0) { michael@0: major = intAtStringIndex(versions, 0); michael@0: if (count > 1) { michael@0: minor = intAtStringIndex(versions, 1); michael@0: if (count > 2) { michael@0: bugfix = intAtStringIndex(versions, 2); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: /*static*/ void michael@0: nsCocoaFeatures::InitializeVersionNumbers() michael@0: { michael@0: NS_OBJC_BEGIN_TRY_ABORT_BLOCK; michael@0: michael@0: // Provide an autorelease pool to avoid leaking Cocoa objects, michael@0: // as this gets called before the main autorelease pool is in place. michael@0: nsAutoreleasePool localPool; michael@0: michael@0: int major, minor, bugfix; michael@0: GetSystemVersion(major, minor, bugfix); michael@0: michael@0: mOSXVersionMajor = major; michael@0: mOSXVersionMinor = minor; michael@0: mOSXVersionBugFix = bugfix; michael@0: michael@0: if (major < 10) { michael@0: NS_ERROR("Couldn't determine OS X version, assuming 10.6"); michael@0: mOSXVersion = MAC_OS_X_VERSION_10_6_HEX; michael@0: mOSXVersionMajor = 10; michael@0: mOSXVersionMinor = 6; michael@0: mOSXVersionBugFix = 0; michael@0: } else if (minor < 6) { michael@0: NS_ERROR("OS X version too old, assuming 10.6"); michael@0: mOSXVersion = MAC_OS_X_VERSION_10_6_HEX; michael@0: mOSXVersionMinor = 6; michael@0: mOSXVersionBugFix = 0; michael@0: } else { michael@0: mOSXVersion = 0x1000 + (minor << 4); michael@0: } michael@0: michael@0: NS_OBJC_END_TRY_ABORT_BLOCK; michael@0: } michael@0: michael@0: /* static */ int32_t michael@0: nsCocoaFeatures::OSXVersion() michael@0: { michael@0: if (!mOSXVersion) { michael@0: InitializeVersionNumbers(); michael@0: } michael@0: return mOSXVersion; michael@0: } michael@0: michael@0: /* static */ int32_t michael@0: nsCocoaFeatures::OSXVersionMajor() michael@0: { michael@0: if (!mOSXVersion) { michael@0: InitializeVersionNumbers(); michael@0: } michael@0: return mOSXVersionMajor; michael@0: } michael@0: michael@0: /* static */ int32_t michael@0: nsCocoaFeatures::OSXVersionMinor() michael@0: { michael@0: if (!mOSXVersion) { michael@0: InitializeVersionNumbers(); michael@0: } michael@0: return mOSXVersionMinor; michael@0: } michael@0: michael@0: /* static */ int32_t michael@0: nsCocoaFeatures::OSXVersionBugFix() michael@0: { michael@0: if (!mOSXVersion) { michael@0: InitializeVersionNumbers(); michael@0: } michael@0: return mOSXVersionBugFix; michael@0: } michael@0: michael@0: /* static */ bool michael@0: nsCocoaFeatures::SupportCoreAnimationPlugins() michael@0: { michael@0: // Disallow Core Animation on 10.5 because of crashes. michael@0: // See Bug 711564. michael@0: return (OSXVersion() >= MAC_OS_X_VERSION_10_6_HEX); michael@0: } michael@0: michael@0: /* static */ bool michael@0: nsCocoaFeatures::OnLionOrLater() michael@0: { michael@0: return (OSXVersion() >= MAC_OS_X_VERSION_10_7_HEX); michael@0: } michael@0: michael@0: /* static */ bool michael@0: nsCocoaFeatures::OnMountainLionOrLater() michael@0: { michael@0: return (OSXVersion() >= MAC_OS_X_VERSION_10_8_HEX); michael@0: } michael@0: michael@0: /* static */ bool michael@0: nsCocoaFeatures::OnMavericksOrLater() michael@0: { michael@0: return (OSXVersion() >= MAC_OS_X_VERSION_10_9_HEX); michael@0: } michael@0: michael@0: /* static */ bool michael@0: nsCocoaFeatures::OnYosemiteOrLater() michael@0: { michael@0: return (OSXVersion() >= MAC_OS_X_VERSION_10_10_HEX); michael@0: }