summaryrefslogtreecommitdiffstats
path: root/chrome/browser/metrics
diff options
context:
space:
mode:
authorjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-30 23:18:29 +0000
committerjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-30 23:18:29 +0000
commit7f2e792eec4293b56c6eb9a5d014cee9ed612841 (patch)
tree08f30bf750e13bbaff2c3871bb0622137883294c /chrome/browser/metrics
parente6d51160f9cf94237fdb2a25317c20c43eb14b6b (diff)
downloadchromium_src-7f2e792eec4293b56c6eb9a5d014cee9ed612841.zip
chromium_src-7f2e792eec4293b56c6eb9a5d014cee9ed612841.tar.gz
chromium_src-7f2e792eec4293b56c6eb9a5d014cee9ed612841.tar.bz2
Revert 33344 - Relocate plugin list fetching to PluginService
We fetch the plugin list from three places. Previously, each location had custom code to proxy the query to the file thread. This change moves the query to the PluginService, which then internally manages posting to the file thread and calling back. I experimented with some different approaches to handling the lifetimes of the requests and responses. The approach now is simple: The PluginService plugin methods are called and respond on the IO thread. Two of the three consumers of the plugin lists are already on the IO thread, so they don't need any complicated thread handling. None of the callers ever need to cancel their requests: one is a singleton, and the other two always wait (in terms of holding a ref on the object) for the requests to complete. This makes lifetime management a lot simpler than it would otherwise be. With this change in place, I can then look at refactoring the PluginService implementation on Linux to do more complicated plugin loading as needed in bug 17863. BUG=17863 Review URL: http://codereview.chromium.org/437069 TBR=evan@chromium.org Review URL: http://codereview.chromium.org/456012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33369 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/metrics')
-rw-r--r--chrome/browser/metrics/metrics_service.cc57
-rw-r--r--chrome/browser/metrics/metrics_service.h5
2 files changed, 29 insertions, 33 deletions
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
index 82cdeac..5839171 100644
--- a/chrome/browser/metrics/metrics_service.cc
+++ b/chrome/browser/metrics/metrics_service.cc
@@ -174,7 +174,6 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/load_notification_details.h"
#include "chrome/browser/memory_details.h"
-#include "chrome/browser/plugin_service.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/search_engines/template_url_model.h"
@@ -285,38 +284,34 @@ class MetricsMemoryDetails : public MemoryDetails {
DISALLOW_EVIL_CONSTRUCTORS(MetricsMemoryDetails);
};
-// This object and its static functions manage the calls to and from
-// the plugin service. It lives on the IO thread. It only lives long
-// enough to handle the callback, then it deletes itself.
-class GetPluginListClient : public PluginService::GetPluginListClient {
+class MetricsService::GetPluginListTaskComplete : public Task {
public:
- // Call GetPluginList on a GetPluginListClient. Used to proxy this call
- // from the UI thread to the IO thread.
- static void CallGetPluginList(GetPluginListClient* client) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
- PluginService::GetInstance()->GetPluginList(false, client);
+ explicit GetPluginListTaskComplete(
+ const std::vector<WebPluginInfo>& plugins) : plugins_(plugins) { }
+ virtual void Run() {
+ g_browser_process->metrics_service()->OnGetPluginListTaskComplete(plugins_);
}
- // Callback from the PluginService when the plugin list has been retrieved.
- virtual void OnGetPluginList(const std::vector<WebPluginInfo>& plugins) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
- // Forward back to the UI thread.
- ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableFunction(&GetPluginListClient::GetPluginListComplete,
- plugins));
- delete this;
- }
+ private:
+ std::vector<WebPluginInfo> plugins_;
+};
+
+class MetricsService::GetPluginListTask : public Task {
+ public:
+ explicit GetPluginListTask(MessageLoop* callback_loop)
+ : callback_loop_(callback_loop) {}
- // A function to proxy the plugin list back from the IO thread to the UI
- // thread to call the metrics service.
- // |plugins| is intentionally pass by value.
- static void GetPluginListComplete(const std::vector<WebPluginInfo> plugins) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- g_browser_process->metrics_service()->OnGetPluginListComplete(plugins);
+ virtual void Run() {
+ std::vector<WebPluginInfo> plugins;
+ NPAPI::PluginList::Singleton()->GetPlugins(false, &plugins);
+
+ callback_loop_->PostTask(
+ FROM_HERE, new GetPluginListTaskComplete(plugins));
}
-};
+ private:
+ MessageLoop* callback_loop_;
+};
// static
void MetricsService::RegisterPrefs(PrefService* local_state) {
@@ -750,7 +745,7 @@ void MetricsService::InitializeMetricsState() {
ScheduleNextStateSave();
}
-void MetricsService::OnGetPluginListComplete(
+void MetricsService::OnGetPluginListTaskComplete(
const std::vector<WebPluginInfo>& plugins) {
DCHECK(state_ == PLUGIN_LIST_REQUESTED);
plugins_ = plugins;
@@ -831,10 +826,8 @@ void MetricsService::StartRecording() {
// Make sure the plugin list is loaded before the inital log is sent, so
// that the main thread isn't blocked generating the list.
- ChromeThread::PostDelayedTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableFunction(&GetPluginListClient::CallGetPluginList,
- new GetPluginListClient),
+ g_browser_process->file_thread()->message_loop()->PostDelayedTask(FROM_HERE,
+ new GetPluginListTask(MessageLoop::current()),
kInitialInterlogDuration * 1000 / 2);
}
}
diff --git a/chrome/browser/metrics/metrics_service.h b/chrome/browser/metrics/metrics_service.h
index 516dd4c..5e276b2 100644
--- a/chrome/browser/metrics/metrics_service.h
+++ b/chrome/browser/metrics/metrics_service.h
@@ -118,7 +118,7 @@ class MetricsService : public NotificationObserver,
void RecordBreakpadHasDebugger(bool has_debugger);
// Callback to let us knew that the plugin list is warmed up.
- void OnGetPluginListComplete(const std::vector<WebPluginInfo>& plugins);
+ void OnGetPluginListTaskComplete(const std::vector<WebPluginInfo>& plugins);
// Save any unsent logs into a persistent store in a pref. We always do this
// at shutdown, but we can do it as we reduce the list as well.
@@ -149,6 +149,9 @@ class MetricsService : public NotificationObserver,
// Maintain a map of histogram names to the sample stats we've sent.
typedef std::map<std::string, Histogram::SampleSet> LoggedSampleMap;
+ class GetPluginListTask;
+ class GetPluginListTaskComplete;
+
// When we start a new version of Chromium (different from our last run), we
// need to discard the old crash stats so that we don't attribute crashes etc.
// in the old version to the current version (via current logs).