| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/plugin_service_impl.h" | 5 #include "content/browser/plugin_service_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 // the number of processes which start at least one NPAPI/PPAPI Flash process. | 150 // the number of processes which start at least one NPAPI/PPAPI Flash process. |
| 151 static bool counted = false; | 151 static bool counted = false; |
| 152 if (!counted) { | 152 if (!counted) { |
| 153 counted = true; | 153 counted = true; |
| 154 UMA_HISTOGRAM_ENUMERATION("Plugin.FlashUsage", TOTAL_BROWSER_PROCESSES, | 154 UMA_HISTOGRAM_ENUMERATION("Plugin.FlashUsage", TOTAL_BROWSER_PROCESSES, |
| 155 FLASH_USAGE_ENUM_COUNT); | 155 FLASH_USAGE_ENUM_COUNT); |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 | 158 |
| 159 PluginServiceImpl::~PluginServiceImpl() { | 159 PluginServiceImpl::~PluginServiceImpl() { |
| 160 #if defined(OS_WIN) | |
| 161 // Release the events since they're owned by RegKey, not WaitableEvent. | |
| 162 hkcu_watcher_.StopWatching(); | |
| 163 hklm_watcher_.StopWatching(); | |
| 164 if (hkcu_event_) | |
| 165 hkcu_event_->Release(); | |
| 166 if (hklm_event_) | |
| 167 hklm_event_->Release(); | |
| 168 #endif | |
| 169 // Make sure no plugin channel requests have been leaked. | 160 // Make sure no plugin channel requests have been leaked. |
| 170 DCHECK(pending_plugin_clients_.empty()); | 161 DCHECK(pending_plugin_clients_.empty()); |
| 171 } | 162 } |
| 172 | 163 |
| 173 void PluginServiceImpl::Init() { | 164 void PluginServiceImpl::Init() { |
| 174 plugin_list_token_ = BrowserThread::GetBlockingPool()->GetSequenceToken(); | 165 plugin_list_token_ = BrowserThread::GetBlockingPool()->GetSequenceToken(); |
| 175 PluginList::Singleton()->set_will_load_plugins_callback( | 166 PluginList::Singleton()->set_will_load_plugins_callback( |
| 176 base::Bind(&WillLoadPluginsCallback, plugin_list_token_)); | 167 base::Bind(&WillLoadPluginsCallback, plugin_list_token_)); |
| 177 | 168 |
| 178 RegisterPepperPlugins(); | 169 RegisterPepperPlugins(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 193 } | 184 } |
| 194 | 185 |
| 195 void PluginServiceImpl::StartWatchingPlugins() { | 186 void PluginServiceImpl::StartWatchingPlugins() { |
| 196 // Start watching for changes in the plugin list. This means watching | 187 // Start watching for changes in the plugin list. This means watching |
| 197 // for changes in the Windows registry keys and on both Windows and POSIX | 188 // for changes in the Windows registry keys and on both Windows and POSIX |
| 198 // watch for changes in the paths that are expected to contain plugins. | 189 // watch for changes in the paths that are expected to contain plugins. |
| 199 #if defined(OS_WIN) | 190 #if defined(OS_WIN) |
| 200 if (hkcu_key_.Create(HKEY_CURRENT_USER, | 191 if (hkcu_key_.Create(HKEY_CURRENT_USER, |
| 201 kRegistryMozillaPlugins, | 192 kRegistryMozillaPlugins, |
| 202 KEY_NOTIFY) == ERROR_SUCCESS) { | 193 KEY_NOTIFY) == ERROR_SUCCESS) { |
| 203 if (hkcu_key_.StartWatching() == ERROR_SUCCESS) { | 194 base::win::RegKey::ChangeCallback callback = |
| 204 hkcu_event_.reset(new base::WaitableEvent(hkcu_key_.watch_event())); | 195 base::Bind(&PluginServiceImpl::OnKeyChanged, base::Unretained(this), |
| 205 base::WaitableEventWatcher::EventCallback callback = | 196 base::Unretained(&hkcu_key_)); |
| 206 base::Bind(&PluginServiceImpl::OnWaitableEventSignaled, | 197 hkcu_key_.StartWatching(callback); |
| 207 base::Unretained(this)); | |
| 208 hkcu_watcher_.StartWatching(hkcu_event_.get(), callback); | |
| 209 } | |
| 210 } | 198 } |
| 211 if (hklm_key_.Create(HKEY_LOCAL_MACHINE, | 199 if (hklm_key_.Create(HKEY_LOCAL_MACHINE, |
| 212 kRegistryMozillaPlugins, | 200 kRegistryMozillaPlugins, |
| 213 KEY_NOTIFY) == ERROR_SUCCESS) { | 201 KEY_NOTIFY) == ERROR_SUCCESS) { |
| 214 if (hklm_key_.StartWatching() == ERROR_SUCCESS) { | 202 base::win::RegKey::ChangeCallback callback = |
| 215 hklm_event_.reset(new base::WaitableEvent(hklm_key_.watch_event())); | 203 base::Bind(&PluginServiceImpl::OnKeyChanged, base::Unretained(this), |
| 216 base::WaitableEventWatcher::EventCallback callback = | 204 base::Unretained(&hkcu_key_)); |
| 217 base::Bind(&PluginServiceImpl::OnWaitableEventSignaled, | 205 hklm_key_.StartWatching(callback); |
| 218 base::Unretained(this)); | |
| 219 hklm_watcher_.StartWatching(hklm_event_.get(), callback); | |
| 220 } | |
| 221 } | 206 } |
| 222 #endif | 207 #endif |
| 223 #if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID) | 208 #if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID) |
| 224 // On ChromeOS the user can't install plugins anyway and on Windows all | 209 // On ChromeOS the user can't install plugins anyway and on Windows all |
| 225 // important plugins register themselves in the registry so no need to do that. | 210 // important plugins register themselves in the registry so no need to do that. |
| 226 | 211 |
| 227 // Get the list of all paths for registering the FilePathWatchers | 212 // Get the list of all paths for registering the FilePathWatchers |
| 228 // that will track and if needed reload the list of plugins on runtime. | 213 // that will track and if needed reload the list of plugins on runtime. |
| 229 std::vector<base::FilePath> plugin_dirs; | 214 std::vector<base::FilePath> plugin_dirs; |
| 230 PluginList::Singleton()->GetPluginDirectories(&plugin_dirs); | 215 PluginList::Singleton()->GetPluginDirectories(&plugin_dirs); |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 // sure g_thread_init() gets called since plugins may call glib at load. | 620 // sure g_thread_init() gets called since plugins may call glib at load. |
| 636 | 621 |
| 637 if (!plugin_loader_.get()) | 622 if (!plugin_loader_.get()) |
| 638 plugin_loader_ = new PluginLoaderPosix; | 623 plugin_loader_ = new PluginLoaderPosix; |
| 639 | 624 |
| 640 plugin_loader_->GetPlugins( | 625 plugin_loader_->GetPlugins( |
| 641 base::Bind(&ForwardCallback, make_scoped_refptr(target_loop), callback)); | 626 base::Bind(&ForwardCallback, make_scoped_refptr(target_loop), callback)); |
| 642 } | 627 } |
| 643 #endif | 628 #endif |
| 644 | 629 |
| 645 void PluginServiceImpl::OnWaitableEventSignaled( | |
| 646 base::WaitableEvent* waitable_event) { | |
| 647 #if defined(OS_WIN) | 630 #if defined(OS_WIN) |
| 648 if (waitable_event == hkcu_event_) { | 631 void PluginServiceImpl::OnKeyChanged(base::win::RegKey* key) { |
| 649 hkcu_key_.StartWatching(); | 632 key->StartWatching(base::Bind(&PluginServiceImpl::OnKeyChanged, |
| 650 } else { | 633 base::Unretained(this), |
| 651 hklm_key_.StartWatching(); | 634 base::Unretained(&hkcu_key_))); |
| 652 } | |
| 653 | 635 |
| 654 PluginList::Singleton()->RefreshPlugins(); | 636 PluginList::Singleton()->RefreshPlugins(); |
| 655 PurgePluginListCache(NULL, false); | 637 PurgePluginListCache(NULL, false); |
| 656 #else | 638 } |
| 657 // This event should only get signaled on a Windows machine. | |
| 658 NOTREACHED(); | |
| 659 #endif // defined(OS_WIN) | 639 #endif // defined(OS_WIN) |
| 660 } | |
| 661 | 640 |
| 662 void PluginServiceImpl::RegisterPepperPlugins() { | 641 void PluginServiceImpl::RegisterPepperPlugins() { |
| 663 ComputePepperPluginList(&ppapi_plugins_); | 642 ComputePepperPluginList(&ppapi_plugins_); |
| 664 for (size_t i = 0; i < ppapi_plugins_.size(); ++i) { | 643 for (size_t i = 0; i < ppapi_plugins_.size(); ++i) { |
| 665 RegisterInternalPlugin(ppapi_plugins_[i].ToWebPluginInfo(), true); | 644 RegisterInternalPlugin(ppapi_plugins_[i].ToWebPluginInfo(), true); |
| 666 } | 645 } |
| 667 } | 646 } |
| 668 | 647 |
| 669 // There should generally be very few plugins so a brute-force search is fine. | 648 // There should generally be very few plugins so a brute-force search is fine. |
| 670 PepperPluginInfo* PluginServiceImpl::GetRegisteredPpapiPluginInfo( | 649 PepperPluginInfo* PluginServiceImpl::GetRegisteredPpapiPluginInfo( |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 #endif | 838 #endif |
| 860 | 839 |
| 861 bool PluginServiceImpl::PpapiDevChannelSupported( | 840 bool PluginServiceImpl::PpapiDevChannelSupported( |
| 862 BrowserContext* browser_context, | 841 BrowserContext* browser_context, |
| 863 const GURL& document_url) { | 842 const GURL& document_url) { |
| 864 return content::GetContentClient()->browser()-> | 843 return content::GetContentClient()->browser()-> |
| 865 IsPluginAllowedToUseDevChannelAPIs(browser_context, document_url); | 844 IsPluginAllowedToUseDevChannelAPIs(browser_context, document_url); |
| 866 } | 845 } |
| 867 | 846 |
| 868 } // namespace content | 847 } // namespace content |
| OLD | NEW |