autofill_change_processor.h revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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#ifndef CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <vector> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_profile.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/credit_card.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/personal_data_manager.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncapi.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/change_processor.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/sync_backend_host.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/autofill_specifics.pb.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_data_service.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_observer.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_registrar.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillCreditCardChange; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillEntry; 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillProfileChange; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PersonalDataManager; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebDatabase; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillModelAssociator; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UnrecoverableErrorHandler; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is responsible for taking changes from the web data service and 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// applying them to the sync_api 'syncable' model, and vice versa. All 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// operations and use of this class are from the DB thread. 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillChangeProcessor : public ChangeProcessor, 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public NotificationObserver { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChangeProcessor(AutofillModelAssociator* model_associator, 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDatabase* web_database, 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PersonalDataManager* personal_data, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UnrecoverableErrorHandler* error_handler); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~AutofillChangeProcessor() {} 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NotificationObserver implementation. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WebDataService -> sync_api model change application. 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Observe(NotificationType type, 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // sync_api model -> WebDataService change application. 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void ApplyChangesFromSyncModel( 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::BaseTransaction* trans, 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::SyncManager::ChangeRecord* changes, 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int change_count); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Commit any changes from ApplyChangesFromSyncModel buffered in 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // autofill_changes_. 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void CommitChangesFromSyncModel(); 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Copy the properties of the given Autofill entry into the sync 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // node. 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void WriteAutofillEntry(const AutofillEntry& entry, 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteNode* node); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // As above, for autofill profiles. 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void WriteAutofillProfile(const AutoFillProfile& profile, 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteNode* node); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(georgey) : add the same processing for CC info (already in protocol 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // buffers). 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void StartImpl(Profile* profile); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void StopImpl(); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick struct AutofillChangeRecord { 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sync_api::SyncManager::ChangeRecord::Action action_; 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int64 id_; 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sync_pb::AutofillSpecifics autofill_; 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutofillChangeRecord(sync_api::SyncManager::ChangeRecord::Action action, 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int64 id, const sync_pb::AutofillSpecifics& autofill) 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : action_(action), 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id_(id), 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick autofill_(autofill) { } 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartObserving(); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StopObserving(); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A function to remove the sync node for an autofill entry or profile. 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveSyncNode(const std::string& tag, 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These two methods are dispatched to by Observe depending on the type. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ObserveAutofillEntriesChanged(AutofillChangeList* changes, 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans, 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::ReadNode& autofill_root); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ObserveAutofillProfileChanged(AutofillProfileChange* change, 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans, 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::ReadNode& autofill_root); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The following methods are the implementation of ApplyChangeFromSyncModel 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for the respective autofill subtypes. 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillEntryChange( 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::SyncManager::ChangeRecord::Action action, 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& autofill, 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<AutofillEntry>* new_entries, 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 sync_id); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillProfileChange( 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::SyncManager::ChangeRecord::Action action, 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillProfileSpecifics& profile, 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 sync_id); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete is a special case of change application. 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillEntryDelete( 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& autofill); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillProfileDelete( 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillProfileSpecifics& profile, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 sync_id); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the chrome model tries to add an AutoFillProfile with a label that 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is already in use, we perform a move-aside by calling-back into the chrome 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // model and overwriting the label with a unique value we can apply for sync. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This method should be called on an ADD notification from the chrome model. 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |tag| contains the unique sync client tag identifier for |profile|, which 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is derived from the profile label using ProfileLabelToTag. 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |existing_unique_label| is the current label of the object, if any; this 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // is an allowed value, because it's taken by the item in question. 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // For new items, set |existing_unique_label| to the empty string. 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void ChangeProfileLabelIfAlreadyTaken( 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sync_api::BaseTransaction* trans, 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& existing_unique_label, 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutoFillProfile* profile, 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string* tag); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Reassign the label of the profile, write this back to the web database, 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and update |tag| with the tag corresponding to the new label. 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OverrideProfileLabel( 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& new_label, 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutoFillProfile* profile_to_update, 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string* tag_to_update); 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to create a sync node with tag |tag|, storing |profile| as 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the node's AutofillSpecifics. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddAutofillProfileSyncNode( 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans, 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::BaseNode& autofill, 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag, 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutoFillProfile* profile); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to post a task to the UI loop to inform the PersonalDataManager 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it needs to refresh itself. 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PostOptimisticRefreshTask(); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The two models should be associated according to this ModelAssociator. 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillModelAssociator* model_associator_; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The model we are processing changes from. This is owned by the 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WebDataService which is kept alive by our data type controller 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // holding a reference. 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDatabase* web_database_; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We periodically tell the PersonalDataManager to refresh as we make 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // changes to the autofill data in the WebDatabase. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PersonalDataManager* personal_data_; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar notification_registrar_; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool observing_; 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Record of changes from ApplyChangesFromSyncModel. These are then processed 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // in CommitChangesFromSyncModel. 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<AutofillChangeRecord> autofill_changes_; 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(AutofillChangeProcessor); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_ 181