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#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" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/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); 43513209b27ff55e2841eac0e4120199c23acce758Ben 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 // TODO(georgey) : add the same processing for CC info (already in protocol 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // buffers). 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void StartImpl(Profile* profile); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void StopImpl(); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartObserving(); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StopObserving(); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A function to remove the sync node for an autofill entry or profile. 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveSyncNode(const std::string& tag, 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These two methods are dispatched to by Observe depending on the type. 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ObserveAutofillEntriesChanged(AutofillChangeList* changes, 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans, 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::ReadNode& autofill_root); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ObserveAutofillProfileChanged(AutofillProfileChange* change, 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteTransaction* trans, 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_api::ReadNode& autofill_root); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The following methods are the implementation of ApplyChangeFromSyncModel 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for the respective autofill subtypes. 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillEntryChange( 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::SyncManager::ChangeRecord::Action action, 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& autofill, 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<AutofillEntry>* new_entries, 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 sync_id); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillProfileChange( 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::SyncManager::ChangeRecord::Action action, 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillProfileSpecifics& profile, 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 sync_id); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete is a special case of change application. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillEntryDelete( 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& autofill); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ApplySyncAutofillProfileDelete( 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 sync_id); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to post a task to the UI loop to inform the PersonalDataManager 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it needs to refresh itself. 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PostOptimisticRefreshTask(); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Called to see if we need to upgrade to the new autofill2 profile. 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool HasNotMigratedYet(const sync_api::BaseTransaction* trans); 112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The two models should be associated according to this ModelAssociator. 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillModelAssociator* model_associator_; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The model we are processing changes from. This is owned by the 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WebDataService which is kept alive by our data type controller 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // holding a reference. 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDatabase* web_database_; 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We periodically tell the PersonalDataManager to refresh as we make 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // changes to the autofill data in the WebDatabase. 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PersonalDataManager* personal_data_; 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar notification_registrar_; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool observing_; 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Record of changes from ApplyChangesFromSyncModel. These are then processed 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // in CommitChangesFromSyncModel. 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch struct AutofillChangeRecord; 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<AutofillChangeRecord> autofill_changes_; 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(AutofillChangeProcessor); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_ 140