OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/password_manager/chrome_password_manager_client.h" | 5 #include "chrome/browser/password_manager/chrome_password_manager_client.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 #include "components/prefs/pref_service.h" | 49 #include "components/prefs/pref_service.h" |
50 #include "components/signin/core/browser/signin_manager.h" | 50 #include "components/signin/core/browser/signin_manager.h" |
51 #include "components/version_info/version_info.h" | 51 #include "components/version_info/version_info.h" |
52 #include "content/public/browser/navigation_entry.h" | 52 #include "content/public/browser/navigation_entry.h" |
53 #include "content/public/browser/render_view_host.h" | 53 #include "content/public/browser/render_view_host.h" |
54 #include "content/public/browser/web_contents.h" | 54 #include "content/public/browser/web_contents.h" |
55 #include "google_apis/gaia/gaia_urls.h" | 55 #include "google_apis/gaia/gaia_urls.h" |
56 #include "net/base/url_util.h" | 56 #include "net/base/url_util.h" |
57 #include "third_party/re2/src/re2/re2.h" | 57 #include "third_party/re2/src/re2/re2.h" |
58 | 58 |
59 #if defined(OS_MACOSX) || BUILDFLAG(ANDROID_JAVA_UI) | |
60 #include "chrome/browser/password_manager/save_password_infobar_delegate.h" | |
61 #endif | |
62 | |
63 #if BUILDFLAG(ANDROID_JAVA_UI) | 59 #if BUILDFLAG(ANDROID_JAVA_UI) |
64 #include "chrome/browser/android/tab_android.h" | 60 #include "chrome/browser/android/tab_android.h" |
65 #include "chrome/browser/password_manager/account_chooser_dialog_android.h" | 61 #include "chrome/browser/password_manager/account_chooser_dialog_android.h" |
66 #include "chrome/browser/password_manager/auto_signin_first_run_dialog_android.h
" | 62 #include "chrome/browser/password_manager/auto_signin_first_run_dialog_android.h
" |
67 #include "chrome/browser/password_manager/generated_password_saved_infobar_deleg
ate_android.h" | 63 #include "chrome/browser/password_manager/generated_password_saved_infobar_deleg
ate_android.h" |
| 64 #include "chrome/browser/password_manager/save_password_infobar_delegate.h" |
68 #include "chrome/browser/password_manager/update_password_infobar_delegate.h" | 65 #include "chrome/browser/password_manager/update_password_infobar_delegate.h" |
69 #include "chrome/browser/ui/android/snackbars/auto_signin_prompt_controller.h" | 66 #include "chrome/browser/ui/android/snackbars/auto_signin_prompt_controller.h" |
70 #endif | 67 #endif |
71 | 68 |
72 using password_manager::ContentPasswordManagerDriverFactory; | 69 using password_manager::ContentPasswordManagerDriverFactory; |
73 using password_manager::PasswordManagerInternalsService; | 70 using password_manager::PasswordManagerInternalsService; |
74 | 71 |
75 // Shorten the name to spare line breaks. The code provides enough context | 72 // Shorten the name to spare line breaks. The code provides enough context |
76 // already. | 73 // already. |
77 typedef autofill::SavePasswordProgressLogger Logger; | 74 typedef autofill::SavePasswordProgressLogger Logger; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 std::unique_ptr<password_manager::PasswordFormManager> form_to_save, | 212 std::unique_ptr<password_manager::PasswordFormManager> form_to_save, |
216 password_manager::CredentialSourceType type, | 213 password_manager::CredentialSourceType type, |
217 bool update_password) { | 214 bool update_password) { |
218 // Save password infobar and the password bubble prompts in case of | 215 // Save password infobar and the password bubble prompts in case of |
219 // "webby" URLs and do not prompt in case of "non-webby" URLS (e.g. file://). | 216 // "webby" URLs and do not prompt in case of "non-webby" URLS (e.g. file://). |
220 if (!BrowsingDataHelper::IsWebScheme( | 217 if (!BrowsingDataHelper::IsWebScheme( |
221 web_contents()->GetLastCommittedURL().scheme())) { | 218 web_contents()->GetLastCommittedURL().scheme())) { |
222 return false; | 219 return false; |
223 } | 220 } |
224 | 221 |
225 if (IsTheHotNewBubbleUIEnabled()) { | |
226 #if !BUILDFLAG(ANDROID_JAVA_UI) | 222 #if !BUILDFLAG(ANDROID_JAVA_UI) |
227 PasswordsClientUIDelegate* manage_passwords_ui_controller = | 223 PasswordsClientUIDelegate* manage_passwords_ui_controller = |
228 PasswordsClientUIDelegateFromWebContents(web_contents()); | 224 PasswordsClientUIDelegateFromWebContents(web_contents()); |
229 if (update_password && IsUpdatePasswordUIEnabled()) { | 225 if (update_password) { |
230 manage_passwords_ui_controller->OnUpdatePasswordSubmitted( | 226 manage_passwords_ui_controller->OnUpdatePasswordSubmitted( |
231 std::move(form_to_save)); | 227 std::move(form_to_save)); |
232 } else { | |
233 manage_passwords_ui_controller->OnPasswordSubmitted( | |
234 std::move(form_to_save)); | |
235 } | |
236 #endif | |
237 } else { | 228 } else { |
238 #if defined(OS_MACOSX) || BUILDFLAG(ANDROID_JAVA_UI) | 229 manage_passwords_ui_controller->OnPasswordSubmitted( |
239 if (form_to_save->IsBlacklisted()) | 230 std::move(form_to_save)); |
240 return false; | 231 } |
241 #if BUILDFLAG(ANDROID_JAVA_UI) | |
242 if (update_password && IsUpdatePasswordUIEnabled()) { | |
243 UpdatePasswordInfoBarDelegate::Create(web_contents(), | |
244 std::move(form_to_save)); | |
245 return true; | |
246 } | |
247 #endif | |
248 SavePasswordInfoBarDelegate::Create(web_contents(), | |
249 std::move(form_to_save)); | |
250 #else | 232 #else |
251 NOTREACHED() << "Aura platforms should always use the bubble"; | 233 if (form_to_save->IsBlacklisted()) |
252 #endif | 234 return false; |
| 235 |
| 236 if (update_password && IsUpdatePasswordUIEnabled()) { |
| 237 UpdatePasswordInfoBarDelegate::Create(web_contents(), |
| 238 std::move(form_to_save)); |
| 239 return true; |
253 } | 240 } |
| 241 SavePasswordInfoBarDelegate::Create(web_contents(), |
| 242 std::move(form_to_save)); |
| 243 #endif // !BUILDFLAG(ANDROID_JAVA_UI) |
254 return true; | 244 return true; |
255 } | 245 } |
256 | 246 |
257 bool ChromePasswordManagerClient::PromptUserToChooseCredentials( | 247 bool ChromePasswordManagerClient::PromptUserToChooseCredentials( |
258 ScopedVector<autofill::PasswordForm> local_forms, | 248 ScopedVector<autofill::PasswordForm> local_forms, |
259 ScopedVector<autofill::PasswordForm> federated_forms, | 249 ScopedVector<autofill::PasswordForm> federated_forms, |
260 const GURL& origin, | 250 const GURL& origin, |
261 const CredentialsCallback& callback) { | 251 const CredentialsCallback& callback) { |
262 // Set up an intercept callback if the prompt is zero-clickable (e.g. just one | 252 // Set up an intercept callback if the prompt is zero-clickable (e.g. just one |
263 // form provided). | 253 // form provided). |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 // If a site stores a credential the autofill password manager shouldn't kick | 332 // If a site stores a credential the autofill password manager shouldn't kick |
343 // in. | 333 // in. |
344 password_manager_.DropFormManagers(); | 334 password_manager_.DropFormManagers(); |
345 } | 335 } |
346 | 336 |
347 void ChromePasswordManagerClient::AutomaticPasswordSave( | 337 void ChromePasswordManagerClient::AutomaticPasswordSave( |
348 std::unique_ptr<password_manager::PasswordFormManager> saved_form) { | 338 std::unique_ptr<password_manager::PasswordFormManager> saved_form) { |
349 #if BUILDFLAG(ANDROID_JAVA_UI) | 339 #if BUILDFLAG(ANDROID_JAVA_UI) |
350 GeneratedPasswordSavedInfoBarDelegateAndroid::Create(web_contents()); | 340 GeneratedPasswordSavedInfoBarDelegateAndroid::Create(web_contents()); |
351 #else | 341 #else |
352 if (IsTheHotNewBubbleUIEnabled()) { | 342 PasswordsClientUIDelegate* manage_passwords_ui_controller = |
353 PasswordsClientUIDelegate* manage_passwords_ui_controller = | 343 PasswordsClientUIDelegateFromWebContents(web_contents()); |
354 PasswordsClientUIDelegateFromWebContents(web_contents()); | 344 manage_passwords_ui_controller->OnAutomaticPasswordSave( |
355 manage_passwords_ui_controller->OnAutomaticPasswordSave( | 345 std::move(saved_form)); |
356 std::move(saved_form)); | |
357 } | |
358 #endif | 346 #endif |
359 } | 347 } |
360 | 348 |
361 void ChromePasswordManagerClient::PasswordWasAutofilled( | 349 void ChromePasswordManagerClient::PasswordWasAutofilled( |
362 const autofill::PasswordFormMap& best_matches, | 350 const autofill::PasswordFormMap& best_matches, |
363 const GURL& origin, | 351 const GURL& origin, |
364 const std::vector<std::unique_ptr<autofill::PasswordForm>>* | 352 const std::vector<std::unique_ptr<autofill::PasswordForm>>* |
365 federated_matches) const { | 353 federated_matches) const { |
366 #if !BUILDFLAG(ANDROID_JAVA_UI) | 354 #if !BUILDFLAG(ANDROID_JAVA_UI) |
367 PasswordsClientUIDelegate* manage_passwords_ui_controller = | 355 PasswordsClientUIDelegate* manage_passwords_ui_controller = |
368 PasswordsClientUIDelegateFromWebContents(web_contents()); | 356 PasswordsClientUIDelegateFromWebContents(web_contents()); |
369 if (manage_passwords_ui_controller && IsTheHotNewBubbleUIEnabled()) | 357 manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin, |
370 manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin, | 358 federated_matches); |
371 federated_matches); | |
372 #endif | 359 #endif |
373 } | 360 } |
374 | 361 |
375 void ChromePasswordManagerClient::HidePasswordGenerationPopup() { | 362 void ChromePasswordManagerClient::HidePasswordGenerationPopup() { |
376 if (popup_controller_) | 363 if (popup_controller_) |
377 popup_controller_->HideAndDestroy(); | 364 popup_controller_->HideAndDestroy(); |
378 } | 365 } |
379 | 366 |
380 PrefService* ChromePasswordManagerClient::GetPrefs() { | 367 PrefService* ChromePasswordManagerClient::GetPrefs() { |
381 return profile_->GetPrefs(); | 368 return profile_->GetPrefs(); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 PasswordsClientUIDelegateFromWebContents(web_contents()) | 542 PasswordsClientUIDelegateFromWebContents(web_contents()) |
556 ->OnPromptEnableAutoSignin(); | 543 ->OnPromptEnableAutoSignin(); |
557 #endif | 544 #endif |
558 } | 545 } |
559 | 546 |
560 void ChromePasswordManagerClient::GenerationAvailableForForm( | 547 void ChromePasswordManagerClient::GenerationAvailableForForm( |
561 const autofill::PasswordForm& form) { | 548 const autofill::PasswordForm& form) { |
562 password_manager_.GenerationAvailableForForm(form); | 549 password_manager_.GenerationAvailableForForm(form); |
563 } | 550 } |
564 | 551 |
565 bool ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled() { | |
566 #if BUILDFLAG(ANDROID_JAVA_UI) | |
567 return false; | |
568 #elif defined(OS_MACOSX) | |
569 // Query the group first for correct UMA reporting. | |
570 std::string group_name = | |
571 base::FieldTrialList::FindFullName("PasswordManagerUI"); | |
572 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | |
573 if (command_line->HasSwitch(switches::kDisableSavePasswordBubble)) | |
574 return false; | |
575 | |
576 if (command_line->HasSwitch(switches::kEnableSavePasswordBubble)) | |
577 return true; | |
578 | |
579 // The bubble should be the default case that runs on the bots. | |
580 return group_name != "Infobar"; | |
581 #else | |
582 // All other platforms use Aura, and therefore always show the bubble. | |
583 return true; | |
584 #endif | |
585 } | |
586 | |
587 bool ChromePasswordManagerClient::IsUpdatePasswordUIEnabled() const { | 552 bool ChromePasswordManagerClient::IsUpdatePasswordUIEnabled() const { |
588 #if BUILDFLAG(ANDROID_JAVA_UI) | 553 #if BUILDFLAG(ANDROID_JAVA_UI) |
589 return base::FeatureList::IsEnabled( | 554 return base::FeatureList::IsEnabled( |
590 password_manager::features::kEnablePasswordChangeSupport); | 555 password_manager::features::kEnablePasswordChangeSupport); |
591 #else | 556 #else |
592 return IsTheHotNewBubbleUIEnabled(); | 557 return true; |
593 #endif | 558 #endif |
594 } | 559 } |
595 | 560 |
596 const GURL& ChromePasswordManagerClient::GetMainFrameURL() const { | 561 const GURL& ChromePasswordManagerClient::GetMainFrameURL() const { |
597 return web_contents()->GetVisibleURL(); | 562 return web_contents()->GetVisibleURL(); |
598 } | 563 } |
599 | 564 |
600 const GURL& ChromePasswordManagerClient::GetLastCommittedEntryURL() const { | 565 const GURL& ChromePasswordManagerClient::GetLastCommittedEntryURL() const { |
601 DCHECK(web_contents()); | 566 DCHECK(web_contents()); |
602 content::NavigationEntry* entry = | 567 content::NavigationEntry* entry = |
(...skipping 20 matching lines...) Expand all Loading... |
623 password_manager::mojom::CredentialManagerRequest request) { | 588 password_manager::mojom::CredentialManagerRequest request) { |
624 content::WebContents* web_contents = | 589 content::WebContents* web_contents = |
625 content::WebContents::FromRenderFrameHost(render_frame_host); | 590 content::WebContents::FromRenderFrameHost(render_frame_host); |
626 DCHECK(web_contents); | 591 DCHECK(web_contents); |
627 | 592 |
628 ChromePasswordManagerClient* instance = | 593 ChromePasswordManagerClient* instance = |
629 ChromePasswordManagerClient::FromWebContents(web_contents); | 594 ChromePasswordManagerClient::FromWebContents(web_contents); |
630 DCHECK(instance); | 595 DCHECK(instance); |
631 instance->credential_manager_impl_.BindRequest(std::move(request)); | 596 instance->credential_manager_impl_.BindRequest(std::move(request)); |
632 } | 597 } |
OLD | NEW |