| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/browser_main.h" | 5 #include "chrome/browser/browser_main.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "app/hi_res_timer_manager.h" | 9 #include "app/hi_res_timer_manager.h" |
| 10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 bool enabled = local_state->GetBoolean(prefs::kMetricsReportingEnabled); | 475 bool enabled = local_state->GetBoolean(prefs::kMetricsReportingEnabled); |
| 476 metrics->SetUserPermitsUpload(enabled); | 476 metrics->SetUserPermitsUpload(enabled); |
| 477 if (enabled) | 477 if (enabled) |
| 478 metrics->Start(); | 478 metrics->Start(); |
| 479 #endif | 479 #endif |
| 480 } | 480 } |
| 481 | 481 |
| 482 return metrics; | 482 return metrics; |
| 483 } | 483 } |
| 484 | 484 |
| 485 // Initializes the profile, possibly doing some user prompting to pick a |
| 486 // fallback profile. Returns the newly created profile, or NULL if startup |
| 487 // should not continue. |
| 488 Profile* CreateProfile(const MainFunctionParams& parameters, |
| 489 const FilePath& user_data_dir) { |
| 490 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile( |
| 491 user_data_dir); |
| 492 if (profile) |
| 493 return profile; |
| 494 |
| 495 #if defined(OS_WIN) |
| 496 // Ideally, we should be able to run w/o access to disk. For now, we |
| 497 // prompt the user to pick a different user-data-dir and restart chrome |
| 498 // with the new dir. |
| 499 // http://code.google.com/p/chromium/issues/detail?id=11510 |
| 500 FilePath new_user_data_dir = UserDataDirDialog::RunUserDataDirDialog( |
| 501 user_data_dir); |
| 502 if (!parameters.ui_task && browser_shutdown::delete_resources_on_shutdown) { |
| 503 // Only delete the resources if we're not running tests. If we're running |
| 504 // tests the resources need to be reused as many places in the UI cache |
| 505 // SkBitmaps from the ResourceBundle. |
| 506 ResourceBundle::CleanupSharedInstance(); |
| 507 } |
| 508 |
| 509 if (!new_user_data_dir.empty()) { |
| 510 // Because of the way CommandLine parses, it's sufficient to append a new |
| 511 // --user-data-dir switch. The last flag of the same name wins. |
| 512 // TODO(tc): It would be nice to remove the flag we don't want, but that |
| 513 // sounds risky if we parse differently than CommandLineToArgvW. |
| 514 CommandLine new_command_line = parameters.command_line_; |
| 515 new_command_line.AppendSwitchWithValue(switches::kUserDataDir, |
| 516 new_user_data_dir.ToWStringHack()); |
| 517 base::LaunchApp(new_command_line, false, false, NULL); |
| 518 } |
| 519 #else |
| 520 // TODO(port): fix this. See comments near the definition of |
| 521 // user_data_dir. It is better to CHECK-fail here than it is to |
| 522 // silently exit because of missing code in the above test. |
| 523 CHECK(profile) << "Cannot get default profile."; |
| 524 #endif |
| 525 |
| 526 return NULL; |
| 527 } |
| 528 |
| 485 #if defined(OS_WIN) | 529 #if defined(OS_WIN) |
| 486 | 530 |
| 487 // gfx::Font callbacks | 531 // gfx::Font callbacks |
| 488 void AdjustUIFont(LOGFONT* logfont) { | 532 void AdjustUIFont(LOGFONT* logfont) { |
| 489 l10n_util::AdjustUIFont(logfont); | 533 l10n_util::AdjustUIFont(logfont); |
| 490 } | 534 } |
| 491 | 535 |
| 492 int GetMinimumFontSize() { | 536 int GetMinimumFontSize() { |
| 493 return StringToInt(l10n_util::GetString(IDS_MINIMUM_UI_FONT_SIZE).c_str()); | 537 return StringToInt(l10n_util::GetString(IDS_MINIMUM_UI_FONT_SIZE).c_str()); |
| 494 } | 538 } |
| 495 | 539 |
| 496 #endif | 540 #endif |
| 497 | 541 |
| 498 #if defined(TOOLKIT_GTK) | 542 #if defined(TOOLKIT_GTK) |
| 499 void InitializeToolkit() { | 543 void InitializeToolkit() { |
| 500 // It is important for this to happen before the first run dialog, as it | 544 // It is important for this to happen before the first run dialog, as it |
| 501 // styles the dialog as well. | 545 // styles the dialog as well. |
| 502 gtk_util::InitRCStyles(); | 546 gtk_util::InitRCStyles(); |
| 503 } | 547 } |
| 504 #elif defined(TOOLKIT_VIEWS) | 548 #elif defined(TOOLKIT_VIEWS) |
| 505 void InitializeToolkit() { | 549 void InitializeToolkit() { |
| 506 // The delegate needs to be set before any UI is created so that windows | 550 // The delegate needs to be set before any UI is created so that windows |
| 507 // display the correct icon. | 551 // display the correct icon. |
| 508 if (!views::ViewsDelegate::views_delegate) | 552 if (!views::ViewsDelegate::views_delegate) |
| 509 views::ViewsDelegate::views_delegate = new ChromeViewsDelegate; | 553 views::ViewsDelegate::views_delegate = new ChromeViewsDelegate; |
| 510 | 554 |
| 511 #if defined(OS_WIN) | 555 #if defined(OS_WIN) |
| 512 gfx::Font::adjust_font_callback = &AdjustUIFont; | 556 gfx::Font::adjust_font_callback = &AdjustUIFont; |
| 513 gfx::Font::get_minimum_font_size_callback = &GetMinimumFontSize; | 557 gfx::Font::get_minimum_font_size_callback = &GetMinimumFontSize; |
| 558 |
| 559 // Init common control sex. |
| 560 INITCOMMONCONTROLSEX config; |
| 561 config.dwSize = sizeof(config); |
| 562 config.dwICC = ICC_WIN95_CLASSES; |
| 563 InitCommonControlsEx(&config); |
| 514 #endif | 564 #endif |
| 515 } | 565 } |
| 516 #else | 566 #else |
| 517 void InitializeToolkit() { | 567 void InitializeToolkit() { |
| 518 } | 568 } |
| 519 #endif | 569 #endif |
| 520 | 570 |
| 521 #if defined(OS_CHROMEOS) | 571 #if defined(OS_CHROMEOS) |
| 522 void OptionallyRunChromeOSLoginManager(const CommandLine& parsed_command_line) { | 572 void OptionallyRunChromeOSLoginManager(const CommandLine& parsed_command_line) { |
| 523 if (parsed_command_line.HasSwitch(switches::kLoginManager)) { | 573 if (parsed_command_line.HasSwitch(switches::kLoginManager)) { |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 #endif | 883 #endif |
| 834 | 884 |
| 835 if (parsed_command_line.HasSwitch(switches::kHideIcons) || | 885 if (parsed_command_line.HasSwitch(switches::kHideIcons) || |
| 836 parsed_command_line.HasSwitch(switches::kShowIcons)) | 886 parsed_command_line.HasSwitch(switches::kShowIcons)) |
| 837 return HandleIconsCommands(parsed_command_line); | 887 return HandleIconsCommands(parsed_command_line); |
| 838 if (parsed_command_line.HasSwitch(switches::kMakeDefaultBrowser)) { | 888 if (parsed_command_line.HasSwitch(switches::kMakeDefaultBrowser)) { |
| 839 return ShellIntegration::SetAsDefaultBrowser() ? | 889 return ShellIntegration::SetAsDefaultBrowser() ? |
| 840 ResultCodes::NORMAL_EXIT : ResultCodes::SHELL_INTEGRATION_FAILED; | 890 ResultCodes::NORMAL_EXIT : ResultCodes::SHELL_INTEGRATION_FAILED; |
| 841 } | 891 } |
| 842 | 892 |
| 843 // Try to create/load the profile. | |
| 844 ProfileManager* profile_manager = browser_process->profile_manager(); | |
| 845 #if defined(OS_CHROMEOS) | 893 #if defined(OS_CHROMEOS) |
| 846 if (parsed_command_line.HasSwitch(switches::kLoginUser)) { | 894 if (parsed_command_line.HasSwitch(switches::kLoginUser)) { |
| 847 std::string username = | 895 std::string username = |
| 848 parsed_command_line.GetSwitchValueASCII(switches::kLoginUser); | 896 parsed_command_line.GetSwitchValueASCII(switches::kLoginUser); |
| 849 LOG(INFO) << "Relaunching browser for user: " << username; | 897 LOG(INFO) << "Relaunching browser for user: " << username; |
| 850 chromeos::UserManager::Get()->UserLoggedIn(username); | 898 chromeos::UserManager::Get()->UserLoggedIn(username); |
| 851 } | 899 } |
| 852 #endif | 900 #endif |
| 853 | 901 |
| 854 Profile* profile = profile_manager->GetDefaultProfile(user_data_dir); | 902 // Profile creation ---------------------------------------------------------- |
| 855 | 903 |
| 856 #if defined(OS_WIN) | 904 Profile* profile = CreateProfile(parameters, user_data_dir); |
| 857 if (!profile) { | 905 if (!profile) |
| 858 // Ideally, we should be able to run w/o access to disk. For now, we | 906 return ResultCodes::NORMAL_EXIT; |
| 859 // prompt the user to pick a different user-data-dir and restart chrome | |
| 860 // with the new dir. | |
| 861 // http://code.google.com/p/chromium/issues/detail?id=11510 | |
| 862 user_data_dir = UserDataDirDialog::RunUserDataDirDialog(user_data_dir); | |
| 863 if (!parameters.ui_task && browser_shutdown::delete_resources_on_shutdown) { | |
| 864 // Only delete the resources if we're not running tests. If we're running | |
| 865 // tests the resources need to be reused as many places in the UI cache | |
| 866 // SkBitmaps from the ResourceBundle. | |
| 867 ResourceBundle::CleanupSharedInstance(); | |
| 868 } | |
| 869 | 907 |
| 870 if (!user_data_dir.empty()) { | 908 // Post-profile init --------------------------------------------------------- |
| 871 // Because of the way CommandLine parses, it's sufficient to append a new | |
| 872 // --user-data-dir switch. The last flag of the same name wins. | |
| 873 // TODO(tc): It would be nice to remove the flag we don't want, but that | |
| 874 // sounds risky if we parse differently than CommandLineToArgvW. | |
| 875 CommandLine new_command_line = parsed_command_line; | |
| 876 new_command_line.AppendSwitchWithValue(switches::kUserDataDir, | |
| 877 user_data_dir.ToWStringHack()); | |
| 878 base::LaunchApp(new_command_line, false, false, NULL); | |
| 879 } | |
| 880 | |
| 881 return ResultCodes::NORMAL_EXIT; | |
| 882 } | |
| 883 #else | |
| 884 // TODO(port): fix this. See comments near the definition of | |
| 885 // user_data_dir. It is better to CHECK-fail here than it is to | |
| 886 // silently exit because of missing code in the above test. | |
| 887 CHECK(profile) << "Cannot get default profile."; | |
| 888 #endif | |
| 889 | 909 |
| 890 PrefService* user_prefs = profile->GetPrefs(); | 910 PrefService* user_prefs = profile->GetPrefs(); |
| 891 DCHECK(user_prefs); | 911 DCHECK(user_prefs); |
| 892 | 912 |
| 893 OptionallyRunChromeOSLoginManager(parsed_command_line); | 913 OptionallyRunChromeOSLoginManager(parsed_command_line); |
| 894 | 914 |
| 895 // Importing other browser settings is done in a browser-like process | 915 // Importing other browser settings is done in a browser-like process |
| 896 // that exits when this task has finished. | 916 // that exits when this task has finished. |
| 897 #if defined(OS_WIN) | 917 #if defined(OS_WIN) |
| 898 if (parsed_command_line.HasSwitch(switches::kImport) || | 918 if (parsed_command_line.HasSwitch(switches::kImport) || |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 // Sets things up so that if we crash from this point on, a dialog will | 993 // Sets things up so that if we crash from this point on, a dialog will |
| 974 // popup asking the user to restart chrome. It is done this late to avoid | 994 // popup asking the user to restart chrome. It is done this late to avoid |
| 975 // testing against a bunch of special cases that are taken care early on. | 995 // testing against a bunch of special cases that are taken care early on. |
| 976 PrepareRestartOnCrashEnviroment(parsed_command_line); | 996 PrepareRestartOnCrashEnviroment(parsed_command_line); |
| 977 | 997 |
| 978 // Initialize and maintain DNS prefetcher module. Also registers an observer | 998 // Initialize and maintain DNS prefetcher module. Also registers an observer |
| 979 // to clear the host cache when closing incognito mode. | 999 // to clear the host cache when closing incognito mode. |
| 980 chrome_browser_net::DnsGlobalInit dns_prefetch(user_prefs, local_state); | 1000 chrome_browser_net::DnsGlobalInit dns_prefetch(user_prefs, local_state); |
| 981 | 1001 |
| 982 #if defined(OS_WIN) | 1002 #if defined(OS_WIN) |
| 983 // Init common control sex. | |
| 984 INITCOMMONCONTROLSEX config; | |
| 985 config.dwSize = sizeof(config); | |
| 986 config.dwICC = ICC_WIN95_CLASSES; | |
| 987 InitCommonControlsEx(&config); | |
| 988 | |
| 989 win_util::ScopedCOMInitializer com_initializer; | 1003 win_util::ScopedCOMInitializer com_initializer; |
| 990 | 1004 |
| 991 // Init the RLZ library. This just binds the dll and schedules a task on the | 1005 // Init the RLZ library. This just binds the dll and schedules a task on the |
| 992 // file thread to be run sometime later. If this is the first run we record | 1006 // file thread to be run sometime later. If this is the first run we record |
| 993 // the installation event. | 1007 // the installation event. |
| 994 RLZTracker::InitRlzDelayed(base::DIR_MODULE, is_first_run, | 1008 RLZTracker::InitRlzDelayed(base::DIR_MODULE, is_first_run, |
| 995 master_prefs.ping_delay); | 1009 master_prefs.ping_delay); |
| 996 #endif | 1010 #endif |
| 997 | 1011 |
| 998 // Configure the network module so it has access to resources. | 1012 // Configure the network module so it has access to resources. |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 | 1112 |
| 1099 metrics->Stop(); | 1113 metrics->Stop(); |
| 1100 | 1114 |
| 1101 // browser_shutdown takes care of deleting browser_process, so we need to | 1115 // browser_shutdown takes care of deleting browser_process, so we need to |
| 1102 // release it. | 1116 // release it. |
| 1103 browser_process.release(); | 1117 browser_process.release(); |
| 1104 browser_shutdown::Shutdown(); | 1118 browser_shutdown::Shutdown(); |
| 1105 | 1119 |
| 1106 return result_code; | 1120 return result_code; |
| 1107 } | 1121 } |
| OLD | NEW |