| Index: chrome/browser/plugin_service.cc
|
| diff --git a/chrome/browser/plugin_service.cc b/chrome/browser/plugin_service.cc
|
| index 1f178d9b327a94d7d3ca57653648bef2e7bf81e2..810d6b7727c0c9f98ef3559b7b65ff43e4667631 100644
|
| --- a/chrome/browser/plugin_service.cc
|
| +++ b/chrome/browser/plugin_service.cc
|
| @@ -56,6 +56,29 @@ static void NotifyPluginsOfActivation() {
|
| }
|
| #endif
|
|
|
| +static void PurgePluginListCache(bool reload_pages) {
|
| + for (RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
|
| + !it.IsAtEnd(); it.Advance()) {
|
| + it.GetCurrentValue()->Send(new ViewMsg_PurgePluginListCache(reload_pages));
|
| + }
|
| +}
|
| +
|
| +#if defined(OS_LINUX)
|
| +// Delegate class for monitoring directories.
|
| +class PluginDirWatcherDelegate : public FilePathWatcher::Delegate {
|
| + virtual void OnFilePathChanged(const FilePath& path) {
|
| + VLOG(1) << "Watched path changed: " << path.value();
|
| + // Make the plugin list update itself
|
| + webkit::npapi::PluginList::Singleton()->RefreshPlugins();
|
| + }
|
| + virtual void OnError() {
|
| + // TODO(pastarmovj): Add some sensible error handling. Maybe silently
|
| + // stopping the watcher would be enough. Or possibly restart it.
|
| + NOTREACHED();
|
| + }
|
| +};
|
| +#endif
|
| +
|
| // static
|
| bool PluginService::enable_chrome_plugins_ = true;
|
|
|
| @@ -120,6 +143,9 @@ PluginService::PluginService()
|
|
|
| chrome::RegisterInternalGPUPlugin();
|
|
|
| + // Start watching for changes in the plugin list. This means watching
|
| + // for changes in the Windows registry keys and on both Windows and POSIX
|
| + // watch for changes in the paths that are expected to contain plugins.
|
| #if defined(OS_WIN)
|
| hkcu_key_.Create(
|
| HKEY_CURRENT_USER, webkit::npapi::kRegistryMozillaPlugins, KEY_NOTIFY);
|
| @@ -143,7 +169,36 @@ PluginService::PluginService()
|
| user_data_dir.Append("Plugins"));
|
| }
|
| #endif
|
| -
|
| +// The FilePathWatcher produces too many false positives on MacOS (access time
|
| +// updates?) which will lead to enforcing updates of the plugins way too often.
|
| +// On ChromeOS the user can't install plugins anyway and on Windows all
|
| +// important plugins register themselves in the registry so no need to do that.
|
| +#if defined(OS_LINUX)
|
| + file_watcher_delegate_ = new PluginDirWatcherDelegate();
|
| + // Get the list of all paths for registering the FilePathWatchers
|
| + // that will track and if needed reload the list of plugins on runtime.
|
| + std::vector<FilePath> plugin_dirs;
|
| + webkit::npapi::PluginList::Singleton()->GetPluginDirectories(
|
| + &plugin_dirs);
|
| +
|
| + for (size_t i = 0; i < plugin_dirs.size(); ++i) {
|
| + FilePathWatcher* watcher = new FilePathWatcher();
|
| + // FilePathWatcher can not handle non-absolute paths under windows.
|
| + // We don't watch for file changes in windows now but if this should ever
|
| + // be extended to Windows these lines might save some time of debugging.
|
| +#if defined(OS_WIN)
|
| + if (!plugin_dirs[i].IsAbsolute())
|
| + continue;
|
| +#endif
|
| + VLOG(1) << "Watching for changes in: " << plugin_dirs[i].value();
|
| + BrowserThread::PostTask(
|
| + BrowserThread::FILE, FROM_HERE,
|
| + NewRunnableFunction(
|
| + &PluginService::RegisterFilePathWatcher,
|
| + watcher, plugin_dirs[i], file_watcher_delegate_));
|
| + file_watchers_.push_back(watcher);
|
| + }
|
| +#endif
|
| registrar_.Add(this, NotificationType::EXTENSION_LOADED,
|
| NotificationService::AllSources());
|
| registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
|
| @@ -302,13 +357,6 @@ bool PluginService::GetFirstAllowedPluginInfo(
|
| #endif
|
| }
|
|
|
| -static void PurgePluginListCache(bool reload_pages) {
|
| - for (RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
|
| - !it.IsAtEnd(); it.Advance()) {
|
| - it.GetCurrentValue()->Send(new ViewMsg_PurgePluginListCache(reload_pages));
|
| - }
|
| -}
|
| -
|
| void PluginService::OnWaitableEventSignaled(
|
| base::WaitableEvent* waitable_event) {
|
| #if defined(OS_WIN)
|
| @@ -320,6 +368,9 @@ void PluginService::OnWaitableEventSignaled(
|
|
|
| webkit::npapi::PluginList::Singleton()->RefreshPlugins();
|
| PurgePluginListCache(true);
|
| +#else
|
| + // This event should only get signaled on a Windows machine.
|
| + NOTREACHED();
|
| #endif // defined(OS_WIN)
|
| }
|
|
|
| @@ -384,7 +435,7 @@ void PluginService::Observe(NotificationType type,
|
| break;
|
| }
|
| default:
|
| - DCHECK(false);
|
| + NOTREACHED();
|
| }
|
| }
|
|
|
| @@ -426,3 +477,14 @@ void PluginService::RegisterPepperPlugins() {
|
| webkit::npapi::PluginList::Singleton()->RegisterInternalPlugin(info);
|
| }
|
| }
|
| +
|
| +#if defined(OS_LINUX)
|
| +// static
|
| +void PluginService::RegisterFilePathWatcher(
|
| + FilePathWatcher *watcher,
|
| + const FilePath& path,
|
| + FilePathWatcher::Delegate* delegate) {
|
| + bool result = watcher->Watch(path, delegate);
|
| + DCHECK(result);
|
| +}
|
| +#endif
|
|
|