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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c6023893e86c41a5685f1ba9c957ed381442519b |
| --- /dev/null |
| +++ b/chrome/browser/plugin_data_remover.cc |
| @@ -0,0 +1,115 @@ |
| +// 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. |
| + static int id = ChildProcessInfo::GenerateChildProcessUniqueId(); |
|
jam
2010/11/12 20:44:58
i think there could be race conditions if two of t
|
| + return id; |
| +} |
| + |
| +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() { |
| + message_loop_->PostTask(FROM_HERE, done_task_.release()); |
| + message_loop_ = NULL; |
| +} |