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

Unified Diff: chrome/browser/autofill/personal_data_manager.cc

Issue 545175: Add the ability to save and remove AutoFill profiles from the AutoFillDialog.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 11 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
Index: chrome/browser/autofill/personal_data_manager.cc
===================================================================
--- chrome/browser/autofill/personal_data_manager.cc (revision 36778)
+++ chrome/browser/autofill/personal_data_manager.cc (working copy)
@@ -4,9 +4,15 @@
#include "chrome/browser/autofill/personal_data_manager.h"
+#include <algorithm>
+#include <iterator>
+
+#include "base/logging.h"
#include "chrome/browser/autofill/autofill_manager.h"
#include "chrome/browser/autofill/autofill_field.h"
#include "chrome/browser/autofill/form_structure.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/webdata/web_data_service.h"
// The minimum number of fields that must contain user data and have known types
// before autofill will attempt to import the data into a profile.
@@ -19,8 +25,47 @@
static const int kPhoneCityCodeLength = 3;
PersonalDataManager::~PersonalDataManager() {
+ CancelPendingQuery();
}
+void PersonalDataManager::OnWebDataServiceRequestDone(
+ WebDataService::Handle h,
+ const WDTypedResult* result) {
+ // Error from the web database.
+ if (!result)
+ return;
+
+ DCHECK(pending_query_handle_);
+ DCHECK(result->GetType() == AUTOFILL_PROFILES_RESULT);
+ pending_query_handle_ = 0;
+
+ unique_ids_.clear();
+ profiles_.reset();
+ const WDResult<std::vector<AutoFillProfile*> >* r =
+ static_cast<const WDResult<std::vector<AutoFillProfile*> >*>(result);
+ std::vector<AutoFillProfile*> profiles = r->GetValue();
+ for (std::vector<AutoFillProfile*>::iterator iter = profiles.begin();
+ iter != profiles.end(); ++iter) {
+ unique_ids_.insert((*iter)->unique_id());
+ profiles_.push_back(*iter);
+ }
+
+ is_data_loaded_ = true;
+ if (observer_)
+ observer_->OnPersonalDataLoaded();
+}
+
+void PersonalDataManager::SetObserver(PersonalDataManager::Observer* observer) {
+ DCHECK(observer_ == NULL);
+ observer_ = observer;
+}
+
+void PersonalDataManager::RemoveObserver(
+ PersonalDataManager::Observer* observer) {
+ if (observer_ == observer)
+ observer_ = NULL;
+}
+
bool PersonalDataManager::ImportFormData(
const std::vector<FormStructure*>& form_structures,
AutoFillManager* autofill_manager) {
@@ -31,7 +76,7 @@
int importable_fields = 0;
int importable_credit_card_fields = 0;
imported_profile_.reset(new AutoFillProfile(string16(),
- CreateNextUniqueId()));
+ CreateNextUniqueID()));
imported_credit_card_.reset(new CreditCard(string16()));
bool billing_address_info = false;
@@ -104,6 +149,63 @@
return true;
}
+void PersonalDataManager::SetProfiles(std::vector<AutoFillProfile>* profiles) {
+ if (profile_->IsOffTheRecord())
+ return;
+
+ WebDataService* wds = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS);
+ if (!wds)
+ return;
+
+ // Remove the unique IDs of the new set of profiles from the unique ID set.
+ for (std::vector<AutoFillProfile>::iterator iter = profiles->begin();
+ iter != profiles->end(); ++iter) {
+ if (iter->unique_id() != 0)
+ unique_ids_.erase(iter->unique_id());
+ }
+
+ // Any remaining IDs are not in the new profile list and should be removed
+ // from the web database.
+ for (std::set<int>::iterator iter = unique_ids_.begin();
+ iter != unique_ids_.end(); ++iter) {
+ wds->RemoveAutoFillProfile(*iter);
+ }
+
+ // Clear the unique IDs. The set of unique IDs is updated for each profile
+ // added to |profile_| below.
+ unique_ids_.clear();
+
+ // Update the web database with the existing profiles. We need to handle
+ // these first so that |unique_ids_| is reset with the IDs of the existing
+ // profiles; otherwise, new profiles added before older profiles can take
+ // their unique ID.
+ for (std::vector<AutoFillProfile>::iterator iter = profiles->begin();
+ iter != profiles->end(); ++iter) {
+ if (iter->unique_id() != 0) {
+ unique_ids_.insert(iter->unique_id());
+ wds->UpdateAutoFillProfile(*iter);
+ }
+ }
+
+ // Add the new profiles to the web database.
+ for (std::vector<AutoFillProfile>::iterator iter = profiles->begin();
+ iter != profiles->end(); ++iter) {
+ // Profile was added by the AutoFill dialog, so we need to set the unique
+ // ID. This also means we need to add this profile to the web DB.
+ if (iter->unique_id() == 0) {
+ iter->set_unique_id(CreateNextUniqueID());
+ wds->AddAutoFillProfile(*iter);
+ }
+ }
+
+ profiles_.reset();
+ for (std::vector<AutoFillProfile>::iterator iter = profiles->begin();
+ iter != profiles->end(); ++iter) {
+ profiles_.push_back(new AutoFillProfile(*iter));
+ }
+}
+
+
void PersonalDataManager::GetPossibleFieldTypes(const string16& text,
FieldTypeSet* possible_types) {
InitializeIfNeeded();
@@ -115,8 +217,8 @@
return;
}
- ScopedVector<FormGroup>::const_iterator iter;
- for (iter = profiles_.begin(); iter != profiles_.end(); ++iter) {
+ for (ScopedVector<AutoFillProfile>::iterator iter = profiles_.begin();
+ iter != profiles_.end(); ++iter) {
const FormGroup* profile = *iter;
if (!profile) {
DLOG(ERROR) << "NULL information in profiles list";
@@ -125,7 +227,8 @@
profile->GetPossibleFieldTypes(clean_info, possible_types);
}
- for (iter = credit_cards_.begin(); iter != credit_cards_.end(); ++iter) {
+ for (ScopedVector<FormGroup>::iterator iter = credit_cards_.begin();
+ iter != credit_cards_.end(); ++iter) {
const FormGroup* credit_card = *iter;
if (!credit_card) {
DLOG(ERROR) << "NULL information in credit cards list";
@@ -143,8 +246,13 @@
return !password_hash_.empty();
}
-PersonalDataManager::PersonalDataManager()
- : is_initialized_(false) {
+PersonalDataManager::PersonalDataManager(Profile* profile)
+ : profile_(profile),
+ is_initialized_(false),
+ is_data_loaded_(false),
+ pending_query_handle_(0),
+ observer_(NULL) {
+ LoadProfiles();
}
void PersonalDataManager::InitializeIfNeeded() {
@@ -155,7 +263,7 @@
// TODO(jhawkins): Load data.
}
-int PersonalDataManager::CreateNextUniqueId() {
+int PersonalDataManager::CreateNextUniqueID() {
// Profile IDs MUST start at 1 to allow 0 as an error value when reading
// the ID from the WebDB (see LoadData()).
int id = 1;
@@ -190,3 +298,29 @@
// Treat any remaining digits as the country code.
profile->SetInfo(AutoFillType(country_code), *value);
}
+
+void PersonalDataManager::LoadProfiles() {
+ WebDataService* web_data_service =
+ profile_->GetWebDataService(Profile::EXPLICIT_ACCESS);
+ if (!web_data_service) {
+ NOTREACHED();
+ return;
+ }
+
+ CancelPendingQuery();
+
+ pending_query_handle_ = web_data_service->GetAutoFillProfiles(this);
+}
+
+void PersonalDataManager::CancelPendingQuery() {
+ if (pending_query_handle_) {
+ WebDataService* web_data_service =
+ profile_->GetWebDataService(Profile::EXPLICIT_ACCESS);
+ if (!web_data_service) {
+ NOTREACHED();
+ return;
+ }
+ web_data_service->CancelRequest(pending_query_handle_);
+ }
+ pending_query_handle_ = 0;
+}
« no previous file with comments | « chrome/browser/autofill/personal_data_manager.h ('k') | chrome/browser/autofill/personal_data_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698