-
Notifications
You must be signed in to change notification settings - Fork 288
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add .mm files necessary to build on OS X
- Loading branch information
Showing
11 changed files
with
1,466 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
// Copyright (c) 2012 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
// Defines base::PathProviderMac which replaces base::PathProviderPosix for Mac | ||
// in base/path_service.cc. | ||
|
||
#include <dlfcn.h> | ||
#import <Foundation/Foundation.h> | ||
#include <mach-o/dyld.h> | ||
|
||
#include "base/base_paths.h" | ||
#include "base/compiler_specific.h" | ||
#include "base/files/file_path.h" | ||
#include "base/files/file_util.h" | ||
#include "base/logging.h" | ||
#include "base/mac/foundation_util.h" | ||
#include "base/path_service.h" | ||
#include "base/strings/string_util.h" | ||
#include "build/build_config.h" | ||
|
||
namespace { | ||
|
||
void GetNSExecutablePath(base::FilePath* path) { | ||
DCHECK(path); | ||
// Executable path can have relative references ("..") depending on | ||
// how the app was launched. | ||
uint32_t executable_length = 0; | ||
_NSGetExecutablePath(NULL, &executable_length); | ||
DCHECK_GT(executable_length, 1u); | ||
std::string executable_path; | ||
int rv = _NSGetExecutablePath( | ||
base::WriteInto(&executable_path, executable_length), | ||
&executable_length); | ||
DCHECK_EQ(rv, 0); | ||
|
||
// _NSGetExecutablePath may return paths containing ./ or ../ which makes | ||
// FilePath::DirName() work incorrectly, convert it to absolute path so that | ||
// paths such as DIR_SOURCE_ROOT can work, since we expect absolute paths to | ||
// be returned here. | ||
*path = base::MakeAbsoluteFilePath(base::FilePath(executable_path)); | ||
} | ||
|
||
// Returns true if the module for |address| is found. |path| will contain | ||
// the path to the module. Note that |path| may not be absolute. | ||
bool GetModulePathForAddress(base::FilePath* path, | ||
const void* address) WARN_UNUSED_RESULT; | ||
|
||
bool GetModulePathForAddress(base::FilePath* path, const void* address) { | ||
Dl_info info; | ||
if (dladdr(address, &info) == 0) | ||
return false; | ||
*path = base::FilePath(info.dli_fname); | ||
return true; | ||
} | ||
|
||
} // namespace | ||
|
||
namespace base { | ||
|
||
bool PathProviderMac(int key, base::FilePath* result) { | ||
switch (key) { | ||
case base::FILE_EXE: | ||
GetNSExecutablePath(result); | ||
return true; | ||
case base::FILE_MODULE: | ||
return GetModulePathForAddress(result, | ||
reinterpret_cast<const void*>(&base::PathProviderMac)); | ||
case base::DIR_APP_DATA: { | ||
bool success = base::mac::GetUserDirectory(NSApplicationSupportDirectory, | ||
result); | ||
#if defined(OS_IOS) | ||
// On IOS, this directory does not exist unless it is created explicitly. | ||
if (success && !base::PathExists(*result)) | ||
success = base::CreateDirectory(*result); | ||
#endif // defined(OS_IOS) | ||
return success; | ||
} | ||
case base::DIR_SOURCE_ROOT: | ||
// Go through PathService to catch overrides. | ||
if (!PathService::Get(base::FILE_EXE, result)) | ||
return false; | ||
|
||
// Start with the executable's directory. | ||
*result = result->DirName(); | ||
|
||
#if !defined(OS_IOS) | ||
if (base::mac::AmIBundled()) { | ||
// The bundled app executables (Chromium, TestShell, etc) live five | ||
// levels down, eg: | ||
// src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium | ||
*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 | ||
*result = result->DirName().DirName(); | ||
} | ||
#endif | ||
return true; | ||
case base::DIR_USER_DESKTOP: | ||
#if defined(OS_IOS) | ||
// iOS does not have desktop directories. | ||
NOTIMPLEMENTED(); | ||
return false; | ||
#else | ||
return base::mac::GetUserDirectory(NSDesktopDirectory, result); | ||
#endif | ||
case base::DIR_CACHE: | ||
return base::mac::GetUserDirectory(NSCachesDirectory, result); | ||
default: | ||
return false; | ||
} | ||
} | ||
|
||
} // namespace base |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// Copyright (c) 2012 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef BASE_MAC_BUNDLE_LOCATIONS_H_ | ||
#define BASE_MAC_BUNDLE_LOCATIONS_H_ | ||
|
||
#include "base/base_export.h" | ||
#include "base/files/file_path.h" | ||
|
||
#if defined(__OBJC__) | ||
#import <Foundation/Foundation.h> | ||
#else // __OBJC__ | ||
class NSBundle; | ||
class NSString; | ||
#endif // __OBJC__ | ||
|
||
namespace base { | ||
|
||
class FilePath; | ||
|
||
namespace mac { | ||
|
||
// This file provides several functions to explicitly request the various | ||
// component bundles of Chrome. Please use these methods rather than calling | ||
// +[NSBundle mainBundle] or CFBundleGetMainBundle(). | ||
// | ||
// Terminology | ||
// - "Outer Bundle" - This is the main bundle for Chrome; it's what | ||
// +[NSBundle mainBundle] returns when Chrome is launched normally. | ||
// | ||
// - "Main Bundle" - This is the bundle from which Chrome was launched. | ||
// This will be the same as the outer bundle except when Chrome is launched | ||
// via an app shortcut, in which case this will return the app shortcut's | ||
// bundle rather than the main Chrome bundle. | ||
// | ||
// - "Framework Bundle" - This is the bundle corresponding to the Chrome | ||
// framework. | ||
// | ||
// Guidelines for use: | ||
// - To access a resource, the Framework bundle should be used. | ||
// - If the choice is between the Outer or Main bundles then please choose | ||
// carefully. Most often the Outer bundle will be the right choice, but for | ||
// cases such as adding an app to the "launch on startup" list, the Main | ||
// bundle is probably the one to use. | ||
|
||
// Methods for retrieving the various bundles. | ||
BASE_EXPORT NSBundle* MainBundle(); | ||
BASE_EXPORT FilePath MainBundlePath(); | ||
BASE_EXPORT NSBundle* OuterBundle(); | ||
BASE_EXPORT FilePath OuterBundlePath(); | ||
BASE_EXPORT NSBundle* FrameworkBundle(); | ||
BASE_EXPORT FilePath FrameworkBundlePath(); | ||
|
||
// Set the bundle that the preceding functions will return, overriding the | ||
// default values. Restore the default by passing in |nil|. | ||
BASE_EXPORT void SetOverrideOuterBundle(NSBundle* bundle); | ||
BASE_EXPORT void SetOverrideFrameworkBundle(NSBundle* bundle); | ||
|
||
// Same as above but accepting a FilePath argument. | ||
BASE_EXPORT void SetOverrideOuterBundlePath(const FilePath& file_path); | ||
BASE_EXPORT void SetOverrideFrameworkBundlePath(const FilePath& file_path); | ||
|
||
} // namespace mac | ||
} // namespace base | ||
|
||
#endif // BASE_MAC_BUNDLE_LOCATIONS_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
// Copyright (c) 2012 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "base/mac/bundle_locations.h" | ||
|
||
#include "base/logging.h" | ||
#include "base/mac/foundation_util.h" | ||
#include "base/strings/sys_string_conversions.h" | ||
|
||
namespace base { | ||
namespace mac { | ||
|
||
// NSBundle isn't threadsafe, all functions in this file must be called on the | ||
// main thread. | ||
static NSBundle* g_override_framework_bundle = nil; | ||
static NSBundle* g_override_outer_bundle = nil; | ||
|
||
NSBundle* MainBundle() { | ||
return [NSBundle mainBundle]; | ||
} | ||
|
||
FilePath MainBundlePath() { | ||
NSBundle* bundle = MainBundle(); | ||
return NSStringToFilePath([bundle bundlePath]); | ||
} | ||
|
||
NSBundle* OuterBundle() { | ||
if (g_override_outer_bundle) | ||
return g_override_outer_bundle; | ||
return [NSBundle mainBundle]; | ||
} | ||
|
||
FilePath OuterBundlePath() { | ||
NSBundle* bundle = OuterBundle(); | ||
return NSStringToFilePath([bundle bundlePath]); | ||
} | ||
|
||
NSBundle* FrameworkBundle() { | ||
if (g_override_framework_bundle) | ||
return g_override_framework_bundle; | ||
return [NSBundle mainBundle]; | ||
} | ||
|
||
FilePath FrameworkBundlePath() { | ||
NSBundle* bundle = FrameworkBundle(); | ||
return NSStringToFilePath([bundle bundlePath]); | ||
} | ||
|
||
static void AssignOverrideBundle(NSBundle* new_bundle, | ||
NSBundle** override_bundle) { | ||
if (new_bundle != *override_bundle) { | ||
[*override_bundle release]; | ||
*override_bundle = [new_bundle retain]; | ||
} | ||
} | ||
|
||
static void AssignOverridePath(const FilePath& file_path, | ||
NSBundle** override_bundle) { | ||
NSString* path = base::SysUTF8ToNSString(file_path.value()); | ||
NSBundle* new_bundle = [NSBundle bundleWithPath:path]; | ||
DCHECK(new_bundle) << "Failed to load the bundle at " << file_path.value(); | ||
AssignOverrideBundle(new_bundle, override_bundle); | ||
} | ||
|
||
void SetOverrideOuterBundle(NSBundle* bundle) { | ||
AssignOverrideBundle(bundle, &g_override_outer_bundle); | ||
} | ||
|
||
void SetOverrideFrameworkBundle(NSBundle* bundle) { | ||
AssignOverrideBundle(bundle, &g_override_framework_bundle); | ||
} | ||
|
||
void SetOverrideOuterBundlePath(const FilePath& file_path) { | ||
AssignOverridePath(file_path, &g_override_outer_bundle); | ||
} | ||
|
||
void SetOverrideFrameworkBundlePath(const FilePath& file_path) { | ||
AssignOverridePath(file_path, &g_override_framework_bundle); | ||
} | ||
|
||
} // namespace mac | ||
} // namespace base |
Oops, something went wrong.