diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc index 655cf4564411ec..02640502b115c5 100644 --- a/chrome/browser/chrome_browser_field_trials.cc +++ b/chrome/browser/chrome_browser_field_trials.cc @@ -31,9 +31,8 @@ ChromeBrowserFieldTrials::ChromeBrowserFieldTrials( ChromeBrowserFieldTrials::~ChromeBrowserFieldTrials() { } -void ChromeBrowserFieldTrials::SetupFieldTrials(PrefService* local_state) { - const base::Time install_time = base::Time::FromTimeT( - local_state->GetInt64(metrics::prefs::kInstallDate)); +void ChromeBrowserFieldTrials::SetupFieldTrials(const base::Time& install_time, + PrefService* local_state) { DCHECK(!install_time.is_null()); // Field trials that are shared by all platforms. @@ -41,11 +40,10 @@ void ChromeBrowserFieldTrials::SetupFieldTrials(PrefService* local_state) { InstantiateDynamicTrials(); #if defined(OS_ANDROID) || defined(OS_IOS) - chrome::SetupMobileFieldTrials( - parsed_command_line_, install_time, local_state); + chrome::SetupMobileFieldTrials(parsed_command_line_); #else chrome::SetupDesktopFieldTrials( - parsed_command_line_, install_time, local_state); + parsed_command_line_, local_state); #endif } diff --git a/chrome/browser/chrome_browser_field_trials.h b/chrome/browser/chrome_browser_field_trials.h index 515b5149b03bff..2ae3d0e73428e7 100644 --- a/chrome/browser/chrome_browser_field_trials.h +++ b/chrome/browser/chrome_browser_field_trials.h @@ -10,14 +10,19 @@ class PrefService; +namespace base { +class Time; +} + class ChromeBrowserFieldTrials { public: explicit ChromeBrowserFieldTrials(const base::CommandLine& command_line); ~ChromeBrowserFieldTrials(); // Called by the browser main sequence to set up Field Trials for this client. - // |local_state| is used to extract properties like install time. - void SetupFieldTrials(PrefService* local_state); + // |local_state| is used to set browser-wide properties. + void SetupFieldTrials(const base::Time& install_time, + PrefService* local_state); private: // Instantiates dynamic trials by querying their state, to ensure they get diff --git a/chrome/browser/chrome_browser_field_trials_desktop.cc b/chrome/browser/chrome_browser_field_trials_desktop.cc index e79ff1f384f957..b3784d6f98c1ba 100644 --- a/chrome/browser/chrome_browser_field_trials_desktop.cc +++ b/chrome/browser/chrome_browser_field_trials_desktop.cc @@ -118,7 +118,6 @@ void SetupPreReadFieldTrial() { } // namespace void SetupDesktopFieldTrials(const CommandLine& parsed_command_line, - const base::Time& install_time, PrefService* local_state) { prerender::ConfigurePrerender(parsed_command_line); AutoLaunchChromeFieldTrial(); diff --git a/chrome/browser/chrome_browser_field_trials_desktop.h b/chrome/browser/chrome_browser_field_trials_desktop.h index 141e01f43fba36..cb31126f0dfb78 100644 --- a/chrome/browser/chrome_browser_field_trials_desktop.h +++ b/chrome/browser/chrome_browser_field_trials_desktop.h @@ -22,7 +22,6 @@ namespace chrome { // platforms. // |local_state| is needed by some other methods called from within this one. void SetupDesktopFieldTrials(const base::CommandLine& parsed_command_line, - const base::Time& install_time, PrefService* local_state); } // namespace chrome diff --git a/chrome/browser/chrome_browser_field_trials_mobile.cc b/chrome/browser/chrome_browser_field_trials_mobile.cc index ac5bc3a2577fe9..3bc52cbd0175dd 100644 --- a/chrome/browser/chrome_browser_field_trials_mobile.cc +++ b/chrome/browser/chrome_browser_field_trials_mobile.cc @@ -72,9 +72,7 @@ void DataCompressionProxyFieldTrials() { } // namespace -void SetupMobileFieldTrials(const CommandLine& parsed_command_line, - const base::Time& install_time, - PrefService* local_state) { +void SetupMobileFieldTrials(const CommandLine& parsed_command_line) { DataCompressionProxyFieldTrials(); #if defined(OS_ANDROID) prerender::ConfigurePrerender(parsed_command_line); diff --git a/chrome/browser/chrome_browser_field_trials_mobile.h b/chrome/browser/chrome_browser_field_trials_mobile.h index dc5f278cbb331e..7fd3c2fe87e429 100644 --- a/chrome/browser/chrome_browser_field_trials_mobile.h +++ b/chrome/browser/chrome_browser_field_trials_mobile.h @@ -20,9 +20,7 @@ namespace chrome { // Add an invocation of your field trial init function to this method, or to // SetupFieldTrials in chrome_browser_field_trials.cc if it is for all // platforms. -void SetupMobileFieldTrials(const base::CommandLine& parsed_command_line, - const base::Time& install_time, - PrefService* local_state); +void SetupMobileFieldTrials(const base::CommandLine& parsed_command_line); } // namespace chrome diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index c97696c16de9d7..6b4db2249ed3e1 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc @@ -104,7 +104,6 @@ #include "chrome/installer/util/google_update_settings.h" #include "components/google/core/browser/google_util.h" #include "components/language_usage_metrics/language_usage_metrics.h" -#include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" #include "components/nacl/browser/nacl_browser.h" #include "components/nacl/browser/nacl_process_host.h" @@ -601,8 +600,9 @@ void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() { if (variations_service) variations_service->CreateTrialsFromSeed(); - // This must be called after the local state is initialized. - browser_field_trials_.SetupFieldTrials(local_state_); + // This must be called after |local_state_| is initialized. + browser_field_trials_.SetupFieldTrials( + base::Time::FromTimeT(metrics->GetInstallDate()), local_state_); // Initialize FieldTrialSynchronizer system. This is a singleton and is used // for posting tasks via base::Bind. Its deleted when it goes out of scope. @@ -937,15 +937,6 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() { // Initialize tracking synchronizer system. tracking_synchronizer_ = new chrome_browser_metrics::TrackingSynchronizer(); - // Now that all preferences have been registered, set the install date - // for the uninstall metrics if this is our first run. This only actually - // gets used if the user has metrics reporting enabled at uninstall time. - int64 install_date = local_state_->GetInt64(metrics::prefs::kInstallDate); - if (install_date == 0) { - local_state_->SetInt64(metrics::prefs::kInstallDate, - base::Time::Now().ToTimeT()); - } - #if defined(OS_MACOSX) // Get the Keychain API to register for distributed notifications on the main // thread, which has a proper CFRunloop, instead of later on the I/O thread, diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index ae2c80ff46cd6a..925421fea799a8 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc @@ -179,6 +179,7 @@ #include "base/threading/platform_thread.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" +#include "base/time/time.h" #include "base/tracked_objects.h" #include "base/values.h" #include "components/metrics/metrics_log.h" @@ -331,6 +332,13 @@ MetricsService::MetricsService(metrics::MetricsStateManager* state_manager, DCHECK(state_manager_); DCHECK(client_); DCHECK(local_state_); + + // Set the install date if this is our first run. + int64 install_date = local_state_->GetInt64(metrics::prefs::kInstallDate); + if (install_date == 0) { + local_state_->SetInt64(metrics::prefs::kInstallDate, + base::Time::Now().ToTimeT()); + } } MetricsService::~MetricsService() {