| Index: win8/delegate_execute/command_execute_impl.cc
|
| diff --git a/win8/delegate_execute/command_execute_impl.cc b/win8/delegate_execute/command_execute_impl.cc
|
| index 0d05dc517ee251e2d2eb8eb5cd3aed2d98847394..405b24f0fc4884d94780a738f4ae96ad2e9ca6f1 100644
|
| --- a/win8/delegate_execute/command_execute_impl.cc
|
| +++ b/win8/delegate_execute/command_execute_impl.cc
|
| @@ -116,7 +116,7 @@ bool CommandExecuteImpl::path_provider_initialized_ = false;
|
| // If chrome is running then focus/activation is given to the existing one
|
| // regarless of what launch point the user used.
|
| //
|
| -// The general flow when chrome is the default browser is as follows:
|
| +// The general flow for activation is as follows:
|
| //
|
| // 1- User interacts with launch point (icon, tile, search, shellexec, etc)
|
| // 2- Windows finds the appid for launch item and resolves it to chrome
|
| @@ -133,11 +133,12 @@ bool CommandExecuteImpl::path_provider_initialized_ = false;
|
| // the launch scheme (or url) and the activation verb.
|
| // 5- Windows calls CommandExecuteImpl::Getvalue()
|
| // Here we need to return AHE_IMMERSIVE or AHE_DESKTOP. That depends on:
|
| -// a) if run in high-integrity return AHE_DESKTOP
|
| +// a) if run in high-integrity return AHE_DESKTOP.
|
| // b) else we return what GetLaunchMode() tells us, which is:
|
| -// i) if the command line --force-xxx is present return that
|
| -// ii) if the registry 'launch_mode' exists return that
|
| -// iii) else return AHE_DESKTOP
|
| +// i) if chrome is not the default browser, return AHE_DESKTOP
|
| +// ii) if the command line --force-xxx is present return that
|
| +// iii) if the registry 'launch_mode' exists return that
|
| +// iv) else return AHE_DESKTOP
|
| // 6- If we returned AHE_IMMERSIVE in step 5 windows might not call us back
|
| // and simply activate chrome in metro by itself, however in some cases
|
| // it might proceed at step 7.
|
| @@ -150,7 +151,13 @@ bool CommandExecuteImpl::path_provider_initialized_ = false;
|
| // b) else we call one of the IApplicationActivationManager activation
|
| // functions depending on the parameters passed in step 4.
|
| // c) If the activation returns E_APPLICATION_NOT_REGISTERED, then we fall
|
| -// back to launching chrome on the desktop via LaunchDestopChrome().
|
| +// back to launching chrome on the desktop via LaunchDestopChrome(). Note
|
| +// that this case can lead to strange behavior, because at this point we
|
| +// have pre-launched the browser with --silent-launch --viewer-connect.
|
| +// E_APPLICATION_NOT_REGISTERED is always returned if Chrome is not the
|
| +// default browser (this case will have already been checked for by
|
| +// GetLaunchMode() and AHE_DESKTOP returned), but we don't know if it can
|
| +// be returned for other reasons.
|
| //
|
| // Note that if a command line --force-xxx is present we write that launch mode
|
| // in the registry so next time the logic reaches 5c-ii it will use the same
|
| @@ -209,6 +216,12 @@ STDMETHODIMP CommandExecuteImpl::GetValue(enum AHE_TYPE* pahe) {
|
| EC_HOST_UI_MODE mode = GetLaunchMode();
|
| *pahe = (mode == ECHUIM_DESKTOP) ? AHE_DESKTOP : AHE_IMMERSIVE;
|
|
|
| + // If we're going to return AHE_IMMERSIVE, then both the browser process and
|
| + // the metro viewer need to launch and connect before the user can start
|
| + // browsing. However we must not launch the metro viewer until we get a
|
| + // call to CommandExecuteImpl::Execute(). If we wait until then to launch
|
| + // the browser process as well, it will appear laggy while they connect to
|
| + // each other, so we pre-launch the browser process now.
|
| if (*pahe == AHE_IMMERSIVE && verb_ != win8::kMetroViewerConnectVerb)
|
| LaunchChromeBrowserProcess();
|
| return S_OK;
|
| @@ -415,6 +428,17 @@ EC_HOST_UI_MODE CommandExecuteImpl::GetLaunchMode() {
|
| launch_mode_determined = true;
|
| return launch_mode;
|
| }
|
| +
|
| + base::FilePath chrome_exe;
|
| + if (!FindChromeExe(&chrome_exe) ||
|
| + ShellUtil::GetChromeDefaultStateFromPath(chrome_exe) !=
|
| + ShellUtil::DefaultState::IS_DEFAULT) {
|
| + AtlTrace("Chrome is not default: launching in desktop mode\n");
|
| + launch_mode = ECHUIM_DESKTOP;
|
| + launch_mode_determined = true;
|
| + return launch_mode;
|
| + }
|
| +
|
| if (GetAsyncKeyState(VK_SHIFT) && GetAsyncKeyState(VK_F11)) {
|
| AtlTrace("Hotkey: launching in immersive mode\n");
|
| launch_mode = ECHUIM_IMMERSIVE;
|
|
|