[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | bc4303d3 | 2012-05-10 14:58:55 | [diff] [blame] | 5 | #include "chrome/browser/ui/startup/default_browser_prompt.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 6 | |
pmonette | fca05f3 | 2016-06-02 17:06:12 | [diff] [blame] | 7 | #include <limits> |
pmonette | 868ca64 | 2015-09-02 14:34:02 | [diff] [blame] | 8 | #include <string> |
| 9 | |
skyostil | 380bb222 | 2015-06-12 12:07:05 | [diff] [blame] | 10 | #include "base/location.h" |
avi | 655876a | 2015-12-25 07:18:15 | [diff] [blame] | 11 | #include "base/macros.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 12 | #include "base/memory/weak_ptr.h" |
skyostil | 380bb222 | 2015-06-12 12:07:05 | [diff] [blame] | 13 | #include "base/single_thread_task_runner.h" |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 14 | #include "base/strings/string_number_conversions.h" |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 15 | #include "base/time/time.h" |
[email protected] | abaca60 | 2013-03-29 01:31:29 | [diff] [blame] | 16 | #include "base/version.h" |
avi | 655876a | 2015-12-25 07:18:15 | [diff] [blame] | 17 | #include "build/build_config.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 18 | #include "chrome/browser/browser_process.h" |
[email protected] | 4a8adfa0 | 2013-03-19 22:37:46 | [diff] [blame] | 19 | #include "chrome/browser/infobars/infobar_service.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 20 | #include "chrome/browser/profiles/profile.h" |
grt | b0e8c81 | 2015-06-16 22:45:42 | [diff] [blame] | 21 | #include "chrome/browser/profiles/profile_manager.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 22 | #include "chrome/browser/ui/browser.h" |
[email protected] | 8381068 | 2012-10-12 21:10:14 | [diff] [blame] | 23 | #include "chrome/browser/ui/browser_finder.h" |
pmonette | fca05f3 | 2016-06-02 17:06:12 | [diff] [blame] | 24 | #include "chrome/browser/ui/startup/default_browser_infobar_delegate.h" |
[email protected] | 617ee96 | 2013-01-29 20:49:12 | [diff] [blame] | 25 | #include "chrome/browser/ui/tabs/tab_strip_model.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 26 | #include "chrome/common/pref_names.h" |
brettw | b1fc1b8 | 2016-02-02 00:19:08 | [diff] [blame] | 27 | #include "components/prefs/pref_registry_simple.h" |
| 28 | #include "components/prefs/pref_service.h" |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 29 | #include "components/variations/variations_associated_data.h" |
sdefresne | 9fb6769 | 2015-08-03 18:48:22 | [diff] [blame] | 30 | #include "components/version_info/version_info.h" |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 31 | |
pmonette | fca05f3 | 2016-06-02 17:06:12 | [diff] [blame] | 32 | namespace chrome { |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 33 | |
[email protected] | 268942a | 2012-05-08 22:40:35 | [diff] [blame] | 34 | namespace { |
| 35 | |
pmonette | 586ab5b3 | 2016-03-07 19:50:37 | [diff] [blame] | 36 | void ResetCheckDefaultBrowserPref(const base::FilePath& profile_path) { |
grt | 9c8bb5e | 2015-09-23 23:41:17 | [diff] [blame] | 37 | Profile* profile = |
pmonette | 586ab5b3 | 2016-03-07 19:50:37 | [diff] [blame] | 38 | g_browser_process->profile_manager()->GetProfileByPath(profile_path); |
grt | 9c8bb5e | 2015-09-23 23:41:17 | [diff] [blame] | 39 | if (profile) |
grt | 36fc632 | 2016-04-07 13:28:35 | [diff] [blame] | 40 | chrome::ResetDefaultBrowserPrompt(profile); |
grt | 9c8bb5e | 2015-09-23 23:41:17 | [diff] [blame] | 41 | } |
| 42 | |
pmonette | 586ab5b3 | 2016-03-07 19:50:37 | [diff] [blame] | 43 | void ShowPrompt() { |
scottmg | 5c03fe02 | 2016-02-03 01:27:24 | [diff] [blame] | 44 | Browser* browser = chrome::FindLastActive(); |
[email protected] | 3a798230 | 2012-05-25 15:53:04 | [diff] [blame] | 45 | if (!browser) |
| 46 | return; // Reached during ui tests. |
| 47 | |
| 48 | // In ChromeBot tests, there might be a race. This line appears to get |
| 49 | // called during shutdown and |tab| can be NULL. |
[email protected] | 617ee96 | 2013-01-29 20:49:12 | [diff] [blame] | 50 | content::WebContents* web_contents = |
| 51 | browser->tab_strip_model()->GetActiveWebContents(); |
[email protected] | 591a59f | 2012-10-11 01:16:23 | [diff] [blame] | 52 | if (!web_contents) |
[email protected] | 3a798230 | 2012-05-25 15:53:04 | [diff] [blame] | 53 | return; |
| 54 | |
[email protected] | 0be0993 | 2013-01-08 02:03:50 | [diff] [blame] | 55 | DefaultBrowserInfoBarDelegate::Create( |
grt | 36fc632 | 2016-04-07 13:28:35 | [diff] [blame] | 56 | InfoBarService::FromWebContents(web_contents), browser->profile()); |
[email protected] | 8381068 | 2012-10-12 21:10:14 | [diff] [blame] | 57 | } |
| 58 | |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 59 | // Returns true if the default browser prompt should be shown if Chrome is not |
| 60 | // the user's default browser. |
| 61 | bool ShouldShowDefaultBrowserPrompt(Profile* profile) { |
| 62 | // Do not show the prompt if the "suppress_default_browser_prompt_for_version" |
| 63 | // master preference is set to the current version. |
| 64 | const std::string disable_version_string = |
| 65 | g_browser_process->local_state()->GetString( |
| 66 | prefs::kBrowserSuppressDefaultBrowserPrompt); |
pwnall | a9cfc0f | 2016-08-30 23:17:23 | [diff] [blame] | 67 | const base::Version disable_version(disable_version_string); |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 68 | DCHECK(disable_version_string.empty() || disable_version.IsValid()); |
| 69 | if (disable_version.IsValid() && |
pwnall | a9cfc0f | 2016-08-30 23:17:23 | [diff] [blame] | 70 | disable_version == base::Version(version_info::GetVersionNumber())) { |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 71 | return false; |
| 72 | } |
| 73 | |
| 74 | // Do not show if the prompt period has yet to pass since the user previously |
| 75 | // dismissed the infobar. |
| 76 | int64_t last_dismissed_value = |
| 77 | profile->GetPrefs()->GetInt64(prefs::kDefaultBrowserLastDeclined); |
| 78 | if (last_dismissed_value) { |
| 79 | int period_days = 0; |
| 80 | base::StringToInt(variations::GetVariationParamValue( |
| 81 | "DefaultBrowserInfobar", "RefreshPeriodDays"), |
| 82 | &period_days); |
| 83 | if (period_days <= 0 || period_days == std::numeric_limits<int>::max()) |
| 84 | return false; // Failed to parse a reasonable period. |
| 85 | base::Time show_on_or_after = |
| 86 | base::Time::FromInternalValue(last_dismissed_value) + |
| 87 | base::TimeDelta::FromDays(period_days); |
| 88 | if (base::Time::Now() < show_on_or_after) |
| 89 | return false; |
| 90 | } |
| 91 | |
| 92 | return true; |
| 93 | } |
| 94 | |
pmonette | 586ab5b3 | 2016-03-07 19:50:37 | [diff] [blame] | 95 | void OnCheckIsDefaultBrowserFinished( |
| 96 | const base::FilePath& profile_path, |
| 97 | bool show_prompt, |
pmonette | b920414 | 2016-03-08 20:02:44 | [diff] [blame] | 98 | shell_integration::DefaultWebClientState state) { |
| 99 | if (state == shell_integration::IS_DEFAULT) { |
pmonette | 586ab5b3 | 2016-03-07 19:50:37 | [diff] [blame] | 100 | // Notify the user in the future if Chrome ceases to be the user's chosen |
| 101 | // default browser. |
| 102 | ResetCheckDefaultBrowserPref(profile_path); |
pmonette | b920414 | 2016-03-08 20:02:44 | [diff] [blame] | 103 | } else if (show_prompt && state == shell_integration::NOT_DEFAULT && |
pmonette | 32a5cfb4 | 2016-04-11 22:04:44 | [diff] [blame] | 104 | shell_integration::CanSetAsDefaultBrowser()) { |
pmonette | 586ab5b3 | 2016-03-07 19:50:37 | [diff] [blame] | 105 | ShowPrompt(); |
| 106 | } |
| 107 | } |
| 108 | |
[email protected] | 8381068 | 2012-10-12 21:10:14 | [diff] [blame] | 109 | } // namespace |
| 110 | |
[email protected] | abaca60 | 2013-03-29 01:31:29 | [diff] [blame] | 111 | void RegisterDefaultBrowserPromptPrefs(PrefRegistrySimple* registry) { |
| 112 | registry->RegisterStringPref( |
| 113 | prefs::kBrowserSuppressDefaultBrowserPrompt, std::string()); |
| 114 | } |
| 115 | |
scottmg | b711bab1 | 2016-02-10 21:39:11 | [diff] [blame] | 116 | void ShowDefaultBrowserPrompt(Profile* profile) { |
grt | 22a6f88 | 2015-09-20 23:36:24 | [diff] [blame] | 117 | // Do not check if Chrome is the default browser if there is a policy in |
| 118 | // control of this setting. |
| 119 | if (g_browser_process->local_state()->IsManagedPreference( |
| 120 | prefs::kDefaultBrowserSettingEnabled)) { |
| 121 | // Handling of the browser.default_browser_setting_enabled policy setting is |
| 122 | // taken care of in BrowserProcessImpl. |
| 123 | return; |
| 124 | } |
| 125 | |
pmonette | cff89e9 | 2016-01-12 01:18:55 | [diff] [blame] | 126 | PrefService* prefs = profile->GetPrefs(); |
| 127 | // Reset preferences if kResetCheckDefaultBrowser is true. |
| 128 | if (prefs->GetBoolean(prefs::kResetCheckDefaultBrowser)) { |
| 129 | prefs->SetBoolean(prefs::kResetCheckDefaultBrowser, false); |
grt | 36fc632 | 2016-04-07 13:28:35 | [diff] [blame] | 130 | ResetDefaultBrowserPrompt(profile); |
pmonette | cff89e9 | 2016-01-12 01:18:55 | [diff] [blame] | 131 | } |
| 132 | |
pmonette | 9fa59e88 | 2016-02-10 00:12:19 | [diff] [blame] | 133 | scoped_refptr<shell_integration::DefaultBrowserWorker>( |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 134 | new shell_integration::DefaultBrowserWorker( |
| 135 | base::Bind(&OnCheckIsDefaultBrowserFinished, profile->GetPath(), |
| 136 | ShouldShowDefaultBrowserPrompt(profile)))) |
grt | 9c8bb5e | 2015-09-23 23:41:17 | [diff] [blame] | 137 | ->StartCheckIsDefault(); |
[email protected] | 8381068 | 2012-10-12 21:10:14 | [diff] [blame] | 138 | } |
| 139 | |
grt | 36fc632 | 2016-04-07 13:28:35 | [diff] [blame] | 140 | void DefaultBrowserPromptDeclined(Profile* profile) { |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 141 | profile->GetPrefs()->SetInt64(prefs::kDefaultBrowserLastDeclined, |
| 142 | base::Time::Now().ToInternalValue()); |
grt | 36fc632 | 2016-04-07 13:28:35 | [diff] [blame] | 143 | } |
| 144 | |
| 145 | void ResetDefaultBrowserPrompt(Profile* profile) { |
grt | a872c10 | 2016-04-12 17:20:57 | [diff] [blame] | 146 | profile->GetPrefs()->ClearPref(prefs::kDefaultBrowserLastDeclined); |
grt | 36fc632 | 2016-04-07 13:28:35 | [diff] [blame] | 147 | } |
| 148 | |
[email protected] | 8381068 | 2012-10-12 21:10:14 | [diff] [blame] | 149 | #if !defined(OS_WIN) |
| 150 | bool ShowFirstRunDefaultBrowserPrompt(Profile* profile) { |
| 151 | return false; |
| 152 | } |
| 153 | #endif |
| 154 | |
[email protected] | 4feb37d9 | 2012-07-01 20:22:13 | [diff] [blame] | 155 | } // namespace chrome |