| OLD | NEW |
| 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/app/chrome_main_delegate.h" | 5 #include "chrome/app/chrome_main_delegate.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
| 11 #include "base/metrics/stats_counters.h" | 11 #include "base/metrics/stats_counters.h" |
| 12 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 13 #include "base/process_util.h" | 13 #include "base/process_util.h" |
| 14 #include "base/stringprintf.h" | 14 #include "base/stringprintf.h" |
| 15 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 17 #include "chrome/browser/chrome_content_browser_client.h" | 17 #include "chrome/browser/chrome_content_browser_client.h" |
| 18 #include "chrome/browser/defaults.h" | 18 #include "chrome/browser/defaults.h" |
| 19 #include "chrome/browser/diagnostics/diagnostics_main.h" | 19 #include "chrome/browser/diagnostics/diagnostics_main.h" |
| 20 #include "chrome/browser/policy/policy_path_parser.h" |
| 20 #include "chrome/common/chrome_constants.h" | 21 #include "chrome/common/chrome_constants.h" |
| 21 #include "chrome/common/chrome_content_client.h" | 22 #include "chrome/common/chrome_content_client.h" |
| 22 #include "chrome/common/chrome_paths.h" | 23 #include "chrome/common/chrome_paths.h" |
| 23 #include "chrome/common/chrome_paths_internal.h" | 24 #include "chrome/common/chrome_paths_internal.h" |
| 24 #include "chrome/common/chrome_switches.h" | 25 #include "chrome/common/chrome_switches.h" |
| 25 #include "chrome/common/chrome_version_info.h" | 26 #include "chrome/common/chrome_version_info.h" |
| 26 #include "chrome/common/logging_chrome.h" | 27 #include "chrome/common/logging_chrome.h" |
| 27 #include "chrome/common/profiling.h" | 28 #include "chrome/common/profiling.h" |
| 28 #include "chrome/common/startup_metric_utils.h" | 29 #include "chrome/common/startup_metric_utils.h" |
| 29 #include "chrome/common/url_constants.h" | 30 #include "chrome/common/url_constants.h" |
| 30 #include "chrome/plugin/chrome_content_plugin_client.h" | 31 #include "chrome/plugin/chrome_content_plugin_client.h" |
| 31 #include "chrome/renderer/chrome_content_renderer_client.h" | 32 #include "chrome/renderer/chrome_content_renderer_client.h" |
| 32 #include "chrome/utility/chrome_content_utility_client.h" | 33 #include "chrome/utility/chrome_content_utility_client.h" |
| 33 #include "content/public/common/content_client.h" | 34 #include "content/public/common/content_client.h" |
| 34 #include "content/public/common/content_paths.h" | 35 #include "content/public/common/content_paths.h" |
| 35 #include "content/public/common/content_switches.h" | 36 #include "content/public/common/content_switches.h" |
| 36 #include "ui/base/ui_base_switches.h" | 37 #include "ui/base/ui_base_switches.h" |
| 37 | 38 |
| 38 #if defined(OS_WIN) | 39 #if defined(OS_WIN) |
| 39 #include <algorithm> | 40 #include <algorithm> |
| 40 #include <atlbase.h> | 41 #include <atlbase.h> |
| 41 #include <malloc.h> | 42 #include <malloc.h> |
| 42 #include "base/string_util.h" | 43 #include "base/string_util.h" |
| 43 #include "base/win/registry.h" | |
| 44 #include "chrome/browser/policy/policy_path_parser.h" | |
| 45 #include "policy/policy_constants.h" | |
| 46 #include "sandbox/win/src/sandbox.h" | 44 #include "sandbox/win/src/sandbox.h" |
| 47 #include "tools/memory_watcher/memory_watcher.h" | 45 #include "tools/memory_watcher/memory_watcher.h" |
| 48 #include "ui/base/resource/resource_bundle_win.h" | 46 #include "ui/base/resource/resource_bundle_win.h" |
| 49 #endif | 47 #endif |
| 50 | 48 |
| 51 #if defined(OS_MACOSX) | 49 #if defined(OS_MACOSX) |
| 52 #include "base/mac/mac_util.h" | 50 #include "base/mac/mac_util.h" |
| 53 #include "base/mac/os_crash_dumps.h" | 51 #include "base/mac/os_crash_dumps.h" |
| 54 #include "chrome/app/breakpad_mac.h" | 52 #include "chrome/app/breakpad_mac.h" |
| 55 #include "chrome/app/chrome_main_mac.h" | 53 #include "chrome/app/chrome_main_mac.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 // some apps fail to properly escape arguments. | 116 // some apps fail to properly escape arguments. |
| 119 bool HasDeprecatedArguments(const std::wstring& command_line) { | 117 bool HasDeprecatedArguments(const std::wstring& command_line) { |
| 120 const wchar_t kChromeHtml[] = L"chromehtml:"; | 118 const wchar_t kChromeHtml[] = L"chromehtml:"; |
| 121 std::wstring command_line_lower = command_line; | 119 std::wstring command_line_lower = command_line; |
| 122 // We are only searching for ASCII characters so this is OK. | 120 // We are only searching for ASCII characters so this is OK. |
| 123 StringToLowerASCII(&command_line_lower); | 121 StringToLowerASCII(&command_line_lower); |
| 124 std::wstring::size_type pos = command_line_lower.find(kChromeHtml); | 122 std::wstring::size_type pos = command_line_lower.find(kChromeHtml); |
| 125 return (pos != std::wstring::npos); | 123 return (pos != std::wstring::npos); |
| 126 } | 124 } |
| 127 | 125 |
| 128 // Checks if the registry key exists in the given hive and expands any | |
| 129 // variables in the string. | |
| 130 bool LoadUserDataDirPolicyFromRegistry(HKEY hive, | |
| 131 const std::wstring& key_name, | |
| 132 base::FilePath* user_data_dir) { | |
| 133 std::wstring value; | |
| 134 | |
| 135 base::win::RegKey policy_key(hive, | |
| 136 policy::kRegistryMandatorySubKey, | |
| 137 KEY_READ); | |
| 138 if (policy_key.ReadValue(key_name.c_str(), &value) == ERROR_SUCCESS) { | |
| 139 *user_data_dir = | |
| 140 base::FilePath(policy::path_parser::ExpandPathVariables(value)); | |
| 141 return true; | |
| 142 } | |
| 143 return false; | |
| 144 } | |
| 145 | |
| 146 void CheckUserDataDirPolicy(base::FilePath* user_data_dir) { | |
| 147 DCHECK(user_data_dir); | |
| 148 // We are running as Chrome Frame if we were invoked with user-data-dir, | |
| 149 // chrome-frame, and automation-channel switches. | |
| 150 CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
| 151 const bool is_chrome_frame = | |
| 152 !user_data_dir->empty() && | |
| 153 command_line->HasSwitch(switches::kChromeFrame) && | |
| 154 command_line->HasSwitch(switches::kAutomationClientChannelID); | |
| 155 | |
| 156 // In the case of Chrome Frame, the last path component of the user-data-dir | |
| 157 // provided on the command line must be preserved since it is specific to | |
| 158 // CF's host. | |
| 159 base::FilePath cf_host_dir; | |
| 160 if (is_chrome_frame) | |
| 161 cf_host_dir = user_data_dir->BaseName(); | |
| 162 | |
| 163 // Policy from the HKLM hive has precedence over HKCU so if we have one here | |
| 164 // we don't have to try to load HKCU. | |
| 165 const char* key_name_ascii = (is_chrome_frame ? policy::key::kGCFUserDataDir : | |
| 166 policy::key::kUserDataDir); | |
| 167 std::wstring key_name(ASCIIToWide(key_name_ascii)); | |
| 168 if (LoadUserDataDirPolicyFromRegistry(HKEY_LOCAL_MACHINE, key_name, | |
| 169 user_data_dir) || | |
| 170 LoadUserDataDirPolicyFromRegistry(HKEY_CURRENT_USER, key_name, | |
| 171 user_data_dir)) { | |
| 172 // A Group Policy value was loaded. Append the Chrome Frame host directory | |
| 173 // if relevant. | |
| 174 if (is_chrome_frame) | |
| 175 *user_data_dir = user_data_dir->Append(cf_host_dir); | |
| 176 } | |
| 177 } | |
| 178 | |
| 179 // If we try to access a path that is not currently available, we want the call | 126 // If we try to access a path that is not currently available, we want the call |
| 180 // to fail rather than show an error dialog. | 127 // to fail rather than show an error dialog. |
| 181 void SuppressWindowsErrorDialogs() { | 128 void SuppressWindowsErrorDialogs() { |
| 182 UINT new_flags = SEM_FAILCRITICALERRORS | | 129 UINT new_flags = SEM_FAILCRITICALERRORS | |
| 183 SEM_NOOPENFILEERRORBOX; | 130 SEM_NOOPENFILEERRORBOX; |
| 184 | 131 |
| 185 // Preserve existing error mode. | 132 // Preserve existing error mode. |
| 186 UINT existing_flags = SetErrorMode(new_flags); | 133 UINT existing_flags = SetErrorMode(new_flags); |
| 187 SetErrorMode(existing_flags | new_flags); | 134 SetErrorMode(existing_flags | new_flags); |
| 188 } | 135 } |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 chrome::GetVersionedDirectory(). | 485 chrome::GetVersionedDirectory(). |
| 539 Append(chrome::kHelperProcessExecutablePath)); | 486 Append(chrome::kHelperProcessExecutablePath)); |
| 540 | 487 |
| 541 InitMacCrashReporter(command_line, process_type); | 488 InitMacCrashReporter(command_line, process_type); |
| 542 #endif | 489 #endif |
| 543 | 490 |
| 544 // Notice a user data directory override if any | 491 // Notice a user data directory override if any |
| 545 base::FilePath user_data_dir = | 492 base::FilePath user_data_dir = |
| 546 command_line.GetSwitchValuePath(switches::kUserDataDir); | 493 command_line.GetSwitchValuePath(switches::kUserDataDir); |
| 547 #if defined(OS_MACOSX) || defined(OS_WIN) | 494 #if defined(OS_MACOSX) || defined(OS_WIN) |
| 548 CheckUserDataDirPolicy(&user_data_dir); | 495 policy::path_parser::CheckUserDataDirPolicy(&user_data_dir); |
| 549 #endif | 496 #endif |
| 550 if (!user_data_dir.empty()) { | 497 if (!user_data_dir.empty()) { |
| 551 CHECK(PathService::OverrideAndCreateIfNeeded( | 498 CHECK(PathService::OverrideAndCreateIfNeeded( |
| 552 chrome::DIR_USER_DATA, | 499 chrome::DIR_USER_DATA, |
| 553 user_data_dir, | 500 user_data_dir, |
| 554 chrome::ProcessNeedsProfileDir(process_type))); | 501 chrome::ProcessNeedsProfileDir(process_type))); |
| 555 } | 502 } |
| 556 | 503 |
| 557 stats_counter_timer_.reset(new base::StatsCounterTimer("Chrome.Init")); | 504 stats_counter_timer_.reset(new base::StatsCounterTimer("Chrome.Init")); |
| 558 startup_timer_.reset(new base::StatsScope<base::StatsCounterTimer> | 505 startup_timer_.reset(new base::StatsScope<base::StatsCounterTimer> |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 | 713 |
| 767 content::ContentRendererClient* | 714 content::ContentRendererClient* |
| 768 ChromeMainDelegate::CreateContentRendererClient() { | 715 ChromeMainDelegate::CreateContentRendererClient() { |
| 769 return &g_chrome_content_renderer_client.Get(); | 716 return &g_chrome_content_renderer_client.Get(); |
| 770 } | 717 } |
| 771 | 718 |
| 772 content::ContentUtilityClient* | 719 content::ContentUtilityClient* |
| 773 ChromeMainDelegate::CreateContentUtilityClient() { | 720 ChromeMainDelegate::CreateContentUtilityClient() { |
| 774 return &g_chrome_content_utility_client.Get(); | 721 return &g_chrome_content_utility_client.Get(); |
| 775 } | 722 } |
| OLD | NEW |