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