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/ui/startup/default_browser_prompt.h" | 5 #include "chrome/browser/ui/startup/default_browser_prompt.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram_macros.h" |
12 #include "base/prefs/pref_registry_simple.h" | 12 #include "base/prefs/pref_registry_simple.h" |
13 #include "base/prefs/pref_service.h" | 13 #include "base/prefs/pref_service.h" |
14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
15 #include "base/thread_task_runner_handle.h" | 15 #include "base/thread_task_runner_handle.h" |
16 #include "base/version.h" | 16 #include "base/version.h" |
17 #include "chrome/browser/browser_process.h" | 17 #include "chrome/browser/browser_process.h" |
18 #include "chrome/browser/first_run/first_run.h" | |
19 #include "chrome/browser/infobars/infobar_service.h" | 18 #include "chrome/browser/infobars/infobar_service.h" |
20 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
21 #include "chrome/browser/profiles/profile_manager.h" | 20 #include "chrome/browser/profiles/profile_manager.h" |
22 #include "chrome/browser/shell_integration.h" | 21 #include "chrome/browser/shell_integration.h" |
23 #include "chrome/browser/ui/browser.h" | 22 #include "chrome/browser/ui/browser.h" |
24 #include "chrome/browser/ui/browser_finder.h" | 23 #include "chrome/browser/ui/browser_finder.h" |
25 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 24 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
26 #include "chrome/common/pref_names.h" | 25 #include "chrome/common/pref_names.h" |
27 #include "chrome/grit/chromium_strings.h" | 26 #include "chrome/grit/chromium_strings.h" |
28 #include "chrome/grit/generated_resources.h" | 27 #include "chrome/grit/generated_resources.h" |
29 #include "chrome/installer/util/master_preferences.h" | |
30 #include "chrome/installer/util/master_preferences_constants.h" | |
31 #include "components/infobars/core/confirm_infobar_delegate.h" | 28 #include "components/infobars/core/confirm_infobar_delegate.h" |
32 #include "components/infobars/core/infobar.h" | 29 #include "components/infobars/core/infobar.h" |
33 #include "components/version_info/version_info.h" | 30 #include "components/version_info/version_info.h" |
34 #include "content/public/browser/browser_thread.h" | |
35 #include "content/public/browser/navigation_details.h" | 31 #include "content/public/browser/navigation_details.h" |
36 #include "content/public/browser/web_contents.h" | 32 #include "content/public/browser/web_contents.h" |
37 #include "grit/theme_resources.h" | 33 #include "grit/theme_resources.h" |
38 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
39 | 35 |
40 | 36 |
41 namespace { | 37 namespace { |
42 | 38 |
43 // Calls the appropriate function for setting Chrome as the default browser. | 39 // A ShellIntegration::DefaultWebClientObserver that records user metrics for |
44 // This requires IO access (registry) and may result in interaction with a | 40 // the result of making Chrome the default browser. |
45 // modal system UI. | 41 class SetDefaultBrowserObserver |
46 void SetChromeAsDefaultBrowser(bool interactive_flow, PrefService* prefs) { | 42 : public ShellIntegration::DefaultWebClientObserver { |
47 if (interactive_flow) { | 43 public: |
| 44 SetDefaultBrowserObserver(); |
| 45 ~SetDefaultBrowserObserver() override; |
| 46 |
| 47 private: |
| 48 void SetDefaultWebClientUIState( |
| 49 ShellIntegration::DefaultWebClientUIState state) override; |
| 50 void OnSetAsDefaultConcluded(bool succeeded) override; |
| 51 bool IsOwnedByWorker() override; |
| 52 bool IsInteractiveSetDefaultPermitted() override; |
| 53 |
| 54 // True if an interactive flow will be used (i.e., Windows 8+). |
| 55 bool interactive_; |
| 56 |
| 57 // The result of the call to ShellIntegration::SetAsDefaultBrowser() or |
| 58 // ShellIntegration::SetAsDefaultBrowserInteractive(). |
| 59 bool interaction_succeeded_ = false; |
| 60 |
| 61 DISALLOW_COPY_AND_ASSIGN(SetDefaultBrowserObserver); |
| 62 }; |
| 63 |
| 64 SetDefaultBrowserObserver::SetDefaultBrowserObserver() |
| 65 : interactive_(ShellIntegration::CanSetAsDefaultBrowser() == |
| 66 ShellIntegration::SET_DEFAULT_INTERACTIVE) { |
| 67 // Log that an attempt is about to be made to set one way or the other. |
| 68 if (interactive_) |
48 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.SetAsDefaultUI", true); | 69 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.SetAsDefaultUI", true); |
49 if (!ShellIntegration::SetAsDefaultBrowserInteractive()) { | 70 else |
50 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.SetAsDefaultUIFailed", true); | |
51 } else if (ShellIntegration::GetDefaultBrowser() == | |
52 ShellIntegration::NOT_DEFAULT) { | |
53 // If the interaction succeeded but we are still not the default browser | |
54 // it likely means the user simply selected another browser from the | |
55 // panel. We will respect this choice and write it down as 'no, thanks'. | |
56 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.DontSetAsDefault", true); | |
57 } | |
58 } else { | |
59 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.SetAsDefault", true); | 71 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.SetAsDefault", true); |
60 ShellIntegration::SetAsDefaultBrowser(); | 72 } |
| 73 |
| 74 SetDefaultBrowserObserver::~SetDefaultBrowserObserver() {} |
| 75 |
| 76 void SetDefaultBrowserObserver::SetDefaultWebClientUIState( |
| 77 ShellIntegration::DefaultWebClientUIState state) { |
| 78 if (interactive_ && interaction_succeeded_ && |
| 79 state == ShellIntegration::STATE_NOT_DEFAULT) { |
| 80 // The interactive flow succeeded, yet Chrome is not the default browser. |
| 81 // This likely means that the user selected another browser from the panel. |
| 82 // Consider this the same as canceling the infobar. |
| 83 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.DontSetAsDefault", true); |
61 } | 84 } |
62 } | 85 } |
63 | 86 |
| 87 void SetDefaultBrowserObserver::OnSetAsDefaultConcluded(bool succeeded) { |
| 88 interaction_succeeded_ = succeeded; |
| 89 if (interactive_ && !succeeded) { |
| 90 // Log that the interactive flow failed. |
| 91 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.SetAsDefaultUIFailed", true); |
| 92 } |
| 93 } |
| 94 |
| 95 bool SetDefaultBrowserObserver::IsOwnedByWorker() { |
| 96 // Instruct the DefaultBrowserWorker to delete this instance when it is done. |
| 97 return true; |
| 98 } |
| 99 |
| 100 bool SetDefaultBrowserObserver::IsInteractiveSetDefaultPermitted() { |
| 101 return true; |
| 102 } |
| 103 |
64 // The delegate for the infobar shown when Chrome is not the default browser. | 104 // The delegate for the infobar shown when Chrome is not the default browser. |
65 class DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate { | 105 class DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate { |
66 public: | 106 public: |
67 // Creates a default browser infobar and delegate and adds the infobar to | 107 // Creates a default browser infobar and delegate and adds the infobar to |
68 // |infobar_service|. | 108 // |infobar_service|. |
69 static void Create(InfoBarService* infobar_service, | 109 static void Create(InfoBarService* infobar_service, PrefService* prefs); |
70 PrefService* prefs, | |
71 bool interactive_flow_required); | |
72 | 110 |
73 private: | 111 private: |
74 DefaultBrowserInfoBarDelegate(PrefService* prefs, | 112 explicit DefaultBrowserInfoBarDelegate(PrefService* prefs); |
75 bool interactive_flow_required); | |
76 ~DefaultBrowserInfoBarDelegate() override; | 113 ~DefaultBrowserInfoBarDelegate() override; |
77 | 114 |
78 void AllowExpiry() { should_expire_ = true; } | 115 void AllowExpiry() { should_expire_ = true; } |
79 | 116 |
80 // ConfirmInfoBarDelegate: | 117 // ConfirmInfoBarDelegate: |
81 int GetIconId() const override; | 118 int GetIconId() const override; |
82 bool ShouldExpire(const NavigationDetails& details) const override; | 119 bool ShouldExpire(const NavigationDetails& details) const override; |
83 base::string16 GetMessageText() const override; | 120 base::string16 GetMessageText() const override; |
84 base::string16 GetButtonLabel(InfoBarButton button) const override; | 121 base::string16 GetButtonLabel(InfoBarButton button) const override; |
85 bool OKButtonTriggersUACPrompt() const override; | 122 bool OKButtonTriggersUACPrompt() const override; |
86 bool Accept() override; | 123 bool Accept() override; |
87 bool Cancel() override; | 124 bool Cancel() override; |
88 | 125 |
89 // The prefs to use. | 126 // The prefs to use. |
90 PrefService* prefs_; | 127 PrefService* prefs_; |
91 | 128 |
92 // Whether the user clicked one of the buttons. | 129 // Whether the user clicked one of the buttons. |
93 bool action_taken_; | 130 bool action_taken_; |
94 | 131 |
95 // Whether the info-bar should be dismissed on the next navigation. | 132 // Whether the info-bar should be dismissed on the next navigation. |
96 bool should_expire_; | 133 bool should_expire_; |
97 | 134 |
98 // Whether changing the default application will require entering the | |
99 // modal-UI flow. | |
100 const bool interactive_flow_required_; | |
101 | |
102 // Used to delay the expiration of the info-bar. | 135 // Used to delay the expiration of the info-bar. |
103 base::WeakPtrFactory<DefaultBrowserInfoBarDelegate> weak_factory_; | 136 base::WeakPtrFactory<DefaultBrowserInfoBarDelegate> weak_factory_; |
104 | 137 |
105 DISALLOW_COPY_AND_ASSIGN(DefaultBrowserInfoBarDelegate); | 138 DISALLOW_COPY_AND_ASSIGN(DefaultBrowserInfoBarDelegate); |
106 }; | 139 }; |
107 | 140 |
108 // static | 141 // static |
109 void DefaultBrowserInfoBarDelegate::Create(InfoBarService* infobar_service, | 142 void DefaultBrowserInfoBarDelegate::Create(InfoBarService* infobar_service, |
110 PrefService* prefs, | 143 PrefService* prefs) { |
111 bool interactive_flow_required) { | 144 infobar_service->AddInfoBar( |
112 infobar_service->AddInfoBar(infobar_service->CreateConfirmInfoBar( | 145 infobar_service->CreateConfirmInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( |
113 scoped_ptr<ConfirmInfoBarDelegate>(new DefaultBrowserInfoBarDelegate( | 146 new DefaultBrowserInfoBarDelegate(prefs)))); |
114 prefs, interactive_flow_required)))); | |
115 } | 147 } |
116 | 148 |
117 DefaultBrowserInfoBarDelegate::DefaultBrowserInfoBarDelegate( | 149 DefaultBrowserInfoBarDelegate::DefaultBrowserInfoBarDelegate(PrefService* prefs) |
118 PrefService* prefs, | |
119 bool interactive_flow_required) | |
120 : ConfirmInfoBarDelegate(), | 150 : ConfirmInfoBarDelegate(), |
121 prefs_(prefs), | 151 prefs_(prefs), |
122 action_taken_(false), | 152 action_taken_(false), |
123 should_expire_(false), | 153 should_expire_(false), |
124 interactive_flow_required_(interactive_flow_required), | |
125 weak_factory_(this) { | 154 weak_factory_(this) { |
126 // We want the info-bar to stick-around for few seconds and then be hidden | 155 // We want the info-bar to stick-around for few seconds and then be hidden |
127 // on the next navigation after that. | 156 // on the next navigation after that. |
128 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 157 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
129 FROM_HERE, base::Bind(&DefaultBrowserInfoBarDelegate::AllowExpiry, | 158 FROM_HERE, base::Bind(&DefaultBrowserInfoBarDelegate::AllowExpiry, |
130 weak_factory_.GetWeakPtr()), | 159 weak_factory_.GetWeakPtr()), |
131 base::TimeDelta::FromSeconds(8)); | 160 base::TimeDelta::FromSeconds(8)); |
132 } | 161 } |
133 | 162 |
134 DefaultBrowserInfoBarDelegate::~DefaultBrowserInfoBarDelegate() { | 163 DefaultBrowserInfoBarDelegate::~DefaultBrowserInfoBarDelegate() { |
(...skipping 23 matching lines...) Expand all Loading... |
158 | 187 |
159 // Setting an app as the default browser doesn't require elevation directly, but | 188 // Setting an app as the default browser doesn't require elevation directly, but |
160 // it does require registering it as the protocol handler for "http", so if | 189 // it does require registering it as the protocol handler for "http", so if |
161 // protocol registration in general requires elevation, this does as well. | 190 // protocol registration in general requires elevation, this does as well. |
162 bool DefaultBrowserInfoBarDelegate::OKButtonTriggersUACPrompt() const { | 191 bool DefaultBrowserInfoBarDelegate::OKButtonTriggersUACPrompt() const { |
163 return ShellIntegration::IsElevationNeededForSettingDefaultProtocolClient(); | 192 return ShellIntegration::IsElevationNeededForSettingDefaultProtocolClient(); |
164 } | 193 } |
165 | 194 |
166 bool DefaultBrowserInfoBarDelegate::Accept() { | 195 bool DefaultBrowserInfoBarDelegate::Accept() { |
167 action_taken_ = true; | 196 action_taken_ = true; |
168 content::BrowserThread::PostTask( | 197 scoped_refptr<ShellIntegration::DefaultBrowserWorker>( |
169 content::BrowserThread::FILE, FROM_HERE, | 198 new ShellIntegration::DefaultBrowserWorker(new SetDefaultBrowserObserver)) |
170 base::Bind(&SetChromeAsDefaultBrowser, interactive_flow_required_, | 199 ->StartSetAsDefault(); |
171 prefs_)); | |
172 | |
173 return true; | 200 return true; |
174 } | 201 } |
175 | 202 |
176 bool DefaultBrowserInfoBarDelegate::Cancel() { | 203 bool DefaultBrowserInfoBarDelegate::Cancel() { |
177 action_taken_ = true; | 204 action_taken_ = true; |
178 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.DontSetAsDefault", true); | 205 UMA_HISTOGRAM_BOOLEAN("DefaultBrowserWarning.DontSetAsDefault", true); |
179 // User clicked "Don't ask me again", remember that. | 206 // User clicked "Don't ask me again", remember that. |
180 prefs_->SetBoolean(prefs::kCheckDefaultBrowser, false); | 207 prefs_->SetBoolean(prefs::kCheckDefaultBrowser, false); |
181 return true; | 208 return true; |
182 } | 209 } |
183 | 210 |
184 void NotifyNotDefaultBrowserCallback(chrome::HostDesktopType desktop_type) { | 211 // A ShellIntegration::DefaultWebClientObserver that handles the check to |
185 Browser* browser = chrome::FindLastActiveWithHostDesktopType(desktop_type); | 212 // determine whether or not to show the default browser prompt. If Chrome is the |
| 213 // default browser, then the kCheckDefaultBrowser pref is reset. Otherwise, the |
| 214 // prompt is shown. |
| 215 class CheckDefaultBrowserObserver |
| 216 : public ShellIntegration::DefaultWebClientObserver { |
| 217 public: |
| 218 CheckDefaultBrowserObserver(const base::FilePath& profile_path, |
| 219 bool show_prompt, |
| 220 chrome::HostDesktopType desktop_type); |
| 221 ~CheckDefaultBrowserObserver() override; |
| 222 |
| 223 private: |
| 224 void SetDefaultWebClientUIState( |
| 225 ShellIntegration::DefaultWebClientUIState state) override; |
| 226 bool IsOwnedByWorker() override; |
| 227 |
| 228 void ResetCheckDefaultBrowserPref(); |
| 229 void ShowPrompt(); |
| 230 |
| 231 // The path to the profile for which the prompt is to be shown. |
| 232 base::FilePath profile_path_; |
| 233 |
| 234 // True if the prompt is to be shown if Chrome is not the default browser. |
| 235 bool show_prompt_; |
| 236 chrome::HostDesktopType desktop_type_; |
| 237 |
| 238 DISALLOW_COPY_AND_ASSIGN(CheckDefaultBrowserObserver); |
| 239 }; |
| 240 |
| 241 CheckDefaultBrowserObserver::CheckDefaultBrowserObserver( |
| 242 const base::FilePath& profile_path, |
| 243 bool show_prompt, |
| 244 chrome::HostDesktopType desktop_type) |
| 245 : profile_path_(profile_path), |
| 246 show_prompt_(show_prompt), |
| 247 desktop_type_(desktop_type) {} |
| 248 |
| 249 CheckDefaultBrowserObserver::~CheckDefaultBrowserObserver() {} |
| 250 |
| 251 void CheckDefaultBrowserObserver::SetDefaultWebClientUIState( |
| 252 ShellIntegration::DefaultWebClientUIState state) { |
| 253 if (state == ShellIntegration::STATE_IS_DEFAULT) { |
| 254 // Notify the user in the future if Chrome ceases to be the user's chosen |
| 255 // default browser. |
| 256 ResetCheckDefaultBrowserPref(); |
| 257 } else if (show_prompt_ && state == ShellIntegration::STATE_NOT_DEFAULT && |
| 258 ShellIntegration::CanSetAsDefaultBrowser() != |
| 259 ShellIntegration::SET_DEFAULT_NOT_ALLOWED) { |
| 260 ShowPrompt(); |
| 261 } |
| 262 } |
| 263 |
| 264 bool CheckDefaultBrowserObserver::IsOwnedByWorker() { |
| 265 // Instruct the DefaultBrowserWorker to delete this instance when it is done. |
| 266 return true; |
| 267 } |
| 268 |
| 269 void CheckDefaultBrowserObserver::ResetCheckDefaultBrowserPref() { |
| 270 Profile* profile = |
| 271 g_browser_process->profile_manager()->GetProfileByPath(profile_path_); |
| 272 if (profile) |
| 273 profile->GetPrefs()->SetBoolean(prefs::kCheckDefaultBrowser, true); |
| 274 } |
| 275 |
| 276 void CheckDefaultBrowserObserver::ShowPrompt() { |
| 277 Browser* browser = chrome::FindLastActiveWithHostDesktopType(desktop_type_); |
186 if (!browser) | 278 if (!browser) |
187 return; // Reached during ui tests. | 279 return; // Reached during ui tests. |
188 | 280 |
189 // In ChromeBot tests, there might be a race. This line appears to get | 281 // In ChromeBot tests, there might be a race. This line appears to get |
190 // called during shutdown and |tab| can be NULL. | 282 // called during shutdown and |tab| can be NULL. |
191 content::WebContents* web_contents = | 283 content::WebContents* web_contents = |
192 browser->tab_strip_model()->GetActiveWebContents(); | 284 browser->tab_strip_model()->GetActiveWebContents(); |
193 if (!web_contents) | 285 if (!web_contents) |
194 return; | 286 return; |
195 | 287 |
196 DefaultBrowserInfoBarDelegate::Create( | 288 DefaultBrowserInfoBarDelegate::Create( |
197 InfoBarService::FromWebContents(web_contents), | 289 InfoBarService::FromWebContents(web_contents), |
198 Profile::FromBrowserContext( | 290 Profile::FromBrowserContext(web_contents->GetBrowserContext()) |
199 web_contents->GetBrowserContext())->GetPrefs(), | 291 ->GetPrefs()); |
200 (ShellIntegration::CanSetAsDefaultBrowser() == | |
201 ShellIntegration::SET_DEFAULT_INTERACTIVE)); | |
202 } | |
203 | |
204 void ResetCheckDefaultBrowserPrefOnUIThread( | |
205 const base::FilePath& profile_path) { | |
206 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
207 Profile* profile = | |
208 g_browser_process->profile_manager()->GetProfileByPath(profile_path); | |
209 if (profile) | |
210 profile->GetPrefs()->SetBoolean(prefs::kCheckDefaultBrowser, true); | |
211 } | |
212 | |
213 void CheckDefaultBrowserOnFileThread(const base::FilePath& profile_path, | |
214 bool show_prompt, | |
215 chrome::HostDesktopType desktop_type) { | |
216 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); | |
217 ShellIntegration::DefaultWebClientState state = | |
218 ShellIntegration::GetDefaultBrowser(); | |
219 if (state == ShellIntegration::IS_DEFAULT) { | |
220 // Notify the user in the future if Chrome ceases to be the user's chosen | |
221 // default browser. | |
222 content::BrowserThread::PostTask( | |
223 content::BrowserThread::UI, FROM_HERE, | |
224 base::Bind(&ResetCheckDefaultBrowserPrefOnUIThread, profile_path)); | |
225 } else if (show_prompt && state == ShellIntegration::NOT_DEFAULT) { | |
226 ShellIntegration::DefaultWebClientSetPermission default_change_mode = | |
227 ShellIntegration::CanSetAsDefaultBrowser(); | |
228 | |
229 if (default_change_mode != ShellIntegration::SET_DEFAULT_NOT_ALLOWED) { | |
230 content::BrowserThread::PostTask( | |
231 content::BrowserThread::UI, FROM_HERE, | |
232 base::Bind(&NotifyNotDefaultBrowserCallback, desktop_type)); | |
233 } | |
234 } | |
235 } | 292 } |
236 | 293 |
237 } // namespace | 294 } // namespace |
238 | 295 |
239 namespace chrome { | 296 namespace chrome { |
240 | 297 |
241 void RegisterDefaultBrowserPromptPrefs(PrefRegistrySimple* registry) { | 298 void RegisterDefaultBrowserPromptPrefs(PrefRegistrySimple* registry) { |
242 registry->RegisterStringPref( | 299 registry->RegisterStringPref( |
243 prefs::kBrowserSuppressDefaultBrowserPrompt, std::string()); | 300 prefs::kBrowserSuppressDefaultBrowserPrompt, std::string()); |
244 } | 301 } |
(...skipping 19 matching lines...) Expand all Loading... |
264 g_browser_process->local_state()->GetString( | 321 g_browser_process->local_state()->GetString( |
265 prefs::kBrowserSuppressDefaultBrowserPrompt); | 322 prefs::kBrowserSuppressDefaultBrowserPrompt); |
266 const Version disable_version(disable_version_string); | 323 const Version disable_version(disable_version_string); |
267 DCHECK(disable_version_string.empty() || disable_version.IsValid()); | 324 DCHECK(disable_version_string.empty() || disable_version.IsValid()); |
268 if (disable_version.IsValid()) { | 325 if (disable_version.IsValid()) { |
269 if (disable_version.Equals(Version(version_info::GetVersionNumber()))) | 326 if (disable_version.Equals(Version(version_info::GetVersionNumber()))) |
270 show_prompt = false; | 327 show_prompt = false; |
271 } | 328 } |
272 } | 329 } |
273 | 330 |
274 content::BrowserThread::PostTask( | 331 scoped_refptr<ShellIntegration::DefaultBrowserWorker>( |
275 content::BrowserThread::FILE, FROM_HERE, | 332 new ShellIntegration::DefaultBrowserWorker( |
276 base::Bind(&CheckDefaultBrowserOnFileThread, profile->GetPath(), | 333 new CheckDefaultBrowserObserver(profile->GetPath(), show_prompt, |
277 show_prompt, desktop_type)); | 334 desktop_type))) |
| 335 ->StartCheckIsDefault(); |
278 } | 336 } |
279 | 337 |
280 #if !defined(OS_WIN) | 338 #if !defined(OS_WIN) |
281 bool ShowFirstRunDefaultBrowserPrompt(Profile* profile) { | 339 bool ShowFirstRunDefaultBrowserPrompt(Profile* profile) { |
282 return false; | 340 return false; |
283 } | 341 } |
284 #endif | 342 #endif |
285 | 343 |
286 } // namespace chrome | 344 } // namespace chrome |
OLD | NEW |