widget/cocoa/nsCocoaFeatures.mm

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/widget/cocoa/nsCocoaFeatures.mm	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,151 @@
     1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     1.5 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#define MAC_OS_X_VERSION_MASK      0x0000FFFF
    1.10 +#define MAC_OS_X_VERSION_10_6_HEX  0x00001060
    1.11 +#define MAC_OS_X_VERSION_10_7_HEX  0x00001070
    1.12 +#define MAC_OS_X_VERSION_10_8_HEX  0x00001080
    1.13 +#define MAC_OS_X_VERSION_10_9_HEX  0x00001090
    1.14 +#define MAC_OS_X_VERSION_10_10_HEX 0x000010A0
    1.15 +
    1.16 +// This API will not work for OS X 10.10, see Gestalt.h.
    1.17 +
    1.18 +#include "nsCocoaFeatures.h"
    1.19 +#include "nsCocoaUtils.h"
    1.20 +#include "nsDebug.h"
    1.21 +#include "nsObjCExceptions.h"
    1.22 +
    1.23 +#import <Cocoa/Cocoa.h>
    1.24 +
    1.25 +int32_t nsCocoaFeatures::mOSXVersion = 0;
    1.26 +int32_t nsCocoaFeatures::mOSXVersionMajor = 0;
    1.27 +int32_t nsCocoaFeatures::mOSXVersionMinor = 0;
    1.28 +int32_t nsCocoaFeatures::mOSXVersionBugFix = 0;
    1.29 +
    1.30 +static int intAtStringIndex(NSArray *array, int index)
    1.31 +{
    1.32 +    return [(NSString *)[array objectAtIndex:index] integerValue];
    1.33 +}
    1.34 +
    1.35 +static void GetSystemVersion(int &major, int &minor, int &bugfix)
    1.36 +{
    1.37 +    major = minor = bugfix = 0;
    1.38 +    
    1.39 +    NSString* versionString = [[NSDictionary dictionaryWithContentsOfFile:
    1.40 +                                @"/System/Library/CoreServices/SystemVersion.plist"] objectForKey:@"ProductVersion"];
    1.41 +    NSArray* versions = [versionString componentsSeparatedByString:@"."];
    1.42 +    NSUInteger count = [versions count];
    1.43 +    if (count > 0) {
    1.44 +        major = intAtStringIndex(versions, 0);
    1.45 +        if (count > 1) {
    1.46 +            minor = intAtStringIndex(versions, 1);
    1.47 +            if (count > 2) {
    1.48 +                bugfix = intAtStringIndex(versions, 2);
    1.49 +            }
    1.50 +        }
    1.51 +    }
    1.52 +}
    1.53 +
    1.54 +/*static*/ void
    1.55 +nsCocoaFeatures::InitializeVersionNumbers()
    1.56 +{
    1.57 +    NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
    1.58 +
    1.59 +    // Provide an autorelease pool to avoid leaking Cocoa objects,
    1.60 +    // as this gets called before the main autorelease pool is in place.
    1.61 +    nsAutoreleasePool localPool;
    1.62 +
    1.63 +    int major, minor, bugfix;
    1.64 +    GetSystemVersion(major, minor, bugfix);
    1.65 +
    1.66 +    mOSXVersionMajor = major;
    1.67 +    mOSXVersionMinor = minor;
    1.68 +    mOSXVersionBugFix = bugfix;
    1.69 +
    1.70 +    if (major < 10) {
    1.71 +        NS_ERROR("Couldn't determine OS X version, assuming 10.6");
    1.72 +        mOSXVersion = MAC_OS_X_VERSION_10_6_HEX;
    1.73 +        mOSXVersionMajor = 10;
    1.74 +        mOSXVersionMinor = 6;
    1.75 +        mOSXVersionBugFix = 0;
    1.76 +    } else if (minor < 6) {
    1.77 +        NS_ERROR("OS X version too old, assuming 10.6");
    1.78 +        mOSXVersion = MAC_OS_X_VERSION_10_6_HEX;
    1.79 +        mOSXVersionMinor = 6;
    1.80 +        mOSXVersionBugFix = 0;
    1.81 +    } else {
    1.82 +        mOSXVersion = 0x1000 + (minor << 4);
    1.83 +    }
    1.84 +
    1.85 +    NS_OBJC_END_TRY_ABORT_BLOCK;
    1.86 +}
    1.87 +
    1.88 +/* static */ int32_t
    1.89 +nsCocoaFeatures::OSXVersion()
    1.90 +{
    1.91 +    if (!mOSXVersion) {
    1.92 +        InitializeVersionNumbers();
    1.93 +    }
    1.94 +    return mOSXVersion;
    1.95 +}
    1.96 +
    1.97 +/* static */ int32_t
    1.98 +nsCocoaFeatures::OSXVersionMajor()
    1.99 +{
   1.100 +    if (!mOSXVersion) {
   1.101 +        InitializeVersionNumbers();
   1.102 +    }
   1.103 +    return mOSXVersionMajor;
   1.104 +}
   1.105 +
   1.106 +/* static */ int32_t
   1.107 +nsCocoaFeatures::OSXVersionMinor()
   1.108 +{
   1.109 +    if (!mOSXVersion) {
   1.110 +        InitializeVersionNumbers();
   1.111 +    }
   1.112 +    return mOSXVersionMinor;
   1.113 +}
   1.114 +
   1.115 +/* static */ int32_t
   1.116 +nsCocoaFeatures::OSXVersionBugFix()
   1.117 +{
   1.118 +    if (!mOSXVersion) {
   1.119 +        InitializeVersionNumbers();
   1.120 +    }
   1.121 +    return mOSXVersionBugFix;
   1.122 +}
   1.123 +
   1.124 +/* static */ bool
   1.125 +nsCocoaFeatures::SupportCoreAnimationPlugins()
   1.126 +{
   1.127 +    // Disallow Core Animation on 10.5 because of crashes.
   1.128 +    // See Bug 711564.
   1.129 +    return (OSXVersion() >= MAC_OS_X_VERSION_10_6_HEX);
   1.130 +}
   1.131 +
   1.132 +/* static */ bool
   1.133 +nsCocoaFeatures::OnLionOrLater()
   1.134 +{
   1.135 +    return (OSXVersion() >= MAC_OS_X_VERSION_10_7_HEX);
   1.136 +}
   1.137 +
   1.138 +/* static */ bool
   1.139 +nsCocoaFeatures::OnMountainLionOrLater()
   1.140 +{
   1.141 +    return (OSXVersion() >= MAC_OS_X_VERSION_10_8_HEX);
   1.142 +}
   1.143 +
   1.144 +/* static */ bool
   1.145 +nsCocoaFeatures::OnMavericksOrLater()
   1.146 +{
   1.147 +    return (OSXVersion() >= MAC_OS_X_VERSION_10_9_HEX);
   1.148 +}
   1.149 +
   1.150 +/* static */ bool
   1.151 +nsCocoaFeatures::OnYosemiteOrLater()
   1.152 +{
   1.153 +    return (OSXVersion() >= MAC_OS_X_VERSION_10_10_HEX);
   1.154 +}

mercurial