1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/win/default_apps_util.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <shobjidl.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <wrl/client.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_version.h"
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker // Returns the target used as a activate parameter when opening the settings
21*6777b538SAndroid Build Coastguard Worker // pointing to the page that is the most relevant to a user trying to change the
22*6777b538SAndroid Build Coastguard Worker // default handler for `protocol`.
GetTargetForDefaultAppsSettings(std::wstring_view protocol)23*6777b538SAndroid Build Coastguard Worker std::wstring GetTargetForDefaultAppsSettings(std::wstring_view protocol) {
24*6777b538SAndroid Build Coastguard Worker static constexpr std::wstring_view kSystemSettingsDefaultAppsPrefix(
25*6777b538SAndroid Build Coastguard Worker L"SystemSettings_DefaultApps_");
26*6777b538SAndroid Build Coastguard Worker if (base::EqualsCaseInsensitiveASCII(protocol, L"http"))
27*6777b538SAndroid Build Coastguard Worker return base::StrCat({kSystemSettingsDefaultAppsPrefix, L"Browser"});
28*6777b538SAndroid Build Coastguard Worker if (base::EqualsCaseInsensitiveASCII(protocol, L"mailto"))
29*6777b538SAndroid Build Coastguard Worker return base::StrCat({kSystemSettingsDefaultAppsPrefix, L"Email"});
30*6777b538SAndroid Build Coastguard Worker return L"SettingsPageAppsDefaultsProtocolView";
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker } // namespace
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker namespace base::win {
36*6777b538SAndroid Build Coastguard Worker
LaunchDefaultAppsSettingsModernDialog(std::wstring_view protocol)37*6777b538SAndroid Build Coastguard Worker bool LaunchDefaultAppsSettingsModernDialog(std::wstring_view protocol) {
38*6777b538SAndroid Build Coastguard Worker // The appModelId looks arbitrary but it is the same in Win8 and Win10. There
39*6777b538SAndroid Build Coastguard Worker // is no easy way to retrieve the appModelId from the registry.
40*6777b538SAndroid Build Coastguard Worker static constexpr wchar_t kControlPanelAppModelId[] =
41*6777b538SAndroid Build Coastguard Worker L"windows.immersivecontrolpanel_cw5n1h2txyewy"
42*6777b538SAndroid Build Coastguard Worker L"!microsoft.windows.immersivecontrolpanel";
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IApplicationActivationManager> activator;
45*6777b538SAndroid Build Coastguard Worker HRESULT hr = ::CoCreateInstance(CLSID_ApplicationActivationManager, nullptr,
46*6777b538SAndroid Build Coastguard Worker CLSCTX_ALL, IID_PPV_ARGS(&activator));
47*6777b538SAndroid Build Coastguard Worker if (FAILED(hr))
48*6777b538SAndroid Build Coastguard Worker return false;
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker DWORD pid = 0;
51*6777b538SAndroid Build Coastguard Worker CoAllowSetForegroundWindow(activator.Get(), nullptr);
52*6777b538SAndroid Build Coastguard Worker hr = activator->ActivateApplication(
53*6777b538SAndroid Build Coastguard Worker kControlPanelAppModelId, L"page=SettingsPageAppsDefaults", AO_NONE, &pid);
54*6777b538SAndroid Build Coastguard Worker if (FAILED(hr))
55*6777b538SAndroid Build Coastguard Worker return false;
56*6777b538SAndroid Build Coastguard Worker if (protocol.empty())
57*6777b538SAndroid Build Coastguard Worker return true;
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker hr = activator->ActivateApplication(
60*6777b538SAndroid Build Coastguard Worker kControlPanelAppModelId,
61*6777b538SAndroid Build Coastguard Worker base::StrCat({L"page=SettingsPageAppsDefaults&target=",
62*6777b538SAndroid Build Coastguard Worker GetTargetForDefaultAppsSettings(protocol)})
63*6777b538SAndroid Build Coastguard Worker .c_str(),
64*6777b538SAndroid Build Coastguard Worker AO_NONE, &pid);
65*6777b538SAndroid Build Coastguard Worker return SUCCEEDED(hr);
66*6777b538SAndroid Build Coastguard Worker }
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker } // namespace base::win
69