| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "chrome/app/chrome_main.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/stats_counters.h" | 10 #include "base/metrics/stats_counters.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 #include "media/base/media.h" | 39 #include "media/base/media.h" |
| 40 #include "ui/base/resource/resource_bundle.h" | 40 #include "ui/base/resource/resource_bundle.h" |
| 41 #include "ui/base/ui_base_switches.h" | 41 #include "ui/base/ui_base_switches.h" |
| 42 | 42 |
| 43 #if defined(OS_WIN) | 43 #if defined(OS_WIN) |
| 44 #include <algorithm> | 44 #include <algorithm> |
| 45 #include <atlbase.h> | 45 #include <atlbase.h> |
| 46 #include <malloc.h> | 46 #include <malloc.h> |
| 47 #include "base/string_util.h" | 47 #include "base/string_util.h" |
| 48 #include "base/win/registry.h" | 48 #include "base/win/registry.h" |
| 49 #include "chrome/browser/policy/policy_path_parser.h" |
| 50 #include "policy/policy_constants.h" |
| 49 #include "sandbox/src/sandbox.h" | 51 #include "sandbox/src/sandbox.h" |
| 50 #include "tools/memory_watcher/memory_watcher.h" | 52 #include "tools/memory_watcher/memory_watcher.h" |
| 51 #endif | 53 #endif |
| 52 | 54 |
| 53 #if defined(OS_MACOSX) | 55 #if defined(OS_MACOSX) |
| 54 #include "base/mac/mac_util.h" | 56 #include "base/mac/mac_util.h" |
| 55 #include "base/mac/os_crash_dumps.h" | 57 #include "base/mac/os_crash_dumps.h" |
| 56 #include "chrome/app/breakpad_mac.h" | 58 #include "chrome/app/breakpad_mac.h" |
| 57 #include "chrome/browser/mac/relauncher.h" | 59 #include "chrome/browser/mac/relauncher.h" |
| 58 #include "chrome/common/chrome_paths_internal.h" | 60 #include "chrome/common/chrome_paths_internal.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 // some apps fail to properly escape arguments. | 143 // some apps fail to properly escape arguments. |
| 142 bool HasDeprecatedArguments(const std::wstring& command_line) { | 144 bool HasDeprecatedArguments(const std::wstring& command_line) { |
| 143 const wchar_t kChromeHtml[] = L"chromehtml:"; | 145 const wchar_t kChromeHtml[] = L"chromehtml:"; |
| 144 std::wstring command_line_lower = command_line; | 146 std::wstring command_line_lower = command_line; |
| 145 // We are only searching for ASCII characters so this is OK. | 147 // We are only searching for ASCII characters so this is OK. |
| 146 StringToLowerASCII(&command_line_lower); | 148 StringToLowerASCII(&command_line_lower); |
| 147 std::wstring::size_type pos = command_line_lower.find(kChromeHtml); | 149 std::wstring::size_type pos = command_line_lower.find(kChromeHtml); |
| 148 return (pos != std::wstring::npos); | 150 return (pos != std::wstring::npos); |
| 149 } | 151 } |
| 150 | 152 |
| 153 // Checks if the registry key exists in the given hive and expands any |
| 154 // variables in the string. |
| 155 bool LoadUserDataDirPolicyFromRegistry(HKEY hive, |
| 156 const std::wstring& key_name, |
| 157 FilePath* user_data_dir) { |
| 158 std::wstring value; |
| 159 |
| 160 base::win::RegKey hklm_policy_key(hive, policy::kRegistrySubKey, KEY_READ); |
| 161 if (hklm_policy_key.ReadValue(key_name.c_str(), &value) == ERROR_SUCCESS) { |
| 162 *user_data_dir = FilePath(policy::path_parser::ExpandPathVariables(value)); |
| 163 return true; |
| 164 } |
| 165 return false; |
| 166 } |
| 167 |
| 168 void CheckUserDataDirPolicy(FilePath* user_data_dir) { |
| 169 DCHECK(user_data_dir); |
| 170 // We are running as Chrome Frame if we were invoked with user-data-dir, |
| 171 // chrome-frame, and automation-channel switches. |
| 172 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 173 const bool is_chrome_frame = |
| 174 !user_data_dir->empty() && |
| 175 command_line->HasSwitch(switches::kChromeFrame) && |
| 176 command_line->HasSwitch(switches::kAutomationClientChannelID); |
| 177 |
| 178 // In the case of Chrome Frame, the last path component of the user-data-dir |
| 179 // provided on the command line must be preserved since it is specific to |
| 180 // CF's host. |
| 181 FilePath cf_host_dir; |
| 182 if (is_chrome_frame) |
| 183 cf_host_dir = user_data_dir->BaseName(); |
| 184 |
| 185 // Policy from the HKLM hive has precedence over HKCU so if we have one here |
| 186 // we don't have to try to load HKCU. |
| 187 const char* key_name_ascii = (is_chrome_frame ? policy::key::kGCFUserDataDir : |
| 188 policy::key::kUserDataDir); |
| 189 std::wstring key_name(ASCIIToWide(key_name_ascii)); |
| 190 if (LoadUserDataDirPolicyFromRegistry(HKEY_LOCAL_MACHINE, key_name, |
| 191 user_data_dir) || |
| 192 LoadUserDataDirPolicyFromRegistry(HKEY_CURRENT_USER, key_name, |
| 193 user_data_dir)) { |
| 194 // A Group Policy value was loaded. Append the Chrome Frame host directory |
| 195 // if relevant. |
| 196 if (is_chrome_frame) |
| 197 *user_data_dir = user_data_dir->Append(cf_host_dir); |
| 198 } |
| 199 } |
| 200 |
| 151 #endif // defined(OS_WIN) | 201 #endif // defined(OS_WIN) |
| 152 | 202 |
| 153 #if defined(OS_LINUX) | 203 #if defined(OS_LINUX) |
| 154 static void AdjustLinuxOOMScore(const std::string& process_type) { | 204 static void AdjustLinuxOOMScore(const std::string& process_type) { |
| 155 // Browsers and zygotes should still be killable, but killed last. | 205 // Browsers and zygotes should still be killable, but killed last. |
| 156 const int kZygoteScore = 0; | 206 const int kZygoteScore = 0; |
| 157 // The minimum amount to bump a score by. This is large enough that | 207 // The minimum amount to bump a score by. This is large enough that |
| 158 // even if it's translated into the old values, it will still go up | 208 // even if it's translated into the old values, it will still go up |
| 159 // by at least one. | 209 // by at least one. |
| 160 const int kScoreBump = 100; | 210 const int kScoreBump = 100; |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 }; | 404 }; |
| 355 | 405 |
| 356 class ChromeMainDelegate : public content::ContentMainDelegate { | 406 class ChromeMainDelegate : public content::ContentMainDelegate { |
| 357 public: | 407 public: |
| 358 virtual bool BasicStartupComplete(int* exit_code) OVERRIDE { | 408 virtual bool BasicStartupComplete(int* exit_code) OVERRIDE { |
| 359 #if defined(OS_CHROMEOS) | 409 #if defined(OS_CHROMEOS) |
| 360 chromeos::BootTimesLoader::Get()->SaveChromeMainStats(); | 410 chromeos::BootTimesLoader::Get()->SaveChromeMainStats(); |
| 361 #endif | 411 #endif |
| 362 | 412 |
| 363 #if defined(OS_MACOSX) | 413 #if defined(OS_MACOSX) |
| 364 chrome_main::SetUpBundleOverrides(); | 414 SetUpBundleOverrides(); |
| 365 chrome::common::mac::EnableCFBundleBlocker(); | 415 chrome::common::mac::EnableCFBundleBlocker(); |
| 366 #endif | 416 #endif |
| 367 | 417 |
| 368 Profiling::ProcessStarted(); | 418 Profiling::ProcessStarted(); |
| 369 | 419 |
| 370 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 420 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 371 std::string process_type = | 421 std::string process_type = |
| 372 command_line.GetSwitchValueASCII(switches::kProcessType); | 422 command_line.GetSwitchValueASCII(switches::kProcessType); |
| 373 | 423 |
| 374 #if defined(OS_POSIX) | 424 #if defined(OS_POSIX) |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 PathService::Override(content::CHILD_PROCESS_EXE, | 555 PathService::Override(content::CHILD_PROCESS_EXE, |
| 506 chrome::GetVersionedDirectory(). | 556 chrome::GetVersionedDirectory(). |
| 507 Append(chrome::kHelperProcessExecutablePath)); | 557 Append(chrome::kHelperProcessExecutablePath)); |
| 508 | 558 |
| 509 InitMacCrashReporter(command_line, process_type); | 559 InitMacCrashReporter(command_line, process_type); |
| 510 #endif | 560 #endif |
| 511 | 561 |
| 512 // Notice a user data directory override if any | 562 // Notice a user data directory override if any |
| 513 FilePath user_data_dir = | 563 FilePath user_data_dir = |
| 514 command_line.GetSwitchValuePath(switches::kUserDataDir); | 564 command_line.GetSwitchValuePath(switches::kUserDataDir); |
| 515 chrome_main::CheckUserDataDirPolicy(&user_data_dir); | 565 #if defined(OS_MACOSX) || defined(OS_WIN) |
| 566 CheckUserDataDirPolicy(&user_data_dir); |
| 567 #endif |
| 516 if (!user_data_dir.empty()) | 568 if (!user_data_dir.empty()) |
| 517 CHECK(PathService::Override(chrome::DIR_USER_DATA, user_data_dir)); | 569 CHECK(PathService::Override(chrome::DIR_USER_DATA, user_data_dir)); |
| 518 | 570 |
| 519 base::ProcessId browser_pid = base::GetCurrentProcId(); | 571 base::ProcessId browser_pid = base::GetCurrentProcId(); |
| 520 if (!process_type.empty() && | 572 if (!process_type.empty() && |
| 521 #if defined(OS_MACOSX) | 573 #if defined(OS_MACOSX) |
| 522 process_type != switches::kRelauncherProcess && | 574 process_type != switches::kRelauncherProcess && |
| 523 #endif | 575 #endif |
| 524 process_type != switches::kServiceProcess) { | 576 process_type != switches::kServiceProcess) { |
| 525 #if defined(OS_WIN) || defined(OS_MACOSX) | 577 #if defined(OS_WIN) || defined(OS_MACOSX) |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 749 DLLEXPORT int __cdecl ChromeMain(HINSTANCE instance, | 801 DLLEXPORT int __cdecl ChromeMain(HINSTANCE instance, |
| 750 sandbox::SandboxInterfaceInfo* sandbox_info) { | 802 sandbox::SandboxInterfaceInfo* sandbox_info) { |
| 751 ChromeMainDelegate chrome_main_delegate; | 803 ChromeMainDelegate chrome_main_delegate; |
| 752 return content::ContentMain(instance, sandbox_info, &chrome_main_delegate); | 804 return content::ContentMain(instance, sandbox_info, &chrome_main_delegate); |
| 753 #elif defined(OS_POSIX) | 805 #elif defined(OS_POSIX) |
| 754 int ChromeMain(int argc, char** argv) { | 806 int ChromeMain(int argc, char** argv) { |
| 755 ChromeMainDelegate chrome_main_delegate; | 807 ChromeMainDelegate chrome_main_delegate; |
| 756 return content::ContentMain(argc, argv, &chrome_main_delegate); | 808 return content::ContentMain(argc, argv, &chrome_main_delegate); |
| 757 #endif | 809 #endif |
| 758 } | 810 } |
| OLD | NEW |