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; |