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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 const std::string group_name = | 278 const std::string group_name = |
279 base::FieldTrialList::FindFullName("AsyncSetAsDefault"); | 279 base::FieldTrialList::FindFullName("AsyncSetAsDefault"); |
280 if (CommandLine::ForCurrentProcess()->HasSwitch(kDisableAsyncSetAsDefault)) | 280 if (CommandLine::ForCurrentProcess()->HasSwitch(kDisableAsyncSetAsDefault)) |
281 return false; | 281 return false; |
282 if (CommandLine::ForCurrentProcess()->HasSwitch(kEnableAsyncSetAsDefault)) | 282 if (CommandLine::ForCurrentProcess()->HasSwitch(kEnableAsyncSetAsDefault)) |
283 return true; | 283 return true; |
284 | 284 |
285 return base::StartsWith(group_name, "Enabled", base::CompareCase::SENSITIVE); | 285 return base::StartsWith(group_name, "Enabled", base::CompareCase::SENSITIVE); |
286 } | 286 } |
287 | 287 |
| 288 bool RegisterBrowser() { |
| 289 base::FilePath chrome_exe; |
| 290 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { |
| 291 NOTREACHED() << "Error getting app exe path"; |
| 292 return false; |
| 293 } |
| 294 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 295 |
| 296 return ShellUtil::RegisterChromeBrowser(dist, chrome_exe, base::string16(), |
| 297 true); |
| 298 } |
| 299 |
288 } // namespace | 300 } // namespace |
289 | 301 |
290 // static | 302 // static |
291 bool ShellIntegration::IsSetAsDefaultAsynchronous() { | 303 bool ShellIntegration::IsSetAsDefaultAsynchronous() { |
292 return base::win::GetVersion() >= base::win::VERSION_WIN10 && | 304 return base::win::GetVersion() >= base::win::VERSION_WIN10 && |
293 IsAsyncSetAsDefaultEnabled(); | 305 IsAsyncSetAsDefaultEnabled(); |
294 } | 306 } |
295 | 307 |
296 bool ShellIntegration::SetAsDefaultBrowser() { | 308 bool ShellIntegration::SetAsDefaultBrowser() { |
297 base::FilePath chrome_exe; | 309 base::FilePath chrome_exe; |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 bool ShellIntegration::DefaultBrowserWorker::InitializeSetAsDefault() { | 660 bool ShellIntegration::DefaultBrowserWorker::InitializeSetAsDefault() { |
649 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 661 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
650 | 662 |
651 if (!IsSetAsDefaultAsynchronous()) | 663 if (!IsSetAsDefaultAsynchronous()) |
652 return false; | 664 return false; |
653 | 665 |
654 // On Windows 10+, there is no official way to prompt the user to set a | 666 // On Windows 10+, there is no official way to prompt the user to set a |
655 // default browser. This is the workaround: | 667 // default browser. This is the workaround: |
656 // 1. Unregister the default browser. | 668 // 1. Unregister the default browser. |
657 // 2. Open "How to make Chrome my default browser" link with openwith.exe. | 669 // 2. Open "How to make Chrome my default browser" link with openwith.exe. |
658 // 3. Windows will prompt the user with "How would you link to open this?". | 670 // 3. Windows will prompt the user with "How would you like to open this?". |
659 // 4. If Chrome is selected, we intercept the attempt to open the URL and | 671 // 4. If Chrome is selected, we intercept the attempt to open the URL and |
660 // instead call OnSetAsDefaultAttemptComplete(), passing true to indicate | 672 // instead call OnSetAsDefaultAttemptComplete(), passing true to indicate |
661 // success. | 673 // success. |
662 // 5. If Chrome is not selected, the url is opened in the selected browser. | 674 // 5. If Chrome is not selected, the url is opened in the selected browser. |
663 // After a certain amount of time, we notify the observer that the | 675 // After a certain amount of time, we notify the observer that the |
664 // process failed. | 676 // process failed. |
665 | 677 |
666 if (!StartupBrowserCreator::SetDefaultBrowserCallback( | 678 if (!StartupBrowserCreator::SetDefaultBrowserCallback( |
667 base::Bind(&DefaultBrowserWorker::OnSetAsDefaultAttemptComplete, this, | 679 base::Bind(&DefaultBrowserWorker::OnSetAsDefaultAttemptComplete, this, |
668 AttemptResult::SUCCESS))) { | 680 AttemptResult::SUCCESS))) { |
(...skipping 29 matching lines...) Expand all Loading... |
698 DCHECK(set_as_default_initialized()); | 710 DCHECK(set_as_default_initialized()); |
699 | 711 |
700 async_timer_.reset(); | 712 async_timer_.reset(); |
701 StartupBrowserCreator::ClearDefaultBrowserCallback(); | 713 StartupBrowserCreator::ClearDefaultBrowserCallback(); |
702 } | 714 } |
703 | 715 |
704 // static | 716 // static |
705 bool ShellIntegration::DefaultBrowserWorker::SetAsDefaultBrowserAsynchronous() { | 717 bool ShellIntegration::DefaultBrowserWorker::SetAsDefaultBrowserAsynchronous() { |
706 DCHECK(IsSetAsDefaultAsynchronous()); | 718 DCHECK(IsSetAsDefaultAsynchronous()); |
707 | 719 |
| 720 // Registers chrome.exe as a browser on Windows to make sure it will be shown |
| 721 // in the "How would you like to open this?" prompt. |
| 722 if (!RegisterBrowser()) |
| 723 return false; |
| 724 |
708 ResetDefaultBrowser(); | 725 ResetDefaultBrowser(); |
709 | 726 |
710 base::CommandLine cmdline(base::FilePath(L"openwith.exe")); | 727 base::CommandLine cmdline(base::FilePath(L"openwith.exe")); |
711 cmdline.AppendArgNative(StartupBrowserCreator::GetDefaultBrowserUrl()); | 728 cmdline.AppendArgNative(StartupBrowserCreator::GetDefaultBrowserUrl()); |
712 return base::LaunchProcess(cmdline, base::LaunchOptions()).IsValid(); | 729 return base::LaunchProcess(cmdline, base::LaunchOptions()).IsValid(); |
713 } | 730 } |
OLD | NEW |