Index: chrome/browser/plugin_data_remover.cc |
diff --git a/chrome/browser/plugin_data_remover.cc b/chrome/browser/plugin_data_remover.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..299189a840e51a942d725a7df0ac8ce44ce703a8 |
--- /dev/null |
+++ b/chrome/browser/plugin_data_remover.cc |
@@ -0,0 +1,119 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/plugin_data_remover.h" |
+ |
+#include "base/message_loop_proxy.h" |
+#include "chrome/browser/browser_thread.h" |
+#include "chrome/browser/plugin_service.h" |
+#include "chrome/common/plugin_messages.h" |
+#include "ipc/ipc_channel.h" |
+ |
+#if defined(OS_POSIX) |
+#include "ipc/ipc_channel_posix.h" |
+#endif |
+ |
+namespace { |
+const std::string flash_mime_type = "application/x-shockwave-flash"; |
+const int64 timeout_ms = 10000; |
+} |
+ |
+PluginDataRemover::PluginDataRemover() |
+ : channel_(NULL), |
+ method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
+} |
+ |
+PluginDataRemover::~PluginDataRemover() { |
+ DCHECK(!done_task_.get()); |
+ if (!BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, channel_)) |
+ delete channel_; |
+} |
+ |
+void PluginDataRemover::StartRemoving(base::Time begin_time, Task* done_task) { |
+ DCHECK(!done_task_.get()); |
+ begin_time_ = begin_time; |
+ |
+ message_loop_ = base::MessageLoopProxy::CreateForCurrentThread(); |
+ done_task_.reset(done_task); |
+ |
+ PluginService::GetInstance()->OpenChannelToPlugin( |
+ GURL(), flash_mime_type, this); |
+ |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ method_factory_.NewRunnableMethod(&PluginDataRemover::OnTimeout), |
+ timeout_ms); |
+} |
+ |
+int PluginDataRemover::ID() { |
+ // Generate an ID for the browser process. |
+ return ChildProcessInfo::GenerateChildProcessUniqueId(); |
+} |
+ |
+bool PluginDataRemover::OffTheRecord() { |
+ return false; |
+} |
+ |
+void PluginDataRemover::SetPluginInfo(const WebPluginInfo& info) { |
+} |
+ |
+void PluginDataRemover::OnChannelOpened(const IPC::ChannelHandle& handle) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(!channel_); |
+#if defined(OS_POSIX) |
+ // If we received a ChannelHandle, register it now. |
+ if (handle.socket.fd >= 0) |
+ IPC::AddChannelSocket(handle.name, handle.socket.fd); |
+#endif |
+ channel_ = new IPC::Channel(handle.name, IPC::Channel::MODE_CLIENT, this); |
+ if (!channel_->Connect()) { |
+ NOTREACHED() << "Couldn't connect to plugin"; |
+ SignalDone(); |
+ return; |
+ } |
+ |
+ if (!channel_->Send( |
+ new PluginMsg_ClearSiteData(0, std::string(), begin_time_))) { |
+ NOTREACHED() << "Couldn't send ClearSiteData message"; |
+ SignalDone(); |
+ } |
+} |
+ |
+void PluginDataRemover::OnError() { |
+ NOTREACHED() << "Couldn't open plugin channel"; |
+ SignalDone(); |
+} |
+ |
+void PluginDataRemover::OnClearSiteDataResult(bool success) { |
+ DCHECK(success) << "ClearSiteData returned error"; |
+ SignalDone(); |
+} |
+ |
+void PluginDataRemover::OnTimeout() { |
+ NOTREACHED() << "Timed out"; |
+ SignalDone(); |
+} |
+ |
+void PluginDataRemover::OnMessageReceived(const IPC::Message& msg) { |
+ IPC_BEGIN_MESSAGE_MAP(PluginDataRemover, msg) |
+ IPC_MESSAGE_HANDLER(PluginHostMsg_ClearSiteDataResult, |
+ OnClearSiteDataResult) |
+ IPC_MESSAGE_UNHANDLED_ERROR() |
+ IPC_END_MESSAGE_MAP() |
+} |
+ |
+void PluginDataRemover::OnChannelError() { |
+ NOTREACHED() << "Channel error"; |
+ SignalDone(); |
+} |
+ |
+void PluginDataRemover::SignalDone() { |
+ // 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; |
+} |