Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Unified Diff: chrome/browser/metrics/metrics_service.cc

Issue 7980011: Convert the PluginService interface to be an async wrapper around PluginList. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Ready for review Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/metrics/metrics_service.cc
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
index 60944871c2ddc1a79116ccd3782cdf9134a23f4c..9102c783bb67a2db65321c064e7d559f49a07681 100644
--- a/chrome/browser/metrics/metrics_service.cc
+++ b/chrome/browser/metrics/metrics_service.cc
@@ -187,6 +187,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/render_messages.h"
#include "content/browser/load_notification_details.h"
+#include "content/browser/plugin_service.h"
#include "content/browser/renderer_host/render_process_host.h"
#include "content/common/child_process_info.h"
#include "content/common/notification_service.h"
@@ -323,44 +324,6 @@ class MetricsMemoryDetails : public MemoryDetails {
DISALLOW_COPY_AND_ASSIGN(MetricsMemoryDetails);
};
-class MetricsService::InitTaskComplete : public Task {
- public:
- explicit InitTaskComplete(
- const std::string& hardware_class,
- const std::vector<webkit::WebPluginInfo>& plugins)
- : hardware_class_(hardware_class), plugins_(plugins) {}
-
- virtual void Run() {
- g_browser_process->metrics_service()->OnInitTaskComplete(
- hardware_class_, plugins_);
- }
-
- private:
- std::string hardware_class_;
- std::vector<webkit::WebPluginInfo> plugins_;
-};
-
-class MetricsService::InitTask : public Task {
- public:
- explicit InitTask(MessageLoop* callback_loop)
- : callback_loop_(callback_loop) {}
-
- virtual void Run() {
- std::vector<webkit::WebPluginInfo> plugins;
- webkit::npapi::PluginList::Singleton()->GetPlugins(&plugins);
- std::string hardware_class; // Empty string by default.
-#if defined(OS_CHROMEOS)
- chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic(
- "hardware_class", &hardware_class);
-#endif // OS_CHROMEOS
- callback_loop_->PostTask(FROM_HERE, new InitTaskComplete(
- hardware_class, plugins));
- }
-
- private:
- MessageLoop* callback_loop_;
-};
-
// static
void MetricsService::RegisterPrefs(PrefService* local_state) {
DCHECK(IsSingleThreaded());
@@ -445,6 +408,7 @@ MetricsService::MetricsService()
: recording_active_(false),
reporting_active_(false),
state_(INITIALIZED),
+ init_state_(INIT_SUBTASK_UNSTARTED),
current_fetch_(NULL),
io_thread_(NULL),
idle_since_last_transmission_(false),
@@ -798,15 +762,59 @@ void MetricsService::InitializeMetricsState() {
ScheduleNextStateSave();
}
-void MetricsService::OnInitTaskComplete(
- const std::string& hardware_class,
- const std::vector<webkit::WebPluginInfo>& plugins) {
- DCHECK(state_ == INIT_TASK_SCHEDULED);
+void MetricsService::RunInitTasks() {
+ // Schedules a task on the file thread for execution of slower
+ // initialization steps (such as plugin list generation) necessary
+ // for sending the initial log. This avoids blocking the main UI
+ // thread.
+ BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
+ base::Bind(&MetricsService::InitTaskGetHardwareClass,
+ base::Unretained(this),
+ MessageLoop::current()->message_loop_proxy()));
+
+ PluginService::GetInstance()->GetPlugins(
+ base::Bind(&MetricsService::OnInitTaskGotPluginInfo,
+ base::Unretained(this)));
+}
+
+void MetricsService::InitTaskGetHardwareClass(
+ base::MessageLoopProxy* target_loop) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+
+ std::string hardware_class;
+#if defined(OS_CHROMEOS)
+ chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic(
+ "hardware_class", &hardware_class);
+#endif // OS_CHROMEOS
+
+ target_loop->PostTask(FROM_HERE,
+ base::Bind(&MetricsService::OnInitTaskGotHardwareClass,
+ base::Unretained(this), hardware_class));
+}
+
+void MetricsService::OnInitTaskGotHardwareClass(
+ const std::string& hardware_class) {
hardware_class_ = hardware_class;
+ init_state_ |= INIT_SUBTASK_HWCLASS;
+ OnInitTaskMaybeDone();
+}
+
+void MetricsService::OnInitTaskGotPluginInfo(
+ std::vector<webkit::WebPluginInfo> plugins) {
plugins_ = plugins;
+ init_state_ |= INIT_SUBTASK_PLUGINS;
+ OnInitTaskMaybeDone();
+}
+
+void MetricsService::OnInitTaskMaybeDone() {
+ DCHECK(state_ == INIT_TASK_SCHEDULED);
+ if (state_ != INIT_TASK_SCHEDULED ||
+ (init_state_ & INIT_SUBTASK_ALL) != INIT_SUBTASK_ALL) {
+ return;
+ }
+
io_thread_ = g_browser_process->io_thread();
- if (state_ == INIT_TASK_SCHEDULED)
- state_ = INIT_TASK_DONE;
+ state_ = INIT_TASK_DONE;
}
std::string MetricsService::GenerateClientID() {
@@ -851,12 +859,8 @@ void MetricsService::StartRecording() {
// We only need to schedule that run once.
state_ = INIT_TASK_SCHEDULED;
- // Schedules a task on the file thread for execution of slower
- // initialization steps (such as plugin list generation) necessary
- // for sending the initial log. This avoids blocking the main UI
- // thread.
- g_browser_process->file_thread()->message_loop()->PostDelayedTask(FROM_HERE,
- new InitTask(MessageLoop::current()),
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ base::Bind(&MetricsService::RunInitTasks, base::Unretained(this)),
kInitializationDelaySeconds * 1000);
}
}

Powered by Google App Engine
This is Rietveld 408576698