| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // This file defines functions that integrate Chrome in Windows shell. These | 5 // This file defines functions that integrate Chrome in Windows shell. These |
| 6 // functions can be used by Chrome as well as Chrome installer. All of the | 6 // functions can be used by Chrome as well as Chrome installer. All of the |
| 7 // work is done by the local functions defined in anonymous namespace in | 7 // work is done by the local functions defined in anonymous namespace in |
| 8 // this class. | 8 // this class. |
| 9 | 9 |
| 10 #include "chrome/installer/util/shell_util.h" | 10 #include "chrome/installer/util/shell_util.h" |
| 11 | 11 |
| 12 #include <windows.h> | 12 #include <windows.h> |
| 13 #include <shlobj.h> | 13 #include <shlobj.h> |
| 14 #include <shobjidl.h> |
| 14 | 15 |
| 15 #include <limits> | 16 #include <limits> |
| 16 #include <string> | 17 #include <string> |
| 17 | 18 |
| 18 #include "base/bind.h" | 19 #include "base/bind.h" |
| 19 #include "base/command_line.h" | 20 #include "base/command_line.h" |
| 20 #include "base/files/file_enumerator.h" | 21 #include "base/files/file_enumerator.h" |
| 21 #include "base/files/file_path.h" | 22 #include "base/files/file_path.h" |
| 22 #include "base/files/file_util.h" | 23 #include "base/files/file_util.h" |
| 23 #include "base/lazy_instance.h" | 24 #include "base/lazy_instance.h" |
| (...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 } | 870 } |
| 870 | 871 |
| 871 DWORD ret_val = 0; | 872 DWORD ret_val = 0; |
| 872 InstallUtil::ExecuteExeAsAdmin(cmd, &ret_val); | 873 InstallUtil::ExecuteExeAsAdmin(cmd, &ret_val); |
| 873 if (ret_val == 0) | 874 if (ret_val == 0) |
| 874 return true; | 875 return true; |
| 875 } | 876 } |
| 876 return false; | 877 return false; |
| 877 } | 878 } |
| 878 | 879 |
| 880 // Launches the Windows 'settings' modern app with the 'default apps' view |
| 881 // focused. This only works for Windows 8 and Windows 10. The appModelId |
| 882 // looks arbitrary but it is the same in Win8 and Win10 previews. There |
| 883 // is no easy way to retrieve the appModelId from the registry. |
| 884 bool LaunchDefaultAppsSettingsModernDialog() { |
| 885 base::win::ScopedComPtr<IApplicationActivationManager> activator; |
| 886 HRESULT hr = activator.CreateInstance(CLSID_ApplicationActivationManager); |
| 887 if (SUCCEEDED(hr)) { |
| 888 DWORD pid = 0; |
| 889 CoAllowSetForegroundWindow(activator.get(), nullptr); |
| 890 hr = activator->ActivateApplication( |
| 891 L"windows.immersivecontrolpanel_cw5n1h2txyewy" |
| 892 L"!microsoft.windows.immersivecontrolpanel", |
| 893 L"page=SettingsPageAppsDefaults", AO_NONE, &pid); |
| 894 return SUCCEEDED(hr); |
| 895 } |
| 896 return false; |
| 897 } |
| 898 |
| 879 // Launches the Windows 7 and Windows 8 dialog for picking the application to | 899 // Launches the Windows 7 and Windows 8 dialog for picking the application to |
| 880 // handle the given protocol. Most importantly, this is used to set the default | 900 // handle the given protocol. Most importantly, this is used to set the default |
| 881 // handler for http (and, implicitly with it, https). In that case it is also | 901 // handler for http (and, implicitly with it, https). In that case it is also |
| 882 // known as the 'how do you want to open webpages' dialog. | 902 // known as the 'how do you want to open webpages' dialog. |
| 883 // It is required that Chrome be already *registered* for the given protocol. | 903 // It is required that Chrome be already *registered* for the given protocol. |
| 884 bool LaunchSelectDefaultProtocolHandlerDialog(const wchar_t* protocol) { | 904 bool LaunchSelectDefaultProtocolHandlerDialog(const wchar_t* protocol) { |
| 885 DCHECK(protocol); | 905 DCHECK(protocol); |
| 886 OPENASINFO open_as_info = {}; | 906 OPENASINFO open_as_info = {}; |
| 887 open_as_info.pcszFile = protocol; | 907 open_as_info.pcszFile = protocol; |
| 888 open_as_info.oaifInFlags = | 908 open_as_info.oaifInFlags = |
| (...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2054 BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) { | 2074 BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) { |
| 2055 return false; | 2075 return false; |
| 2056 } | 2076 } |
| 2057 | 2077 |
| 2058 if (!RegisterChromeBrowser(dist, chrome_exe, base::string16(), true)) | 2078 if (!RegisterChromeBrowser(dist, chrome_exe, base::string16(), true)) |
| 2059 return false; | 2079 return false; |
| 2060 | 2080 |
| 2061 bool succeeded = true; | 2081 bool succeeded = true; |
| 2062 bool is_default = (GetChromeDefaultState() == IS_DEFAULT); | 2082 bool is_default = (GetChromeDefaultState() == IS_DEFAULT); |
| 2063 if (!is_default) { | 2083 if (!is_default) { |
| 2064 // On Windows 8, you can't set yourself as the default handler | 2084 if (base::win::GetVersion() < base::win::VERSION_WIN10) { |
| 2065 // programatically. In other words IApplicationAssociationRegistration | 2085 // On Windows 8, you can't set yourself as the default handler |
| 2066 // has been rendered useless. What you can do is to launch | 2086 // programatically. In other words IApplicationAssociationRegistration |
| 2067 // "Set Program Associations" section of the "Default Programs" | 2087 // has been rendered useless. What you can do is to launch |
| 2068 // control panel, which is a mess, or pop the concise "How you want to open | 2088 // "Set Program Associations" section of the "Default Programs" |
| 2069 // webpages?" dialog. We choose the latter. | 2089 // control panel, which is a mess, or pop the concise "How you want to |
| 2070 succeeded = LaunchSelectDefaultProtocolHandlerDialog(L"http"); | 2090 // open webpages?" dialog. We choose the latter. |
| 2091 succeeded = LaunchSelectDefaultProtocolHandlerDialog(L"http"); |
| 2092 } else { |
| 2093 // On Windows 10, you can't even launch the associations dialog. |
| 2094 // So we launch the settings dialog. Quoting from MSDN: "The Open With |
| 2095 // dialog box can no longer be used to change the default program used to |
| 2096 // open a file extension. You can only use SHOpenWithDialog to open |
| 2097 // a single file." |
| 2098 succeeded = LaunchDefaultAppsSettingsModernDialog(); |
| 2099 } |
| 2071 is_default = (succeeded && GetChromeDefaultState() == IS_DEFAULT); | 2100 is_default = (succeeded && GetChromeDefaultState() == IS_DEFAULT); |
| 2072 } | 2101 } |
| 2073 if (succeeded && is_default) | 2102 if (succeeded && is_default) |
| 2074 RegisterChromeAsDefaultXPStyle(dist, CURRENT_USER, chrome_exe); | 2103 RegisterChromeAsDefaultXPStyle(dist, CURRENT_USER, chrome_exe); |
| 2075 return succeeded; | 2104 return succeeded; |
| 2076 } | 2105 } |
| 2077 | 2106 |
| 2078 bool ShellUtil::MakeChromeDefaultProtocolClient( | 2107 bool ShellUtil::MakeChromeDefaultProtocolClient( |
| 2079 BrowserDistribution* dist, | 2108 BrowserDistribution* dist, |
| 2080 const base::FilePath& chrome_exe, | 2109 const base::FilePath& chrome_exe, |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2480 base::string16 key_path(ShellUtil::kRegClasses); | 2509 base::string16 key_path(ShellUtil::kRegClasses); |
| 2481 key_path.push_back(base::FilePath::kSeparators[0]); | 2510 key_path.push_back(base::FilePath::kSeparators[0]); |
| 2482 key_path.append(prog_id); | 2511 key_path.append(prog_id); |
| 2483 return InstallUtil::DeleteRegistryKey( | 2512 return InstallUtil::DeleteRegistryKey( |
| 2484 HKEY_CURRENT_USER, key_path, WorkItem::kWow64Default); | 2513 HKEY_CURRENT_USER, key_path, WorkItem::kWow64Default); |
| 2485 | 2514 |
| 2486 // TODO(mgiuca): Remove the extension association entries. This requires that | 2515 // TODO(mgiuca): Remove the extension association entries. This requires that |
| 2487 // the extensions associated with a particular prog_id are stored in that | 2516 // the extensions associated with a particular prog_id are stored in that |
| 2488 // prog_id's key. | 2517 // prog_id's key. |
| 2489 } | 2518 } |
| OLD | NEW |