| 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";
|
| 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;
|
| +}
|
|
|