mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
macOS: Load the CEF framework using dlopen instead of direct linking (issue #2459)
This is a prerequisite for using the Chromium V2 sandbox.
This commit is contained in:
77
libcef_dll/wrapper/cef_library_loader_mac.mm
Normal file
77
libcef_dll/wrapper/cef_library_loader_mac.mm
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright (c) 2018 The Chromium Embedded Framework 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 "include/wrapper/cef_library_loader.h"
|
||||
|
||||
#include <libgen.h>
|
||||
#include <mach-o/dyld.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
|
||||
namespace {
|
||||
|
||||
const char kFrameworkPath[] =
|
||||
"Chromium Embedded Framework.framework/Chromium Embedded Framework";
|
||||
const char kPathFromHelperExe[] = "../../..";
|
||||
const char kPathFromMainExe[] = "../Frameworks";
|
||||
|
||||
std::string GetFrameworkPath(bool helper) {
|
||||
uint32_t exec_path_size = 0;
|
||||
int rv = _NSGetExecutablePath(NULL, &exec_path_size);
|
||||
if (rv != -1) {
|
||||
return std::string();
|
||||
}
|
||||
|
||||
std::unique_ptr<char[]> exec_path(new char[exec_path_size]);
|
||||
rv = _NSGetExecutablePath(exec_path.get(), &exec_path_size);
|
||||
if (rv != 0) {
|
||||
return std::string();
|
||||
}
|
||||
|
||||
// Get the directory path of the executable.
|
||||
const char* parent_dir = dirname(exec_path.get());
|
||||
if (!parent_dir) {
|
||||
return std::string();
|
||||
}
|
||||
|
||||
// Append the relative path to the framework.
|
||||
std::stringstream ss;
|
||||
ss << parent_dir << "/" << (helper ? kPathFromHelperExe : kPathFromMainExe)
|
||||
<< "/" << kFrameworkPath;
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
CefScopedLibraryLoader::CefScopedLibraryLoader() : loaded_(false) {}
|
||||
|
||||
bool CefScopedLibraryLoader::Load(bool helper) {
|
||||
if (loaded_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::string& framework_path = GetFrameworkPath(helper);
|
||||
if (framework_path.empty()) {
|
||||
fprintf(stderr, "App does not have the expected bundle structure.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Load the CEF framework library.
|
||||
if (!cef_load_library(framework_path.c_str())) {
|
||||
fprintf(stderr, "Failed to load the CEF framework.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
loaded_ = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
CefScopedLibraryLoader::~CefScopedLibraryLoader() {
|
||||
if (loaded_) {
|
||||
// Unload the CEF framework library.
|
||||
cef_unload_library();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user