Index: components/password_manager/content/browser/credential_manager_dispatcher.cc |
diff --git a/components/password_manager/content/browser/credential_manager_dispatcher.cc b/components/password_manager/content/browser/credential_manager_dispatcher.cc |
index fc7a026d82aeedde176ff647d07062cc9eb565fe..3ec0329e214dfc85550f91dfa8b95a2758cc2b1e 100644 |
--- a/components/password_manager/content/browser/credential_manager_dispatcher.cc |
+++ b/components/password_manager/content/browser/credential_manager_dispatcher.cc |
@@ -137,6 +137,7 @@ void CredentialManagerDispatcher::OnRequestCredential( |
request_id, zero_click_only, |
web_contents()->GetLastCommittedURL().GetOrigin(), federations)); |
+ // This will result in a callback to ::OnGetPasswordStoreResults(). |
store->GetAutofillableLogins(this); |
} |
@@ -152,17 +153,30 @@ void CredentialManagerDispatcher::OnGetPasswordStoreResults( |
// up the instances we don't add to |local_results| or |federated_results|. |
// We'll dump them into a ScopedVector and allow it to delete the |
// PasswordForms upon destruction. |
+ autofill::PasswordForm* to_send_as_zero_click = nullptr; |
+ bool multiple_zero_click = false; |
std::vector<autofill::PasswordForm*> local_results; |
std::vector<autofill::PasswordForm*> federated_results; |
ScopedVector<autofill::PasswordForm> discarded_results; |
for (autofill::PasswordForm* form : results) { |
- // TODO(mkwst): Extend this filter to include federations. |
- if (form->origin == pending_request_->origin) |
+ if (form->origin == pending_request_->origin) { |
local_results.push_back(form); |
- else if (federations.count(form->origin.spec()) != 0) |
+ |
+ // If more than one local credential is_zero_click, then we punt on |
+ // auto signin. |
+ // |
+ // TODO(mkwst): We should have a global on-off switch here alongside the |
+ // credential-level toggle. |
+ if (form->is_zero_click && !multiple_zero_click) { |
vasilii
2015/01/28 13:25:30
AS we discussed, I'll rename form->is_zero_click t
Mike West
2015/01/28 14:42:14
Perfect, thanks.
|
+ if (to_send_as_zero_click) |
+ multiple_zero_click = true; |
+ to_send_as_zero_click = multiple_zero_click ? nullptr : form; |
+ } |
+ } else if (federations.count(form->origin.spec()) != 0) { |
federated_results.push_back(form); |
- else |
+ } else { |
discarded_results.push_back(form); |
vabr (Chromium)
2015/01/28 13:37:52
Why not just
delete form;
?
Mike West
2015/01/28 14:42:14
That would be too easy!
|
+ } |
} |
if ((local_results.empty() && federated_results.empty()) || |
@@ -172,9 +186,21 @@ void CredentialManagerDispatcher::OnGetPasswordStoreResults( |
return; |
} |
- if (!client_->PromptUserToChooseCredentials( |
- local_results, |
- federated_results, |
+ if (to_send_as_zero_click) { |
+ discarded_results.assign(local_results.begin(), local_results.end()); |
vabr (Chromium)
2015/01/28 13:37:52
Why not use STLDeleteElements? This is a bit crypt
Mike West
2015/01/28 14:42:14
Sure. I can do that.
|
+ discarded_results.assign(federated_results.begin(), |
+ federated_results.end()); |
+ CredentialInfo info(*to_send_as_zero_click, |
+ to_send_as_zero_click->federation_url.is_empty() |
+ ? CredentialType::CREDENTIAL_TYPE_LOCAL |
+ : CredentialType::CREDENTIAL_TYPE_FEDERATED); |
+ SendCredential(pending_request_->id, info); |
+ return; |
+ } |
+ |
+ if (pending_request_->zero_click_only || |
+ !client_->PromptUserToChooseCredentials( |
+ local_results, federated_results, |
base::Bind(&CredentialManagerDispatcher::SendCredential, |
base::Unretained(this), pending_request_->id))) { |
SendCredential(pending_request_->id, CredentialInfo()); |