Index: chrome/browser/plugin_data_remover.cc |
diff --git a/chrome/browser/plugin_data_remover.cc b/chrome/browser/plugin_data_remover.cc |
index a171ac77cc545d73b7b7b196e4c3596a34dfe0b3..89e0ecec103a09bacda4cdeb424caa581bdbdc41 100644 |
--- a/chrome/browser/plugin_data_remover.cc |
+++ b/chrome/browser/plugin_data_remover.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 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. |
@@ -29,7 +29,9 @@ const uint64 kClearAllData = 0; |
} // namespace |
PluginDataRemover::PluginDataRemover() |
- : is_removing_(false), |
+ : mime_type_(kFlashMimeType), |
+ is_removing_(false), |
+ event_(new base::WaitableEvent(true, false)), |
channel_(NULL) { } |
PluginDataRemover::~PluginDataRemover() { |
@@ -38,25 +40,37 @@ PluginDataRemover::~PluginDataRemover() { |
BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, channel_); |
} |
-void PluginDataRemover::StartRemoving(base::Time begin_time, Task* done_task) { |
- DCHECK(!done_task_.get()); |
+base::WaitableEvent* PluginDataRemover::StartRemoving( |
+ const base::Time& begin_time) { |
DCHECK(!is_removing_); |
remove_start_time_ = base::Time::Now(); |
begin_time_ = begin_time; |
- message_loop_ = base::MessageLoopProxy::CreateForCurrentThread(); |
- done_task_.reset(done_task); |
is_removing_ = true; |
AddRef(); |
PluginService::GetInstance()->OpenChannelToPlugin( |
- GURL(), kFlashMimeType, this); |
+ GURL(), mime_type_, this); |
BrowserThread::PostDelayedTask( |
BrowserThread::IO, |
FROM_HERE, |
NewRunnableMethod(this, &PluginDataRemover::OnTimeout), |
kRemovalTimeoutMs); |
+ |
+ return event_.get(); |
+} |
+ |
+void PluginDataRemover::Wait() { |
+ base::Time start_time(base::Time::Now()); |
+ bool result = true; |
+ if (is_removing_) |
+ result = event_->Wait(); |
+ UMA_HISTOGRAM_TIMES("ClearPluginData.wait_at_shutdown", |
+ base::Time::Now() - start_time); |
+ UMA_HISTOGRAM_TIMES("ClearPluginData.time_at_shutdown", |
+ base::Time::Now() - remove_start_time_); |
+ DCHECK(result) << "Error waiting for plugin process"; |
} |
int PluginDataRemover::ID() { |
@@ -87,7 +101,7 @@ void PluginDataRemover::ConnectToChannel(const IPC::ChannelHandle& handle) { |
DCHECK(!channel_); |
channel_ = new IPC::Channel(handle, IPC::Channel::MODE_CLIENT, this); |
if (!channel_->Connect()) { |
- LOG(DFATAL) << "Couldn't connect to plugin"; |
+ NOTREACHED() << "Couldn't connect to plugin"; |
SignalDone(); |
return; |
} |
@@ -96,27 +110,27 @@ void PluginDataRemover::ConnectToChannel(const IPC::ChannelHandle& handle) { |
new PluginMsg_ClearSiteData(std::string(), |
kClearAllData, |
begin_time_))) { |
- LOG(DFATAL) << "Couldn't send ClearSiteData message"; |
+ NOTREACHED() << "Couldn't send ClearSiteData message"; |
SignalDone(); |
+ return; |
} |
} |
void PluginDataRemover::OnError() { |
- NOTREACHED() << "Couldn't open plugin channel"; |
+ LOG(DFATAL) << "Couldn't open plugin channel"; |
SignalDone(); |
Release(); |
} |
void PluginDataRemover::OnClearSiteDataResult(bool success) { |
- if (!success) |
- LOG(DFATAL) << "ClearSiteData returned error"; |
+ LOG_IF(DFATAL, !success) << "ClearSiteData returned error"; |
UMA_HISTOGRAM_TIMES("ClearPluginData.time", |
base::Time::Now() - remove_start_time_); |
SignalDone(); |
} |
void PluginDataRemover::OnTimeout() { |
- NOTREACHED() << "Timed out"; |
+ LOG_IF(DFATAL, is_removing_) << "Timed out"; |
SignalDone(); |
} |
@@ -131,8 +145,10 @@ bool PluginDataRemover::OnMessageReceived(const IPC::Message& msg) { |
} |
void PluginDataRemover::OnChannelError() { |
- LOG(DFATAL) << "Channel error"; |
- SignalDone(); |
+ if (is_removing_) { |
+ NOTREACHED() << "Channel error"; |
+ SignalDone(); |
+ } |
} |
void PluginDataRemover::SignalDone() { |
@@ -140,10 +156,7 @@ void PluginDataRemover::SignalDone() { |
if (!is_removing_) |
return; |
is_removing_ = false; |
- if (done_task_.get()) { |
- message_loop_->PostTask(FROM_HERE, done_task_.release()); |
- message_loop_ = NULL; |
- } |
+ event_->Signal(); |
} |
// static |