summaryrefslogtreecommitdiffstats
path: root/chrome/browser/autofill/personal_data_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/autofill/personal_data_manager.cc')
-rw-r--r--chrome/browser/autofill/personal_data_manager.cc150
1 files changed, 142 insertions, 8 deletions
diff --git a/chrome/browser/autofill/personal_data_manager.cc b/chrome/browser/autofill/personal_data_manager.cc
index c60aa6e..e2b2150 100644
--- a/chrome/browser/autofill/personal_data_manager.cc
+++ b/chrome/browser/autofill/personal_data_manager.cc
@@ -1,12 +1,18 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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,6 +25,45 @@ static const int kPhoneNumberLength = 7;
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(
@@ -31,7 +76,7 @@ bool PersonalDataManager::ImportFormData(
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 @@ bool PersonalDataManager::ImportFormData(
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 @@ void PersonalDataManager::GetPossibleFieldTypes(const string16& text,
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 @@ void PersonalDataManager::GetPossibleFieldTypes(const string16& text,
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 @@ bool PersonalDataManager::HasPassword() {
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 @@ void PersonalDataManager::InitializeIfNeeded() {
// 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 @@ void PersonalDataManager::ParsePhoneNumber(
// 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;
+}