Chromium Code Reviews| 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 #include "chrome/browser/shell_integration.h" | 5 #include "chrome/browser/shell_integration.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <shlwapi.h> | 8 #include <shlwapi.h> |
| 9 #include <shobjidl.h> | 9 #include <shobjidl.h> |
| 10 #include <propkey.h> // Needs to come after shobjidl.h. | 10 #include <propkey.h> // Needs to come after shobjidl.h. |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 case ShellUtil::NOT_DEFAULT: | 246 case ShellUtil::NOT_DEFAULT: |
| 247 return ShellIntegration::NOT_DEFAULT; | 247 return ShellIntegration::NOT_DEFAULT; |
| 248 case ShellUtil::IS_DEFAULT: | 248 case ShellUtil::IS_DEFAULT: |
| 249 return ShellIntegration::IS_DEFAULT; | 249 return ShellIntegration::IS_DEFAULT; |
| 250 default: | 250 default: |
| 251 DCHECK_EQ(ShellUtil::UNKNOWN_DEFAULT, default_state); | 251 DCHECK_EQ(ShellUtil::UNKNOWN_DEFAULT, default_state); |
| 252 return ShellIntegration::UNKNOWN_DEFAULT; | 252 return ShellIntegration::UNKNOWN_DEFAULT; |
| 253 } | 253 } |
| 254 } | 254 } |
| 255 | 255 |
| 256 // Resets the default browser choice for the current user. | |
| 257 void ResetDefaultBrowser() { | |
| 258 static const wchar_t* const kUrlAssociationKeyFormats[] = { | |
| 259 L"SOFTWARE\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\" | |
| 260 L"%ls\\UserChoice", | |
| 261 L"SOFTWARE\\Microsoft\\Windows\\Roaming\\OpenWith\\UrlAssociations\\" | |
| 262 L"%ls\\UserChoice"}; | |
| 263 static const wchar_t* const kProtocols[] = {L"http", L"https"}; | |
| 264 | |
| 265 for (const wchar_t* format : kUrlAssociationKeyFormats) { | |
| 266 for (const wchar_t* protocol : kProtocols) { | |
| 267 base::win::RegKey registry_key( | |
| 268 HKEY_CURRENT_USER, base::StringPrintf(format, protocol).c_str(), | |
| 269 KEY_SET_VALUE); | |
| 270 registry_key.DeleteValue(L"Hash"); | |
| 271 } | |
| 272 } | |
| 273 } | |
| 274 | |
| 275 // Returns true if the AsyncSetAsDefault field trial is activated. | 256 // Returns true if the AsyncSetAsDefault field trial is activated. |
| 276 bool IsAsyncSetAsDefaultEnabled() { | 257 bool IsAsyncSetAsDefaultEnabled() { |
| 277 using base::CommandLine; | 258 using base::CommandLine; |
| 278 | 259 |
| 279 // Note: It's important to query the field trial state first, to ensure that | 260 // Note: It's important to query the field trial state first, to ensure that |
| 280 // UMA reports the correct group. | 261 // UMA reports the correct group. |
| 281 const std::string group_name = | 262 const std::string group_name = |
| 282 base::FieldTrialList::FindFullName("AsyncSetAsDefault"); | 263 base::FieldTrialList::FindFullName(kAsyncSetAsDefaultExperimentName); |
| 283 if (CommandLine::ForCurrentProcess()->HasSwitch(kDisableAsyncSetAsDefault)) | 264 if (CommandLine::ForCurrentProcess()->HasSwitch(kDisableAsyncSetAsDefault)) |
| 284 return false; | 265 return false; |
| 285 if (CommandLine::ForCurrentProcess()->HasSwitch(kEnableAsyncSetAsDefault)) | 266 if (CommandLine::ForCurrentProcess()->HasSwitch(kEnableAsyncSetAsDefault)) |
| 286 return true; | 267 return true; |
| 287 | 268 |
| 288 return base::StartsWith(group_name, "Enabled", base::CompareCase::SENSITIVE); | 269 return base::StartsWith(group_name, "Enabled", base::CompareCase::SENSITIVE); |
| 289 } | 270 } |
| 290 | 271 |
| 291 bool RegisterBrowser() { | 272 bool RegisterBrowser() { |
| 292 base::FilePath chrome_exe; | 273 base::FilePath chrome_exe; |
| 293 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { | 274 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { |
| 294 NOTREACHED() << "Error getting app exe path"; | 275 NOTREACHED() << "Error getting app exe path"; |
| 295 return false; | 276 return false; |
| 296 } | 277 } |
| 297 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 278 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 298 | 279 |
| 299 return ShellUtil::RegisterChromeBrowser(dist, chrome_exe, base::string16(), | 280 return ShellUtil::RegisterChromeBrowser(dist, chrome_exe, base::string16(), |
| 300 true); | 281 true); |
| 301 } | 282 } |
| 302 | 283 |
| 284 // Returns true if the default browser choice should be reset for the current | |
| 285 // user. | |
| 286 bool ShouldResetDefaultBrowser() { | |
| 287 return base::FieldTrialList::FindFullName(kAsyncSetAsDefaultExperimentName) != | |
| 288 "EnabledNoRegistry"; | |
|
gab
2016/01/11 23:41:00
Use StartsWith() instead of == for comparing group
Patrick Monette
2016/01/12 00:07:27
Done.
| |
| 289 } | |
| 290 | |
| 291 // Resets the default browser choice for the current user. | |
| 292 void ResetDefaultBrowser() { | |
|
gab
2016/01/11 23:41:00
What's the reason to move the method? It appears u
Patrick Monette
2016/01/12 00:07:27
Just to make order of definition = order of use.
| |
| 293 static const wchar_t* const kUrlAssociationKeyFormats[] = { | |
| 294 L"SOFTWARE\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\" | |
| 295 L"%ls\\UserChoice", | |
| 296 L"SOFTWARE\\Microsoft\\Windows\\Roaming\\OpenWith\\UrlAssociations\\" | |
| 297 L"%ls\\UserChoice"}; | |
| 298 static const wchar_t* const kProtocols[] = {L"http", L"https"}; | |
| 299 | |
| 300 for (const wchar_t* format : kUrlAssociationKeyFormats) { | |
| 301 for (const wchar_t* protocol : kProtocols) { | |
| 302 base::win::RegKey registry_key( | |
| 303 HKEY_CURRENT_USER, base::StringPrintf(format, protocol).c_str(), | |
| 304 KEY_SET_VALUE); | |
| 305 registry_key.DeleteValue(L"Hash"); | |
| 306 } | |
| 307 } | |
| 308 } | |
| 309 | |
| 303 } // namespace | 310 } // namespace |
| 304 | 311 |
| 305 // static | 312 // static |
| 306 bool ShellIntegration::IsSetAsDefaultAsynchronous() { | 313 bool ShellIntegration::IsSetAsDefaultAsynchronous() { |
| 307 return base::win::GetVersion() >= base::win::VERSION_WIN10 && | 314 return base::win::GetVersion() >= base::win::VERSION_WIN10 && |
| 308 IsAsyncSetAsDefaultEnabled(); | 315 IsAsyncSetAsDefaultEnabled(); |
| 309 } | 316 } |
| 310 | 317 |
| 311 bool ShellIntegration::SetAsDefaultBrowser() { | 318 bool ShellIntegration::SetAsDefaultBrowser() { |
| 312 base::FilePath chrome_exe; | 319 base::FilePath chrome_exe; |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 705 | 712 |
| 706 void ShellIntegration::DefaultBrowserWorker::FinalizeSetAsDefault() { | 713 void ShellIntegration::DefaultBrowserWorker::FinalizeSetAsDefault() { |
| 707 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 714 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 708 DCHECK(set_as_default_initialized()); | 715 DCHECK(set_as_default_initialized()); |
| 709 | 716 |
| 710 async_timer_.reset(); | 717 async_timer_.reset(); |
| 711 StartupBrowserCreator::ClearDefaultBrowserCallback(); | 718 StartupBrowserCreator::ClearDefaultBrowserCallback(); |
| 712 } | 719 } |
| 713 | 720 |
| 714 // static | 721 // static |
| 715 bool ShellIntegration::DefaultBrowserWorker::SetAsDefaultBrowserAsynchronous() { | 722 bool ShellIntegration::DefaultBrowserWorker::SetAsDefaultBrowserAsynchronous() { |
|
gab
2016/01/11 23:43:28
It's weird to have a group ("EnablednoRegistry") t
Patrick Monette
2016/01/12 00:07:27
This won't change the fact that there is 2 meaning
| |
| 716 DCHECK(IsSetAsDefaultAsynchronous()); | 723 DCHECK(IsSetAsDefaultAsynchronous()); |
| 717 | 724 |
| 718 // Registers chrome.exe as a browser on Windows to make sure it will be shown | 725 // Registers chrome.exe as a browser on Windows to make sure it will be shown |
| 719 // in the "How would you like to open this?" prompt. | 726 // in the "How would you like to open this?" prompt. |
| 720 if (!RegisterBrowser()) | 727 if (!RegisterBrowser()) |
| 721 return false; | 728 return false; |
| 722 | 729 |
| 723 ResetDefaultBrowser(); | 730 if (ShouldResetDefaultBrowser()) |
| 731 ResetDefaultBrowser(); | |
| 724 | 732 |
| 725 base::CommandLine cmdline(base::FilePath(L"openwith.exe")); | 733 base::CommandLine cmdline(base::FilePath(L"openwith.exe")); |
| 726 cmdline.AppendArgNative(StartupBrowserCreator::GetDefaultBrowserUrl()); | 734 cmdline.AppendArgNative(StartupBrowserCreator::GetDefaultBrowserUrl()); |
| 727 return base::LaunchProcess(cmdline, base::LaunchOptions()).IsValid(); | 735 return base::LaunchProcess(cmdline, base::LaunchOptions()).IsValid(); |
| 728 } | 736 } |
| OLD | NEW |