15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_WEBDATA_AUTOCOMPLETE_SYNCABLE_SERVICE_H_
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_WEBDATA_AUTOCOMPLETE_SYNCABLE_SERVICE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/gtest_prod_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/scoped_observer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/supports_user_data.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_change.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_data.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/syncable_service.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceAutofillTest;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace autofill {
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class AutofillTable;
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncErrorFactory;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_pb {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillSpecifics;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The sync implementation for autocomplete.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MergeDataAndStartSyncing() called first, it does cloud->local and
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// local->cloud syncs. Then for each cloud change we receive
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProcessSyncChanges() and for each local change Observe() is called.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutocompleteSyncableService
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public base::SupportsUserData::Data,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public syncer::SyncableService,
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public autofill::AutofillWebDataServiceObserverOnDBThread,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::NonThreadSafe {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AutocompleteSyncableService();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a new AutocompleteSyncableService and hangs it off of
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |web_data_service|, which takes ownership.
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static void CreateForWebDataServiceAndBackend(
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataService* web_data_service,
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      autofill::AutofillWebDataBackend* web_data_backend);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Retrieves the AutocompleteSyncableService stored on |web_data_service|.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static AutocompleteSyncableService* FromWebDataService(
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::AutofillWebDataService* web_data_service);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static syncer::ModelType model_type() { return syncer::AUTOFILL; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // syncer::SyncableService:
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual syncer::SyncMergeResult MergeDataAndStartSyncing(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelType type,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::SyncDataList& initial_sync_data,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor> sync_processor,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory> error_handler) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StopSyncing(syncer::ModelType type) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::SyncDataList GetAllSyncData(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelType type) const OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::SyncError ProcessSyncChanges(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const tracked_objects::Location& from_here,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::SyncChangeList& change_list) OVERRIDE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // AutofillWebDataServiceObserverOnDBThread:
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AutofillEntriesChanged(
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const autofill::AutofillChangeList& changes) OVERRIDE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Provides a StartSyncFlare to the SyncableService. See sync_start_util for
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // more.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void InjectStartSyncFlare(
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const syncer::SyncableService::StartSyncFlare& flare);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit AutocompleteSyncableService(
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      autofill::AutofillWebDataBackend* web_data_backend);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to query WebDatabase for the current autocomplete state.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Made virtual for ease of mocking in the unit-test.
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool LoadAutofillData(
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::vector<autofill::AutofillEntry>* entries) const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to persist any changes that occured during model association to
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the WebDatabase. |entries| will be either added or updated.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Made virtual for ease of mocking in the unit-test.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SaveChangesToWebData(
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::vector<autofill::AutofillEntry>& entries);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ProfileSyncServiceAutofillTest;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class MockAutocompleteSyncableService;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FakeServerUpdater;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutocompleteSyncableServiceTest,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           MergeDataAndStartSyncing);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutocompleteSyncableServiceTest, GetAllSyncData);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutocompleteSyncableServiceTest,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ProcessSyncChanges);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutocompleteSyncableServiceTest,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ActOnChange);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a helper map used only in Merge/Process* functions. The lifetime
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the iterator is longer than the map object. The bool in the pair is used
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to indicate if the item needs to be added (true) or updated (false).
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<autofill::AutofillKey,
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   std::pair<syncer::SyncChange::SyncChangeType,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<autofill::AutofillEntry>::iterator> >
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutocompleteEntryMap;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates or updates an autocomplete entry based on |data|.
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |data| - an entry for sync.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |loaded_data| - entries that were loaded from local storage.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |new_entries| - entries that came from the sync.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ignored_entries| - entries that came from the sync, but too old to be
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stored and immediately discarded.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateOrUpdateEntry(const syncer::SyncData& data,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           AutocompleteEntryMap* loaded_data,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           std::vector<autofill::AutofillEntry>* new_entries);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes |entry| data into supplied |autofill_specifics|.
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void WriteAutofillEntry(const autofill::AutofillEntry& entry,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 sync_pb::EntitySpecifics* autofill_specifics);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes the database entry corresponding to the |autofill| specifics.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncError AutofillEntryDelete(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillSpecifics& autofill);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  syncer::SyncData CreateSyncData(const autofill::AutofillEntry& entry) const;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Syncs |changes| to the cloud.
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ActOnChanges(const autofill::AutofillChangeList& changes);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns the table associated with the |web_data_backend_|.
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  autofill::AutofillTable* GetAutofillTable() const;
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string KeyToTag(const std::string& name,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& value);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For unit-tests.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteSyncableService();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_sync_processor(syncer::SyncChangeProcessor* sync_processor) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_processor_.reset(sync_processor);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The |web_data_backend_| is expected to outlive |this|.
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  autofill::AutofillWebDataBackend* const web_data_backend_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedObserver<autofill::AutofillWebDataBackend, AutocompleteSyncableService>
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_observer_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We receive ownership of |sync_processor_| in MergeDataAndStartSyncing() and
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destroy it in StopSyncing().
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<syncer::SyncChangeProcessor> sync_processor_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We receive ownership of |error_handler_| in MergeDataAndStartSyncing() and
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destroy it in StopSyncing().
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<syncer::SyncErrorFactory> error_handler_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  syncer::SyncableService::StartSyncFlare flare_;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutocompleteSyncableService);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_WEBDATA_AUTOCOMPLETE_SYNCABLE_SERVICE_H_
179