#include "chrome/browser/extensions/plugin_manager.h"
#include "base/files/file_path.h"
#include "base/lazy_instance.h"
#include "base/no_destructor.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_paths.h"
#include "content/public/browser/plugin_service.h"
#include "content/public/common/content_plugin_info.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_handlers/mime_types_handler.h"
#include "net/base/mime_util.h"
#include "third_party/skia/include/core/SkColor.h"
#include "url/gurl.h"
#if BUILDFLAG(ENABLE_NACL)
#include "components/nacl/common/nacl_constants.h"
#endif
PluginService;
namespace extensions {
PluginManager::PluginManager(content::BrowserContext* context)
: … { … }
PluginManager::~PluginManager() { … }
static base::LazyInstance<BrowserContextKeyedAPIFactory<PluginManager>>::
DestructorAtExit g_plugin_manager_factory = …;
BrowserContextKeyedAPIFactory<PluginManager>*
PluginManager::GetFactoryInstance() { … }
void PluginManager::OnExtensionLoaded(content::BrowserContext* browser_context,
const Extension* extension) { … }
void PluginManager::OnExtensionUnloaded(
content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) { … }
#if BUILDFLAG(ENABLE_NACL)
void PluginManager::RegisterNaClModule(const NaClModuleInfo& info) {
nacl_module_list_.push_front(info);
}
void PluginManager::UnregisterNaClModule(const NaClModuleInfo& info) {
auto iter = FindNaClModule(info.url);
if (iter != nacl_module_list_.end())
nacl_module_list_.erase(iter);
}
void PluginManager::UpdatePluginListWithNaClModules() {
static const base::NoDestructor<base::FilePath> path(
nacl::kInternalNaClPluginFileName);
const content::ContentPluginInfo* registered_info =
PluginService::GetInstance()->GetRegisteredPluginInfo(*path);
if (!registered_info)
return;
for (const auto& mime_type : registered_info->mime_types) {
if (mime_type.mime_type == nacl::kNaClPluginMimeType) {
PluginService::GetInstance()->UnregisterInternalPlugin(
registered_info->path);
content::WebPluginInfo info = registered_info->ToWebPluginInfo();
for (const auto& nacl_module : nacl_module_list_) {
content::WebPluginMimeType mime_type_info;
mime_type_info.mime_type = nacl_module.mime_type;
mime_type_info.additional_params.emplace_back(
u"nacl", base::UTF8ToUTF16(nacl_module.url.spec()));
info.mime_types.emplace_back(std::move(mime_type_info));
}
PluginService::GetInstance()->RefreshPlugins();
PluginService::GetInstance()->RegisterInternalPlugin(info, true);
break;
}
}
}
NaClModuleInfo::List::iterator PluginManager::FindNaClModule(const GURL& url) {
for (auto iter = nacl_module_list_.begin(); iter != nacl_module_list_.end();
++iter) {
if (iter->url == url)
return iter;
}
return nacl_module_list_.end();
}
#endif
}