summaryrefslogtreecommitdiffstats
path: root/base/native_library_mac.mm
diff options
context:
space:
mode:
authorjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-05 22:18:09 +0000
committerjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-05 22:18:09 +0000
commit108c2a1d2780d49121e16b18a29580ef4d28c790 (patch)
treeeca587b489c7c22924814f4475c4a56ec5bc5b8e /base/native_library_mac.mm
parent9e241cc8a7320c0a818da0ddac1bc3910fc1b60a (diff)
downloadchromium_src-108c2a1d2780d49121e16b18a29580ef4d28c790.zip
chromium_src-108c2a1d2780d49121e16b18a29580ef4d28c790.tar.gz
chromium_src-108c2a1d2780d49121e16b18a29580ef4d28c790.tar.bz2
Porting the browser tests to Unix.
The browser tests are an alternative to UI tests. They provide a way to exercise the browser from within the test (without having the test and the browser running in different processes). In order to ensure atexit hanlders are run after each tests and static initializers start fresh for each test, each test is run in a new process (on Linux and Mac). On Windows, a DLL containing the test is loaded/unloaded for each tests. BUG=None TEST=Run the browser tests. Review URL: http://codereview.chromium.org/115896 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17781 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/native_library_mac.mm')
-rw-r--r--base/native_library_mac.mm41
1 files changed, 37 insertions, 4 deletions
diff --git a/base/native_library_mac.mm b/base/native_library_mac.mm
index f817a01..577f5ac 100644
--- a/base/native_library_mac.mm
+++ b/base/native_library_mac.mm
@@ -4,15 +4,28 @@
#include "base/native_library.h"
+#include <dlfcn.h>
#import <Carbon/Carbon.h>
#include "base/file_path.h"
+#include "base/file_util.h"
#include "base/scoped_cftyperef.h"
+#include "base/string_util.h"
namespace base {
// static
NativeLibrary LoadNativeLibrary(const FilePath& library_path) {
+ if (library_path.Extension() == "dylib" ||
+ !file_util::DirectoryExists(library_path)) {
+ void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY);
+ if (!dylib)
+ return NULL;
+ NativeLibrary native_lib = new NativeLibraryStruct();
+ native_lib->type = DYNAMIC_LIB;
+ native_lib->dylib = dylib;
+ return native_lib;
+ }
scoped_cftyperef<CFURLRef> url(CFURLCreateFromFileSystemRepresentation(
kCFAllocatorDefault,
(const UInt8*)library_path.value().c_str(),
@@ -20,19 +33,39 @@ NativeLibrary LoadNativeLibrary(const FilePath& library_path) {
true));
if (!url)
return NULL;
+ CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get());
+ if (!bundle)
+ return NULL;
- return CFBundleCreate(kCFAllocatorDefault, url.get());
+ NativeLibrary native_lib = new NativeLibraryStruct();
+ native_lib->type = BUNDLE;
+ native_lib->bundle = bundle;
+ return native_lib;
}
// static
void UnloadNativeLibrary(NativeLibrary library) {
- CFRelease(library);
+ if (library->type == BUNDLE)
+ CFRelease(library->bundle);
+ else
+ dlclose(library->dylib);
+ delete library;
}
// static
void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
- NativeLibraryFunctionNameType name) {
- return CFBundleGetFunctionPointerForName(library, name);
+ const char* name) {
+ if (library->type == BUNDLE)
+ return CFBundleGetFunctionPointerForName(library->bundle,
+ CFStringCreateWithCString(kCFAllocatorDefault, name,
+ kCFStringEncodingUTF8));
+
+ return dlsym(library->dylib, name);
+}
+
+// static
+string16 GetNativeLibraryName(const string16& name) {
+ return name + ASCIIToUTF16(".dylib");
}
} // namespace base