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