| Index: chrome/browser/sync/glue/password_model_associator.cc
|
| diff --git a/chrome/browser/sync/glue/password_model_associator.cc b/chrome/browser/sync/glue/password_model_associator.cc
|
| index 4181f33823728a13231ba4420ffb2c4032526c91..1e12f7c251cf7552a325cfb6af9b670900af7e05 100644
|
| --- a/chrome/browser/sync/glue/password_model_associator.cc
|
| +++ b/chrome/browser/sync/glue/password_model_associator.cc
|
| @@ -28,12 +28,14 @@ const char kPasswordTag[] = "google_chrome_passwords";
|
|
|
| PasswordModelAssociator::PasswordModelAssociator(
|
| ProfileSyncService* sync_service,
|
| - PasswordStore* password_store)
|
| + PasswordStore* password_store,
|
| + DataTypeErrorHandler* error_handler)
|
| : sync_service_(sync_service),
|
| password_store_(password_store),
|
| password_node_id_(sync_api::kInvalidId),
|
| abort_association_pending_(false),
|
| - expected_loop_(MessageLoop::current()) {
|
| + expected_loop_(MessageLoop::current()),
|
| + error_handler_(error_handler) {
|
| DCHECK(sync_service_);
|
| DCHECK(password_store_);
|
| #if defined(OS_MACOSX)
|
| @@ -45,7 +47,8 @@ PasswordModelAssociator::PasswordModelAssociator(
|
|
|
| PasswordModelAssociator::~PasswordModelAssociator() {}
|
|
|
| -bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| +SyncError PasswordModelAssociator::AssociateModels() {
|
| + SyncError error;
|
| DCHECK(expected_loop_ == MessageLoop::current());
|
| {
|
| base::AutoLock lock(abort_association_pending_lock_);
|
| @@ -59,10 +62,10 @@ bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| if (!password_store_->FillAutofillableLogins(&passwords) ||
|
| !password_store_->FillBlacklistLogins(&passwords)) {
|
| STLDeleteElements(&passwords);
|
| - error->Reset(FROM_HERE,
|
| - "Could not get the password entries.",
|
| - model_type());
|
| - return false;
|
| + return error_handler_->CreateAndUploadError(
|
| + FROM_HERE,
|
| + "Could not get the password entries.",
|
| + model_type());
|
| }
|
|
|
| std::set<std::string> current_passwords;
|
| @@ -72,19 +75,18 @@ bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
|
| sync_api::ReadNode password_root(&trans);
|
| if (!password_root.InitByTagLookup(kPasswordTag)) {
|
| - error->Reset(FROM_HERE,
|
| - "Server did not create the top-level password node. We "
|
| - "might be running against an out-of-date server.",
|
| - model_type());
|
| - return false;
|
| + return error_handler_->CreateAndUploadError(
|
| + FROM_HERE,
|
| + "Server did not create the top-level password node. We "
|
| + "might be running against an out-of-date server.",
|
| + model_type());
|
| }
|
|
|
| for (std::vector<webkit::forms::PasswordForm*>::iterator ix =
|
| passwords.begin();
|
| ix != passwords.end(); ++ix) {
|
| if (IsAbortPending()) {
|
| - error->Reset(FROM_HERE, "Abort pending", model_type());
|
| - return false;
|
| + return SyncError();
|
| }
|
| std::string tag = MakeTag(**ix);
|
|
|
| @@ -100,10 +102,10 @@ bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| sync_api::WriteNode write_node(&trans);
|
| if (!write_node.InitByClientTagLookup(syncable::PASSWORDS, tag)) {
|
| STLDeleteElements(&passwords);
|
| - error->Reset(FROM_HERE,
|
| - "Failed to edit password sync node.",
|
| - model_type());
|
| - return false;
|
| + return error_handler_->CreateAndUploadError(
|
| + FROM_HERE,
|
| + "Failed to edit password sync node.",
|
| + model_type());
|
| }
|
| WriteToSyncNode(new_password, &write_node);
|
| updated_passwords.push_back(new_password);
|
| @@ -115,10 +117,10 @@ bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| if (!node.InitUniqueByCreation(syncable::PASSWORDS,
|
| password_root, tag)) {
|
| STLDeleteElements(&passwords);
|
| - error->Reset(FROM_HERE,
|
| - "Failed to create password sync node.",
|
| - model_type());
|
| - return false;
|
| + return error_handler_->CreateAndUploadError(
|
| + FROM_HERE,
|
| + "Failed to create password sync node.",
|
| + model_type());
|
| }
|
|
|
| WriteToSyncNode(**ix, &node);
|
| @@ -135,8 +137,10 @@ bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| while (sync_child_id != sync_api::kInvalidId) {
|
| sync_api::ReadNode sync_child_node(&trans);
|
| if (!sync_child_node.InitByIdLookup(sync_child_id)) {
|
| - error->Reset(FROM_HERE, "Failed to fetch child node.", model_type());
|
| - return false;
|
| + return error_handler_->CreateAndUploadError(
|
| + FROM_HERE,
|
| + "Failed to fetch child node.",
|
| + model_type());
|
| }
|
| const sync_pb::PasswordSpecificsData& password =
|
| sync_child_node.GetPasswordSpecifics();
|
| @@ -159,12 +163,14 @@ bool PasswordModelAssociator::AssociateModels(SyncError* error) {
|
| // We must not be holding a transaction when we interact with the password
|
| // store, as it can post tasks to the UI thread which can itself be blocked
|
| // on our transaction, resulting in deadlock. (http://crbug.com/70658)
|
| - if (!WriteToPasswordStore(&new_passwords, &updated_passwords, NULL)) {
|
| - error->Reset(FROM_HERE, "Failed to write passwords.", model_type());
|
| - return false;
|
| + error = WriteToPasswordStore(&new_passwords,
|
| + &updated_passwords,
|
| + NULL);
|
| + if (error.IsSet()) {
|
| + return error;
|
| }
|
|
|
| - return true;
|
| + return error;
|
| }
|
|
|
| bool PasswordModelAssociator::DeleteAllNodes(
|
| @@ -185,10 +191,10 @@ bool PasswordModelAssociator::DeleteAllNodes(
|
| return true;
|
| }
|
|
|
| -bool PasswordModelAssociator::DisassociateModels(SyncError* error) {
|
| +SyncError PasswordModelAssociator::DisassociateModels() {
|
| id_map_.clear();
|
| id_map_inverse_.clear();
|
| - return true;
|
| + return SyncError();
|
| }
|
|
|
| bool PasswordModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) {
|
| @@ -279,10 +285,10 @@ bool PasswordModelAssociator::GetSyncIdForTaggedNode(const std::string& tag,
|
| return true;
|
| }
|
|
|
| -bool PasswordModelAssociator::WriteToPasswordStore(
|
| - const PasswordVector* new_passwords,
|
| - const PasswordVector* updated_passwords,
|
| - const PasswordVector* deleted_passwords) {
|
| +SyncError PasswordModelAssociator::WriteToPasswordStore(
|
| + const PasswordVector* new_passwords,
|
| + const PasswordVector* updated_passwords,
|
| + const PasswordVector* deleted_passwords) {
|
| if (new_passwords) {
|
| for (PasswordVector::const_iterator password = new_passwords->begin();
|
| password != new_passwords->end(); ++password) {
|
| @@ -309,7 +315,7 @@ bool PasswordModelAssociator::WriteToPasswordStore(
|
| // we use internal password store interfaces to make changes synchronously.
|
| password_store_->PostNotifyLoginsChanged();
|
| }
|
| - return true;
|
| + return SyncError();
|
| }
|
|
|
| // static
|
|
|