// 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 #include #include #include #include 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 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(); } }