| Index: chrome/browser/ui/startup/startup_browser_creator.cc
|
| diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc
|
| index f114fb6db5500558618a6e68b44da2bd89030703..8553942b943d4f7bf5f500458b1aae6baf8b4855 100644
|
| --- a/chrome/browser/ui/startup/startup_browser_creator.cc
|
| +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
|
| @@ -106,6 +106,14 @@ using content::ChildProcessSecurityPolicy;
|
|
|
| namespace {
|
|
|
| +#if defined(OS_WIN)
|
| +const wchar_t kSetDefaultBrowserHelpUrl[] =
|
| + L"https://support.google.com/chrome?p=default_browser";
|
| +
|
| +// Not thread-safe. Always use or modify this callback on the UI thread.
|
| +base::Closure* g_default_browser_callback = nullptr;
|
| +#endif // defined(OS_WIN)
|
| +
|
| // Keeps track on which profiles have been launched.
|
| class ProfileLaunchObserver : public content::NotificationObserver {
|
| public:
|
| @@ -484,6 +492,34 @@ void StartupBrowserCreator::RegisterLocalStatePrefs(
|
| #endif
|
| }
|
|
|
| +
|
| +#if defined(OS_WIN)
|
| +// static
|
| +bool StartupBrowserCreator::SetDefaultBrowserCallback(
|
| + const base::Closure& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + if (!g_default_browser_callback) {
|
| + // This won't leak because the worker class invoking this function always
|
| + // calls ClearDefaultBrowserCallback() in its destructor.
|
| + g_default_browser_callback = new base::Closure(callback);
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// static
|
| +void StartupBrowserCreator::ClearDefaultBrowserCallback() {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + delete g_default_browser_callback;
|
| + g_default_browser_callback = nullptr;
|
| +}
|
| +
|
| +// static
|
| +const wchar_t* StartupBrowserCreator::GetDefaultBrowserUrl() {
|
| + return kSetDefaultBrowserHelpUrl;
|
| +}
|
| +#endif // defined(OS_WIN)
|
| +
|
| // static
|
| std::vector<GURL> StartupBrowserCreator::GetURLsFromCommandLine(
|
| const base::CommandLine& command_line,
|
| @@ -550,6 +586,7 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
|
| Profile* last_used_profile,
|
| const Profiles& last_opened_profiles,
|
| StartupBrowserCreator* browser_creator) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| TRACE_EVENT0("startup", "StartupBrowserCreator::ProcessCmdLineImpl");
|
|
|
| DCHECK(last_used_profile);
|
| @@ -689,12 +726,25 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
|
| }
|
|
|
| #if defined(OS_WIN)
|
| + // Intercept a specific url when setting the default browser asynchronously.
|
| + // This only happens on Windows 10+.
|
| + if (g_default_browser_callback) {
|
| + base::CommandLine::StringType default_browser_url_(
|
| + kSetDefaultBrowserHelpUrl);
|
| + for (const auto& arg : command_line.GetArgs()) {
|
| + if (arg == default_browser_url_) {
|
| + g_default_browser_callback->Run();
|
| + return true;
|
| + }
|
| + }
|
| + }
|
| +
|
| // Log whether this process was a result of an action in the Windows Jumplist.
|
| if (command_line.HasSwitch(switches::kWinJumplistAction)) {
|
| jumplist::LogJumplistActionFromSwitchValue(
|
| command_line.GetSwitchValueASCII(switches::kWinJumplistAction));
|
| }
|
| -#endif
|
| +#endif // defined(OS_WIN)
|
|
|
| chrome::startup::IsProcessStartup is_process_startup = process_startup ?
|
| chrome::startup::IS_PROCESS_STARTUP :
|
|
|