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