1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/password_store_default.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen#include <set>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/logging.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/stl_util-inl.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/password_store_change.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_data_service.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_constants.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::PasswordForm;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen// MigrateHelper handles migration from WebDB to PasswordStore. It runs
233dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen// entirely on the UI thread and is owned by PasswordStoreDefault.
243dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenclass PasswordStoreDefault::MigrateHelper : public WebDataServiceConsumer {
253dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen public:
263dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  MigrateHelper(Profile* profile,
273dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                WebDataService* web_data_service,
283dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                PasswordStore* password_store)
293dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      : profile_(profile),
303dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        web_data_service_(web_data_service),
313dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        password_store_(password_store) {
323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  }
333dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  ~MigrateHelper();
343dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
353dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  void Init();
363dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  // WebDataServiceConsumer:
383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  virtual void OnWebDataServiceRequestDone(
393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      WebDataService::Handle handle,
403dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      const WDTypedResult *result) OVERRIDE;
413dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
423dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen private:
433dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  typedef std::set<WebDataService::Handle> Handles;
443dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
453dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  Profile* profile_;
463dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
473dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  scoped_refptr<WebDataService> web_data_service_;
483dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
493dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  // This creates a cycle between us and PasswordStore. The cycle is broken
503dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  // from PasswordStoreDefault::Shutdown, which deletes us.
513dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  scoped_refptr<PasswordStore> password_store_;
523dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
533dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  // Set of handles from requesting data from the WebDB.
543dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  Handles handles_;
553dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
563dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(MigrateHelper);
573dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen};
583dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
593dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian MonsenPasswordStoreDefault::MigrateHelper::~MigrateHelper() {
603dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  for (Handles::const_iterator i = handles_.begin(); i != handles_.end(); ++i)
613dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    web_data_service_->CancelRequest(*i);
623dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  handles_.clear();
633dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
643dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
653dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenvoid PasswordStoreDefault::MigrateHelper::Init() {
663dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  handles_.insert(web_data_service_->GetAutofillableLogins(this));
673dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  handles_.insert(web_data_service_->GetBlacklistLogins(this));
683dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
693dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
703dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenvoid PasswordStoreDefault::MigrateHelper::OnWebDataServiceRequestDone(
713dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    WebDataService::Handle handle,
723dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    const WDTypedResult* result) {
733dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  typedef std::vector<const PasswordForm*> PasswordForms;
743dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
753dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  DCHECK(handles_.end() != handles_.find(handle));
763dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  DCHECK(password_store_);
773dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
783dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  handles_.erase(handle);
793dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if (!result)
803dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    return;
813dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if (PASSWORD_RESULT != result->GetType()) {
833dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    NOTREACHED();
843dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    return;
853dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  }
863dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
873dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  const PasswordForms& forms =
883dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      static_cast<const WDResult<PasswordForms>*>(result)->GetValue();
893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  for (PasswordForms::const_iterator it = forms.begin();
903dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen       it != forms.end(); ++it) {
913dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    password_store_->AddLogin(**it);
923dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    web_data_service_->RemoveLogin(**it);
933dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    delete *it;
943dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  }
953dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if (handles_.empty()) {
963dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated,
973dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                                              true);
983dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  }
993dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
1003dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPasswordStoreDefault::PasswordStoreDefault(LoginDatabase* login_db,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           Profile* profile,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           WebDataService* web_data_service)
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : web_data_service_(web_data_service),
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      login_db_(login_db), profile_(profile) {
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(login_db);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(profile);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(web_data_service);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MigrateIfNecessary();
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPasswordStoreDefault::~PasswordStoreDefault() {
1133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  // MigrateHelper should always be NULL as Shutdown should be invoked before
1143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  // the destructor.
1153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  DCHECK(!migrate_helper_.get());
1163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
1173dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1183dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenvoid PasswordStoreDefault::Shutdown() {
1193dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  migrate_helper_.reset();
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::ReportMetricsImpl() {
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  login_db_->ReportMetrics();
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::AddLoginImpl(const PasswordForm& form) {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (login_db_->AddLogin(form)) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PasswordStoreChangeList changes;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form));
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::LOGINS_CHANGED,
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Source<PasswordStore>(this),
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Details<PasswordStoreChangeList>(&changes));
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::UpdateLoginImpl(const PasswordForm& form) {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (login_db_->UpdateLogin(form, NULL)) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PasswordStoreChangeList changes;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    changes.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form));
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::LOGINS_CHANGED,
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Source<PasswordStore>(this),
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Details<PasswordStoreChangeList>(&changes));
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::RemoveLoginImpl(const PasswordForm& form) {
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (login_db_->RemoveLogin(form)) {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PasswordStoreChangeList changes;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form));
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::LOGINS_CHANGED,
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Source<PasswordStore>(this),
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Details<PasswordStoreChangeList>(&changes));
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::RemoveLoginsCreatedBetweenImpl(
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const base::Time& delete_begin, const base::Time& delete_end) {
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<PasswordForm*> forms;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (login_db_->GetLoginsCreatedBetween(delete_begin, delete_end, &forms)) {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (login_db_->RemoveLoginsCreatedBetween(delete_begin, delete_end)) {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      PasswordStoreChangeList changes;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      for (std::vector<PasswordForm*>::const_iterator it = forms.begin();
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           it != forms.end(); ++it) {
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE,
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                              **it));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::current()->Notify(
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          NotificationType::LOGINS_CHANGED,
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          Source<PasswordStore>(this),
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          Details<PasswordStoreChangeList>(&changes));
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STLDeleteElements(&forms);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::GetLoginsImpl(
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetLoginsRequest* request, const webkit_glue::PasswordForm& form) {
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  login_db_->GetLogins(form, &request->value);
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ForwardLoginsResult(request);
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::GetAutofillableLoginsImpl(
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetLoginsRequest* request) {
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FillAutofillableLogins(&request->value);
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ForwardLoginsResult(request);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::GetBlacklistLoginsImpl(
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetLoginsRequest* request) {
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FillBlacklistLogins(&request->value);
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ForwardLoginsResult(request);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PasswordStoreDefault::FillAutofillableLogins(
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         std::vector<PasswordForm*>* forms) {
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return login_db_->GetAutofillableLogins(forms);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PasswordStoreDefault::FillBlacklistLogins(
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         std::vector<PasswordForm*>* forms) {
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return login_db_->GetBlacklistLogins(forms);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStoreDefault::MigrateIfNecessary() {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* prefs = profile_->GetPrefs();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (prefs->FindPreference(prefs::kLoginDatabaseMigrated))
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
2143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  DCHECK(!migrate_helper_.get());
2153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  migrate_helper_.reset(new MigrateHelper(profile_, web_data_service_, this));
2163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  migrate_helper_->Init();
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
218