Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(694)

Unified Diff: components/password_manager/core/browser/password_form_manager.cc

Issue 1094013002: PasswordFormManager: Clean up PasswordForm pointer ownership. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@image-scopedptr
Patch Set: Revert back to using a reference (minimize map lookups). Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/password_manager/core/browser/password_form_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/password_manager/core/browser/password_form_manager.cc
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index 88fdc57496a20e4ae1aec3f9b047470cbec355af..44f4a8d2fd13b1ce7f4095635bea0ff01f82bd40 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -388,6 +388,10 @@ void PasswordFormManager::OnRequestDone(
// the worse-scoring "protected" ones for later.
ScopedVector<PasswordForm> protected_credentials;
for (size_t i = 0; i < logins_result.size(); ++i) {
+ // Take ownership of the PasswordForm from the ScopedVector.
+ scoped_ptr<PasswordForm> login(logins_result[i]);
+ logins_result[i] = nullptr;
+
if (credential_scores[i] < 0)
continue;
if (credential_scores[i] < best_score) {
@@ -399,45 +403,46 @@ void PasswordFormManager::OnRequestDone(
// instead of explicitly handling empty path matches.
bool is_credential_protected =
observed_form_.scheme == PasswordForm::SCHEME_HTML &&
- StartsWithASCII("/", logins_result[i]->origin.path(), true) &&
- credential_scores[i] > 0 && !logins_result[i]->blacklisted_by_user;
+ StartsWithASCII("/", login->origin.path(), true) &&
+ credential_scores[i] > 0 && !login->blacklisted_by_user;
// Passwords generated on a signup form must show on a login form even if
// there are better-matching saved credentials. TODO(gcasto): We don't
// want to cut credentials that were saved on signup forms even if they
// weren't generated, but currently it's hard to distinguish between those
// forms and two different login forms on the same domain. Filed
// http://crbug.com/294468 to look into this.
- is_credential_protected |=
- logins_result[i]->type == PasswordForm::TYPE_GENERATED;
+ is_credential_protected |= login->type == PasswordForm::TYPE_GENERATED;
- if (is_credential_protected) {
- protected_credentials.push_back(logins_result[i]);
- logins_result[i] = nullptr;
- }
+ if (is_credential_protected)
+ protected_credentials.push_back(login.Pass());
continue;
}
// If there is another best-score match for the same username, replace it.
// TODO(vabr): Spare the replacing and keep the first instead of the last
// candidate.
- auto& best_match = best_matches_[logins_result[i]->username_value];
+ PasswordForm*& best_match = best_matches_[login->username_value];
if (best_match == preferred_match_)
preferred_match_ = nullptr;
delete best_match;
-
- best_match = logins_result[i];
- logins_result[i] = nullptr;
- preferred_match_ = best_match->preferred ? best_match : preferred_match_;
+ // Transfer ownership into the map.
+ best_match = login.release();
+ if (best_match->preferred)
+ preferred_match_ = best_match;
}
// Add the protected results if we don't already have a result with the same
// username.
- for (auto& protege : protected_credentials) {
- auto& corresponding_best_match = best_matches_[protege->username_value];
- if (!corresponding_best_match) {
- corresponding_best_match = protege;
- protege = nullptr;
- }
+ for (ScopedVector<PasswordForm>::iterator it = protected_credentials.begin();
+ it != protected_credentials.end(); ++it) {
+ // Take ownership of the PasswordForm from the ScopedVector.
+ scoped_ptr<PasswordForm> protege(*it);
+ *it = nullptr;
+
+ PasswordForm*& corresponding_best_match =
+ best_matches_[protege->username_value];
+ if (!corresponding_best_match)
+ corresponding_best_match = protege.release();
}
client_->AutofillResultsComputed();
« no previous file with comments | « components/password_manager/core/browser/password_form_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698