| Index: chrome/installer/util/shell_util.cc
|
| diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
|
| index acff489d78441011d3fe5ea115e82576981d484c..5dd804af45f6ec92cd4f4de26b147c97e3a21a11 100644
|
| --- a/chrome/installer/util/shell_util.cc
|
| +++ b/chrome/installer/util/shell_util.cc
|
| @@ -11,6 +11,7 @@
|
|
|
| #include <windows.h>
|
| #include <shlobj.h>
|
| +#include <shobjidl.h>
|
|
|
| #include <limits>
|
| #include <string>
|
| @@ -876,6 +877,25 @@ bool ElevateAndRegisterChrome(BrowserDistribution* dist,
|
| return false;
|
| }
|
|
|
| +// Launches the Windows 'settings' modern app with the 'default apps' view
|
| +// focused. This only works for Windows 8 and Windows 10. The appModelId
|
| +// looks arbitrary but it is the same in Win8 and Win10 previews. There
|
| +// is no easy way to retrieve the appModelId from the registry.
|
| +bool LaunchDefaultAppsSettingsModernDialog() {
|
| + base::win::ScopedComPtr<IApplicationActivationManager> activator;
|
| + HRESULT hr = activator.CreateInstance(CLSID_ApplicationActivationManager);
|
| + if (SUCCEEDED(hr)) {
|
| + DWORD pid = 0;
|
| + CoAllowSetForegroundWindow(activator.get(), nullptr);
|
| + hr = activator->ActivateApplication(
|
| + L"windows.immersivecontrolpanel_cw5n1h2txyewy"
|
| + L"!microsoft.windows.immersivecontrolpanel",
|
| + L"page=SettingsPageAppsDefaults", AO_NONE, &pid);
|
| + return SUCCEEDED(hr);
|
| + }
|
| + return false;
|
| +}
|
| +
|
| // Launches the Windows 7 and Windows 8 dialog for picking the application to
|
| // handle the given protocol. Most importantly, this is used to set the default
|
| // handler for http (and, implicitly with it, https). In that case it is also
|
| @@ -2061,13 +2081,22 @@ bool ShellUtil::ShowMakeChromeDefaultSystemUI(
|
| bool succeeded = true;
|
| bool is_default = (GetChromeDefaultState() == IS_DEFAULT);
|
| if (!is_default) {
|
| - // On Windows 8, you can't set yourself as the default handler
|
| - // programatically. In other words IApplicationAssociationRegistration
|
| - // has been rendered useless. What you can do is to launch
|
| - // "Set Program Associations" section of the "Default Programs"
|
| - // control panel, which is a mess, or pop the concise "How you want to open
|
| - // webpages?" dialog. We choose the latter.
|
| - succeeded = LaunchSelectDefaultProtocolHandlerDialog(L"http");
|
| + if (base::win::GetVersion() < base::win::VERSION_WIN10) {
|
| + // On Windows 8, you can't set yourself as the default handler
|
| + // programatically. In other words IApplicationAssociationRegistration
|
| + // has been rendered useless. What you can do is to launch
|
| + // "Set Program Associations" section of the "Default Programs"
|
| + // control panel, which is a mess, or pop the concise "How you want to
|
| + // open webpages?" dialog. We choose the latter.
|
| + succeeded = LaunchSelectDefaultProtocolHandlerDialog(L"http");
|
| + } else {
|
| + // On Windows 10, you can't even launch the associations dialog.
|
| + // So we launch the settings dialog. Quoting from MSDN: "The Open With
|
| + // dialog box can no longer be used to change the default program used to
|
| + // open a file extension. You can only use SHOpenWithDialog to open
|
| + // a single file."
|
| + succeeded = LaunchDefaultAppsSettingsModernDialog();
|
| + }
|
| is_default = (succeeded && GetChromeDefaultState() == IS_DEFAULT);
|
| }
|
| if (succeeded && is_default)
|
|
|