// Copyright 2020 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 "libcef/common/app_manager.h" #include "libcef/common/net/scheme_info.h" #include "libcef/common/net/scheme_registration.h" #include "libcef/common/scheme_registrar_impl.h" #include "base/command_line.h" #include "base/logging.h" #include "content/public/browser/child_process_security_policy.h" #include "content/public/common/content_switches.h" #if BUILDFLAG(IS_WIN) #include #include "base/path_service.h" #endif namespace { CefAppManager* g_manager = nullptr; } // namespace // static CefAppManager* CefAppManager::Get() { return g_manager; } CefAppManager::CefAppManager() { // Only a single instance should exist. DCHECK(!g_manager); g_manager = this; } CefAppManager::~CefAppManager() { g_manager = nullptr; } void CefAppManager::AddCustomScheme(CefSchemeInfo* scheme_info) { DCHECK(!scheme_info_list_locked_); scheme_info_list_.push_back(*scheme_info); base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (!command_line->HasSwitch(switches::kProcessType)) { // Register as a Web-safe scheme in the browser process so that requests for // the scheme from a render process will be allowed in // resource_dispatcher_host_impl.cc ShouldServiceRequest. content::ChildProcessSecurityPolicy* policy = content::ChildProcessSecurityPolicy::GetInstance(); if (!policy->IsWebSafeScheme(scheme_info->scheme_name)) { policy->RegisterWebSafeScheme(scheme_info->scheme_name); } } } bool CefAppManager::HasCustomScheme(const std::string& scheme_name) { DCHECK(scheme_info_list_locked_); if (scheme_info_list_.empty()) { return false; } SchemeInfoList::const_iterator it = scheme_info_list_.begin(); for (; it != scheme_info_list_.end(); ++it) { if (it->scheme_name == scheme_name) { return true; } } return false; } const CefAppManager::SchemeInfoList* CefAppManager::GetCustomSchemes() { DCHECK(scheme_info_list_locked_); return &scheme_info_list_; } void CefAppManager::AddAdditionalSchemes( content::ContentClient::Schemes* schemes) { DCHECK(!scheme_info_list_locked_); auto application = GetApplication(); if (application) { CefSchemeRegistrarImpl schemeRegistrar; application->OnRegisterCustomSchemes(&schemeRegistrar); schemeRegistrar.GetSchemes(schemes); } scheme::AddInternalSchemes(schemes); scheme_info_list_locked_ = true; } #if BUILDFLAG(IS_WIN) const wchar_t* CefAppManager::GetResourceDllName() { static wchar_t file_path[MAX_PATH + 1] = {0}; if (file_path[0] == 0) { // Retrieve the module path (usually libcef.dll). base::FilePath module; base::PathService::Get(base::FILE_MODULE, &module); const std::wstring wstr = module.value(); size_t count = std::min(static_cast(MAX_PATH), wstr.size()); wcsncpy(file_path, wstr.c_str(), count); file_path[count] = 0; } return file_path; } #endif // BUILDFLAG(IS_WIN)