widget/cocoa/nsCocoaFeatures.mm

branch
TOR_BUG_9701
changeset 10
ac0c01689b40
equal deleted inserted replaced
-1:000000000000 0:36f54193eaa7
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #define MAC_OS_X_VERSION_MASK 0x0000FFFF
7 #define MAC_OS_X_VERSION_10_6_HEX 0x00001060
8 #define MAC_OS_X_VERSION_10_7_HEX 0x00001070
9 #define MAC_OS_X_VERSION_10_8_HEX 0x00001080
10 #define MAC_OS_X_VERSION_10_9_HEX 0x00001090
11 #define MAC_OS_X_VERSION_10_10_HEX 0x000010A0
12
13 // This API will not work for OS X 10.10, see Gestalt.h.
14
15 #include "nsCocoaFeatures.h"
16 #include "nsCocoaUtils.h"
17 #include "nsDebug.h"
18 #include "nsObjCExceptions.h"
19
20 #import <Cocoa/Cocoa.h>
21
22 int32_t nsCocoaFeatures::mOSXVersion = 0;
23 int32_t nsCocoaFeatures::mOSXVersionMajor = 0;
24 int32_t nsCocoaFeatures::mOSXVersionMinor = 0;
25 int32_t nsCocoaFeatures::mOSXVersionBugFix = 0;
26
27 static int intAtStringIndex(NSArray *array, int index)
28 {
29 return [(NSString *)[array objectAtIndex:index] integerValue];
30 }
31
32 static void GetSystemVersion(int &major, int &minor, int &bugfix)
33 {
34 major = minor = bugfix = 0;
35
36 NSString* versionString = [[NSDictionary dictionaryWithContentsOfFile:
37 @"/System/Library/CoreServices/SystemVersion.plist"] objectForKey:@"ProductVersion"];
38 NSArray* versions = [versionString componentsSeparatedByString:@"."];
39 NSUInteger count = [versions count];
40 if (count > 0) {
41 major = intAtStringIndex(versions, 0);
42 if (count > 1) {
43 minor = intAtStringIndex(versions, 1);
44 if (count > 2) {
45 bugfix = intAtStringIndex(versions, 2);
46 }
47 }
48 }
49 }
50
51 /*static*/ void
52 nsCocoaFeatures::InitializeVersionNumbers()
53 {
54 NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
55
56 // Provide an autorelease pool to avoid leaking Cocoa objects,
57 // as this gets called before the main autorelease pool is in place.
58 nsAutoreleasePool localPool;
59
60 int major, minor, bugfix;
61 GetSystemVersion(major, minor, bugfix);
62
63 mOSXVersionMajor = major;
64 mOSXVersionMinor = minor;
65 mOSXVersionBugFix = bugfix;
66
67 if (major < 10) {
68 NS_ERROR("Couldn't determine OS X version, assuming 10.6");
69 mOSXVersion = MAC_OS_X_VERSION_10_6_HEX;
70 mOSXVersionMajor = 10;
71 mOSXVersionMinor = 6;
72 mOSXVersionBugFix = 0;
73 } else if (minor < 6) {
74 NS_ERROR("OS X version too old, assuming 10.6");
75 mOSXVersion = MAC_OS_X_VERSION_10_6_HEX;
76 mOSXVersionMinor = 6;
77 mOSXVersionBugFix = 0;
78 } else {
79 mOSXVersion = 0x1000 + (minor << 4);
80 }
81
82 NS_OBJC_END_TRY_ABORT_BLOCK;
83 }
84
85 /* static */ int32_t
86 nsCocoaFeatures::OSXVersion()
87 {
88 if (!mOSXVersion) {
89 InitializeVersionNumbers();
90 }
91 return mOSXVersion;
92 }
93
94 /* static */ int32_t
95 nsCocoaFeatures::OSXVersionMajor()
96 {
97 if (!mOSXVersion) {
98 InitializeVersionNumbers();
99 }
100 return mOSXVersionMajor;
101 }
102
103 /* static */ int32_t
104 nsCocoaFeatures::OSXVersionMinor()
105 {
106 if (!mOSXVersion) {
107 InitializeVersionNumbers();
108 }
109 return mOSXVersionMinor;
110 }
111
112 /* static */ int32_t
113 nsCocoaFeatures::OSXVersionBugFix()
114 {
115 if (!mOSXVersion) {
116 InitializeVersionNumbers();
117 }
118 return mOSXVersionBugFix;
119 }
120
121 /* static */ bool
122 nsCocoaFeatures::SupportCoreAnimationPlugins()
123 {
124 // Disallow Core Animation on 10.5 because of crashes.
125 // See Bug 711564.
126 return (OSXVersion() >= MAC_OS_X_VERSION_10_6_HEX);
127 }
128
129 /* static */ bool
130 nsCocoaFeatures::OnLionOrLater()
131 {
132 return (OSXVersion() >= MAC_OS_X_VERSION_10_7_HEX);
133 }
134
135 /* static */ bool
136 nsCocoaFeatures::OnMountainLionOrLater()
137 {
138 return (OSXVersion() >= MAC_OS_X_VERSION_10_8_HEX);
139 }
140
141 /* static */ bool
142 nsCocoaFeatures::OnMavericksOrLater()
143 {
144 return (OSXVersion() >= MAC_OS_X_VERSION_10_9_HEX);
145 }
146
147 /* static */ bool
148 nsCocoaFeatures::OnYosemiteOrLater()
149 {
150 return (OSXVersion() >= MAC_OS_X_VERSION_10_10_HEX);
151 }

mercurial