| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "content/browser/plugin_service.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "content/browser/resource_context.h" | 24 #include "content/browser/resource_context.h" |
| 25 #include "content/common/notification_service.h" | 25 #include "content/common/notification_service.h" |
| 26 #include "content/common/notification_type.h" | 26 #include "content/common/notification_type.h" |
| 27 #include "content/common/pepper_plugin_registry.h" | 27 #include "content/common/pepper_plugin_registry.h" |
| 28 #include "content/common/plugin_messages.h" | 28 #include "content/common/plugin_messages.h" |
| 29 #include "content/common/view_messages.h" | 29 #include "content/common/view_messages.h" |
| 30 #include "webkit/plugins/npapi/plugin_constants_win.h" | 30 #include "webkit/plugins/npapi/plugin_constants_win.h" |
| 31 #include "webkit/plugins/npapi/plugin_list.h" | 31 #include "webkit/plugins/npapi/plugin_list.h" |
| 32 #include "webkit/plugins/npapi/webplugininfo.h" | 32 #include "webkit/plugins/npapi/webplugininfo.h" |
| 33 | 33 |
| 34 #if defined(OS_LINUX) | 34 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 35 using ::base::files::FilePathWatcher; | 35 using ::base::files::FilePathWatcher; |
| 36 #endif | 36 #endif |
| 37 | 37 |
| 38 #if defined(OS_MACOSX) | 38 #if defined(OS_MACOSX) |
| 39 static void NotifyPluginsOfActivation() { | 39 static void NotifyPluginsOfActivation() { |
| 40 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 40 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 41 | 41 |
| 42 for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::PLUGIN_PROCESS); | 42 for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::PLUGIN_PROCESS); |
| 43 !iter.Done(); ++iter) { | 43 !iter.Done(); ++iter) { |
| 44 PluginProcessHost* plugin = static_cast<PluginProcessHost*>(*iter); | 44 PluginProcessHost* plugin = static_cast<PluginProcessHost*>(*iter); |
| 45 plugin->OnAppActivation(); | 45 plugin->OnAppActivation(); |
| 46 } | 46 } |
| 47 } | 47 } |
| 48 #endif | 48 #elif defined(OS_POSIX) |
| 49 | |
| 50 #if defined(OS_LINUX) | |
| 51 // Delegate class for monitoring directories. | 49 // Delegate class for monitoring directories. |
| 52 class PluginDirWatcherDelegate : public FilePathWatcher::Delegate { | 50 class PluginDirWatcherDelegate : public FilePathWatcher::Delegate { |
| 53 virtual void OnFilePathChanged(const FilePath& path) OVERRIDE { | 51 virtual void OnFilePathChanged(const FilePath& path) OVERRIDE { |
| 54 VLOG(1) << "Watched path changed: " << path.value(); | 52 VLOG(1) << "Watched path changed: " << path.value(); |
| 55 // Make the plugin list update itself | 53 // Make the plugin list update itself |
| 56 webkit::npapi::PluginList::Singleton()->RefreshPlugins(); | 54 webkit::npapi::PluginList::Singleton()->RefreshPlugins(); |
| 57 } | 55 } |
| 58 virtual void OnFilePathError(const FilePath& path) OVERRIDE { | 56 virtual void OnFilePathError(const FilePath& path) OVERRIDE { |
| 59 // TODO(pastarmovj): Add some sensible error handling. Maybe silently | 57 // TODO(pastarmovj): Add some sensible error handling. Maybe silently |
| 60 // stopping the watcher would be enough. Or possibly restart it. | 58 // stopping the watcher would be enough. Or possibly restart it. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 } | 93 } |
| 96 } | 94 } |
| 97 if (hklm_key_.Create(HKEY_LOCAL_MACHINE, | 95 if (hklm_key_.Create(HKEY_LOCAL_MACHINE, |
| 98 webkit::npapi::kRegistryMozillaPlugins, | 96 webkit::npapi::kRegistryMozillaPlugins, |
| 99 KEY_NOTIFY) == ERROR_SUCCESS) { | 97 KEY_NOTIFY) == ERROR_SUCCESS) { |
| 100 if (hklm_key_.StartWatching() == ERROR_SUCCESS) { | 98 if (hklm_key_.StartWatching() == ERROR_SUCCESS) { |
| 101 hklm_event_.reset(new base::WaitableEvent(hklm_key_.watch_event())); | 99 hklm_event_.reset(new base::WaitableEvent(hklm_key_.watch_event())); |
| 102 hklm_watcher_.StartWatching(hklm_event_.get(), this); | 100 hklm_watcher_.StartWatching(hklm_event_.get(), this); |
| 103 } | 101 } |
| 104 } | 102 } |
| 105 #elif defined(OS_POSIX) && !defined(OS_MACOSX) | 103 #elif defined(OS_MACOSX) |
| 104 // We need to know when the browser comes forward so we can bring modal plugin |
| 105 // windows forward too. |
| 106 registrar_.Add(this, NotificationType::APP_ACTIVATED, |
| 107 NotificationService::AllSources()); |
| 108 #elif defined(OS_POSIX) |
| 106 // Also find plugins in a user-specific plugins dir, | 109 // Also find plugins in a user-specific plugins dir, |
| 107 // e.g. ~/.config/chromium/Plugins. | 110 // e.g. ~/.config/chromium/Plugins. |
| 108 FilePath user_data_dir; | 111 FilePath user_data_dir; |
| 109 if (PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) { | 112 if (PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) { |
| 110 webkit::npapi::PluginList::Singleton()->AddExtraPluginDir( | 113 webkit::npapi::PluginList::Singleton()->AddExtraPluginDir( |
| 111 user_data_dir.Append("Plugins")); | 114 user_data_dir.Append("Plugins")); |
| 112 } | 115 } |
| 113 #endif | 116 |
| 114 // The FilePathWatcher produces too many false positives on MacOS (access time | 117 // The FilePathWatcher produces too many false positives on MacOS (access time |
| 115 // updates?) which will lead to enforcing updates of the plugins way too often. | 118 // updates?) which will lead to enforcing updates of the plugins way too often. |
| 116 // On ChromeOS the user can't install plugins anyway and on Windows all | 119 // On ChromeOS the user can't install plugins anyway and on Windows all |
| 117 // important plugins register themselves in the registry so no need to do that. | 120 // important plugins register themselves in the registry so no need to do that. |
| 118 #if defined(OS_LINUX) | |
| 119 file_watcher_delegate_ = new PluginDirWatcherDelegate(); | 121 file_watcher_delegate_ = new PluginDirWatcherDelegate(); |
| 120 // Get the list of all paths for registering the FilePathWatchers | 122 // Get the list of all paths for registering the FilePathWatchers |
| 121 // that will track and if needed reload the list of plugins on runtime. | 123 // that will track and if needed reload the list of plugins on runtime. |
| 122 std::vector<FilePath> plugin_dirs; | 124 std::vector<FilePath> plugin_dirs; |
| 123 webkit::npapi::PluginList::Singleton()->GetPluginDirectories( | 125 webkit::npapi::PluginList::Singleton()->GetPluginDirectories( |
| 124 &plugin_dirs); | 126 &plugin_dirs); |
| 125 | 127 |
| 126 for (size_t i = 0; i < plugin_dirs.size(); ++i) { | 128 for (size_t i = 0; i < plugin_dirs.size(); ++i) { |
| 127 // FilePathWatcher can not handle non-absolute paths under windows. | 129 // FilePathWatcher can not handle non-absolute paths under windows. |
| 128 // We don't watch for file changes in windows now but if this should ever | 130 // We don't watch for file changes in windows now but if this should ever |
| 129 // be extended to Windows these lines might save some time of debugging. | 131 // be extended to Windows these lines might save some time of debugging. |
| 130 #if defined(OS_WIN) | 132 #if defined(OS_WIN) |
| 131 if (!plugin_dirs[i].IsAbsolute()) | 133 if (!plugin_dirs[i].IsAbsolute()) |
| 132 continue; | 134 continue; |
| 133 #endif | 135 #endif |
| 134 FilePathWatcher* watcher = new FilePathWatcher(); | 136 FilePathWatcher* watcher = new FilePathWatcher(); |
| 135 VLOG(1) << "Watching for changes in: " << plugin_dirs[i].value(); | 137 VLOG(1) << "Watching for changes in: " << plugin_dirs[i].value(); |
| 136 BrowserThread::PostTask( | 138 BrowserThread::PostTask( |
| 137 BrowserThread::FILE, FROM_HERE, | 139 BrowserThread::FILE, FROM_HERE, |
| 138 NewRunnableFunction( | 140 NewRunnableFunction( |
| 139 &PluginService::RegisterFilePathWatcher, | 141 &PluginService::RegisterFilePathWatcher, |
| 140 watcher, plugin_dirs[i], file_watcher_delegate_)); | 142 watcher, plugin_dirs[i], file_watcher_delegate_)); |
| 141 file_watchers_.push_back(watcher); | 143 file_watchers_.push_back(watcher); |
| 142 } | 144 } |
| 143 #endif | 145 #endif |
| 144 #if defined(OS_MACOSX) | |
| 145 // We need to know when the browser comes forward so we can bring modal plugin | |
| 146 // windows forward too. | |
| 147 registrar_.Add(this, NotificationType::APP_ACTIVATED, | |
| 148 NotificationService::AllSources()); | |
| 149 #endif | |
| 150 registrar_.Add(this, NotificationType::PLUGIN_ENABLE_STATUS_CHANGED, | 146 registrar_.Add(this, NotificationType::PLUGIN_ENABLE_STATUS_CHANGED, |
| 151 NotificationService::AllSources()); | 147 NotificationService::AllSources()); |
| 152 registrar_.Add(this, | 148 registrar_.Add(this, |
| 153 NotificationType::RENDERER_PROCESS_CLOSED, | 149 NotificationType::RENDERER_PROCESS_CLOSED, |
| 154 NotificationService::AllSources()); | 150 NotificationService::AllSources()); |
| 155 } | 151 } |
| 156 | 152 |
| 157 PluginService::~PluginService() { | 153 PluginService::~PluginService() { |
| 158 #if defined(OS_WIN) | 154 #if defined(OS_WIN) |
| 159 // Release the events since they're owned by RegKey, not WaitableEvent. | 155 // Release the events since they're owned by RegKey, not WaitableEvent. |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 PepperPluginInfo* info = NULL; | 486 PepperPluginInfo* info = NULL; |
| 491 for (size_t i = 0; i < ppapi_plugins_.size(); i++) { | 487 for (size_t i = 0; i < ppapi_plugins_.size(); i++) { |
| 492 if (ppapi_plugins_[i].path == plugin_path) { | 488 if (ppapi_plugins_[i].path == plugin_path) { |
| 493 info = &ppapi_plugins_[i]; | 489 info = &ppapi_plugins_[i]; |
| 494 break; | 490 break; |
| 495 } | 491 } |
| 496 } | 492 } |
| 497 return info; | 493 return info; |
| 498 } | 494 } |
| 499 | 495 |
| 500 #if defined(OS_LINUX) | 496 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 501 // static | 497 // static |
| 502 void PluginService::RegisterFilePathWatcher( | 498 void PluginService::RegisterFilePathWatcher( |
| 503 FilePathWatcher *watcher, | 499 FilePathWatcher *watcher, |
| 504 const FilePath& path, | 500 const FilePath& path, |
| 505 FilePathWatcher::Delegate* delegate) { | 501 FilePathWatcher::Delegate* delegate) { |
| 506 bool result = watcher->Watch(path, delegate); | 502 bool result = watcher->Watch(path, delegate); |
| 507 DCHECK(result); | 503 DCHECK(result); |
| 508 } | 504 } |
| 509 #endif | 505 #endif |
| OLD | NEW |