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

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

Issue 2253953003: Disable AutoImport: experiment and histogram for analysis. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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
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 <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 15 matching lines...) Expand all
26 #include "base/logging.h" 26 #include "base/logging.h"
27 #include "base/memory/ptr_util.h" 27 #include "base/memory/ptr_util.h"
28 #include "base/metrics/field_trial.h" 28 #include "base/metrics/field_trial.h"
29 #include "base/metrics/histogram_macros.h" 29 #include "base/metrics/histogram_macros.h"
30 #include "base/path_service.h" 30 #include "base/path_service.h"
31 #include "base/profiler/scoped_tracker.h" 31 #include "base/profiler/scoped_tracker.h"
32 #include "base/run_loop.h" 32 #include "base/run_loop.h"
33 #include "base/strings/string_number_conversions.h" 33 #include "base/strings/string_number_conversions.h"
34 #include "base/strings/string_piece.h" 34 #include "base/strings/string_piece.h"
35 #include "base/strings/string_split.h" 35 #include "base/strings/string_split.h"
36 #include "base/strings/string_util.h"
36 #include "base/strings/sys_string_conversions.h" 37 #include "base/strings/sys_string_conversions.h"
37 #include "base/strings/utf_string_conversions.h" 38 #include "base/strings/utf_string_conversions.h"
38 #include "base/sys_info.h" 39 #include "base/sys_info.h"
39 #include "base/task_scheduler/scheduler_worker_pool_params.h" 40 #include "base/task_scheduler/scheduler_worker_pool_params.h"
40 #include "base/task_scheduler/switches.h" 41 #include "base/task_scheduler/switches.h"
41 #include "base/task_scheduler/task_scheduler.h" 42 #include "base/task_scheduler/task_scheduler.h"
42 #include "base/task_scheduler/task_traits.h" 43 #include "base/task_scheduler/task_traits.h"
43 #include "base/threading/platform_thread.h" 44 #include "base/threading/platform_thread.h"
44 #include "base/time/default_tick_clock.h" 45 #include "base/time/default_tick_clock.h"
45 #include "base/time/time.h" 46 #include "base/time/time.h"
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 #include "chromeos/settings/cros_settings_names.h" 199 #include "chromeos/settings/cros_settings_names.h"
199 #endif // defined(OS_CHROMEOS) 200 #endif // defined(OS_CHROMEOS)
200 201
201 // TODO(port): several win-only methods have been pulled out of this, but 202 // TODO(port): several win-only methods have been pulled out of this, but
202 // BrowserMain() as a whole needs to be broken apart so that it's usable by 203 // BrowserMain() as a whole needs to be broken apart so that it's usable by
203 // other platforms. For now, it's just a stub. This is a serious work in 204 // other platforms. For now, it's just a stub. This is a serious work in
204 // progress and should not be taken as an indication of a real refactoring. 205 // progress and should not be taken as an indication of a real refactoring.
205 206
206 #if defined(OS_WIN) 207 #if defined(OS_WIN)
207 #include "base/trace_event/trace_event_etw_export_win.h" 208 #include "base/trace_event/trace_event_etw_export_win.h"
209 #include "base/win/win_util.h"
208 #include "base/win/windows_version.h" 210 #include "base/win/windows_version.h"
209 #include "chrome/app/file_pre_reader_win.h" 211 #include "chrome/app/file_pre_reader_win.h"
210 #include "chrome/browser/chrome_browser_main_win.h" 212 #include "chrome/browser/chrome_browser_main_win.h"
211 #include "chrome/browser/component_updater/caps_installer_win.h" 213 #include "chrome/browser/component_updater/caps_installer_win.h"
212 #include "chrome/browser/component_updater/sw_reporter_installer_win.h" 214 #include "chrome/browser/component_updater/sw_reporter_installer_win.h"
213 #include "chrome/browser/downgrade/user_data_downgrade.h" 215 #include "chrome/browser/downgrade/user_data_downgrade.h"
214 #include "chrome/browser/first_run/try_chrome_dialog_view.h" 216 #include "chrome/browser/first_run/try_chrome_dialog_view.h"
215 #include "chrome/browser/first_run/upgrade_util_win.h" 217 #include "chrome/browser/first_run/upgrade_util_win.h"
216 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" 218 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
217 #include "chrome/browser/ui/network_profile_bubble.h" 219 #include "chrome/browser/ui/network_profile_bubble.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 285
284 #if defined(OS_WIN) || defined(OS_MACOSX) || \ 286 #if defined(OS_WIN) || defined(OS_MACOSX) || \
285 (defined(OS_LINUX) && !defined(OS_CHROMEOS)) 287 (defined(OS_LINUX) && !defined(OS_CHROMEOS))
286 #include "chrome/browser/metrics/desktop_engagement/desktop_engagement_service.h " 288 #include "chrome/browser/metrics/desktop_engagement/desktop_engagement_service.h "
287 #endif 289 #endif
288 290
289 using content::BrowserThread; 291 using content::BrowserThread;
290 292
291 namespace { 293 namespace {
292 294
295 // feature used to remove AutoImport on first run is default-off
296 const base::Feature kFirstRunAutoImport{"FirstRunAutoImport",
manzagop (departed) 2016/08/18 15:59:56 I'd call it DisableFirstRunAutoImport, so it's acc
gcomanici 2016/08/19 16:04:30 Done.
297 base::FEATURE_DISABLED_BY_DEFAULT};
298
293 // A provider of Geolocation services to override AccessTokenStore. 299 // A provider of Geolocation services to override AccessTokenStore.
294 class ChromeGeolocationDelegate : public device::GeolocationDelegate { 300 class ChromeGeolocationDelegate : public device::GeolocationDelegate {
295 public: 301 public:
296 ChromeGeolocationDelegate() = default; 302 ChromeGeolocationDelegate() = default;
297 303
298 scoped_refptr<device::AccessTokenStore> CreateAccessTokenStore() final { 304 scoped_refptr<device::AccessTokenStore> CreateAccessTokenStore() final {
299 return new ChromeAccessTokenStore(); 305 return new ChromeAccessTokenStore();
300 } 306 }
301 307
302 private: 308 private:
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 // |pool_descriptor| is a semi-colon separated value string with the following 349 // |pool_descriptor| is a semi-colon separated value string with the following
344 // items: 350 // items:
345 // 1. Minimum Thread Count (int) 351 // 1. Minimum Thread Count (int)
346 // 2. Maximum Thread Count (int) 352 // 2. Maximum Thread Count (int)
347 // 3. Thread Count Multiplier (double) 353 // 3. Thread Count Multiplier (double)
348 // 4. Thread Count Offset (int) 354 // 4. Thread Count Offset (int)
349 // 5. Detach Time in Milliseconds (milliseconds) 355 // 5. Detach Time in Milliseconds (milliseconds)
350 // Additional values may appear as necessary and will be ignored. 356 // Additional values may appear as necessary and will be ignored.
351 WorkerPoolVariationValues StringToWorkerPoolVariationValues( 357 WorkerPoolVariationValues StringToWorkerPoolVariationValues(
352 const base::StringPiece pool_descriptor) { 358 const base::StringPiece pool_descriptor) {
353 const std::vector<std::string> tokens = 359 const std::vector<std::string> tokens = SplitString(
354 SplitString(pool_descriptor, ";", 360 pool_descriptor, ";", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
355 base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
356 int minimum; 361 int minimum;
357 int maximum; 362 int maximum;
358 double multiplier; 363 double multiplier;
359 int offset; 364 int offset;
360 int detach_milliseconds; 365 int detach_milliseconds;
361 // Checking for a size greater than the expected amount allows us to be 366 // Checking for a size greater than the expected amount allows us to be
362 // forward compatible if we add more variation values. 367 // forward compatible if we add more variation values.
363 if (tokens.size() >= 5 && 368 if (tokens.size() >= 5 && base::StringToInt(tokens[0], &minimum) &&
364 base::StringToInt(tokens[0], &minimum) &&
365 base::StringToInt(tokens[1], &maximum) && 369 base::StringToInt(tokens[1], &maximum) &&
366 base::StringToDouble(tokens[2], &multiplier) && 370 base::StringToDouble(tokens[2], &multiplier) &&
367 base::StringToInt(tokens[3], &offset) && 371 base::StringToInt(tokens[3], &offset) &&
368 base::StringToInt(tokens[4], &detach_milliseconds)) { 372 base::StringToInt(tokens[4], &detach_milliseconds)) {
369 const int num_of_cores = base::SysInfo::NumberOfProcessors(); 373 const int num_of_cores = base::SysInfo::NumberOfProcessors();
370 const int threads = std::ceil<int>(num_of_cores * multiplier) + offset; 374 const int threads = std::ceil<int>(num_of_cores * multiplier) + offset;
371 WorkerPoolVariationValues values; 375 WorkerPoolVariationValues values;
372 values.threads = std::min(maximum, std::max(minimum, threads)); 376 values.threads = std::min(maximum, std::max(minimum, threads));
373 values.detach_period = 377 values.detach_period =
374 base::TimeDelta::FromMilliseconds(detach_milliseconds); 378 base::TimeDelta::FromMilliseconds(detach_milliseconds);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 } 411 }
408 412
409 using ThreadPriority = base::ThreadPriority; 413 using ThreadPriority = base::ThreadPriority;
410 using IORestriction = base::SchedulerWorkerPoolParams::IORestriction; 414 using IORestriction = base::SchedulerWorkerPoolParams::IORestriction;
411 struct SchedulerWorkerPoolPredefinedParams { 415 struct SchedulerWorkerPoolPredefinedParams {
412 const char* name; 416 const char* name;
413 ThreadPriority priority_hint; 417 ThreadPriority priority_hint;
414 IORestriction io_restriction; 418 IORestriction io_restriction;
415 }; 419 };
416 static const SchedulerWorkerPoolPredefinedParams kAllPredefinedParams[] = { 420 static const SchedulerWorkerPoolPredefinedParams kAllPredefinedParams[] = {
417 {"Background", ThreadPriority::BACKGROUND, IORestriction::DISALLOWED}, 421 {"Background", ThreadPriority::BACKGROUND, IORestriction::DISALLOWED},
418 {"BackgroundFileIO", ThreadPriority::BACKGROUND, IORestriction::ALLOWED}, 422 {"BackgroundFileIO", ThreadPriority::BACKGROUND, IORestriction::ALLOWED},
419 {"Foreground", ThreadPriority::NORMAL, IORestriction::DISALLOWED}, 423 {"Foreground", ThreadPriority::NORMAL, IORestriction::DISALLOWED},
420 {"ForegroundFileIO", ThreadPriority::NORMAL, IORestriction::ALLOWED}, 424 {"ForegroundFileIO", ThreadPriority::NORMAL, IORestriction::ALLOWED},
421 }; 425 };
422 static_assert(arraysize(kAllPredefinedParams) == WORKER_POOL_COUNT, 426 static_assert(arraysize(kAllPredefinedParams) == WORKER_POOL_COUNT,
423 "Mismatched Worker Pool Types and Predefined Parameters"); 427 "Mismatched Worker Pool Types and Predefined Parameters");
424 428
425 std::vector<base::SchedulerWorkerPoolParams> params_vector; 429 std::vector<base::SchedulerWorkerPoolParams> params_vector;
426 for (const auto& predefined_params : kAllPredefinedParams) { 430 for (const auto& predefined_params : kAllPredefinedParams) {
427 const auto pair = variation_params.find(predefined_params.name); 431 const auto pair = variation_params.find(predefined_params.name);
428 if (pair == variation_params.end()) { 432 if (pair == variation_params.end()) {
429 DLOG(ERROR) << "Missing Worker Pool Configuration: " 433 DLOG(ERROR) << "Missing Worker Pool Configuration: "
430 << predefined_params.name; 434 << predefined_params.name;
431 return; 435 return;
432 } 436 }
433 437
434 const WorkerPoolVariationValues variation_values = 438 const WorkerPoolVariationValues variation_values =
435 StringToWorkerPoolVariationValues(pair->second); 439 StringToWorkerPoolVariationValues(pair->second);
436 440
437 if (variation_values.threads <= 0 || 441 if (variation_values.threads <= 0 ||
438 variation_values.detach_period.is_zero()) { 442 variation_values.detach_period.is_zero()) {
439 DLOG(ERROR) << "Invalid Worker Pool Configuration: " << 443 DLOG(ERROR) << "Invalid Worker Pool Configuration: "
440 predefined_params.name << " [" << pair->second << "]"; 444 << predefined_params.name << " [" << pair->second << "]";
441 return; 445 return;
442 } 446 }
443 447
444 params_vector.emplace_back(predefined_params.name, 448 params_vector.emplace_back(
445 predefined_params.priority_hint, 449 predefined_params.name, predefined_params.priority_hint,
446 predefined_params.io_restriction, 450 predefined_params.io_restriction, variation_values.threads,
447 variation_values.threads, 451 variation_values.detach_period);
448 variation_values.detach_period);
449 } 452 }
450 453
451 DCHECK_EQ(WORKER_POOL_COUNT, params_vector.size()); 454 DCHECK_EQ(WORKER_POOL_COUNT, params_vector.size());
452 455
453 base::TaskScheduler::CreateAndSetDefaultTaskScheduler( 456 base::TaskScheduler::CreateAndSetDefaultTaskScheduler(
454 params_vector, base::Bind(WorkerPoolIndexForTraits)); 457 params_vector, base::Bind(WorkerPoolIndexForTraits));
455 } 458 }
456 459
457 // Returns the new local state object, guaranteed non-NULL. 460 // Returns the new local state object, guaranteed non-NULL.
458 // |local_state_task_runner| must be a shutdown-blocking task runner. 461 // |local_state_task_runner| must be a shutdown-blocking task runner.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 // missing code in the above test. 577 // missing code in the above test.
575 CHECK(profile) << "Cannot get default profile."; 578 CHECK(profile) << "Cannot get default profile.";
576 579
577 #else 580 #else
578 profile = GetStartupProfile(user_data_dir, parsed_command_line); 581 profile = GetStartupProfile(user_data_dir, parsed_command_line);
579 582
580 if (!profile && !profile_dir_specified) 583 if (!profile && !profile_dir_specified)
581 profile = GetFallbackStartupProfile(); 584 profile = GetFallbackStartupProfile();
582 585
583 if (!profile) { 586 if (!profile) {
584 ProfileErrorType error_type = profile_dir_specified ? 587 ProfileErrorType error_type = profile_dir_specified
585 PROFILE_ERROR_CREATE_FAILURE_SPECIFIED : 588 ? PROFILE_ERROR_CREATE_FAILURE_SPECIFIED
586 PROFILE_ERROR_CREATE_FAILURE_ALL; 589 : PROFILE_ERROR_CREATE_FAILURE_ALL;
587 590
588 // TODO(lwchkg): What diagnostics do you want to include in the feedback 591 // TODO(lwchkg): What diagnostics do you want to include in the feedback
589 // report when an error occurs? 592 // report when an error occurs?
590 ShowProfileErrorDialog(error_type, IDS_COULDNT_STARTUP_PROFILE_ERROR, 593 ShowProfileErrorDialog(error_type, IDS_COULDNT_STARTUP_PROFILE_ERROR,
591 "Error creating primary profile."); 594 "Error creating primary profile.");
592 return nullptr; 595 return nullptr;
593 } 596 }
594 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID) 597 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID)
595 598
596 UMA_HISTOGRAM_LONG_TIMES( 599 UMA_HISTOGRAM_LONG_TIMES("Startup.CreateFirstProfile",
597 "Startup.CreateFirstProfile", base::Time::Now() - start); 600 base::Time::Now() - start);
598 return profile; 601 return profile;
599 } 602 }
600 603
601 #if defined(OS_MACOSX) 604 #if defined(OS_MACOSX)
602 OSStatus KeychainCallback(SecKeychainEvent keychain_event, 605 OSStatus KeychainCallback(SecKeychainEvent keychain_event,
603 SecKeychainCallbackInfo* info, void* context) { 606 SecKeychainCallbackInfo* info,
607 void* context) {
604 return noErr; 608 return noErr;
605 } 609 }
606 #endif // defined(OS_MACOSX) 610 #endif // defined(OS_MACOSX)
607 611
608 void RegisterComponentsForUpdate() { 612 void RegisterComponentsForUpdate() {
609 component_updater::ComponentUpdateService* cus = 613 component_updater::ComponentUpdateService* cus =
610 g_browser_process->component_updater(); 614 g_browser_process->component_updater();
611 615
612 // Registration can be before or after cus->Start() so it is ok to post 616 // Registration can be before or after cus->Start() so it is ok to post
613 // a task to the UI thread to do registration once you done the necessary 617 // a task to the UI thread to do registration once you done the necessary
614 // file IO to know you existing component version. 618 // file IO to know you existing component version.
615 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 619 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
616 RegisterRecoveryComponent(cus, g_browser_process->local_state()); 620 RegisterRecoveryComponent(cus, g_browser_process->local_state());
617 RegisterPepperFlashComponent(cus); 621 RegisterPepperFlashComponent(cus);
618 RegisterSwiftShaderComponent(cus); 622 RegisterSwiftShaderComponent(cus);
619 RegisterWidevineCdmComponent(cus); 623 RegisterWidevineCdmComponent(cus);
620 #endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 624 #endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
621 625
622 #if !defined(DISABLE_NACL) && !defined(OS_ANDROID) 626 #if !defined(DISABLE_NACL) && !defined(OS_ANDROID)
623 #if defined(OS_CHROMEOS) 627 #if defined(OS_CHROMEOS)
624 // PNaCl on Chrome OS is on rootfs and there is no need to download it. But 628 // PNaCl on Chrome OS is on rootfs and there is no need to download it. But
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 std::string start_time_string = 685 std::string start_time_string =
682 command_line.GetSwitchValueASCII(switches::kOriginalProcessStartTime); 686 command_line.GetSwitchValueASCII(switches::kOriginalProcessStartTime);
683 int64_t remote_start_time; 687 int64_t remote_start_time;
684 if (base::StringToInt64(start_time_string, &remote_start_time)) { 688 if (base::StringToInt64(start_time_string, &remote_start_time)) {
685 base::TimeDelta elapsed = 689 base::TimeDelta elapsed =
686 base::Time::Now() - base::Time::FromInternalValue(remote_start_time); 690 base::Time::Now() - base::Time::FromInternalValue(remote_start_time);
687 if (command_line.HasSwitch(switches::kFastStart)) { 691 if (command_line.HasSwitch(switches::kFastStart)) {
688 UMA_HISTOGRAM_LONG_TIMES( 692 UMA_HISTOGRAM_LONG_TIMES(
689 "Startup.WarmStartTimeFromRemoteProcessStartFast", elapsed); 693 "Startup.WarmStartTimeFromRemoteProcessStartFast", elapsed);
690 } else { 694 } else {
691 UMA_HISTOGRAM_LONG_TIMES( 695 UMA_HISTOGRAM_LONG_TIMES("Startup.WarmStartTimeFromRemoteProcessStart",
692 "Startup.WarmStartTimeFromRemoteProcessStart", elapsed); 696 elapsed);
693 } 697 }
694 } 698 }
695 } 699 }
696 700
697 g_browser_process->platform_part()->PlatformSpecificCommandLineProcessing( 701 g_browser_process->platform_part()->PlatformSpecificCommandLineProcessing(
698 command_line); 702 command_line);
699 703
700 base::FilePath user_data_dir = 704 base::FilePath user_data_dir =
701 g_browser_process->profile_manager()->user_data_dir(); 705 g_browser_process->profile_manager()->user_data_dir();
702 base::FilePath startup_profile_dir = 706 base::FilePath startup_profile_dir =
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 if (parameters.ui_task) 812 if (parameters.ui_task)
809 browser_defaults::enable_help_app = false; 813 browser_defaults::enable_help_app = false;
810 814
811 // Chrome disallows cookies by default. All code paths that want to use 815 // Chrome disallows cookies by default. All code paths that want to use
812 // cookies need to go through one of Chrome's URLRequestContexts which have 816 // cookies need to go through one of Chrome's URLRequestContexts which have
813 // a ChromeNetworkDelegate attached that selectively allows cookies again. 817 // a ChromeNetworkDelegate attached that selectively allows cookies again.
814 net::URLRequest::SetDefaultCookiePolicyToBlock(); 818 net::URLRequest::SetDefaultCookiePolicyToBlock();
815 } 819 }
816 820
817 ChromeBrowserMainParts::~ChromeBrowserMainParts() { 821 ChromeBrowserMainParts::~ChromeBrowserMainParts() {
818 for (int i = static_cast<int>(chrome_extra_parts_.size())-1; i >= 0; --i) 822 for (int i = static_cast<int>(chrome_extra_parts_.size()) - 1; i >= 0; --i)
819 delete chrome_extra_parts_[i]; 823 delete chrome_extra_parts_[i];
820 chrome_extra_parts_.clear(); 824 chrome_extra_parts_.clear();
821 } 825 }
822 826
823 // This will be called after the command-line has been mutated by about:flags 827 // This will be called after the command-line has been mutated by about:flags
824 void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() { 828 void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() {
825 TRACE_EVENT0("startup", "ChromeBrowserMainParts::SetupMetricsAndFieldTrials"); 829 TRACE_EVENT0("startup", "ChromeBrowserMainParts::SetupMetricsAndFieldTrials");
826 // Must initialize metrics after labs have been converted into switches, 830 // Must initialize metrics after labs have been converted into switches,
827 // but before field trials are set up (so that client ID is available for 831 // but before field trials are set up (so that client ID is available for
828 // one-time randomized field trials). 832 // one-time randomized field trials).
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 CHECK(result) << "Invalid --" << switches::kForceFieldTrials 868 CHECK(result) << "Invalid --" << switches::kForceFieldTrials
865 << " list specified."; 869 << " list specified.";
866 } 870 }
867 871
868 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); 872 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
869 873
870 // Associate parameters chosen in about:flags and create trial/group for them. 874 // Associate parameters chosen in about:flags and create trial/group for them.
871 flags_ui::PrefServiceFlagsStorage flags_storage( 875 flags_ui::PrefServiceFlagsStorage flags_storage(
872 g_browser_process->local_state()); 876 g_browser_process->local_state());
873 std::vector<std::string> variation_ids = 877 std::vector<std::string> variation_ids =
874 about_flags::RegisterAllFeatureVariationParameters( 878 about_flags::RegisterAllFeatureVariationParameters(&flags_storage,
875 &flags_storage, feature_list.get()); 879 feature_list.get());
876 880
877 variations::VariationsHttpHeaderProvider* http_header_provider = 881 variations::VariationsHttpHeaderProvider* http_header_provider =
878 variations::VariationsHttpHeaderProvider::GetInstance(); 882 variations::VariationsHttpHeaderProvider::GetInstance();
879 // Force the variation ids selected in chrome://flags and/or specified using 883 // Force the variation ids selected in chrome://flags and/or specified using
880 // the command-line flag. 884 // the command-line flag.
881 bool result = http_header_provider->ForceVariationIds( 885 bool result = http_header_provider->ForceVariationIds(
882 command_line->GetSwitchValueASCII(switches::kForceVariationIds), 886 command_line->GetSwitchValueASCII(switches::kForceVariationIds),
883 &variation_ids); 887 &variation_ids);
884 CHECK(result) << "Invalid list of variation ids specified (either in --" 888 CHECK(result) << "Invalid list of variation ids specified (either in --"
885 << switches::kForceVariationIds << " or in chrome://flags)"; 889 << switches::kForceVariationIds << " or in chrome://flags)";
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1109 run_message_loop_ = false; 1113 run_message_loop_ = false;
1110 #if !defined(OS_ANDROID) 1114 #if !defined(OS_ANDROID)
1111 chrome::MaybeShowInvalidUserDataDirWarningDialog(); 1115 chrome::MaybeShowInvalidUserDataDirWarningDialog();
1112 #endif // !defined(OS_ANDROID) 1116 #endif // !defined(OS_ANDROID)
1113 if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_)) 1117 if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_))
1114 return chrome::RESULT_CODE_MISSING_DATA; 1118 return chrome::RESULT_CODE_MISSING_DATA;
1115 1119
1116 // Force MediaCaptureDevicesDispatcher to be created on UI thread. 1120 // Force MediaCaptureDevicesDispatcher to be created on UI thread.
1117 MediaCaptureDevicesDispatcher::GetInstance(); 1121 MediaCaptureDevicesDispatcher::GetInstance();
1118 1122
1119 // Android's first run is done in Java instead of native. 1123 // Android's first run is done in Java instead of native.
1120 #if !defined(OS_ANDROID) 1124 #if !defined(OS_ANDROID)
1121 process_singleton_.reset(new ChromeProcessSingleton( 1125 process_singleton_.reset(new ChromeProcessSingleton(
1122 user_data_dir_, base::Bind(&ProcessSingletonNotificationCallback))); 1126 user_data_dir_, base::Bind(&ProcessSingletonNotificationCallback)));
1123 1127
1124 // Cache first run state early. 1128 // Cache first run state early.
1125 first_run::IsChromeFirstRun(); 1129 first_run::IsChromeFirstRun();
1126 #endif // !defined(OS_ANDROID) 1130 #endif // !defined(OS_ANDROID)
1127 1131
1128 scoped_refptr<base::SequencedTaskRunner> local_state_task_runner = 1132 scoped_refptr<base::SequencedTaskRunner> local_state_task_runner =
1129 JsonPrefStore::GetTaskRunnerForFile( 1133 JsonPrefStore::GetTaskRunnerForFile(
1130 base::FilePath(chrome::kLocalStorePoolName), 1134 base::FilePath(chrome::kLocalStorePoolName),
1131 BrowserThread::GetBlockingPool()); 1135 BrowserThread::GetBlockingPool());
1132 1136
1133 { 1137 {
1134 TRACE_EVENT0("startup", 1138 TRACE_EVENT0(
1135 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitBrowswerProcessImpl"); 1139 "startup",
1140 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitBrowswerProcessImpl");
1136 browser_process_.reset(new BrowserProcessImpl(local_state_task_runner.get(), 1141 browser_process_.reset(new BrowserProcessImpl(local_state_task_runner.get(),
1137 parsed_command_line())); 1142 parsed_command_line()));
1138 } 1143 }
1139 1144
1140 if (parsed_command_line().HasSwitch(switches::kEnableProfiling)) { 1145 if (parsed_command_line().HasSwitch(switches::kEnableProfiling)) {
1141 TRACE_EVENT0("startup", 1146 TRACE_EVENT0("startup",
1142 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitProfiling"); 1147 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitProfiling");
1143 // User wants to override default tracking status. 1148 // User wants to override default tracking status.
1144 std::string flag = 1149 std::string flag =
1145 parsed_command_line().GetSwitchValueASCII(switches::kEnableProfiling); 1150 parsed_command_line().GetSwitchValueASCII(switches::kEnableProfiling);
1146 // Default to basic profiling (no parent child support). 1151 // Default to basic profiling (no parent child support).
1147 tracked_objects::ThreadData::Status status = 1152 tracked_objects::ThreadData::Status status =
1148 tracked_objects::ThreadData::PROFILING_ACTIVE; 1153 tracked_objects::ThreadData::PROFILING_ACTIVE;
1149 if (flag.compare("0") != 0) 1154 if (flag.compare("0") != 0)
1150 status = tracked_objects::ThreadData::DEACTIVATED; 1155 status = tracked_objects::ThreadData::DEACTIVATED;
1151 tracked_objects::ThreadData::InitializeAndSetTrackingStatus(status); 1156 tracked_objects::ThreadData::InitializeAndSetTrackingStatus(status);
1152 } 1157 }
1153 1158
1154 local_state_ = InitializeLocalState( 1159 local_state_ = InitializeLocalState(local_state_task_runner.get(),
1155 local_state_task_runner.get(), parsed_command_line()); 1160 parsed_command_line());
1156 1161
1157 #if !defined(OS_ANDROID) 1162 #if !defined(OS_ANDROID)
1158 // These members must be initialized before returning from this function. 1163 // These members must be initialized before returning from this function.
1159 master_prefs_.reset(new first_run::MasterPrefs); 1164 master_prefs_.reset(new first_run::MasterPrefs);
1160 // Android doesn't use StartupBrowserCreator. 1165 // Android doesn't use StartupBrowserCreator.
1161 browser_creator_.reset(new StartupBrowserCreator); 1166 browser_creator_.reset(new StartupBrowserCreator);
1162 // TODO(yfriedman): Refactor Android to re-use UMABrowsingActivityObserver 1167 // TODO(yfriedman): Refactor Android to re-use UMABrowsingActivityObserver
1163 chrome::UMABrowsingActivityObserver::Init(); 1168 chrome::UMABrowsingActivityObserver::Init();
1164 #endif // !defined(OS_ANDROID) 1169 #endif // !defined(OS_ANDROID)
1165 1170
1166 #if !defined(OS_CHROMEOS) 1171 #if !defined(OS_CHROMEOS)
1167 // Convert active labs into switches. This needs to be done before 1172 // Convert active labs into switches. This needs to be done before
1168 // ResourceBundle::InitSharedInstanceWithLocale as some loaded resources are 1173 // ResourceBundle::InitSharedInstanceWithLocale as some loaded resources are
1169 // affected by experiment flags (--touch-optimized-ui in particular). 1174 // affected by experiment flags (--touch-optimized-ui in particular).
1170 // On ChromeOS system level flags are applied from the device settings from 1175 // On ChromeOS system level flags are applied from the device settings from
1171 // the session manager. 1176 // the session manager.
1172 { 1177 {
1173 TRACE_EVENT0("startup", 1178 TRACE_EVENT0("startup",
1174 "ChromeBrowserMainParts::PreCreateThreadsImpl:ConvertFlags"); 1179 "ChromeBrowserMainParts::PreCreateThreadsImpl:ConvertFlags");
1175 flags_ui::PrefServiceFlagsStorage flags_storage( 1180 flags_ui::PrefServiceFlagsStorage flags_storage(
1176 g_browser_process->local_state()); 1181 g_browser_process->local_state());
1177 about_flags::ConvertFlagsToSwitches(&flags_storage, 1182 about_flags::ConvertFlagsToSwitches(&flags_storage,
1178 base::CommandLine::ForCurrentProcess(), 1183 base::CommandLine::ForCurrentProcess(),
1179 flags_ui::kAddSentinels); 1184 flags_ui::kAddSentinels);
1180 } 1185 }
1181 #endif // !defined(OS_CHROMEOS) 1186 #endif // !defined(OS_CHROMEOS)
1182 // The MaterialDesignController needs to look at command line flags, which 1187 // The MaterialDesignController needs to look at command line flags, which
1183 // are not available until this point. Now that they are, proceed with 1188 // are not available until this point. Now that they are, proceed with
1184 // initializing the MaterialDesignController. 1189 // initializing the MaterialDesignController.
(...skipping 15 matching lines...) Expand all
1200 #endif // OS_WIN 1205 #endif // OS_WIN
1201 1206
1202 local_state_->UpdateCommandLinePrefStore( 1207 local_state_->UpdateCommandLinePrefStore(
1203 new CommandLinePrefStore(base::CommandLine::ForCurrentProcess())); 1208 new CommandLinePrefStore(base::CommandLine::ForCurrentProcess()));
1204 1209
1205 // Reset the command line in the crash report details, since we may have 1210 // Reset the command line in the crash report details, since we may have
1206 // just changed it to include experiments. 1211 // just changed it to include experiments.
1207 crash_keys::SetCrashKeysFromCommandLine( 1212 crash_keys::SetCrashKeysFromCommandLine(
1208 *base::CommandLine::ForCurrentProcess()); 1213 *base::CommandLine::ForCurrentProcess());
1209 1214
1210 // Mac starts it earlier in |PreMainMessageLoopStart()| (because it is 1215 // Mac starts it earlier in |PreMainMessageLoopStart()| (because it is
1211 // needed when loading the MainMenu.nib and the language doesn't depend on 1216 // needed when loading the MainMenu.nib and the language doesn't depend on
1212 // anything since it comes from Cocoa. 1217 // anything since it comes from Cocoa.
1213 #if defined(OS_MACOSX) 1218 #if defined(OS_MACOSX)
1214 std::string locale = 1219 std::string locale =
1215 parameters().ui_task ? "en-US" : l10n_util::GetLocaleOverride(); 1220 parameters().ui_task ? "en-US" : l10n_util::GetLocaleOverride();
1216 browser_process_->SetApplicationLocale(locale); 1221 browser_process_->SetApplicationLocale(locale);
1217 #else 1222 #else
1218 const std::string locale = 1223 const std::string locale = local_state_->GetString(prefs::kApplicationLocale);
1219 local_state_->GetString(prefs::kApplicationLocale);
1220 1224
1221 // On a POSIX OS other than ChromeOS, the parameter that is passed to the 1225 // On a POSIX OS other than ChromeOS, the parameter that is passed to the
1222 // method InitSharedInstance is ignored. 1226 // method InitSharedInstance is ignored.
1223 1227
1224 TRACE_EVENT_BEGIN0("startup", 1228 TRACE_EVENT_BEGIN0(
1229 "startup",
1225 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle"); 1230 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle");
1226 const std::string loaded_locale = 1231 const std::string loaded_locale =
1227 ui::ResourceBundle::InitSharedInstanceWithLocale( 1232 ui::ResourceBundle::InitSharedInstanceWithLocale(
1228 locale, NULL, ui::ResourceBundle::LOAD_COMMON_RESOURCES); 1233 locale, NULL, ui::ResourceBundle::LOAD_COMMON_RESOURCES);
1229 TRACE_EVENT_END0("startup", 1234 TRACE_EVENT_END0(
1235 "startup",
1230 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle"); 1236 "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle");
1231 1237
1232 if (loaded_locale.empty() && 1238 if (loaded_locale.empty() &&
1233 !parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) { 1239 !parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) {
1234 ShowMissingLocaleMessageBox(); 1240 ShowMissingLocaleMessageBox();
1235 return chrome::RESULT_CODE_MISSING_DATA; 1241 return chrome::RESULT_CODE_MISSING_DATA;
1236 } 1242 }
1237 CHECK(!loaded_locale.empty()) << "Locale could not be found for " << locale; 1243 CHECK(!loaded_locale.empty()) << "Locale could not be found for " << locale;
1238 browser_process_->SetApplicationLocale(loaded_locale); 1244 browser_process_->SetApplicationLocale(loaded_locale);
1239 1245
1240 { 1246 {
1241 TRACE_EVENT0("startup", 1247 TRACE_EVENT0("startup",
1242 "ChromeBrowserMainParts::PreCreateThreadsImpl:AddDataPack"); 1248 "ChromeBrowserMainParts::PreCreateThreadsImpl:AddDataPack");
1243 base::FilePath resources_pack_path; 1249 base::FilePath resources_pack_path;
1244 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 1250 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
1245 #if defined(OS_ANDROID) 1251 #if defined(OS_ANDROID)
1246 ui::LoadMainAndroidPackFile("assets/resources.pak", resources_pack_path); 1252 ui::LoadMainAndroidPackFile("assets/resources.pak", resources_pack_path);
1247 #else 1253 #else
1248 ResourceBundle::GetSharedInstance().AddDataPackFromPath( 1254 ResourceBundle::GetSharedInstance().AddDataPackFromPath(
1249 resources_pack_path, ui::SCALE_FACTOR_NONE); 1255 resources_pack_path, ui::SCALE_FACTOR_NONE);
1250 #endif // defined(OS_ANDROID) 1256 #endif // defined(OS_ANDROID)
1251 } 1257 }
1252 #endif // defined(OS_MACOSX) 1258 #endif // defined(OS_MACOSX)
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 1445
1440 namespace { 1446 namespace {
1441 1447
1442 void WINAPI SyzyASANExperimentCallback(const char* name, const char* group) { 1448 void WINAPI SyzyASANExperimentCallback(const char* name, const char* group) {
1443 // Indirect through the function above, so that the friend declaration doesn't 1449 // Indirect through the function above, so that the friend declaration doesn't
1444 // need the ugly calling convention. 1450 // need the ugly calling convention.
1445 SyzyASANRegisterExperiment(name, group); 1451 SyzyASANRegisterExperiment(name, group);
1446 } 1452 }
1447 1453
1448 void SetupSyzyASAN() { 1454 void SetupSyzyASAN() {
1449 typedef VOID(WINAPI* SyzyASANExperimentCallbackFn)(const char* name, 1455 typedef VOID(WINAPI * SyzyASANExperimentCallbackFn)(const char* name,
1450 const char* group); 1456 const char* group);
1451 typedef VOID(WINAPI* SyzyASANEnumExperimentsFn)(SyzyASANExperimentCallbackFn); 1457 typedef VOID(WINAPI *
1458 SyzyASANEnumExperimentsFn)(SyzyASANExperimentCallbackFn);
1452 HMODULE syzyasan_handle = ::GetModuleHandle(L"syzyasan_rtl.dll"); 1459 HMODULE syzyasan_handle = ::GetModuleHandle(L"syzyasan_rtl.dll");
1453 if (!syzyasan_handle) 1460 if (!syzyasan_handle)
1454 return; 1461 return;
1455 1462
1456 // Export the SyzyASAN experiments as synthetic field trials. 1463 // Export the SyzyASAN experiments as synthetic field trials.
1457 SyzyASANEnumExperimentsFn syzyasan_enum_experiments = 1464 SyzyASANEnumExperimentsFn syzyasan_enum_experiments =
1458 reinterpret_cast<SyzyASANEnumExperimentsFn>( 1465 reinterpret_cast<SyzyASANEnumExperimentsFn>(
1459 ::GetProcAddress(syzyasan_handle, "asan_EnumExperiments")); 1466 ::GetProcAddress(syzyasan_handle, "asan_EnumExperiments"));
1460 if (syzyasan_enum_experiments) { 1467 if (syzyasan_enum_experiments) {
1461 syzyasan_enum_experiments(&SyzyASANExperimentCallback); 1468 syzyasan_enum_experiments(&SyzyASANExperimentCallback);
1462 } 1469 }
1463 1470
1464 // Enable the deferred free mechanism in the syzyasan module, which helps the 1471 // Enable the deferred free mechanism in the syzyasan module, which helps the
1465 // performance by deferring some work on the critical path to a background 1472 // performance by deferring some work on the critical path to a background
1466 // thread. 1473 // thread.
1467 if (base::FeatureList::IsEnabled(features::kSyzyasanDeferredFree)) { 1474 if (base::FeatureList::IsEnabled(features::kSyzyasanDeferredFree)) {
1468 typedef VOID(WINAPI * SyzyasanEnableDeferredFreeThreadFunc)(VOID); 1475 typedef VOID(WINAPI * SyzyasanEnableDeferredFreeThreadFunc)(VOID);
1469 bool success = false; 1476 bool success = false;
1470 SyzyasanEnableDeferredFreeThreadFunc syzyasan_enable_deferred_free = 1477 SyzyasanEnableDeferredFreeThreadFunc syzyasan_enable_deferred_free =
1471 reinterpret_cast<SyzyasanEnableDeferredFreeThreadFunc>( 1478 reinterpret_cast<SyzyasanEnableDeferredFreeThreadFunc>(
1472 ::GetProcAddress(syzyasan_handle, 1479 ::GetProcAddress(syzyasan_handle, "asan_EnableDeferredFreeThread"));
1473 "asan_EnableDeferredFreeThread"));
1474 if (syzyasan_enable_deferred_free) { 1480 if (syzyasan_enable_deferred_free) {
1475 syzyasan_enable_deferred_free(); 1481 syzyasan_enable_deferred_free();
1476 success = true; 1482 success = true;
1477 } 1483 }
1478 UMA_HISTOGRAM_BOOLEAN("Syzyasan.DeferredFreeWasEnabled", success); 1484 UMA_HISTOGRAM_BOOLEAN("Syzyasan.DeferredFreeWasEnabled", success);
1479 } 1485 }
1480 } 1486 }
1481 1487
1482 } // namespace 1488 } // namespace
1483 1489
1484 #endif // SYZYASAN 1490 #endif // SYZYASAN
1485 1491
1486
1487 void ChromeBrowserMainParts::PreBrowserStart() { 1492 void ChromeBrowserMainParts::PreBrowserStart() {
1488 TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreBrowserStart"); 1493 TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreBrowserStart");
1489 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1494 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1490 chrome_extra_parts_[i]->PreBrowserStart(); 1495 chrome_extra_parts_[i]->PreBrowserStart();
1491 1496
1492 three_d_observer_.reset(new ThreeDAPIObserver()); 1497 three_d_observer_.reset(new ThreeDAPIObserver());
1493 1498
1494 #if defined(SYZYASAN) 1499 #if defined(SYZYASAN)
1495 SetupSyzyASAN(); 1500 SetupSyzyASAN();
1496 #endif 1501 #endif
(...skipping 10 matching lines...) Expand all
1507 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1512 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1508 chrome_extra_parts_[i]->PostBrowserStart(); 1513 chrome_extra_parts_[i]->PostBrowserStart();
1509 #if !defined(OS_ANDROID) 1514 #if !defined(OS_ANDROID)
1510 // Allow ProcessSingleton to process messages. 1515 // Allow ProcessSingleton to process messages.
1511 process_singleton_->Unlock(); 1516 process_singleton_->Unlock();
1512 #endif // !defined(OS_ANDROID) 1517 #endif // !defined(OS_ANDROID)
1513 #if defined(ENABLE_WEBRTC) 1518 #if defined(ENABLE_WEBRTC)
1514 // Set up a task to delete old WebRTC log files for all profiles. Use a delay 1519 // Set up a task to delete old WebRTC log files for all profiles. Use a delay
1515 // to reduce the impact on startup time. 1520 // to reduce the impact on startup time.
1516 BrowserThread::PostDelayedTask( 1521 BrowserThread::PostDelayedTask(
1517 BrowserThread::UI, 1522 BrowserThread::UI, FROM_HERE,
1518 FROM_HERE,
1519 base::Bind(&WebRtcLogUtil::DeleteOldWebRtcLogFilesForAllProfiles), 1523 base::Bind(&WebRtcLogUtil::DeleteOldWebRtcLogFilesForAllProfiles),
1520 base::TimeDelta::FromMinutes(1)); 1524 base::TimeDelta::FromMinutes(1));
1521 #endif // defined(ENABLE_WEBRTC) 1525 #endif // defined(ENABLE_WEBRTC)
1522 1526
1523 #if !defined(OS_ANDROID) 1527 #if !defined(OS_ANDROID)
1524 // WebUSB is an experimental web API. The sites these notifications will link 1528 // WebUSB is an experimental web API. The sites these notifications will link
1525 // to will only work if the experiment is enabled and WebUSB feature is 1529 // to will only work if the experiment is enabled and WebUSB feature is
1526 // enabled. 1530 // enabled.
1527 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1531 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1528 switches::kEnableExperimentalWebPlatformFeatures) && 1532 switches::kEnableExperimentalWebPlatformFeatures) &&
(...skipping 28 matching lines...) Expand all
1557 installer::GetModulePath(installer::kChromeChildDll), 1561 installer::GetModulePath(installer::kChromeChildDll),
1558 pre_read_options)); 1562 pre_read_options));
1559 } 1563 }
1560 1564
1561 // Windows parental controls calls can be slow, so we do an early init here 1565 // Windows parental controls calls can be slow, so we do an early init here
1562 // that calculates this value off of the UI thread. 1566 // that calculates this value off of the UI thread.
1563 IncognitoModePrefs::InitializePlatformParentalControls(); 1567 IncognitoModePrefs::InitializePlatformParentalControls();
1564 #endif 1568 #endif
1565 1569
1566 #if defined(ENABLE_EXTENSIONS) 1570 #if defined(ENABLE_EXTENSIONS)
1567 if (!variations::GetVariationParamValue( 1571 if (!variations::GetVariationParamValue("LightSpeed", "EarlyInitStartup")
1568 "LightSpeed", "EarlyInitStartup").empty()) { 1572 .empty()) {
1569 // Try to compute this early on another thread so that we don't spend time 1573 // Try to compute this early on another thread so that we don't spend time
1570 // during profile load initializing the extensions APIs. 1574 // during profile load initializing the extensions APIs.
1571 BrowserThread::PostTask( 1575 BrowserThread::PostTask(BrowserThread::FILE_USER_BLOCKING, FROM_HERE,
1572 BrowserThread::FILE_USER_BLOCKING, 1576 base::Bind(base::IgnoreResult(
1573 FROM_HERE, 1577 &extensions::FeatureProvider::GetAPIFeatures)));
1574 base::Bind(
1575 base::IgnoreResult(&extensions::FeatureProvider::GetAPIFeatures)));
1576 } 1578 }
1577 #endif 1579 #endif
1578 1580
1579 // Android updates the metrics service dynamically depending on whether the 1581 // Android updates the metrics service dynamically depending on whether the
1580 // application is in the foreground or not. Do not start here. 1582 // application is in the foreground or not. Do not start here.
1581 #if !defined(OS_ANDROID) 1583 #if !defined(OS_ANDROID)
1582 // Now that the file thread has been started, start recording. 1584 // Now that the file thread has been started, start recording.
1583 StartMetricsRecording(); 1585 StartMetricsRecording();
1584 #endif // !defined(OS_ANDROID) 1586 #endif // !defined(OS_ANDROID)
1585 1587
1586 if (!base::debug::BeingDebugged()) { 1588 if (!base::debug::BeingDebugged()) {
1587 // Create watchdog thread after creating all other threads because it will 1589 // Create watchdog thread after creating all other threads because it will
1588 // watch the other threads and they must be running. 1590 // watch the other threads and they must be running.
1589 browser_process_->watchdog_thread(); 1591 browser_process_->watchdog_thread();
1590 } 1592 }
(...skipping 12 matching lines...) Expand all
1603 bool already_running = browser_util::IsBrowserAlreadyRunning(); 1605 bool already_running = browser_util::IsBrowserAlreadyRunning();
1604 1606
1605 // If the command line specifies 'uninstall' then we need to work here 1607 // If the command line specifies 'uninstall' then we need to work here
1606 // unless we detect another chrome browser running. 1608 // unless we detect another chrome browser running.
1607 if (parsed_command_line().HasSwitch(switches::kUninstall)) { 1609 if (parsed_command_line().HasSwitch(switches::kUninstall)) {
1608 return DoUninstallTasks(already_running); 1610 return DoUninstallTasks(already_running);
1609 } 1611 }
1610 1612
1611 if (parsed_command_line().HasSwitch(switches::kHideIcons) || 1613 if (parsed_command_line().HasSwitch(switches::kHideIcons) ||
1612 parsed_command_line().HasSwitch(switches::kShowIcons)) { 1614 parsed_command_line().HasSwitch(switches::kShowIcons)) {
1613 return ChromeBrowserMainPartsWin::HandleIconsCommands( 1615 return ChromeBrowserMainPartsWin::HandleIconsCommands(parsed_command_line_);
1614 parsed_command_line_);
1615 } 1616 }
1616 1617
1617 ui::SelectFileDialog::SetFactory(new ChromeSelectFileDialogFactory( 1618 ui::SelectFileDialog::SetFactory(new ChromeSelectFileDialogFactory(
1618 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO))); 1619 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)));
1619 #endif // defined(OS_WIN) 1620 #endif // defined(OS_WIN)
1620 1621
1621 if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) { 1622 if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) {
1622 bool is_managed = g_browser_process->local_state()->IsManagedPreference( 1623 bool is_managed = g_browser_process->local_state()->IsManagedPreference(
1623 prefs::kDefaultBrowserSettingEnabled); 1624 prefs::kDefaultBrowserSettingEnabled);
1624 if (is_managed && !g_browser_process->local_state()->GetBoolean( 1625 if (is_managed &&
1625 prefs::kDefaultBrowserSettingEnabled)) { 1626 !g_browser_process->local_state()->GetBoolean(
1627 prefs::kDefaultBrowserSettingEnabled)) {
1626 return static_cast<int>(chrome::RESULT_CODE_ACTION_DISALLOWED_BY_POLICY); 1628 return static_cast<int>(chrome::RESULT_CODE_ACTION_DISALLOWED_BY_POLICY);
1627 } 1629 }
1628 1630
1629 return shell_integration::SetAsDefaultBrowser() 1631 return shell_integration::SetAsDefaultBrowser()
1630 ? static_cast<int>(content::RESULT_CODE_NORMAL_EXIT) 1632 ? static_cast<int>(content::RESULT_CODE_NORMAL_EXIT)
1631 : static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED); 1633 : static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED);
1632 } 1634 }
1633 1635
1634 #if defined(USE_AURA) 1636 #if defined(USE_AURA)
1635 // Make sure aura::Env has been initialized. 1637 // Make sure aura::Env has been initialized.
1636 CHECK(aura::Env::GetInstance()); 1638 CHECK(aura::Env::GetInstance());
1637 #endif // defined(USE_AURA) 1639 #endif // defined(USE_AURA)
1638 1640
1639 // Android doesn't support extensions and doesn't implement ProcessSingleton. 1641 // Android doesn't support extensions and doesn't implement ProcessSingleton.
1640 #if !defined(OS_ANDROID) 1642 #if !defined(OS_ANDROID)
1641 // If the command line specifies --pack-extension, attempt the pack extension 1643 // If the command line specifies --pack-extension, attempt the pack extension
1642 // startup action and exit. 1644 // startup action and exit.
1643 if (parsed_command_line().HasSwitch(switches::kPackExtension)) { 1645 if (parsed_command_line().HasSwitch(switches::kPackExtension)) {
1644 extensions::StartupHelper extension_startup_helper; 1646 extensions::StartupHelper extension_startup_helper;
1645 if (extension_startup_helper.PackExtension(parsed_command_line())) 1647 if (extension_startup_helper.PackExtension(parsed_command_line()))
1646 return content::RESULT_CODE_NORMAL_EXIT; 1648 return content::RESULT_CODE_NORMAL_EXIT;
1647 return chrome::RESULT_CODE_PACK_EXTENSION_ERROR; 1649 return chrome::RESULT_CODE_PACK_EXTENSION_ERROR;
1648 } 1650 }
1649 1651
1650 // When another process is running, use that process instead of starting a 1652 // When another process is running, use that process instead of starting a
1651 // new one. NotifyOtherProcess will currently give the other process up to 1653 // new one. NotifyOtherProcess will currently give the other process up to
1652 // 20 seconds to respond. Note that this needs to be done before we attempt 1654 // 20 seconds to respond. Note that this needs to be done before we attempt
1653 // to read the profile. 1655 // to read the profile.
1654 notify_result_ = process_singleton_->NotifyOtherProcessOrCreate(); 1656 notify_result_ = process_singleton_->NotifyOtherProcessOrCreate();
1655 switch (notify_result_) { 1657 switch (notify_result_) {
1656 case ProcessSingleton::PROCESS_NONE: 1658 case ProcessSingleton::PROCESS_NONE:
1657 // No process already running, fall through to starting a new one. 1659 // No process already running, fall through to starting a new one.
1658 break; 1660 break;
1659 1661
1660 case ProcessSingleton::PROCESS_NOTIFIED: 1662 case ProcessSingleton::PROCESS_NOTIFIED:
1661 #if defined(OS_POSIX) && !defined(OS_MACOSX) 1663 #if defined(OS_POSIX) && !defined(OS_MACOSX)
1662 // On POSIX systems, print a message notifying the process is running. 1664 // On POSIX systems, print a message notifying the process is running.
1663 printf("%s\n", base::SysWideToNativeMB(base::UTF16ToWide( 1665 printf("%s\n", base::SysWideToNativeMB(
1664 l10n_util::GetStringUTF16(IDS_USED_EXISTING_BROWSER))).c_str()); 1666 base::UTF16ToWide(l10n_util::GetStringUTF16(
1667 IDS_USED_EXISTING_BROWSER)))
1668 .c_str());
1665 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) 1669 #endif // defined(OS_POSIX) && !defined(OS_MACOSX)
1666 1670
1667 // Having a differentiated return type for testing allows for tests to 1671 // Having a differentiated return type for testing allows for tests to
1668 // verify proper handling of some switches. When not testing, stick to 1672 // verify proper handling of some switches. When not testing, stick to
1669 // the standard Unix convention of returning zero when things went as 1673 // the standard Unix convention of returning zero when things went as
1670 // expected. 1674 // expected.
1671 if (parsed_command_line().HasSwitch(switches::kTestType)) 1675 if (parsed_command_line().HasSwitch(switches::kTestType))
1672 return chrome::RESULT_CODE_NORMAL_EXIT_PROCESS_NOTIFIED; 1676 return chrome::RESULT_CODE_NORMAL_EXIT_PROCESS_NOTIFIED;
1673 return content::RESULT_CODE_NORMAL_EXIT; 1677 return content::RESULT_CODE_NORMAL_EXIT;
1674 1678
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1745 1749
1746 metrics::MetricsService::SetExecutionPhase( 1750 metrics::MetricsService::SetExecutionPhase(
1747 metrics::MetricsService::CREATE_PROFILE, 1751 metrics::MetricsService::CREATE_PROFILE,
1748 g_browser_process->local_state()); 1752 g_browser_process->local_state());
1749 1753
1750 UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep1Time", 1754 UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep1Time",
1751 base::TimeTicks::Now() - start_time_step1); 1755 base::TimeTicks::Now() - start_time_step1);
1752 1756
1753 // This step is costly and is already measured in Startup.CreateFirstProfile 1757 // This step is costly and is already measured in Startup.CreateFirstProfile
1754 // and more directly Profile.CreateAndInitializeProfile. 1758 // and more directly Profile.CreateAndInitializeProfile.
1755 profile_ = CreatePrimaryProfile(parameters(), 1759 profile_ =
1756 user_data_dir_, 1760 CreatePrimaryProfile(parameters(), user_data_dir_, parsed_command_line());
1757 parsed_command_line());
1758 if (!profile_) 1761 if (!profile_)
1759 return content::RESULT_CODE_NORMAL_EXIT; 1762 return content::RESULT_CODE_NORMAL_EXIT;
1760 1763
1761 #if !defined(OS_ANDROID) 1764 #if !defined(OS_ANDROID)
1762 const base::TimeTicks start_time_step2 = base::TimeTicks::Now(); 1765 const base::TimeTicks start_time_step2 = base::TimeTicks::Now();
1763 // The first run sentinel must be created after the process singleton was 1766 // The first run sentinel must be created after the process singleton was
1764 // grabbed and no early return paths were otherwise hit above. 1767 // grabbed and no early return paths were otherwise hit above.
1765 first_run::CreateSentinelIfNeeded(); 1768 first_run::CreateSentinelIfNeeded();
1766 #endif // !defined(OS_ANDROID) 1769 #endif // !defined(OS_ANDROID)
1767 1770
1768 #if BUILDFLAG(ENABLE_BACKGROUND) 1771 #if BUILDFLAG(ENABLE_BACKGROUND)
1769 // Autoload any profiles which are running background apps. 1772 // Autoload any profiles which are running background apps.
1770 // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075. 1773 // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075.
1771 browser_process_->profile_manager()->AutoloadProfiles(); 1774 browser_process_->profile_manager()->AutoloadProfiles();
1772 #endif // BUILDFLAG(ENABLE_BACKGROUND) 1775 #endif // BUILDFLAG(ENABLE_BACKGROUND)
1773 // Post-profile init --------------------------------------------------------- 1776 // Post-profile init ---------------------------------------------------------
1774 1777
1775 TranslateService::Initialize(); 1778 TranslateService::Initialize();
1776 1779
1777 // Needs to be done before PostProfileInit, since login manager on CrOS is 1780 // Needs to be done before PostProfileInit, since login manager on CrOS is
1778 // called inside PostProfileInit. 1781 // called inside PostProfileInit.
1779 content::WebUIControllerFactory::RegisterFactory( 1782 content::WebUIControllerFactory::RegisterFactory(
1780 ChromeWebUIControllerFactory::GetInstance()); 1783 ChromeWebUIControllerFactory::GetInstance());
1781 1784
1782 // NaClBrowserDelegateImpl is accessed inside PostProfileInit(). 1785 // NaClBrowserDelegateImpl is accessed inside PostProfileInit().
1783 // So make sure to create it before that. 1786 // So make sure to create it before that.
1784 #if !defined(DISABLE_NACL) 1787 #if !defined(DISABLE_NACL)
1785 NaClBrowserDelegateImpl* delegate = 1788 NaClBrowserDelegateImpl* delegate =
1786 new NaClBrowserDelegateImpl(browser_process_->profile_manager()); 1789 new NaClBrowserDelegateImpl(browser_process_->profile_manager());
1787 nacl::NaClBrowser::SetDelegate(delegate); 1790 nacl::NaClBrowser::SetDelegate(delegate);
1788 #endif // !defined(DISABLE_NACL) 1791 #endif // !defined(DISABLE_NACL)
1789 1792
1790 // TODO(stevenjb): Move WIN and MACOSX specific code to appropriate Parts. 1793 // TODO(stevenjb): Move WIN and MACOSX specific code to appropriate Parts.
1791 // (requires supporting early exit). 1794 // (requires supporting early exit).
1792 PostProfileInit(); 1795 PostProfileInit();
1793 1796
1794 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) 1797 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
1795 // Show the First Run UI if this is the first time Chrome has been run on 1798 // Show the First Run UI if this is the first time Chrome has been run on
1796 // this computer, or we're being compelled to do so by a command line flag. 1799 // this computer, or we're being compelled to do so by a command line flag.
1797 // Note that this be done _after_ the PrefService is initialized and all 1800 // Note that this be done _after_ the PrefService is initialized and all
1798 // preferences are registered, since some of the code that the importer 1801 // preferences are registered, since some of the code that the importer
1799 // touches reads preferences. 1802 // touches reads preferences.
1800 if (first_run::IsChromeFirstRun()) { 1803 if (first_run::IsChromeFirstRun()) {
1801 first_run::AutoImport(profile_, 1804 // By default, autoImport is performed on first run.
1802 master_prefs_->homepage_defined, 1805 bool perform_autoImport_on_first_run = true;
1803 master_prefs_->do_import_items, 1806 // A field trial that is designed to turn off the AutoImport feature
1804 master_prefs_->dont_import_items, 1807 // for Windows users (on first run).
1805 master_prefs_->import_bookmarks_path); 1808 // The feature keeps running for enterprise.
1809 #if defined(OS_WIN)
1810 base::FieldTrial* trial = base::FieldTrialList::Find("FirstRunAutoImport");
1811 perform_autoImport_on_first_run =
1812 !trial || !base::FeatureList::IsEnabled(kFirstRunAutoImport) ||
1813 base::win::IsEnrolledToDomain();
1814 #endif
1815 if (perform_autoImport_on_first_run) {
1816 first_run::AutoImport(profile_, master_prefs_->homepage_defined,
1817 master_prefs_->do_import_items,
1818 master_prefs_->dont_import_items,
1819 master_prefs_->import_bookmarks_path);
1820 }
1806 1821
1807 // Note: this can pop the first run consent dialog on linux. 1822 // Note: this can pop the first run consent dialog on linux.
1808 first_run::DoPostImportTasks(profile_, 1823 first_run::DoPostImportTasks(profile_,
1809 master_prefs_->make_chrome_default_for_user); 1824 master_prefs_->make_chrome_default_for_user);
1810 1825
1811 if (!master_prefs_->suppress_first_run_default_browser_prompt) { 1826 if (!master_prefs_->suppress_first_run_default_browser_prompt) {
1812 browser_creator_->set_show_main_browser_window( 1827 browser_creator_->set_show_main_browser_window(
1813 !chrome::ShowFirstRunDefaultBrowserPrompt(profile_)); 1828 !chrome::ShowFirstRunDefaultBrowserPrompt(profile_));
1814 } else { 1829 } else {
1815 browser_creator_->set_is_default_browser_dialog_suppressed(true); 1830 browser_creator_->set_is_default_browser_dialog_suppressed(true);
(...skipping 14 matching lines...) Expand all
1830 // but should run on startup if extended to handle crashes/hangs/patches. 1845 // but should run on startup if extended to handle crashes/hangs/patches.
1831 // Also, better to run once here than once for each HWND's WM_QUERYENDSESSION. 1846 // Also, better to run once here than once for each HWND's WM_QUERYENDSESSION.
1832 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { 1847 if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
1833 ChromeBrowserMainPartsWin::RegisterApplicationRestart( 1848 ChromeBrowserMainPartsWin::RegisterApplicationRestart(
1834 parsed_command_line()); 1849 parsed_command_line());
1835 } 1850 }
1836 1851
1837 // Verify that the profile is not on a network share and if so prepare to show 1852 // Verify that the profile is not on a network share and if so prepare to show
1838 // notification to the user. 1853 // notification to the user.
1839 if (NetworkProfileBubble::ShouldCheckNetworkProfile(profile_)) { 1854 if (NetworkProfileBubble::ShouldCheckNetworkProfile(profile_)) {
1840 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 1855 BrowserThread::PostTask(
1856 BrowserThread::FILE, FROM_HERE,
1841 base::Bind(&NetworkProfileBubble::CheckNetworkProfile, 1857 base::Bind(&NetworkProfileBubble::CheckNetworkProfile,
1842 profile_->GetPath())); 1858 profile_->GetPath()));
1843 } 1859 }
1844 #endif // defined(OS_WIN) 1860 #endif // defined(OS_WIN)
1845 1861
1846 #if defined(ENABLE_RLZ) && !defined(OS_CHROMEOS) 1862 #if defined(ENABLE_RLZ) && !defined(OS_CHROMEOS)
1847 // Init the RLZ library. This just binds the dll and schedules a task on the 1863 // Init the RLZ library. This just binds the dll and schedules a task on the
1848 // file thread to be run sometime later. If this is the first run we record 1864 // file thread to be run sometime later. If this is the first run we record
1849 // the installation event. 1865 // the installation event.
1850 PrefService* pref_service = profile_->GetPrefs(); 1866 PrefService* pref_service = profile_->GetPrefs();
1851 int ping_delay = first_run::IsChromeFirstRun() ? master_prefs_->ping_delay : 1867 int ping_delay =
1852 pref_service->GetInteger(first_run::GetPingDelayPrefName().c_str()); 1868 first_run::IsChromeFirstRun()
1869 ? master_prefs_->ping_delay
1870 : pref_service->GetInteger(first_run::GetPingDelayPrefName().c_str());
1853 // Negative ping delay means to send ping immediately after a first search is 1871 // Negative ping delay means to send ping immediately after a first search is
1854 // recorded. 1872 // recorded.
1855 rlz::RLZTracker::SetRlzDelegate( 1873 rlz::RLZTracker::SetRlzDelegate(
1856 base::WrapUnique(new ChromeRLZTrackerDelegate)); 1874 base::WrapUnique(new ChromeRLZTrackerDelegate));
1857 rlz::RLZTracker::InitRlzDelayed( 1875 rlz::RLZTracker::InitRlzDelayed(
1858 first_run::IsChromeFirstRun(), ping_delay < 0, 1876 first_run::IsChromeFirstRun(), ping_delay < 0,
1859 base::TimeDelta::FromMilliseconds(abs(ping_delay)), 1877 base::TimeDelta::FromMilliseconds(abs(ping_delay)),
1860 ChromeRLZTrackerDelegate::IsGoogleDefaultSearch(profile_), 1878 ChromeRLZTrackerDelegate::IsGoogleDefaultSearch(profile_),
1861 ChromeRLZTrackerDelegate::IsGoogleHomepage(profile_), 1879 ChromeRLZTrackerDelegate::IsGoogleHomepage(profile_),
1862 ChromeRLZTrackerDelegate::IsGoogleInStartpages(profile_)); 1880 ChromeRLZTrackerDelegate::IsGoogleInStartpages(profile_));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1898 browser_process_->GetApplicationLocale()); 1916 browser_process_->GetApplicationLocale());
1899 1917
1900 // Start watching for hangs during startup. We disarm this hang detector when 1918 // Start watching for hangs during startup. We disarm this hang detector when
1901 // ThreadWatcher takes over or when browser is shutdown or when 1919 // ThreadWatcher takes over or when browser is shutdown or when
1902 // startup_watcher_ is deleted. 1920 // startup_watcher_ is deleted.
1903 metrics::MetricsService::SetExecutionPhase( 1921 metrics::MetricsService::SetExecutionPhase(
1904 metrics::MetricsService::STARTUP_TIMEBOMB_ARM, 1922 metrics::MetricsService::STARTUP_TIMEBOMB_ARM,
1905 g_browser_process->local_state()); 1923 g_browser_process->local_state());
1906 startup_watcher_->Arm(base::TimeDelta::FromSeconds(600)); 1924 startup_watcher_->Arm(base::TimeDelta::FromSeconds(600));
1907 1925
1908 // On mobile, need for clean shutdown arises only when the application comes 1926 // On mobile, need for clean shutdown arises only when the application comes
1909 // to foreground (i.e. MetricsService::OnAppEnterForeground is called). 1927 // to foreground (i.e. MetricsService::OnAppEnterForeground is called).
1910 // http://crbug.com/179143 1928 // http://crbug.com/179143
1911 #if !defined(OS_ANDROID) 1929 #if !defined(OS_ANDROID)
1912 // Start watching for a hang. 1930 // Start watching for a hang.
1913 browser_process_->metrics_service()->LogNeedForCleanShutdown(); 1931 browser_process_->metrics_service()->LogNeedForCleanShutdown();
1914 #endif // !defined(OS_ANDROID) 1932 #endif // !defined(OS_ANDROID)
1915 1933
1916 #if defined(ENABLE_PRINT_PREVIEW) 1934 #if defined(ENABLE_PRINT_PREVIEW)
1917 // Create the instance of the cloud print proxy service so that it can launch 1935 // Create the instance of the cloud print proxy service so that it can launch
1918 // the service process if needed. This is needed because the service process 1936 // the service process if needed. This is needed because the service process
1919 // might have shutdown because an update was available. 1937 // might have shutdown because an update was available.
1920 // TODO(torne): this should maybe be done with 1938 // TODO(torne): this should maybe be done with
1921 // BrowserContextKeyedServiceFactory::ServiceIsCreatedWithBrowserContext() 1939 // BrowserContextKeyedServiceFactory::ServiceIsCreatedWithBrowserContext()
1922 // instead? 1940 // instead?
1923 CloudPrintProxyServiceFactory::GetForProfile(profile_); 1941 CloudPrintProxyServiceFactory::GetForProfile(profile_);
1924 #endif // defined(ENABLE_PRINT_PREVIEW) 1942 #endif // defined(ENABLE_PRINT_PREVIEW)
1925 1943
1926 // Start watching all browser threads for responsiveness. 1944 // Start watching all browser threads for responsiveness.
1927 metrics::MetricsService::SetExecutionPhase( 1945 metrics::MetricsService::SetExecutionPhase(
1928 metrics::MetricsService::THREAD_WATCHER_START, 1946 metrics::MetricsService::THREAD_WATCHER_START,
1929 g_browser_process->local_state()); 1947 g_browser_process->local_state());
1930 ThreadWatcherList::StartWatchingAll(parsed_command_line()); 1948 ThreadWatcherList::StartWatchingAll(parsed_command_line());
1931 1949
1932 #if defined(OS_ANDROID) 1950 #if defined(OS_ANDROID)
1933 ThreadWatcherAndroid::RegisterApplicationStatusListener(); 1951 ThreadWatcherAndroid::RegisterApplicationStatusListener();
1934 #endif // defined(OS_ANDROID) 1952 #endif // defined(OS_ANDROID)
1935 1953
1936 #if !defined(DISABLE_NACL) 1954 #if !defined(DISABLE_NACL)
1937 BrowserThread::PostTask( 1955 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
1938 BrowserThread::IO, 1956 base::Bind(nacl::NaClProcessHost::EarlyStartup));
manzagop (departed) 2016/08/18 15:59:56 Yes, this is too big a diff. I really think git cl
gcomanici 2016/08/19 16:04:31 Done.
1939 FROM_HERE,
1940 base::Bind(nacl::NaClProcessHost::EarlyStartup));
1941 #endif // !defined(DISABLE_NACL) 1957 #endif // !defined(DISABLE_NACL)
1942 1958
1943 // Make sure initial prefs are recorded 1959 // Make sure initial prefs are recorded
1944 PrefMetricsService::Factory::GetForProfile(profile_); 1960 PrefMetricsService::Factory::GetForProfile(profile_);
1945 1961
1946 PreBrowserStart(); 1962 PreBrowserStart();
1947 1963
1948 // Instantiate the notification UI manager, as this triggers a perf timer 1964 // Instantiate the notification UI manager, as this triggers a perf timer
1949 // used to measure startup time. TODO(stevenjb): Figure out what is actually 1965 // used to measure startup time. TODO(stevenjb): Figure out what is actually
1950 // triggering the timer and call that explicitly in the approprate place. 1966 // triggering the timer and call that explicitly in the approprate place.
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 chromeos::CrosSettings::Shutdown(); 2225 chromeos::CrosSettings::Shutdown();
2210 #endif // defined(OS_CHROMEOS) 2226 #endif // defined(OS_CHROMEOS)
2211 #endif // defined(OS_ANDROID) 2227 #endif // defined(OS_ANDROID)
2212 } 2228 }
2213 2229
2214 // Public members: 2230 // Public members:
2215 2231
2216 void ChromeBrowserMainParts::AddParts(ChromeBrowserMainExtraParts* parts) { 2232 void ChromeBrowserMainParts::AddParts(ChromeBrowserMainExtraParts* parts) {
2217 chrome_extra_parts_.push_back(parts); 2233 chrome_extra_parts_.push_back(parts);
2218 } 2234 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/importer/profile_writer.cc » ('j') | chrome/browser/importer/profile_writer.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698