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

Side by Side Diff: chrome/browser/chrome_browser_main.cc

Issue 9187011: Set up the field trials before IOThread creation. We can't wait until after all the threads are c... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 8 years, 11 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/chrome_browser_main.h ('k') | tools/valgrind/tsan/suppressions.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chrome_browser_main.h" 5 #include "chrome/browser/chrome_browser_main.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 result_code_(content::RESULT_CODE_NORMAL_EXIT), 575 result_code_(content::RESULT_CODE_NORMAL_EXIT),
576 startup_watcher_(new StartupTimeBomb()), 576 startup_watcher_(new StartupTimeBomb()),
577 shutdown_watcher_(new ShutdownWatcherHelper()), 577 shutdown_watcher_(new ShutdownWatcherHelper()),
578 record_search_engine_(false), 578 record_search_engine_(false),
579 translate_manager_(NULL), 579 translate_manager_(NULL),
580 profile_(NULL), 580 profile_(NULL),
581 run_message_loop_(true), 581 run_message_loop_(true),
582 notify_result_(ProcessSingleton::PROCESS_NONE), 582 notify_result_(ProcessSingleton::PROCESS_NONE),
583 is_first_run_(false), 583 is_first_run_(false),
584 first_run_ui_bypass_(false), 584 first_run_ui_bypass_(false),
585 metrics_(NULL),
586 local_state_(NULL), 585 local_state_(NULL),
587 restart_last_session_(false) { 586 restart_last_session_(false) {
588 // If we're running tests (ui_task is non-null). 587 // If we're running tests (ui_task is non-null).
589 if (parameters.ui_task) 588 if (parameters.ui_task)
590 browser_defaults::enable_help_app = false; 589 browser_defaults::enable_help_app = false;
591 } 590 }
592 591
593 ChromeBrowserMainParts::~ChromeBrowserMainParts() { 592 ChromeBrowserMainParts::~ChromeBrowserMainParts() {
594 for (int i = static_cast<int>(chrome_extra_parts_.size())-1; i >= 0; --i) 593 for (int i = static_cast<int>(chrome_extra_parts_.size())-1; i >= 0; --i)
595 delete chrome_extra_parts_[i]; 594 delete chrome_extra_parts_[i];
596 chrome_extra_parts_.clear(); 595 chrome_extra_parts_.clear();
597 } 596 }
598 597
599 // This will be called after the command-line has been mutated by about:flags 598 // This will be called after the command-line has been mutated by about:flags
600 MetricsService* ChromeBrowserMainParts::SetupMetricsAndFieldTrials( 599 void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() {
601 PrefService* local_state) {
602 // Must initialize metrics after labs have been converted into switches, 600 // Must initialize metrics after labs have been converted into switches,
603 // but before field trials are set up (so that client ID is available for 601 // but before field trials are set up (so that client ID is available for
604 // one-time randomized field trials). 602 // one-time randomized field trials).
605 MetricsService* metrics = InitializeMetrics( 603 #if defined(OS_WIN)
606 parsed_command_line_, local_state); 604 if (parsed_command_line_.HasSwitch(switches::kChromeFrame))
605 MetricsLog::set_version_extension("-F");
606 #elif defined(ARCH_CPU_64_BITS)
607 MetricsLog::set_version_extension("-64");
608 #endif // defined(OS_WIN)
607 609
608 // Initialize FieldTrialList to support FieldTrials that use one-time 610 // Initialize FieldTrialList to support FieldTrials that use one-time
609 // randomization. The client ID will be empty if the user has not opted 611 // randomization. The client ID will be empty if the user has not opted
610 // to send metrics. 612 // to send metrics.
613 MetricsService* metrics = browser_process_->metrics_service();
611 field_trial_list_.reset(new base::FieldTrialList(metrics->GetClientId())); 614 field_trial_list_.reset(new base::FieldTrialList(metrics->GetClientId()));
612 615
613 SetupFieldTrials(metrics->recording_active(), 616 SetupFieldTrials(metrics->recording_active(),
614 local_state->IsManagedPreference( 617 local_state_->IsManagedPreference(
615 prefs::kMaxConnectionsPerProxy)); 618 prefs::kMaxConnectionsPerProxy));
616 619
617 // Initialize FieldTrialSynchronizer system. This is a singleton and is used 620 // Initialize FieldTrialSynchronizer system. This is a singleton and is used
618 // for posting tasks via base::Bind. Its deleted when it goes out of scope. 621 // for posting tasks via base::Bind. Its deleted when it goes out of scope.
619 // Even though base::Bind does AddRef and Release, the object will not be 622 // Even though base::Bind does AddRef and Release, the object will not be
620 // deleted after the Task is executed. 623 // deleted after the Task is executed.
621 field_trial_synchronizer_ = new FieldTrialSynchronizer(); 624 field_trial_synchronizer_ = new FieldTrialSynchronizer();
622
623 return metrics;
624 } 625 }
625 626
626 // This is an A/B test for the maximum number of persistent connections per 627 // This is an A/B test for the maximum number of persistent connections per
627 // host. Currently Chrome, Firefox, and IE8 have this value set at 6. Safari 628 // host. Currently Chrome, Firefox, and IE8 have this value set at 6. Safari
628 // uses 4, and Fasterfox (a plugin for Firefox that supposedly configures it to 629 // uses 4, and Fasterfox (a plugin for Firefox that supposedly configures it to
629 // run faster) uses 8. We would like to see how much of an effect this value has 630 // run faster) uses 8. We would like to see how much of an effect this value has
630 // on browsing. Too large a value might cause us to run into SYN flood detection 631 // on browsing. Too large a value might cause us to run into SYN flood detection
631 // mechanisms. 632 // mechanisms.
632 void ChromeBrowserMainParts::ConnectionFieldTrial() { 633 void ChromeBrowserMainParts::ConnectionFieldTrial() {
633 const base::FieldTrial::Probability kConnectDivisor = 100; 634 const base::FieldTrial::Probability kConnectDivisor = 100;
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 base::FieldTrialList::CreateFieldTrial(kAutoLaunchTrialName, 999 base::FieldTrialList::CreateFieldTrial(kAutoLaunchTrialName,
999 kAutoLaunchTrialAutoLaunchGroup); 1000 kAutoLaunchTrialAutoLaunchGroup);
1000 } else if (auto_launch_trial::IsInControlGroup(brand)) { 1001 } else if (auto_launch_trial::IsInControlGroup(brand)) {
1001 base::FieldTrialList::CreateFieldTrial(kAutoLaunchTrialName, 1002 base::FieldTrialList::CreateFieldTrial(kAutoLaunchTrialName,
1002 kAutoLaunchTrialControlGroup); 1003 kAutoLaunchTrialControlGroup);
1003 } 1004 }
1004 } 1005 }
1005 1006
1006 // ChromeBrowserMainParts: |SetupMetricsAndFieldTrials()| related -------------- 1007 // ChromeBrowserMainParts: |SetupMetricsAndFieldTrials()| related --------------
1007 1008
1008 // Initializes the metrics service with the configuration for this process, 1009 void ChromeBrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled,
1009 // returning the created service (guaranteed non-NULL). 1010 bool proxy_policy_is_set) {
1010 MetricsService* ChromeBrowserMainParts::InitializeMetrics( 1011 // Note: make sure to call ConnectionFieldTrial() before
1011 const CommandLine& parsed_command_line, 1012 // ProxyConnectionsFieldTrial().
1012 const PrefService* local_state) { 1013 ConnectionFieldTrial();
1013 #if defined(OS_WIN) 1014 SocketTimeoutFieldTrial();
1014 if (parsed_command_line.HasSwitch(switches::kChromeFrame)) 1015 // If a policy is defining the number of active connections this field test
1015 MetricsLog::set_version_extension("-F"); 1016 // shoud not be performed.
1016 #elif defined(ARCH_CPU_64_BITS) 1017 if (!proxy_policy_is_set)
1017 MetricsLog::set_version_extension("-64"); 1018 ProxyConnectionsFieldTrial();
1018 #endif // defined(OS_WIN) 1019 prerender::ConfigurePrefetchAndPrerender(parsed_command_line());
1020 InstantFieldTrial::Activate();
1021 SpdyFieldTrial();
1022 ConnectBackupJobsFieldTrial();
1023 WarmConnectionFieldTrial();
1024 PredictorFieldTrial();
1025 DefaultAppsFieldTrial();
1026 AutoLaunchChromeFieldTrial();
1027 sync_promo_trial::Activate();
1028 }
1019 1029
1030 void ChromeBrowserMainParts::StartMetricsRecording() {
1020 MetricsService* metrics = g_browser_process->metrics_service(); 1031 MetricsService* metrics = g_browser_process->metrics_service();
1021 1032 if (parsed_command_line_.HasSwitch(switches::kMetricsRecordingOnly) ||
1022 if (parsed_command_line.HasSwitch(switches::kMetricsRecordingOnly) || 1033 parsed_command_line_.HasSwitch(switches::kEnableBenchmarking)) {
1023 parsed_command_line.HasSwitch(switches::kEnableBenchmarking)) {
1024 // If we're testing then we don't care what the user preference is, we turn 1034 // If we're testing then we don't care what the user preference is, we turn
1025 // on recording, but not reporting, otherwise tests fail. 1035 // on recording, but not reporting, otherwise tests fail.
1026 metrics->StartRecordingOnly(); 1036 metrics->StartRecordingOnly();
1027 return metrics; 1037 return;
1028 } 1038 }
1029 1039
1030 // If the user permits metrics reporting with the checkbox in the 1040 // If the user permits metrics reporting with the checkbox in the
1031 // prefs, we turn on recording. We disable metrics completely for 1041 // prefs, we turn on recording. We disable metrics completely for
1032 // non-official builds. 1042 // non-official builds.
1033 #if defined(GOOGLE_CHROME_BUILD) 1043 #if defined(GOOGLE_CHROME_BUILD)
1034 #if defined(OS_CHROMEOS) 1044 #if defined(OS_CHROMEOS)
1035 bool enabled; 1045 bool enabled;
1036 chromeos::CrosSettings::Get()->GetBoolean(chromeos::kStatsReportingPref, 1046 chromeos::CrosSettings::Get()->GetBoolean(chromeos::kStatsReportingPref,
1037 &enabled); 1047 &enabled);
1038 #else 1048 #else
1039 bool enabled = local_state->GetBoolean(prefs::kMetricsReportingEnabled); 1049 bool enabled = local_state_->GetBoolean(prefs::kMetricsReportingEnabled);
1040 #endif // #if defined(OS_CHROMEOS) 1050 #endif // #if defined(OS_CHROMEOS)
1041 if (enabled) { 1051 if (enabled) {
1042 metrics->Start(); 1052 metrics->Start();
1043 } 1053 }
1044 #endif // defined(GOOGLE_CHROME_BUILD) 1054 #endif // defined(GOOGLE_CHROME_BUILD)
1045
1046 return metrics;
1047 }
1048
1049 void ChromeBrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled,
1050 bool proxy_policy_is_set) {
1051 // Note: make sure to call ConnectionFieldTrial() before
1052 // ProxyConnectionsFieldTrial().
1053 ConnectionFieldTrial();
1054 SocketTimeoutFieldTrial();
1055 // If a policy is defining the number of active connections this field test
1056 // shoud not be performed.
1057 if (!proxy_policy_is_set)
1058 ProxyConnectionsFieldTrial();
1059 prerender::ConfigurePrefetchAndPrerender(parsed_command_line());
1060 InstantFieldTrial::Activate();
1061 SpdyFieldTrial();
1062 ConnectBackupJobsFieldTrial();
1063 WarmConnectionFieldTrial();
1064 PredictorFieldTrial();
1065 DefaultAppsFieldTrial();
1066 AutoLaunchChromeFieldTrial();
1067 sync_promo_trial::Activate();
1068 } 1055 }
1069 1056
1070 // ----------------------------------------------------------------------------- 1057 // -----------------------------------------------------------------------------
1071 // TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts. 1058 // TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts.
1072 1059
1073 #if defined(OS_WIN) 1060 #if defined(OS_WIN)
1074 #define DLLEXPORT __declspec(dllexport) 1061 #define DLLEXPORT __declspec(dllexport)
1075 1062
1076 // We use extern C for the prototype DLLEXPORT to avoid C++ name mangling. 1063 // We use extern C for the prototype DLLEXPORT to avoid C++ name mangling.
1077 extern "C" { 1064 extern "C" {
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 #if defined(OS_MACOSX) 1289 #if defined(OS_MACOSX)
1303 // Get the Keychain API to register for distributed notifications on the main 1290 // Get the Keychain API to register for distributed notifications on the main
1304 // thread, which has a proper CFRunloop, instead of later on the I/O thread, 1291 // thread, which has a proper CFRunloop, instead of later on the I/O thread,
1305 // which doesn't. This ensures those notifications will get delivered 1292 // which doesn't. This ensures those notifications will get delivered
1306 // properly. See issue 37766. 1293 // properly. See issue 37766.
1307 // (Note that the callback mask here is empty. I don't want to register for 1294 // (Note that the callback mask here is empty. I don't want to register for
1308 // any callbacks, I just want to initialize the mechanism.) 1295 // any callbacks, I just want to initialize the mechanism.)
1309 SecKeychainAddCallback(&KeychainCallback, 0, NULL); 1296 SecKeychainAddCallback(&KeychainCallback, 0, NULL);
1310 #endif 1297 #endif
1311 1298
1299 // Now the command line has been mutated based on about:flags, we can setup
1300 // metrics and initialize field trials. The field trials are needed by
1301 // IOThread's initialization which happens in BrowserProcess:PreCreateThreads.
1302 SetupMetricsAndFieldTrials();
1303
1312 // ChromeOS needs ResourceBundle::InitSharedInstance to be called before this. 1304 // ChromeOS needs ResourceBundle::InitSharedInstance to be called before this.
1313 browser_process_->PreCreateThreads(); 1305 browser_process_->PreCreateThreads();
1314 1306
1315 return content::RESULT_CODE_NORMAL_EXIT; 1307 return content::RESULT_CODE_NORMAL_EXIT;
1316 } 1308 }
1317 1309
1318 void ChromeBrowserMainParts::PreMainMessageLoopRun() { 1310 void ChromeBrowserMainParts::PreMainMessageLoopRun() {
1319 result_code_ = PreMainMessageLoopRunImpl(); 1311 result_code_ = PreMainMessageLoopRunImpl();
1320 1312
1321 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1313 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
(...skipping 25 matching lines...) Expand all
1347 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1339 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1348 chrome_extra_parts_[i]->PreBrowserStart(); 1340 chrome_extra_parts_[i]->PreBrowserStart();
1349 } 1341 }
1350 1342
1351 void ChromeBrowserMainParts::PostBrowserStart() { 1343 void ChromeBrowserMainParts::PostBrowserStart() {
1352 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1344 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1353 chrome_extra_parts_[i]->PostBrowserStart(); 1345 chrome_extra_parts_[i]->PostBrowserStart();
1354 } 1346 }
1355 1347
1356 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { 1348 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
1357 // Now the command line has been mutated based on about:flags, 1349 // Now that the file thread has been started, start recording.
1358 // and the file thread has been started, we can set up metrics 1350 StartMetricsRecording();
1359 // and initialize field trials.
1360 metrics_ = SetupMetricsAndFieldTrials(local_state_);
1361 1351
1362 #if defined(USE_LINUX_BREAKPAD) 1352 #if defined(USE_LINUX_BREAKPAD)
1363 // Needs to be called after we have chrome::DIR_USER_DATA and 1353 // Needs to be called after we have chrome::DIR_USER_DATA and
1364 // g_browser_process. This happens in PreCreateThreads. 1354 // g_browser_process. This happens in PreCreateThreads.
1365 BrowserThread::PostTask(BrowserThread::FILE, 1355 BrowserThread::PostTask(BrowserThread::FILE,
1366 FROM_HERE, 1356 FROM_HERE,
1367 base::Bind(&GetLinuxDistroCallback)); 1357 base::Bind(&GetLinuxDistroCallback));
1368 1358
1369 if (IsCrashReportingEnabled(local_state_)) 1359 if (IsCrashReportingEnabled(local_state_))
1370 InitCrashReporter(); 1360 InitCrashReporter();
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1666 1656
1667 #if defined(OS_WIN) && !defined(GOOGLE_CHROME_BUILD) 1657 #if defined(OS_WIN) && !defined(GOOGLE_CHROME_BUILD)
1668 if (parsed_command_line().HasSwitch(switches::kDebugPrint)) { 1658 if (parsed_command_line().HasSwitch(switches::kDebugPrint)) {
1669 FilePath path = 1659 FilePath path =
1670 parsed_command_line().GetSwitchValuePath(switches::kDebugPrint); 1660 parsed_command_line().GetSwitchValuePath(switches::kDebugPrint);
1671 printing::PrintedDocument::set_debug_dump_path(path); 1661 printing::PrintedDocument::set_debug_dump_path(path);
1672 } 1662 }
1673 #endif 1663 #endif
1674 1664
1675 HandleTestParameters(parsed_command_line()); 1665 HandleTestParameters(parsed_command_line());
1676 RecordBreakpadStatusUMA(metrics_); 1666 RecordBreakpadStatusUMA(browser_process_->metrics_service());
1677 about_flags::RecordUMAStatistics(local_state_); 1667 about_flags::RecordUMAStatistics(local_state_);
1678 LanguageUsageMetrics::RecordAcceptLanguages( 1668 LanguageUsageMetrics::RecordAcceptLanguages(
1679 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); 1669 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
1680 LanguageUsageMetrics::RecordApplicationLanguage( 1670 LanguageUsageMetrics::RecordApplicationLanguage(
1681 browser_process_->GetApplicationLocale()); 1671 browser_process_->GetApplicationLocale());
1682 1672
1683 #if defined(OS_WIN) 1673 #if defined(OS_WIN)
1684 fragmentation_checker::RecordFragmentationMetricForCurrentModule(); 1674 fragmentation_checker::RecordFragmentationMetricForCurrentModule();
1685 #endif 1675 #endif
1686 1676
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1960 if (base::win::GetVersion() <= base::win::VERSION_XP) 1950 if (base::win::GetVersion() <= base::win::VERSION_XP)
1961 uma_name += "_XP"; 1951 uma_name += "_XP";
1962 1952
1963 uma_name += "_PreRead"; 1953 uma_name += "_PreRead";
1964 uma_name += pre_read == "1" ? "Enabled" : "Disabled"; 1954 uma_name += pre_read == "1" ? "Enabled" : "Disabled";
1965 AddPreReadHistogramTime(uma_name.c_str(), time); 1955 AddPreReadHistogramTime(uma_name.c_str(), time);
1966 } 1956 }
1967 #endif 1957 #endif
1968 #endif 1958 #endif
1969 } 1959 }
OLDNEW
« no previous file with comments | « chrome/browser/chrome_browser_main.h ('k') | tools/valgrind/tsan/suppressions.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698