| Index: chrome/browser/extensions/app_host/app_host_main.cc
|
| diff --git a/chrome/browser/extensions/app_host/app_host_main.cc b/chrome/browser/extensions/app_host/app_host_main.cc
|
| index 387a356e27597352037493a578bdc62e5c5cb836..811a7f1e2cbe25137770baaba07b3dc1096ade40 100644
|
| --- a/chrome/browser/extensions/app_host/app_host_main.cc
|
| +++ b/chrome/browser/extensions/app_host/app_host_main.cc
|
| @@ -13,9 +13,58 @@
|
| #include "chrome/browser/extensions/app_host/update.h"
|
| #include "chrome/installer/launcher_support/chrome_launcher_support.h"
|
|
|
| +namespace {
|
| +
|
| +HRESULT LaunchChromeAndProceed(const CommandLine& cmd_line) {
|
| + bool success = base::LaunchProcess(cmd_line, base::LaunchOptions(), NULL);
|
| + if (success) {
|
| + LOG(INFO) << "Delegated to Chrome executable at "
|
| + << cmd_line.GetProgram().value();
|
| + } else {
|
| + LOG(INFO) << "Failed to launch Chrome executable at "
|
| + << cmd_line.GetProgram().value();
|
| + }
|
| + return success ? S_OK : E_FAIL;
|
| +}
|
| +
|
| +HRESULT LaunchChromeAndWait(const CommandLine& cmd_line) {
|
| + const DWORD kTimeOutInMilliseconds = 20000;
|
| + HANDLE proc = 0;
|
| + bool success = base::LaunchProcess(cmd_line, base::LaunchOptions(), &proc);
|
| + if (!success) {
|
| + LOG(INFO) << "Failed to launch Chrome executable at "
|
| + << cmd_line.GetProgram().value();
|
| + return E_FAIL;
|
| + }
|
| +
|
| + LOG(INFO) << "Delegated to Chrome executable at "
|
| + << cmd_line.GetProgram().value();
|
| + DWORD res = WaitForSingleObject(proc, kTimeOutInMilliseconds);
|
| + if (res != WAIT_OBJECT_0) {
|
| + LOG(INFO) << " Failed to wailt.";
|
| + return E_FAIL;
|
| + }
|
| +
|
| + if (!GetExitCodeProcess(proc, &res)) {
|
| + LOG(INFO) << " Failed to get exit code.";
|
| + return E_FAIL;
|
| + }
|
| + // Since we know that the process has terminated, we need not worry about
|
| + // the case where |res| should be interested as STILL_ACTIVE.
|
| +
|
| + LOG(INFO) << " Exit code: " << res;
|
| + DCHECK(res != STILL_ACTIVE);
|
| + return res;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) {
|
| base::AtExitManager exit_manager;
|
|
|
| + // From chrome_switches.cc
|
| + const char kQueryEULAAcceptance[] = "query-eula-acceptance";
|
| +
|
| // Initialize the commandline singleton from the environment.
|
| CommandLine::Init(0, NULL);
|
|
|
| @@ -25,29 +74,33 @@ int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) {
|
| HRESULT hr = app_host::InstallBinaries();
|
| if (FAILED(hr)) {
|
| LOG(ERROR) << "Failed to install the Chrome Binaries. Error: " << hr;
|
| - return 1;
|
| + return E_FAIL;
|
| } else {
|
| chrome_exe = chrome_launcher_support::GetAnyChromePath();
|
| if (chrome_exe.empty()) {
|
| LOG(ERROR) << "Failed to find the Chrome Binaries despite a "
|
| << "'successful' installation.";
|
| - return 1;
|
| + return E_FAIL;
|
| }
|
| }
|
| }
|
|
|
| + CommandLine command_line(*CommandLine::ForCurrentProcess());
|
| CommandLine chrome_exe_command_line(chrome_exe);
|
| - chrome_exe_command_line.AppendArguments(
|
| - *CommandLine::ForCurrentProcess(), false);
|
| - // Launch Chrome before checking for update, for faster user experience.
|
| - bool launch_result = base::LaunchProcess(chrome_exe_command_line,
|
| - base::LaunchOptions(), NULL);
|
| - if (launch_result)
|
| - LOG(INFO) << "Delegated to Chrome executable at " << chrome_exe.value();
|
| - else
|
| - LOG(INFO) << "Failed to launch Chrome executable at " << chrome_exe.value();
|
| -
|
| - app_host::EnsureAppHostUpToDate();
|
| -
|
| - return !launch_result;
|
| + chrome_exe_command_line.AppendArguments(command_line, false);
|
| +
|
| + bool wait_for_chrome = false;
|
| + if (command_line.HasSwitch(kQueryEULAAcceptance))
|
| + wait_for_chrome = true;
|
| +
|
| + if (!wait_for_chrome) {
|
| + // Launch Chrome before checking for update, for faster user experience.
|
| + HRESULT ret = LaunchChromeAndProceed(chrome_exe_command_line);
|
| + app_host::EnsureAppHostUpToDate();
|
| + return ret;
|
| +
|
| + } else {
|
| + // We wait, so do not slow things more by trying to update app_host.exe.
|
| + return LaunchChromeAndWait(chrome_exe_command_line);
|
| + }
|
| }
|
|
|