Chromium Code Reviews| Index: chrome/browser/plugin_data_remover.cc |
| diff --git a/chrome/browser/plugin_data_remover.cc b/chrome/browser/plugin_data_remover.cc |
| index 4415c5f3d6d8755ea962180410c6f424ff245b20..200e7bedaffe91fb3fd1b05c4b412d290bf7e9f5 100644 |
| --- a/chrome/browser/plugin_data_remover.cc |
| +++ b/chrome/browser/plugin_data_remover.cc |
| @@ -5,10 +5,13 @@ |
| #include "chrome/browser/plugin_data_remover.h" |
| #include "base/message_loop_proxy.h" |
| +#include "base/version.h" |
| #include "chrome/browser/browser_thread.h" |
| #include "chrome/browser/plugin_service.h" |
| #include "chrome/common/plugin_messages.h" |
| #include "ipc/ipc_channel.h" |
| +#include "webkit/glue/plugins/plugin_group.h" |
| +#include "webkit/glue/plugins/plugin_list.h" |
| #if defined(OS_POSIX) |
| #include "ipc/ipc_channel_posix.h" |
| @@ -16,6 +19,7 @@ |
| namespace { |
| const std::string flash_mime_type = "application/x-shockwave-flash"; |
| +const std::string min_flash_version = "10.2"; |
|
jam
2010/11/29 17:14:08
these globals don't seem to match our global namin
|
| const int64 timeout_ms = 10000; |
| } |
| @@ -40,8 +44,7 @@ void PluginDataRemover::StartRemoving(base::Time begin_time, Task* done_task) { |
| PluginService::GetInstance()->OpenChannelToPlugin( |
| GURL(), flash_mime_type, this); |
| - BrowserThread::PostDelayedTask( |
| - BrowserThread::IO, |
| + MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| method_factory_.NewRunnableMethod(&PluginDataRemover::OnTimeout), |
| timeout_ms); |
| @@ -110,9 +113,32 @@ void PluginDataRemover::OnChannelError() { |
| } |
| void PluginDataRemover::SignalDone() { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + // This method could be called from the timeout callback while in another |
| + // callback, so we keep a lock while releasing |done_task_|. |
| + AutoLock lock(task_lock_); |
| if (!done_task_.get()) |
| return; |
| message_loop_->PostTask(FROM_HERE, done_task_.release()); |
| message_loop_ = NULL; |
| } |
| + |
| +// static |
| +bool PluginDataRemover::IsSupported() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + bool allow_wildcard = false; |
| + WebPluginInfo plugin; |
| + std::string mime_type; |
| + if (!NPAPI::PluginList::Singleton()->GetPluginInfo(GURL(), |
| + flash_mime_type, |
| + allow_wildcard, |
| + &plugin, |
| + &mime_type)) |
| + return false; |
| + scoped_ptr<Version> version( |
| + PluginGroup::CreateVersionFromString(plugin.version)); |
| + scoped_ptr<Version> min_version( |
| + Version::GetVersionFromString(min_flash_version)); |
| + return plugin.enabled && |
| + version.get() |
| + && min_version->CompareTo(*version) == -1; |
| +} |