Index: chrome/common/chrome_plugin_lib.cc |
diff --git a/chrome/common/chrome_plugin_lib.cc b/chrome/common/chrome_plugin_lib.cc |
deleted file mode 100644 |
index 7df1837fa8403885c3e0043fb4107a41efd1fed8..0000000000000000000000000000000000000000 |
--- a/chrome/common/chrome_plugin_lib.cc |
+++ /dev/null |
@@ -1,292 +0,0 @@ |
-// Copyright (c) 2011 The Chromium 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 "chrome/common/chrome_plugin_lib.h" |
- |
-#include "base/command_line.h" |
-#include "base/hash_tables.h" |
-#include "base/message_loop.h" |
-#include "base/metrics/histogram.h" |
-#include "base/path_service.h" |
-#include "base/perftimer.h" |
-#include "base/string_util.h" |
-#include "base/threading/platform_thread.h" |
-#include "base/threading/thread.h" |
-#include "chrome/common/chrome_counters.h" |
-#include "chrome/common/chrome_paths.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "content/common/notification_service.h" |
-#include "webkit/plugins/npapi/plugin_list.h" |
- |
-#if defined(OS_WIN) |
-#include "base/win/registry.h" |
-#endif |
- |
-using base::TimeDelta; |
- |
-// TODO(port): revisit when plugins happier |
-#if defined(OS_WIN) |
-const wchar_t ChromePluginLib::kRegistryChromePlugins[] = |
- L"Software\\Google\\Chrome\\Plugins"; |
-static const wchar_t kRegistryLoadOnStartup[] = L"LoadOnStartup"; |
-static const wchar_t kRegistryPath[] = L"Path"; |
-#endif |
- |
-typedef base::hash_map<FilePath, scoped_refptr<ChromePluginLib> > |
- PluginMap; |
- |
-// A map of all the instantiated plugins. |
-static PluginMap* g_loaded_libs; |
- |
-// The thread plugins are loaded and used in, lazily initialized upon |
-// the first creation call. |
-static base::PlatformThreadId g_plugin_thread_id = 0; |
-static MessageLoop* g_plugin_thread_loop = NULL; |
- |
-static bool IsSingleProcessMode() { |
- // We don't support ChromePlugins in single-process mode. |
- return CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess); |
-} |
- |
-// static |
-bool ChromePluginLib::IsInitialized() { |
- return (g_loaded_libs != NULL); |
-} |
- |
-// static |
-ChromePluginLib* ChromePluginLib::Create(const FilePath& filename, |
- const CPBrowserFuncs* bfuncs) { |
- // Keep a map of loaded plugins to ensure we only load each library once. |
- if (!g_loaded_libs) { |
- g_loaded_libs = new PluginMap(); |
- g_plugin_thread_id = base::PlatformThread::CurrentId(); |
- g_plugin_thread_loop = MessageLoop::current(); |
- } |
- DCHECK(IsPluginThread()); |
- |
- PluginMap::const_iterator iter = g_loaded_libs->find(filename); |
- if (iter != g_loaded_libs->end()) |
- return iter->second; |
- |
- scoped_refptr<ChromePluginLib> plugin(new ChromePluginLib(filename)); |
- if (!plugin->CP_Initialize(bfuncs)) |
- return NULL; |
- |
- (*g_loaded_libs)[filename] = plugin; |
- return plugin; |
-} |
- |
-// static |
-ChromePluginLib* ChromePluginLib::Find(const FilePath& filename) { |
- if (g_loaded_libs) { |
- PluginMap::const_iterator iter = g_loaded_libs->find(filename); |
- if (iter != g_loaded_libs->end()) |
- return iter->second; |
- } |
- return NULL; |
-} |
- |
-// static |
-void ChromePluginLib::Destroy(const FilePath& filename) { |
- DCHECK(g_loaded_libs); |
- PluginMap::iterator iter = g_loaded_libs->find(filename); |
- if (iter != g_loaded_libs->end()) { |
- iter->second->Unload(); |
- g_loaded_libs->erase(iter); |
- } |
-} |
- |
-// static |
-bool ChromePluginLib::IsPluginThread() { |
- return base::PlatformThread::CurrentId() == g_plugin_thread_id; |
-} |
- |
-// static |
-MessageLoop* ChromePluginLib::GetPluginThreadLoop() { |
- return g_plugin_thread_loop; |
-} |
- |
-// static |
-void ChromePluginLib::RegisterPluginsWithNPAPI() { |
- // We don't support ChromePlugins in single-process mode. |
- if (IsSingleProcessMode()) |
- return; |
- |
- FilePath path; |
- // Register Gears, if available. |
- if (PathService::Get(chrome::FILE_GEARS_PLUGIN, &path)) |
- webkit::npapi::PluginList::Singleton()->AddExtraPluginPath(path); |
-} |
- |
-static void LogPluginLoadTime(const TimeDelta &time) { |
- UMA_HISTOGRAM_TIMES("Gears.LoadTime", time); |
-} |
- |
-// static |
-void ChromePluginLib::LoadChromePlugins(const CPBrowserFuncs* bfuncs) { |
- static bool loaded = false; |
- if (loaded) |
- return; |
- loaded = true; |
- |
- // We don't support ChromePlugins in single-process mode. |
- if (IsSingleProcessMode()) |
- return; |
- |
- FilePath path; |
- if (!PathService::Get(chrome::FILE_GEARS_PLUGIN, &path)) |
- return; |
- |
- PerfTimer timer; |
- ChromePluginLib::Create(path, bfuncs); |
- LogPluginLoadTime(timer.Elapsed()); |
- |
- // TODO(mpcomplete): disabled loading of plugins from the registry until we |
- // phase out registry keys from the gears installer. |
-#if 0 |
- for (RegistryKeyIterator iter(HKEY_CURRENT_USER, kRegistryChromePlugins); |
- iter.Valid(); ++iter) { |
- // Use the registry to gather plugin across the file system. |
- std::wstring reg_path = kRegistryChromePlugins; |
- reg_path.append(L"\\"); |
- reg_path.append(iter.Name()); |
- base::win::RegKey key(HKEY_CURRENT_USER, reg_path.c_str()); |
- |
- DWORD is_persistent = 0; |
- key.ReadValueDW(kRegistryLoadOnStartup, &is_persistent); |
- if (is_persistent) { |
- std::wstring path; |
- if (key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { |
- ChromePluginLib::Create(path, bfuncs); |
- } |
- } |
- } |
-#endif |
-} |
- |
-// static |
-void ChromePluginLib::UnloadAllPlugins() { |
- if (g_loaded_libs) { |
- PluginMap::iterator it; |
- for (PluginMap::iterator it = g_loaded_libs->begin(); |
- it != g_loaded_libs->end(); ++it) { |
- it->second->Unload(); |
- } |
- delete g_loaded_libs; |
- g_loaded_libs = NULL; |
- } |
-} |
- |
-const CPPluginFuncs& ChromePluginLib::functions() const { |
- DCHECK(initialized_); |
- DCHECK(IsPluginThread()); |
- return plugin_funcs_; |
-} |
- |
-ChromePluginLib::ChromePluginLib(const FilePath& filename) |
- : filename_(filename), |
-#if defined(OS_WIN) |
- module_(0), |
-#endif |
- initialized_(false), |
- CP_VersionNegotiate_(NULL), |
- CP_Initialize_(NULL), |
- CP_Test_(NULL) { |
- memset((void*)&plugin_funcs_, 0, sizeof(plugin_funcs_)); |
-} |
- |
-ChromePluginLib::~ChromePluginLib() { |
-} |
- |
-bool ChromePluginLib::CP_Initialize(const CPBrowserFuncs* bfuncs) { |
- VLOG(1) << "ChromePluginLib::CP_Initialize(" << filename_.value() |
- << "): initialized=" << initialized_; |
- if (initialized_) |
- return true; |
- |
- if (!Load()) |
- return false; |
- |
- if (CP_VersionNegotiate_) { |
- uint16 selected_version = 0; |
- CPError rv = CP_VersionNegotiate_(CP_VERSION, CP_VERSION, |
- &selected_version); |
- if ((rv != CPERR_SUCCESS) || (selected_version != CP_VERSION)) |
- return false; |
- } |
- |
- plugin_funcs_.size = sizeof(plugin_funcs_); |
- CPError rv = CP_Initialize_(cpid(), bfuncs, &plugin_funcs_); |
- initialized_ = (rv == CPERR_SUCCESS) && |
- (CP_GET_MAJOR_VERSION(plugin_funcs_.version) == CP_MAJOR_VERSION) && |
- (CP_GET_MINOR_VERSION(plugin_funcs_.version) <= CP_MINOR_VERSION); |
- VLOG(1) << "ChromePluginLib::CP_Initialize(" << filename_.value() |
- << "): initialized=" << initialized_ << "): result=" << rv; |
- |
- return initialized_; |
-} |
- |
-void ChromePluginLib::CP_Shutdown() { |
- DCHECK(initialized_); |
- functions().shutdown(); |
- initialized_ = false; |
- memset((void*)&plugin_funcs_, 0, sizeof(plugin_funcs_)); |
-} |
- |
-int ChromePluginLib::CP_Test(void* param) { |
- DCHECK(initialized_); |
- if (!CP_Test_) |
- return -1; |
- return CP_Test_(param); |
-} |
- |
-bool ChromePluginLib::Load() { |
-#if !defined(OS_WIN) |
- // Mac and Linux won't implement Gears. |
- return false; |
-#else |
- DCHECK(module_ == 0); |
- |
- module_ = LoadLibrary(filename_.value().c_str()); |
- if (module_ == 0) |
- return false; |
- |
- // required initialization function |
- CP_Initialize_ = reinterpret_cast<CP_InitializeFunc> |
- (GetProcAddress(module_, "CP_Initialize")); |
- |
- if (!CP_Initialize_) { |
- FreeLibrary(module_); |
- module_ = 0; |
- return false; |
- } |
- |
- // optional version negotiation function |
- CP_VersionNegotiate_ = reinterpret_cast<CP_VersionNegotiateFunc> |
- (GetProcAddress(module_, "CP_VersionNegotiate")); |
- |
- // optional test function |
- CP_Test_ = reinterpret_cast<CP_TestFunc> |
- (GetProcAddress(module_, "CP_Test")); |
- |
- return true; |
-#endif |
-} |
- |
-void ChromePluginLib::Unload() { |
- NotificationService::current()->Notify( |
- NotificationType::CHROME_PLUGIN_UNLOADED, |
- Source<ChromePluginLib>(this), |
- NotificationService::NoDetails()); |
- |
- if (initialized_) |
- CP_Shutdown(); |
- |
-#if defined(OS_WIN) |
- if (module_) { |
- FreeLibrary(module_); |
- module_ = 0; |
- } |
-#endif |
-} |