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