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

Side by Side Diff: chrome/browser/password_manager/login_database.cc

Issue 14811010: Add metadata to content::PasswordForm to keep track of the password usage. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 7 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 unified diff | Download patch
OLDNEW
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/password_manager/login_database.h" 5 #include "chrome/browser/password_manager/login_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/pickle.h" 14 #include "base/pickle.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/time.h" 16 #include "base/time.h"
17 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
18 #include "sql/statement.h" 18 #include "sql/statement.h"
19 #include "sql/transaction.h" 19 #include "sql/transaction.h"
20 20
21 using content::PasswordForm; 21 using content::PasswordForm;
22 22
23 static const int kCurrentVersionNumber = 2; 23 static const int kCurrentVersionNumber = 3;
24 static const int kCompatibleVersionNumber = 1; 24 static const int kCompatibleVersionNumber = 1;
25 25
26 namespace { 26 namespace {
27 27
28 // Convenience enum for interacting with SQL queries that use all the columns. 28 // Convenience enum for interacting with SQL queries that use all the columns.
29 enum LoginTableColumns { 29 enum LoginTableColumns {
30 COLUMN_ORIGIN_URL = 0, 30 COLUMN_ORIGIN_URL = 0,
31 COLUMN_ACTION_URL, 31 COLUMN_ACTION_URL,
32 COLUMN_USERNAME_ELEMENT, 32 COLUMN_USERNAME_ELEMENT,
33 COLUMN_USERNAME_VALUE, 33 COLUMN_USERNAME_VALUE,
34 COLUMN_PASSWORD_ELEMENT, 34 COLUMN_PASSWORD_ELEMENT,
35 COLUMN_PASSWORD_VALUE, 35 COLUMN_PASSWORD_VALUE,
36 COLUMN_SUBMIT_ELEMENT, 36 COLUMN_SUBMIT_ELEMENT,
37 COLUMN_SIGNON_REALM, 37 COLUMN_SIGNON_REALM,
38 COLUMN_SSL_VALID, 38 COLUMN_SSL_VALID,
39 COLUMN_PREFERRED, 39 COLUMN_PREFERRED,
40 COLUMN_DATE_CREATED, 40 COLUMN_DATE_CREATED,
41 COLUMN_BLACKLISTED_BY_USER, 41 COLUMN_BLACKLISTED_BY_USER,
42 COLUMN_SCHEME, 42 COLUMN_SCHEME,
43 COLUMN_PASSWORD_TYPE, 43 COLUMN_PASSWORD_TYPE,
44 COLUMN_POSSIBLE_USERNAMES 44 COLUMN_POSSIBLE_USERNAMES,
45 COLUMN_TIMES_USED
45 }; 46 };
46 47
47 } // namespace 48 } // namespace
48 49
49 LoginDatabase::LoginDatabase() { 50 LoginDatabase::LoginDatabase() {
50 } 51 }
51 52
52 LoginDatabase::~LoginDatabase() { 53 LoginDatabase::~LoginDatabase() {
53 } 54 }
54 55
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 } 97 }
97 98
98 if (!transaction.Commit()) { 99 if (!transaction.Commit()) {
99 db_.Close(); 100 db_.Close();
100 return false; 101 return false;
101 } 102 }
102 return true; 103 return true;
103 } 104 }
104 105
105 bool LoginDatabase::MigrateOldVersionsAsNeeded() { 106 bool LoginDatabase::MigrateOldVersionsAsNeeded() {
106 switch (meta_table_.GetVersionNumber()) { 107 int current_version = meta_table_.GetVersionNumber();
107 case kCompatibleVersionNumber: 108 while (current_version != kCurrentVersionNumber) {
108 if (!db_.Execute("ALTER TABLE logins " 109 switch (current_version) {
109 "ADD COLUMN password_type INTEGER") || 110 case 1:
110 !db_.Execute("ALTER TABLE logins " 111 if (!db_.Execute("ALTER TABLE logins "
111 "ADD COLUMN possible_usernames BLOB")) { 112 "ADD COLUMN password_type INTEGER") ||
113 !db_.Execute("ALTER TABLE logins "
114 "ADD COLUMN possible_usernames BLOB")) {
115 return false;
116 } else {
117 current_version = 2;
118 }
119 break;
120 case 2:
121 if (!db_.Execute("ALTER TABLE logins "
122 "ADD COLUMN times_used INTEGER")) {
123 return false;
124 } else {
125 current_version = 3;
126 }
127 default:
128 NOTREACHED();
112 return false; 129 return false;
113 } else { 130 }
114 meta_table_.SetVersionNumber(kCurrentVersionNumber);
115 }
116 } 131 }
132 meta_table_.SetVersionNumber(kCurrentVersionNumber);
117 return true; 133 return true;
118 } 134 }
119 135
120 bool LoginDatabase::InitLoginsTable() { 136 bool LoginDatabase::InitLoginsTable() {
121 if (!db_.DoesTableExist("logins")) { 137 if (!db_.DoesTableExist("logins")) {
122 if (!db_.Execute("CREATE TABLE logins (" 138 if (!db_.Execute("CREATE TABLE logins ("
123 "origin_url VARCHAR NOT NULL, " 139 "origin_url VARCHAR NOT NULL, "
124 "action_url VARCHAR, " 140 "action_url VARCHAR, "
125 "username_element VARCHAR, " 141 "username_element VARCHAR, "
126 "username_value VARCHAR, " 142 "username_value VARCHAR, "
127 "password_element VARCHAR, " 143 "password_element VARCHAR, "
128 "password_value BLOB, " 144 "password_value BLOB, "
129 "submit_element VARCHAR, " 145 "submit_element VARCHAR, "
130 "signon_realm VARCHAR NOT NULL," 146 "signon_realm VARCHAR NOT NULL,"
131 "ssl_valid INTEGER NOT NULL," 147 "ssl_valid INTEGER NOT NULL,"
132 "preferred INTEGER NOT NULL," 148 "preferred INTEGER NOT NULL,"
133 "date_created INTEGER NOT NULL," 149 "date_created INTEGER NOT NULL,"
134 "blacklisted_by_user INTEGER NOT NULL," 150 "blacklisted_by_user INTEGER NOT NULL,"
135 "scheme INTEGER NOT NULL," 151 "scheme INTEGER NOT NULL,"
136 "password_type INTEGER," 152 "password_type INTEGER,"
137 "possible_usernames BLOB," 153 "possible_usernames BLOB,"
154 "times_used INTEGER,"
138 "UNIQUE " 155 "UNIQUE "
139 "(origin_url, username_element, " 156 "(origin_url, username_element, "
140 "username_value, password_element, " 157 "username_value, password_element, "
141 "submit_element, signon_realm))")) { 158 "submit_element, signon_realm))")) {
142 NOTREACHED(); 159 NOTREACHED();
143 return false; 160 return false;
144 } 161 }
145 if (!db_.Execute("CREATE INDEX logins_signon ON " 162 if (!db_.Execute("CREATE INDEX logins_signon ON "
146 "logins (signon_realm)")) { 163 "logins (signon_realm)")) {
147 NOTREACHED(); 164 NOTREACHED();
(...skipping 13 matching lines...) Expand all
161 178
162 int total_accounts = 0; 179 int total_accounts = 0;
163 while (s.Step()) { 180 while (s.Step()) {
164 int accounts_per_site = s.ColumnInt(1); 181 int accounts_per_site = s.ColumnInt(1);
165 total_accounts += accounts_per_site; 182 total_accounts += accounts_per_site;
166 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.AccountsPerSite", 183 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.AccountsPerSite",
167 accounts_per_site, 0, 32, 6); 184 accounts_per_site, 0, 32, 6);
168 } 185 }
169 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.TotalAccounts", 186 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.TotalAccounts",
170 total_accounts, 0, 32, 6); 187 total_accounts, 0, 32, 6);
188
189 sql::Statement usage_statement(db_.GetCachedStatement(
190 SQL_FROM_HERE,
191 "SELECT times_used FROM logins"));
192
193 if (!usage_statement.is_valid())
194 return;
195
196 while (usage_statement.Step()) {
197 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.TimesPasswordUsed",
198 usage_statement.ColumnInt(0), 0, 100, 10);
199 }
171 } 200 }
172 201
173 bool LoginDatabase::AddLogin(const PasswordForm& form) { 202 bool LoginDatabase::AddLogin(const PasswordForm& form) {
174 std::string encrypted_password; 203 std::string encrypted_password;
175 if (!EncryptedString(form.password_value, &encrypted_password)) 204 if (!EncryptedString(form.password_value, &encrypted_password))
176 return false; 205 return false;
177 206
178 // You *must* change LoginTableColumns if this query changes. 207 // You *must* change LoginTableColumns if this query changes.
179 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, 208 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
180 "INSERT OR REPLACE INTO logins " 209 "INSERT OR REPLACE INTO logins "
181 "(origin_url, action_url, username_element, username_value, " 210 "(origin_url, action_url, username_element, username_value, "
182 " password_element, password_value, submit_element, " 211 " password_element, password_value, submit_element, "
183 " signon_realm, ssl_valid, preferred, date_created, " 212 " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, "
184 " blacklisted_by_user, scheme, password_type, possible_usernames) " 213 " scheme, password_type, possible_usernames, times_used) "
185 "VALUES " 214 "VALUES "
186 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); 215 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
187 s.BindString(COLUMN_ORIGIN_URL, form.origin.spec()); 216 s.BindString(COLUMN_ORIGIN_URL, form.origin.spec());
188 s.BindString(COLUMN_ACTION_URL, form.action.spec()); 217 s.BindString(COLUMN_ACTION_URL, form.action.spec());
189 s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); 218 s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element);
190 s.BindString16(COLUMN_USERNAME_VALUE, form.username_value); 219 s.BindString16(COLUMN_USERNAME_VALUE, form.username_value);
191 s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); 220 s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element);
192 s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), 221 s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(),
193 static_cast<int>(encrypted_password.length())); 222 static_cast<int>(encrypted_password.length()));
194 s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element); 223 s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element);
195 s.BindString(COLUMN_SIGNON_REALM, form.signon_realm); 224 s.BindString(COLUMN_SIGNON_REALM, form.signon_realm);
196 s.BindInt(COLUMN_SSL_VALID, form.ssl_valid); 225 s.BindInt(COLUMN_SSL_VALID, form.ssl_valid);
197 s.BindInt(COLUMN_PREFERRED, form.preferred); 226 s.BindInt(COLUMN_PREFERRED, form.preferred);
198 s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); 227 s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT());
199 s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); 228 s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user);
200 s.BindInt(COLUMN_SCHEME, form.scheme); 229 s.BindInt(COLUMN_SCHEME, form.scheme);
201 s.BindInt(COLUMN_PASSWORD_TYPE, form.type); 230 s.BindInt(COLUMN_PASSWORD_TYPE, form.type);
202 Pickle pickle = SerializeVector(form.possible_usernames); 231 Pickle pickle = SerializeVector(form.possible_usernames);
203 s.BindBlob(COLUMN_POSSIBLE_USERNAMES, pickle.data(), pickle.size()); 232 s.BindBlob(COLUMN_POSSIBLE_USERNAMES, pickle.data(), pickle.size());
233 s.BindInt(COLUMN_TIMES_USED, form.times_used);
204 234
205 return s.Run(); 235 return s.Run();
206 } 236 }
207 237
208 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { 238 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) {
209 std::string encrypted_password; 239 std::string encrypted_password;
210 if (!EncryptedString(form.password_value, &encrypted_password)) 240 if (!EncryptedString(form.password_value, &encrypted_password))
211 return false; 241 return false;
212 242
213 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, 243 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
214 "UPDATE logins SET " 244 "UPDATE logins SET "
215 "action_url = ?, " 245 "action_url = ?, "
216 "password_value = ?, " 246 "password_value = ?, "
217 "ssl_valid = ?, " 247 "ssl_valid = ?, "
218 "preferred = ?, " 248 "preferred = ?, "
219 "possible_usernames = ? " 249 "possible_usernames = ?, "
250 "times_used = ? "
220 "WHERE origin_url = ? AND " 251 "WHERE origin_url = ? AND "
221 "username_element = ? AND " 252 "username_element = ? AND "
222 "username_value = ? AND " 253 "username_value = ? AND "
223 "password_element = ? AND " 254 "password_element = ? AND "
224 "signon_realm = ?")); 255 "signon_realm = ?"));
225 s.BindString(0, form.action.spec()); 256 s.BindString(0, form.action.spec());
226 s.BindBlob(1, encrypted_password.data(), 257 s.BindBlob(1, encrypted_password.data(),
227 static_cast<int>(encrypted_password.length())); 258 static_cast<int>(encrypted_password.length()));
228 s.BindInt(2, form.ssl_valid); 259 s.BindInt(2, form.ssl_valid);
229 s.BindInt(3, form.preferred); 260 s.BindInt(3, form.preferred);
230 Pickle pickle = SerializeVector(form.possible_usernames); 261 Pickle pickle = SerializeVector(form.possible_usernames);
231 s.BindBlob(4, pickle.data(), pickle.size()); 262 s.BindBlob(4, pickle.data(), pickle.size());
232 s.BindString(5, form.origin.spec()); 263 s.BindInt(5, form.times_used);
233 s.BindString16(6, form.username_element); 264 s.BindString(6, form.origin.spec());
234 s.BindString16(7, form.username_value); 265 s.BindString16(7, form.username_element);
235 s.BindString16(8, form.password_element); 266 s.BindString16(8, form.username_value);
236 s.BindString(9, form.signon_realm); 267 s.BindString16(9, form.password_element);
268 s.BindString(10, form.signon_realm);
237 269
238 if (!s.Run()) 270 if (!s.Run())
239 return false; 271 return false;
240 272
241 if (items_changed) 273 if (items_changed)
242 *items_changed = db_.GetLastChangeCount(); 274 *items_changed = db_.GetLastChangeCount();
243 275
244 return true; 276 return true;
245 } 277 }
246 278
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 int scheme_int = s.ColumnInt(COLUMN_SCHEME); 335 int scheme_int = s.ColumnInt(COLUMN_SCHEME);
304 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); 336 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER));
305 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); 337 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int);
306 int type_int = s.ColumnInt(COLUMN_PASSWORD_TYPE); 338 int type_int = s.ColumnInt(COLUMN_PASSWORD_TYPE);
307 DCHECK(type_int >= 0 && type_int <= PasswordForm::TYPE_GENERATED); 339 DCHECK(type_int >= 0 && type_int <= PasswordForm::TYPE_GENERATED);
308 form->type = static_cast<PasswordForm::Type>(type_int); 340 form->type = static_cast<PasswordForm::Type>(type_int);
309 Pickle pickle( 341 Pickle pickle(
310 static_cast<const char*>(s.ColumnBlob(COLUMN_POSSIBLE_USERNAMES)), 342 static_cast<const char*>(s.ColumnBlob(COLUMN_POSSIBLE_USERNAMES)),
311 s.ColumnByteLength(COLUMN_POSSIBLE_USERNAMES)); 343 s.ColumnByteLength(COLUMN_POSSIBLE_USERNAMES));
312 form->possible_usernames = DeserializeVector(pickle); 344 form->possible_usernames = DeserializeVector(pickle);
345 form->times_used = s.ColumnInt(COLUMN_TIMES_USED);
313 return true; 346 return true;
314 } 347 }
315 348
316 bool LoginDatabase::GetLogins(const PasswordForm& form, 349 bool LoginDatabase::GetLogins(const PasswordForm& form,
317 std::vector<PasswordForm*>* forms) const { 350 std::vector<PasswordForm*>* forms) const {
318 DCHECK(forms); 351 DCHECK(forms);
319 // You *must* change LoginTableColumns if this query changes. 352 // You *must* change LoginTableColumns if this query changes.
320 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, 353 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
321 "SELECT origin_url, action_url, " 354 "SELECT origin_url, action_url, "
322 "username_element, username_value, " 355 "username_element, username_value, "
323 "password_element, password_value, " 356 "password_element, password_value, submit_element, "
324 "submit_element, signon_realm, ssl_valid, preferred, date_created, " 357 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, "
325 "blacklisted_by_user, scheme, password_type, possible_usernames " 358 "scheme, password_type, possible_usernames, times_used "
326 "FROM logins WHERE signon_realm == ? ")); 359 "FROM logins WHERE signon_realm == ? "));
327 s.BindString(0, form.signon_realm); 360 s.BindString(0, form.signon_realm);
328 361
329 while (s.Step()) { 362 while (s.Step()) {
330 scoped_ptr<PasswordForm> new_form(new PasswordForm()); 363 scoped_ptr<PasswordForm> new_form(new PasswordForm());
331 if (!InitPasswordFormFromStatement(new_form.get(), s)) 364 if (!InitPasswordFormFromStatement(new_form.get(), s))
332 return false; 365 return false;
333 forms->push_back(new_form.release()); 366 forms->push_back(new_form.release());
334 } 367 }
335 return s.Succeeded(); 368 return s.Succeeded();
336 } 369 }
337 370
338 bool LoginDatabase::GetLoginsCreatedBetween( 371 bool LoginDatabase::GetLoginsCreatedBetween(
339 const base::Time begin, 372 const base::Time begin,
340 const base::Time end, 373 const base::Time end,
341 std::vector<content::PasswordForm*>* forms) const { 374 std::vector<content::PasswordForm*>* forms) const {
342 DCHECK(forms); 375 DCHECK(forms);
343 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, 376 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
344 "SELECT origin_url, action_url, " 377 "SELECT origin_url, action_url, "
345 "username_element, username_value, " 378 "username_element, username_value, "
346 "password_element, password_value, " 379 "password_element, password_value, submit_element, "
347 "submit_element, signon_realm, ssl_valid, preferred, date_created, " 380 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, "
348 "blacklisted_by_user, scheme, password_type, possible_usernames " 381 "scheme, password_type, possible_usernames, times_used "
349 "FROM logins WHERE date_created >= ? AND date_created < ?" 382 "FROM logins WHERE date_created >= ? AND date_created < ?"
350 "ORDER BY origin_url")); 383 "ORDER BY origin_url"));
351 s.BindInt64(0, begin.ToTimeT()); 384 s.BindInt64(0, begin.ToTimeT());
352 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() 385 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max()
353 : end.ToTimeT()); 386 : end.ToTimeT());
354 387
355 while (s.Step()) { 388 while (s.Step()) {
356 scoped_ptr<PasswordForm> new_form(new PasswordForm()); 389 scoped_ptr<PasswordForm> new_form(new PasswordForm());
357 if (!InitPasswordFormFromStatement(new_form.get(), s)) 390 if (!InitPasswordFormFromStatement(new_form.get(), s))
358 return false; 391 return false;
(...skipping 12 matching lines...) Expand all
371 return GetAllLoginsWithBlacklistSetting(true, forms); 404 return GetAllLoginsWithBlacklistSetting(true, forms);
372 } 405 }
373 406
374 bool LoginDatabase::GetAllLoginsWithBlacklistSetting( 407 bool LoginDatabase::GetAllLoginsWithBlacklistSetting(
375 bool blacklisted, std::vector<PasswordForm*>* forms) const { 408 bool blacklisted, std::vector<PasswordForm*>* forms) const {
376 DCHECK(forms); 409 DCHECK(forms);
377 // You *must* change LoginTableColumns if this query changes. 410 // You *must* change LoginTableColumns if this query changes.
378 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, 411 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
379 "SELECT origin_url, action_url, " 412 "SELECT origin_url, action_url, "
380 "username_element, username_value, " 413 "username_element, username_value, "
381 "password_element, password_value, " 414 "password_element, password_value, submit_element, "
382 "submit_element, signon_realm, ssl_valid, preferred, date_created, " 415 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, "
383 "blacklisted_by_user, scheme, password_type, possible_usernames " 416 "scheme, password_type, possible_usernames, times_used "
384 "FROM logins WHERE blacklisted_by_user == ? " 417 "FROM logins WHERE blacklisted_by_user == ? "
385 "ORDER BY origin_url")); 418 "ORDER BY origin_url"));
386 s.BindInt(0, blacklisted ? 1 : 0); 419 s.BindInt(0, blacklisted ? 1 : 0);
387 420
388 while (s.Step()) { 421 while (s.Step()) {
389 scoped_ptr<PasswordForm> new_form(new PasswordForm()); 422 scoped_ptr<PasswordForm> new_form(new PasswordForm());
390 if (!InitPasswordFormFromStatement(new_form.get(), s)) 423 if (!InitPasswordFormFromStatement(new_form.get(), s))
391 return false; 424 return false;
392 forms->push_back(new_form.release()); 425 forms->push_back(new_form.release());
393 } 426 }
(...skipping 19 matching lines...) Expand all
413 std::vector<string16> LoginDatabase::DeserializeVector(const Pickle& p) const { 446 std::vector<string16> LoginDatabase::DeserializeVector(const Pickle& p) const {
414 std::vector<string16> ret; 447 std::vector<string16> ret;
415 string16 str; 448 string16 str;
416 449
417 PickleIterator iterator(p); 450 PickleIterator iterator(p);
418 while (iterator.ReadString16(&str)) { 451 while (iterator.ReadString16(&str)) {
419 ret.push_back(str); 452 ret.push_back(str);
420 } 453 }
421 return ret; 454 return ret;
422 } 455 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698