summaryrefslogtreecommitdiffstats
path: root/chrome/browser/plugin_data_remover.cc
diff options
context:
space:
mode:
authorbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-21 10:27:18 +0000
committerbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-21 10:27:18 +0000
commitc7d58d6889f8c8c1a676593cae355326170522d0 (patch)
tree1dd70fb826fb4015321d767dc4bfc26dc1a59a8a /chrome/browser/plugin_data_remover.cc
parent31c1959a53e1ae65660cf1284c46c8d944591c89 (diff)
downloadchromium_src-c7d58d6889f8c8c1a676593cae355326170522d0.zip
chromium_src-c7d58d6889f8c8c1a676593cae355326170522d0.tar.gz
chromium_src-c7d58d6889f8c8c1a676593cae355326170522d0.tar.bz2
When clearing plugin data at shutdown, wait for it to finish.
Also, Add some browser tests for clearing plugin data and enable npapi_test_plugin on 64-bit Linux; apparently it's been fixed. BUG=58235, 18337, 26625 TEST=PluginDataRemoverTest.* Review URL: http://codereview.chromium.org/6308001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72123 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/plugin_data_remover.cc')
-rw-r--r--chrome/browser/plugin_data_remover.cc51
1 files changed, 32 insertions, 19 deletions
diff --git a/chrome/browser/plugin_data_remover.cc b/chrome/browser/plugin_data_remover.cc
index a171ac7..89e0ece 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