summaryrefslogtreecommitdiffstats
path: root/win8
diff options
context:
space:
mode:
authorcpu@chromium.org <cpu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-14 01:13:50 +0000
committercpu@chromium.org <cpu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-14 01:13:50 +0000
commitf2802ccbad2d0aea70be488a5becbd29222f54c1 (patch)
treecd013b8b116812762a8efcf61b86cbdaf7299fc5 /win8
parent8f9e7ef7bc75d1e2d2424afc700225a53d72a7eb (diff)
downloadchromium_src-f2802ccbad2d0aea70be488a5becbd29222f54c1.zip
chromium_src-f2802ccbad2d0aea70be488a5becbd29222f54c1.tar.gz
chromium_src-f2802ccbad2d0aea70be488a5becbd29222f54c1.tar.bz2
Implement the persistent metro mode setting (win8)
We use HKCU\Software\<product>\Metro registry path and 'launch_mode' value to store the last 'forced' mode. Unless chrome is already running we use the stored mode if it is found else we use a "tabletness" heuristic to determine the launch mode. BUG=141032 TEST=none Review URL: https://chromiumcodereview.appspot.com/10928172 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@156708 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'win8')
-rw-r--r--win8/delegate_execute/command_execute_impl.cc117
1 files changed, 60 insertions, 57 deletions
diff --git a/win8/delegate_execute/command_execute_impl.cc b/win8/delegate_execute/command_execute_impl.cc
index 9781386..943a6d6 100644
--- a/win8/delegate_execute/command_execute_impl.cc
+++ b/win8/delegate_execute/command_execute_impl.cc
@@ -10,8 +10,10 @@
#include "base/file_util.h"
#include "base/path_service.h"
#include "base/utf_string_conversions.h"
+#include "base/win/registry.h"
#include "base/win/scoped_co_mem.h"
#include "base/win/scoped_handle.h"
+#include "base/win/win_util.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
@@ -45,36 +47,32 @@
// Here we need to return AHE_IMMERSIVE or AHE_DESKTOP. That depends on:
// a) if run in high-integrity return AHE_DESKTOP
// b) if chrome is running return the AHE_ mode of chrome
-// c) if the current process is inmmersive return AHE_IMMERSIVE
-// d) if the protocol is file and IExecuteCommandHost::GetUIMode() is not
-// ECHUIM_DESKTOP then return AHE_IMMERSIVE
-// e) if none of the above return AHE_DESKTOP
-// 6- If we returned AHE_DESKTOP in step 5 then CommandExecuteImpl::Execute()
-// is called, here we call GetLaunchMode() which:
-// a) if chrome is running return the mode of chrome or
-// b) return IExecuteCommandHost::GetUIMode()
-// 7- If GetLaunchMode() returns
-// a) ECHUIM_DESKTOP we call LaunchDestopChrome() that calls ::CreateProcess
+// c) 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) if IsMachineATablet() is true return AHE_IMMERSIVE
+// 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.
+// As far as we know if we return AHE_DESKTOP then step 7 always happens.
+// 7- Windows calls CommandExecuteImpl::Execute()
+// Here we call GetLaunchMode() which returns the cached answer
+// computed at step 5c. which can be:
+// a) ECHUIM_DESKTOP then we call LaunchDestopChrome() that calls
+// ::CreateProcess and we exit at this point even on failure.
// 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().
//
-// Some examples will help clarify the common cases.
+// 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
+// mode again.
//
-// I - No chrome running, taskbar icon launch:
-// a) Scheme is 'file', Verb is 'open'
-// b) GetValue() returns at e) step : AHE_DESKTOP
-// c) Execute() calls LaunchDestopChrome()
-// --> desktop chrome runs
-// II- No chrome running, tile activation launch:
-// a) Scheme is 'file', Verb is 'open'
-// b) GetValue() returns at d) step : AHE_IMMERSIVE
-// c) Windows does not call us back and just activates chrome
-// --> metro chrome runs
-// III- No chrome running, url link click on metro app:
-// a) Scheme is 'http', Verb is 'open'
-// b) Getvalue() returns at e) step : AHE_DESKTOP
-// c) Execute() calls IApplicationActivationManager::ActivateForProtocol
-// --> metro chrome runs
+// Also note that if we are not the default browser and IsMachineATablet()
+// returns true, launching chrome can go all the way to 7c, which might be
+// a slow way to start chrome.
//
CommandExecuteImpl::CommandExecuteImpl()
: integrity_level_(base::INTEGRITY_UNKNOWN),
@@ -177,21 +175,8 @@ STDMETHODIMP CommandExecuteImpl::GetValue(enum AHE_TYPE* pahe) {
return S_OK;
}
- if (IsImmersiveProcess(GetCurrentProcess())) {
- AtlTrace("Current process is inmmersive, AHE_IMMERSIVE\n");
- *pahe = AHE_IMMERSIVE;
- return S_OK;
- }
-
- if ((launch_scheme_ == INTERNET_SCHEME_FILE) &&
- (GetLaunchMode() != ECHUIM_DESKTOP)) {
- AtlTrace("INTERNET_SCHEME_FILE, mode != ECHUIM_DESKTOP, AHE_IMMERSIVE\n");
- *pahe = AHE_IMMERSIVE;
- return S_OK;
- }
-
- AtlTrace("Fallback is AHE_DESKTOP\n");
- *pahe = AHE_DESKTOP;
+ EC_HOST_UI_MODE mode = GetLaunchMode();
+ *pahe = (mode == ECHUIM_DESKTOP) ? AHE_DESKTOP : AHE_IMMERSIVE;
return S_OK;
}
@@ -399,12 +384,11 @@ HRESULT CommandExecuteImpl::LaunchDesktopChrome() {
}
EC_HOST_UI_MODE CommandExecuteImpl::GetLaunchMode() {
- // We are to return chrome's mode if chrome exists else we query our embedder
- // IServiceProvider and learn the mode from them.
+ // See the header file for an explanation of the mode selection logic.
static bool launch_mode_determined = false;
static EC_HOST_UI_MODE launch_mode = ECHUIM_DESKTOP;
- const char* modes[] = { "Desktop", "Inmmersive", "SysLauncher", "??" };
+ const char* modes[] = { "Desktop", "Immersive", "SysLauncher", "??" };
if (launch_mode_determined)
return launch_mode;
@@ -419,30 +403,49 @@ EC_HOST_UI_MODE CommandExecuteImpl::GetLaunchMode() {
if (parameters_ == ASCIIToWide(switches::kForceImmersive)) {
launch_mode = ECHUIM_IMMERSIVE;
launch_mode_determined = true;
+ parameters_.clear();
} else if (parameters_ == ASCIIToWide(switches::kForceDesktop)) {
launch_mode = ECHUIM_DESKTOP;
launch_mode_determined = true;
+ parameters_.clear();
+ }
+
+ base::win::RegKey reg_key;
+ LONG key_result = reg_key.Create(HKEY_CURRENT_USER,
+ chrome::kMetroRegistryPath,
+ KEY_ALL_ACCESS);
+ if (key_result != ERROR_SUCCESS) {
+ AtlTrace("Failed to open HKCU %ls key, error 0x%x\n",
+ chrome::kMetroRegistryPath,
+ key_result);
+ if (!launch_mode_determined) {
+ launch_mode = ECHUIM_DESKTOP;
+ launch_mode_determined = true;
+ }
+ return launch_mode;
}
if (launch_mode_determined) {
- parameters_.clear();
- AtlTrace("Launch mode forced to %s\n", modes[launch_mode]);
+ AtlTrace("Launch mode forced by cmdline to %s\n", modes[launch_mode]);
+ reg_key.WriteValue(chrome::kLaunchModeValue,
+ static_cast<DWORD>(launch_mode));
return launch_mode;
}
- CComPtr<IExecuteCommandHost> host;
- CComQIPtr<IServiceProvider> service_provider = m_spUnkSite;
- if (service_provider) {
- service_provider->QueryService(IID_IExecuteCommandHost, &host);
- if (host) {
- host->GetUIMode(&launch_mode);
- } else {
- AtlTrace("Failed to get IID_IExecuteCommandHost. Assuming desktop\n");
- }
+ DWORD reg_value;
+ if (reg_key.ReadValueDW(chrome::kLaunchModeValue,
+ &reg_value) != ERROR_SUCCESS) {
+ launch_mode = base::win::IsMachineATablet() ?
+ ECHUIM_IMMERSIVE : ECHUIM_DESKTOP;
+ AtlTrace("Launch mode forced by heuristics to %s\n", modes[launch_mode]);
+ } else if (reg_value >= ECHUIM_SYSTEM_LAUNCHER) {
+ AtlTrace("Invalid registry launch mode value %u\n", reg_value);
+ launch_mode = ECHUIM_DESKTOP;
} else {
- AtlTrace("Failed to get IServiceProvider. Assuming desktop mode\n");
+ AtlTrace("Launch mode forced by registry to %s\n", modes[launch_mode]);
+ launch_mode = static_cast<EC_HOST_UI_MODE>(reg_value);
}
- AtlTrace("Launch mode is %s\n", modes[launch_mode]);
+
launch_mode_determined = true;
return launch_mode;
}