diff options
author | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-15 01:22:51 +0000 |
---|---|---|
committer | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-15 01:22:51 +0000 |
commit | b88a291b41a2232943116c95c215442be3d5f24e (patch) | |
tree | 12cc686e1fc47af7372f14dd15749463bf363370 | |
parent | bc6a901f7d54c1307fcffc82181aedcf694470f7 (diff) | |
download | chromium_src-b88a291b41a2232943116c95c215442be3d5f24e.zip chromium_src-b88a291b41a2232943116c95c215442be3d5f24e.tar.gz chromium_src-b88a291b41a2232943116c95c215442be3d5f24e.tar.bz2 |
Don't use NSBundle when unsure of thread safety.
BUG=24842
TEST=unit tests pass, app still works
Review URL: http://codereview.chromium.org/271094
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29077 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/base_paths_mac.mm | 23 | ||||
-rw-r--r-- | chrome/common/chrome_paths_internal.h | 9 | ||||
-rw-r--r-- | chrome/common/chrome_paths_mac.mm | 24 |
3 files changed, 25 insertions, 31 deletions
diff --git a/base/base_paths_mac.mm b/base/base_paths_mac.mm index 7549827..a4bbdac 100644 --- a/base/base_paths_mac.mm +++ b/base/base_paths_mac.mm @@ -5,6 +5,7 @@ #include "base/base_paths_mac.h" #import <Cocoa/Cocoa.h> +#include <mach-o/dyld.h> #include "base/file_path.h" #include "base/file_util.h" @@ -42,9 +43,13 @@ bool PathProviderMac(int key, FilePath* result) { case base::FILE_MODULE: { // Executable path can have relative references ("..") depending on // how the app was launched. - NSString* path = - [[[NSBundle mainBundle] executablePath] stringByStandardizingPath]; - cur = [path fileSystemRepresentation]; + uint32_t executable_length = 0; + _NSGetExecutablePath(NULL, &executable_length); + DCHECK_GT(executable_length, 1u); + char* executable = WriteInto(&cur, executable_length); + int rv = _NSGetExecutablePath(executable, &executable_length); + DCHECK_EQ(rv, 0); + DCHECK(!cur.empty()); break; } case base::DIR_CACHE: @@ -52,22 +57,16 @@ bool PathProviderMac(int key, FilePath* result) { case base::DIR_APP_DATA: return GetUserDirectory(NSApplicationSupportDirectory, result); case base::DIR_SOURCE_ROOT: { - FilePath path; - PathService::Get(base::DIR_EXE, &path); + PathService::Get(base::DIR_EXE, result); if (mac_util::AmIBundled()) { // The bundled app executables (Chromium, TestShell, etc) live five // levels down, eg: // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium. - path = path.DirName(); - path = path.DirName(); - path = path.DirName(); - path = path.DirName(); - *result = path.DirName(); + *result = result->DirName().DirName().DirName().DirName().DirName(); } else { // Unit tests execute two levels deep from the source root, eg: // src/xcodebuild/{Debug|Release}/base_unittests - path = path.DirName(); - *result = path.DirName(); + *result = result->DirName().DirName(); } return true; } diff --git a/chrome/common/chrome_paths_internal.h b/chrome/common/chrome_paths_internal.h index dfaded7..83ae638 100644 --- a/chrome/common/chrome_paths_internal.h +++ b/chrome/common/chrome_paths_internal.h @@ -6,17 +6,8 @@ #define CHROME_COMMON_CHROME_PATHS_INTERNAL_H_ #include "build/build_config.h" - #include "base/file_path.h" -#if defined(OS_MACOSX) -#ifdef __OBJC__ -@class NSBundle; -#else -class NSBundle; -#endif -#endif - namespace chrome { // Get the path to the user's data directory, regardless of whether diff --git a/chrome/common/chrome_paths_mac.mm b/chrome/common/chrome_paths_mac.mm index b4f28a0..26c2974 100644 --- a/chrome/common/chrome_paths_mac.mm +++ b/chrome/common/chrome_paths_mac.mm @@ -67,18 +67,21 @@ bool GetUserDesktop(FilePath* result) { } FilePath GetVersionedDirectory() { - // Start out with the path to the running .app. - NSBundle* app_bundle = [NSBundle mainBundle]; - FilePath path = FilePath([[app_bundle bundlePath] fileSystemRepresentation]); + // Start out with the path to the running executable. + FilePath path; + PathService::Get(base::FILE_EXE, &path); + + // One step up to MacOS, another to Contents. + path = path.DirName().DirName(); if (mac_util::IsBackgroundOnlyProcess()) { - // path identifies the helper .app in the browser .app's versioned - // directory. Go up one level to get to the browser .app's versioned - // directory. - path = path.DirName(); + // path identifies the helper .app's Contents directory in the browser + // .app's versioned directory. Go up two steps to get to the browser + // .app's versioned directory. + path = path.DirName().DirName(); } else { - // path identifies the browser .app. Go into its versioned directory. - path = path.Append("Contents").Append("Versions").Append(kChromeVersion); + // Go into the versioned directory. + path = path.Append("Versions").Append(kChromeVersion); } return path; @@ -92,7 +95,8 @@ FilePath GetFrameworkBundlePath() { // essentially takes no time at all, at least when the bundle has already // been loaded as it will have been in this case. The FilePath operations // needed to compute the framework's path are also effectively free, so that - // is the approach that is used here. + // is the approach that is used here. NSBundle is also documented as being + // not thread-safe, and thread safety may be a concern here. // The framework bundle is at a known path and name from the browser .app's // versioned directory. |