OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/mac_util.h" | 5 #include "base/mac_util.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 NSString *path_string = [(NSURL *)url.get() path]; | 138 NSString *path_string = [(NSURL *)url.get() path]; |
139 return [path_string fileSystemRepresentation]; | 139 return [path_string fileSystemRepresentation]; |
140 } | 140 } |
141 | 141 |
142 bool FSRefFromPath(const std::string& path, FSRef* ref) { | 142 bool FSRefFromPath(const std::string& path, FSRef* ref) { |
143 OSStatus status = FSPathMakeRef((const UInt8*)path.c_str(), | 143 OSStatus status = FSPathMakeRef((const UInt8*)path.c_str(), |
144 ref, nil); | 144 ref, nil); |
145 return status == noErr; | 145 return status == noErr; |
146 } | 146 } |
147 | 147 |
| 148 static bool g_override_am_i_bundled = false; |
| 149 static bool g_override_am_i_bundled_value = false; |
| 150 |
148 // Adapted from http://developer.apple.com/carbon/tipsandtricks.html#AmIBundled | 151 // Adapted from http://developer.apple.com/carbon/tipsandtricks.html#AmIBundled |
149 bool AmIBundled() { | 152 static bool UncachedAmIBundled() { |
| 153 if (g_override_am_i_bundled) |
| 154 return g_override_am_i_bundled_value; |
| 155 |
150 ProcessSerialNumber psn = {0, kCurrentProcess}; | 156 ProcessSerialNumber psn = {0, kCurrentProcess}; |
151 | 157 |
152 FSRef fsref; | 158 FSRef fsref; |
153 OSStatus pbErr; | 159 OSStatus pbErr; |
154 if ((pbErr = GetProcessBundleLocation(&psn, &fsref)) != noErr) { | 160 if ((pbErr = GetProcessBundleLocation(&psn, &fsref)) != noErr) { |
155 LOG(ERROR) << "GetProcessBundleLocation failed: error " << pbErr; | 161 LOG(ERROR) << "GetProcessBundleLocation failed: error " << pbErr; |
156 return false; | 162 return false; |
157 } | 163 } |
158 | 164 |
159 FSCatalogInfo info; | 165 FSCatalogInfo info; |
160 OSErr fsErr; | 166 OSErr fsErr; |
161 if ((fsErr = FSGetCatalogInfo(&fsref, kFSCatInfoNodeFlags, &info, | 167 if ((fsErr = FSGetCatalogInfo(&fsref, kFSCatInfoNodeFlags, &info, |
162 NULL, NULL, NULL)) != noErr) { | 168 NULL, NULL, NULL)) != noErr) { |
163 LOG(ERROR) << "FSGetCatalogInfo failed: error " << fsErr; | 169 LOG(ERROR) << "FSGetCatalogInfo failed: error " << fsErr; |
164 return false; | 170 return false; |
165 } | 171 } |
166 | 172 |
167 return info.nodeFlags & kFSNodeIsDirectoryMask; | 173 return info.nodeFlags & kFSNodeIsDirectoryMask; |
168 } | 174 } |
169 | 175 |
| 176 bool AmIBundled() { |
| 177 // If the return value is not cached, this function will return different |
| 178 // values depending on when it's called. This confuses some client code, see |
| 179 // http://crbug.com/63183 . |
| 180 static bool result = UncachedAmIBundled(); |
| 181 DCHECK_EQ(result, UncachedAmIBundled()) |
| 182 << "The return value of AmIBundled() changed. This will confuse tests. " |
| 183 << "Call SetAmIBundled() override manually if your test binary " |
| 184 << "delay-loads the framework."; |
| 185 return result; |
| 186 } |
| 187 |
| 188 void SetOverrideAmIBundled(bool value) { |
| 189 g_override_am_i_bundled = true; |
| 190 g_override_am_i_bundled_value = value; |
| 191 } |
| 192 |
170 bool IsBackgroundOnlyProcess() { | 193 bool IsBackgroundOnlyProcess() { |
171 // This function really does want to examine NSBundle's idea of the main | 194 // This function really does want to examine NSBundle's idea of the main |
172 // bundle dictionary, and not the overriden MainAppBundle. It needs to look | 195 // bundle dictionary, and not the overriden MainAppBundle. It needs to look |
173 // at the actual running .app's Info.plist to access its LSUIElement | 196 // at the actual running .app's Info.plist to access its LSUIElement |
174 // property. | 197 // property. |
175 NSDictionary* info_dictionary = [[NSBundle mainBundle] infoDictionary]; | 198 NSDictionary* info_dictionary = [[NSBundle mainBundle] infoDictionary]; |
176 return [[info_dictionary objectForKey:@"LSUIElement"] boolValue] != NO; | 199 return [[info_dictionary objectForKey:@"LSUIElement"] boolValue] != NO; |
177 } | 200 } |
178 | 201 |
179 // No threading worries since NSBundle isn't thread safe. | 202 // No threading worries since NSBundle isn't thread safe. |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 id<NSObject> nsobj = static_cast<id<NSObject> >(obj); | 710 id<NSObject> nsobj = static_cast<id<NSObject> >(obj); |
688 [nsobj retain]; | 711 [nsobj retain]; |
689 } | 712 } |
690 | 713 |
691 void NSObjectRelease(void* obj) { | 714 void NSObjectRelease(void* obj) { |
692 id<NSObject> nsobj = static_cast<id<NSObject> >(obj); | 715 id<NSObject> nsobj = static_cast<id<NSObject> >(obj); |
693 [nsobj release]; | 716 [nsobj release]; |
694 } | 717 } |
695 | 718 |
696 } // namespace mac_util | 719 } // namespace mac_util |
OLD | NEW |