Index: chrome/browser/metrics/metrics_services_manager.cc |
diff --git a/chrome/browser/metrics/metrics_services_manager.cc b/chrome/browser/metrics/metrics_services_manager.cc |
index 40790a522b0ed7bcebd4cda68a28bdc484a351f6..9c7c5013f459721e243c17b2353cca6eef5d395b 100644 |
--- a/chrome/browser/metrics/metrics_services_manager.cc |
+++ b/chrome/browser/metrics/metrics_services_manager.cc |
@@ -4,18 +4,43 @@ |
#include "chrome/browser/metrics/metrics_services_manager.h" |
+#include <string> |
+ |
+#include "base/command_line.h" |
#include "base/logging.h" |
-#include "chrome/browser/metrics/metrics_services_manager_client.h" |
+#include "base/prefs/pref_service.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" |
+#include "chrome/browser/metrics/chrome_metrics_service_client.h" |
+#include "chrome/browser/metrics/metrics_reporting_state.h" |
+#include "chrome/browser/metrics/variations/chrome_variations_service_client.h" |
+#include "chrome/browser/metrics/variations/ui_string_overrider_factory.h" |
+#include "chrome/browser/ui/browser_otr_state.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/installer/util/google_update_settings.h" |
#include "components/metrics/metrics_service.h" |
-#include "components/metrics/metrics_service_client.h" |
#include "components/metrics/metrics_state_manager.h" |
#include "components/rappor/rappor_service.h" |
#include "components/variations/service/variations_service.h" |
+#include "content/public/browser/browser_thread.h" |
-MetricsServicesManager::MetricsServicesManager( |
- scoped_ptr<MetricsServicesManagerClient> client) |
- : client_(client.Pass()), may_upload_(false), may_record_(false) { |
- DCHECK(client_); |
+#if defined(OS_CHROMEOS) |
+#include "chrome/browser/chromeos/settings/cros_settings.h" |
+#endif |
+ |
+// Posts |GoogleUpdateSettings::StoreMetricsClientInfo| on blocking pool thread |
+// because it needs access to IO and cannot work from UI thread. |
+void PostStoreMetricsClientInfo(const metrics::ClientInfo& client_info) { |
+ content::BrowserThread::GetBlockingPool()->PostTask(FROM_HERE, |
+ base::Bind(&GoogleUpdateSettings::StoreMetricsClientInfo, client_info)); |
+} |
+ |
+MetricsServicesManager::MetricsServicesManager(PrefService* local_state) |
+ : local_state_(local_state), |
+ may_upload_(false), |
+ may_record_(false) { |
+ DCHECK(local_state); |
} |
MetricsServicesManager::~MetricsServicesManager() { |
@@ -23,36 +48,72 @@ |
metrics::MetricsService* MetricsServicesManager::GetMetricsService() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- return GetMetricsServiceClient()->GetMetricsService(); |
+ return GetChromeMetricsServiceClient()->metrics_service(); |
} |
rappor::RapporService* MetricsServicesManager::GetRapporService() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (!rappor_service_) { |
- rappor_service_ = client_->CreateRapporService(); |
- rappor_service_->Initialize(client_->GetURLRequestContext()); |
+ rappor_service_.reset(new rappor::RapporService( |
+ local_state_, base::Bind(&chrome::IsOffTheRecordSessionActive))); |
+ rappor_service_->Initialize(g_browser_process->system_request_context()); |
} |
return rappor_service_.get(); |
} |
variations::VariationsService* MetricsServicesManager::GetVariationsService() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!variations_service_) |
- variations_service_ = client_->CreateVariationsService(); |
+ if (!variations_service_) { |
+ variations_service_ = variations::VariationsService::Create( |
+ make_scoped_ptr(new ChromeVariationsServiceClient()), local_state_, |
+ GetMetricsStateManager(), switches::kDisableBackgroundNetworking, |
+ chrome_variations::CreateUIStringOverrider()); |
+ } |
return variations_service_.get(); |
} |
void MetricsServicesManager::OnPluginLoadingError( |
const base::FilePath& plugin_path) { |
- GetMetricsServiceClient()->OnPluginLoadingError(plugin_path); |
+ GetChromeMetricsServiceClient()->LogPluginLoadingError(plugin_path); |
} |
-metrics::MetricsServiceClient* |
-MetricsServicesManager::GetMetricsServiceClient() { |
+ChromeMetricsServiceClient* |
+MetricsServicesManager::GetChromeMetricsServiceClient() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!metrics_service_client_) |
- metrics_service_client_ = client_->CreateMetricsServiceClient(); |
+ if (!metrics_service_client_) { |
+ metrics_service_client_ = ChromeMetricsServiceClient::Create( |
+ GetMetricsStateManager(), local_state_); |
+ } |
return metrics_service_client_.get(); |
+} |
+ |
+metrics::MetricsStateManager* MetricsServicesManager::GetMetricsStateManager() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!metrics_state_manager_) { |
+ metrics_state_manager_ = metrics::MetricsStateManager::Create( |
+ local_state_, |
+ base::Bind( |
+ &ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled), |
+ base::Bind(&PostStoreMetricsClientInfo), |
+ base::Bind(&GoogleUpdateSettings::LoadMetricsClientInfo)); |
+ } |
+ return metrics_state_manager_.get(); |
+} |
+ |
+bool MetricsServicesManager::GetSafeBrowsingState() { |
+ // Start listening for updates to SB service state. This is done here instead |
+ // of in the constructor to avoid errors from trying to instantiate SB |
+ // service before the IO thread exists. |
+ SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); |
+ if (!sb_state_subscription_ && sb_service) { |
+ // base::Unretained(this) is safe here since this object owns the |
+ // sb_state_subscription_ which owns the pointer. |
+ sb_state_subscription_ = sb_service->RegisterStateCallback( |
+ base::Bind(&MetricsServicesManager::UpdateRunningServices, |
+ base::Unretained(this))); |
+ } |
+ |
+ return sb_service && sb_service->enabled_by_prefs(); |
} |
void MetricsServicesManager::UpdatePermissions(bool may_record, |
@@ -71,7 +132,13 @@ |
DCHECK(thread_checker_.CalledOnValidThread()); |
metrics::MetricsService* metrics = GetMetricsService(); |
- if (client_->OnlyDoMetricsRecording()) { |
+ const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); |
+ |
+ const bool only_do_metrics_recording = |
+ cmdline->HasSwitch(switches::kMetricsRecordingOnly) || |
+ cmdline->HasSwitch(switches::kEnableBenchmarking); |
+ |
+ if (only_do_metrics_recording) { |
metrics->StartRecordingForTests(); |
GetRapporService()->Update( |
rappor::UMA_RAPPOR_GROUP | rappor::SAFEBROWSING_RAPPOR_GROUP, |
@@ -95,20 +162,14 @@ |
#if defined(GOOGLE_CHROME_BUILD) |
if (may_record_) |
recording_groups |= rappor::UMA_RAPPOR_GROUP; |
- |
- // NOTE: It is safe to use a raw pointer to |this| because this object owns |
- // |client_|, and the contract of |
- // MetricsServicesManagerClient::IsSafeBrowsingEnabled() states that the |
- // callback passed in must not be used beyond the lifetime of the client |
- // instance. |
- base::Closure on_safe_browsing_update_callback = base::Bind( |
- &MetricsServicesManager::UpdateRunningServices, base::Unretained(this)); |
- if (client_->IsSafeBrowsingEnabled(on_safe_browsing_update_callback) |
+ if (GetSafeBrowsingState()) |
recording_groups |= rappor::SAFEBROWSING_RAPPOR_GROUP; |
#endif // defined(GOOGLE_CHROME_BUILD) |
GetRapporService()->Update(recording_groups, may_upload_); |
} |
void MetricsServicesManager::UpdateUploadPermissions(bool may_upload) { |
- return UpdatePermissions(client_->IsMetricsReportingEnabled(), may_upload); |
+ return UpdatePermissions( |
+ ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled(), |
+ may_upload); |
} |