xref: /aosp_15_r20/external/cronet/base/win/default_apps_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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