| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/common/chrome_paths_internal.h" | 5 #include "chrome/common/chrome_paths_internal.h" |
| 6 | 6 |
| 7 #import <Foundation/Foundation.h> | 7 #import <Foundation/Foundation.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 #include "base/base_paths.h" | 12 #include "base/base_paths.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #import "base/mac/foundation_util.h" | 14 #import "base/mac/foundation_util.h" |
| 15 #import "base/mac/mac_util.h" | |
| 16 #import "base/mac/scoped_nsautorelease_pool.h" | 15 #import "base/mac/scoped_nsautorelease_pool.h" |
| 17 #include "base/path_service.h" | 16 #include "base/path_service.h" |
| 18 #include "chrome/common/chrome_constants.h" | 17 #include "chrome/common/chrome_constants.h" |
| 19 | 18 |
| 19 #if !defined(OS_IOS) |
| 20 #import "base/mac/mac_util.h" |
| 21 #endif |
| 22 |
| 20 namespace { | 23 namespace { |
| 21 | 24 |
| 25 #if !defined(OS_IOS) |
| 22 const FilePath* g_override_versioned_directory = NULL; | 26 const FilePath* g_override_versioned_directory = NULL; |
| 23 | 27 |
| 24 // Return a retained (NOT autoreleased) NSBundle* as the internal | 28 // Return a retained (NOT autoreleased) NSBundle* as the internal |
| 25 // implementation of chrome::OuterAppBundle(), which should be the only | 29 // implementation of chrome::OuterAppBundle(), which should be the only |
| 26 // caller. | 30 // caller. |
| 27 NSBundle* OuterAppBundleInternal() { | 31 NSBundle* OuterAppBundleInternal() { |
| 28 base::mac::ScopedNSAutoreleasePool pool; | 32 base::mac::ScopedNSAutoreleasePool pool; |
| 29 | 33 |
| 30 if (!base::mac::AmIBundled()) { | 34 if (!base::mac::AmIBundled()) { |
| 31 // If unbundled (as in a test), there's no app bundle. | 35 // If unbundled (as in a test), there's no app bundle. |
| 32 return nil; | 36 return nil; |
| 33 } | 37 } |
| 34 | 38 |
| 35 if (!base::mac::IsBackgroundOnlyProcess()) { | 39 if (!base::mac::IsBackgroundOnlyProcess()) { |
| 36 // Shortcut: in the browser process, just return the main app bundle. | 40 // Shortcut: in the browser process, just return the main app bundle. |
| 37 return [[NSBundle mainBundle] retain]; | 41 return [[NSBundle mainBundle] retain]; |
| 38 } | 42 } |
| 39 | 43 |
| 40 // From C.app/Contents/Versions/1.2.3.4, go up three steps to get to C.app. | 44 // From C.app/Contents/Versions/1.2.3.4, go up three steps to get to C.app. |
| 41 FilePath versioned_dir = chrome::GetVersionedDirectory(); | 45 FilePath versioned_dir = chrome::GetVersionedDirectory(); |
| 42 FilePath outer_app_dir = versioned_dir.DirName().DirName().DirName(); | 46 FilePath outer_app_dir = versioned_dir.DirName().DirName().DirName(); |
| 43 const char* outer_app_dir_c = outer_app_dir.value().c_str(); | 47 const char* outer_app_dir_c = outer_app_dir.value().c_str(); |
| 44 NSString* outer_app_dir_ns = [NSString stringWithUTF8String:outer_app_dir_c]; | 48 NSString* outer_app_dir_ns = [NSString stringWithUTF8String:outer_app_dir_c]; |
| 45 | 49 |
| 46 return [[NSBundle bundleWithPath:outer_app_dir_ns] retain]; | 50 return [[NSBundle bundleWithPath:outer_app_dir_ns] retain]; |
| 47 } | 51 } |
| 52 #endif // !defined(OS_IOS) |
| 48 | 53 |
| 49 const char* ProductDirNameInternal() { | 54 const char* ProductDirNameInternal() { |
| 55 const char* product_dir_name = NULL; |
| 56 #if !defined(OS_IOS) |
| 50 base::mac::ScopedNSAutoreleasePool pool; | 57 base::mac::ScopedNSAutoreleasePool pool; |
| 51 | 58 |
| 52 // Use OuterAppBundle() to get the main app's bundle. This key needs to live | 59 // Use OuterAppBundle() to get the main app's bundle. This key needs to live |
| 53 // in the main app's bundle because it will be set differently on the canary | 60 // in the main app's bundle because it will be set differently on the canary |
| 54 // channel, and the autoupdate system dictates that there can be no | 61 // channel, and the autoupdate system dictates that there can be no |
| 55 // differences between channels within the versioned directory. This would | 62 // differences between channels within the versioned directory. This would |
| 56 // normally use base::mac::FrameworkBundle(), but that references the | 63 // normally use base::mac::FrameworkBundle(), but that references the |
| 57 // framework bundle within the versioned directory. Ordinarily, the profile | 64 // framework bundle within the versioned directory. Ordinarily, the profile |
| 58 // should not be accessed from non-browser processes, but those processes do | 65 // should not be accessed from non-browser processes, but those processes do |
| 59 // attempt to get the profile directory, so direct them to look in the outer | 66 // attempt to get the profile directory, so direct them to look in the outer |
| 60 // browser .app's Info.plist for the CrProductDirName key. | 67 // browser .app's Info.plist for the CrProductDirName key. |
| 61 NSBundle* bundle = chrome::OuterAppBundle(); | 68 NSBundle* bundle = chrome::OuterAppBundle(); |
| 62 NSString* product_dir_name_ns = | 69 NSString* product_dir_name_ns = |
| 63 [bundle objectForInfoDictionaryKey:@"CrProductDirName"]; | 70 [bundle objectForInfoDictionaryKey:@"CrProductDirName"]; |
| 64 const char* product_dir_name = [product_dir_name_ns fileSystemRepresentation]; | 71 product_dir_name = [product_dir_name_ns fileSystemRepresentation]; |
| 72 #endif |
| 65 | 73 |
| 66 if (!product_dir_name) { | 74 if (!product_dir_name) { |
| 67 #if defined(GOOGLE_CHROME_BUILD) | 75 #if defined(GOOGLE_CHROME_BUILD) |
| 68 product_dir_name = "Google/Chrome"; | 76 product_dir_name = "Google/Chrome"; |
| 69 #else | 77 #else |
| 70 product_dir_name = "Chromium"; | 78 product_dir_name = "Chromium"; |
| 71 #endif | 79 #endif |
| 72 } | 80 } |
| 73 | 81 |
| 74 // Leaked, but the only caller initializes a static with this result, so it | 82 // Leaked, but the only caller initializes a static with this result, so it |
| (...skipping 23 matching lines...) Expand all Loading... |
| 98 *result = result->Append(ProductDirName()); | 106 *result = result->Append(ProductDirName()); |
| 99 success = true; | 107 success = true; |
| 100 } | 108 } |
| 101 return success; | 109 return success; |
| 102 } | 110 } |
| 103 | 111 |
| 104 bool GetUserDocumentsDirectory(FilePath* result) { | 112 bool GetUserDocumentsDirectory(FilePath* result) { |
| 105 return base::mac::GetUserDirectory(NSDocumentDirectory, result); | 113 return base::mac::GetUserDirectory(NSDocumentDirectory, result); |
| 106 } | 114 } |
| 107 | 115 |
| 108 bool GetGlobalApplicationSupportDirectory(FilePath* result) { | |
| 109 return base::mac::GetLocalDirectory(NSApplicationSupportDirectory, result); | |
| 110 } | |
| 111 | |
| 112 void GetUserCacheDirectory(const FilePath& profile_dir, FilePath* result) { | 116 void GetUserCacheDirectory(const FilePath& profile_dir, FilePath* result) { |
| 113 // If the profile directory is under ~/Library/Application Support, | 117 // If the profile directory is under ~/Library/Application Support, |
| 114 // use a suitable cache directory under ~/Library/Caches. For | 118 // use a suitable cache directory under ~/Library/Caches. For |
| 115 // example, a profile directory of ~/Library/Application | 119 // example, a profile directory of ~/Library/Application |
| 116 // Support/Google/Chrome/MyProfileName would use the cache directory | 120 // Support/Google/Chrome/MyProfileName would use the cache directory |
| 117 // ~/Library/Caches/Google/Chrome/MyProfileName. | 121 // ~/Library/Caches/Google/Chrome/MyProfileName. |
| 118 | 122 |
| 119 // Default value in cases where any of the following fails. | 123 // Default value in cases where any of the following fails. |
| 120 *result = profile_dir; | 124 *result = profile_dir; |
| 121 | 125 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 140 } | 144 } |
| 141 | 145 |
| 142 bool GetUserPicturesDirectory(FilePath* result) { | 146 bool GetUserPicturesDirectory(FilePath* result) { |
| 143 return base::mac::GetUserDirectory(NSPicturesDirectory, result); | 147 return base::mac::GetUserDirectory(NSPicturesDirectory, result); |
| 144 } | 148 } |
| 145 | 149 |
| 146 bool GetUserVideosDirectory(FilePath* result) { | 150 bool GetUserVideosDirectory(FilePath* result) { |
| 147 return base::mac::GetUserDirectory(NSMoviesDirectory, result); | 151 return base::mac::GetUserDirectory(NSMoviesDirectory, result); |
| 148 } | 152 } |
| 149 | 153 |
| 154 #if !defined(OS_IOS) |
| 155 |
| 150 FilePath GetVersionedDirectory() { | 156 FilePath GetVersionedDirectory() { |
| 151 if (g_override_versioned_directory) | 157 if (g_override_versioned_directory) |
| 152 return *g_override_versioned_directory; | 158 return *g_override_versioned_directory; |
| 153 | 159 |
| 154 // Start out with the path to the running executable. | 160 // Start out with the path to the running executable. |
| 155 FilePath path; | 161 FilePath path; |
| 156 PathService::Get(base::FILE_EXE, &path); | 162 PathService::Get(base::FILE_EXE, &path); |
| 157 | 163 |
| 158 // One step up to MacOS, another to Contents. | 164 // One step up to MacOS, another to Contents. |
| 159 path = path.DirName().DirName(); | 165 path = path.DirName().DirName(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 199 |
| 194 // The framework bundle is at a known path and name from the browser .app's | 200 // The framework bundle is at a known path and name from the browser .app's |
| 195 // versioned directory. | 201 // versioned directory. |
| 196 return GetVersionedDirectory().Append(kFrameworkName); | 202 return GetVersionedDirectory().Append(kFrameworkName); |
| 197 } | 203 } |
| 198 | 204 |
| 199 bool GetLocalLibraryDirectory(FilePath* result) { | 205 bool GetLocalLibraryDirectory(FilePath* result) { |
| 200 return base::mac::GetLocalDirectory(NSLibraryDirectory, result); | 206 return base::mac::GetLocalDirectory(NSLibraryDirectory, result); |
| 201 } | 207 } |
| 202 | 208 |
| 209 bool GetGlobalApplicationSupportDirectory(FilePath* result) { |
| 210 return base::mac::GetLocalDirectory(NSApplicationSupportDirectory, result); |
| 211 } |
| 212 |
| 203 NSBundle* OuterAppBundle() { | 213 NSBundle* OuterAppBundle() { |
| 204 // Cache this. Foundation leaks it anyway, and this should be the only call | 214 // Cache this. Foundation leaks it anyway, and this should be the only call |
| 205 // to OuterAppBundleInternal(). | 215 // to OuterAppBundleInternal(). |
| 206 static NSBundle* bundle = OuterAppBundleInternal(); | 216 static NSBundle* bundle = OuterAppBundleInternal(); |
| 207 return bundle; | 217 return bundle; |
| 208 } | 218 } |
| 209 | 219 |
| 220 #endif // !defined(OS_IOS) |
| 221 |
| 210 bool ProcessNeedsProfileDir(const std::string& process_type) { | 222 bool ProcessNeedsProfileDir(const std::string& process_type) { |
| 211 // For now we have no reason to forbid this on other MacOS as we don't | 223 // For now we have no reason to forbid this on other MacOS as we don't |
| 212 // have the roaming profile troubles there. | 224 // have the roaming profile troubles there. |
| 213 return true; | 225 return true; |
| 214 } | 226 } |
| 215 | 227 |
| 216 } // namespace chrome | 228 } // namespace chrome |
| OLD | NEW |