| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SYNC_SERVICE_H_ |
| #define CHROME_BROWSER_EXTENSIONS_EXTENSION_SYNC_SERVICE_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/compiler_specific.h" |
| #include "chrome/browser/extensions/app_sync_bundle.h" |
| #include "chrome/browser/extensions/extension_prefs.h" |
| #include "chrome/browser/extensions/extension_sync_bundle.h" |
| #include "chrome/browser/extensions/pending_enables.h" |
| #include "chrome/common/extensions/extension.h" |
| #include "components/browser_context_keyed_service/browser_context_keyed_service.h" |
| #include "sync/api/string_ordinal.h" |
| #include "sync/api/sync_change.h" |
| #include "sync/api/syncable_service.h" |
| |
| class ExtensionErrorUI; |
| class ExtensionSyncData; |
| class Profile; |
| |
| namespace base { |
| class SequencedTaskRunner; |
| } |
| |
| namespace extensions { |
| class AppSyncData; |
| class ExtensionPrefs; |
| class ExtensionSyncData; |
| } // namespace extensions |
| |
| namespace syncer { |
| class SyncErrorFactory; |
| } |
| |
| class ExtensionSyncService : public syncer::SyncableService, |
| public BrowserContextKeyedService { |
| public: |
| ExtensionSyncService(Profile* profile, |
| extensions::ExtensionPrefs* extension_prefs, |
| ExtensionService* extension_service); |
| |
| virtual ~ExtensionSyncService(); |
| |
| // Convenience function to get the ExtensionSyncService for a Profile. |
| static ExtensionSyncService* Get(Profile* profile); |
| |
| const extensions::ExtensionPrefs& extension_prefs() const { |
| return *extension_prefs_; |
| } |
| |
| // Notifies Sync (if needed) of a newly-installed extension or a change to |
| // an existing extension. |
| virtual void SyncExtensionChangeIfNeeded( |
| const extensions::Extension& extension); |
| |
| // syncer::SyncableService implementation. |
| virtual syncer::SyncMergeResult MergeDataAndStartSyncing( |
| syncer::ModelType type, |
| const syncer::SyncDataList& initial_sync_data, |
| scoped_ptr<syncer::SyncChangeProcessor> sync_processor, |
| scoped_ptr<syncer::SyncErrorFactory> sync_error_factory) OVERRIDE; |
| virtual void StopSyncing(syncer::ModelType type) OVERRIDE; |
| virtual syncer::SyncDataList GetAllSyncData( |
| syncer::ModelType type) const OVERRIDE; |
| virtual syncer::SyncError ProcessSyncChanges( |
| const tracked_objects::Location& from_here, |
| const syncer::SyncChangeList& change_list) OVERRIDE; |
| |
| // Gets the sync data for the given extension, assuming that the extension is |
| // syncable. |
| extensions::ExtensionSyncData GetExtensionSyncData( |
| const extensions::Extension& extension) const; |
| |
| // Gets the sync data for the given app, assuming that the app is |
| // syncable. |
| extensions::AppSyncData GetAppSyncData( |
| const extensions::Extension& extension) const; |
| |
| // Gets the ExtensionSyncData for all extensions. |
| std::vector<extensions::ExtensionSyncData> GetExtensionSyncDataList() const; |
| |
| // Gets the AppSyncData for all extensions. |
| std::vector<extensions::AppSyncData> GetAppSyncDataList() const; |
| |
| // Applies the change specified passed in by either ExtensionSyncData or |
| // AppSyncData to the current system. |
| // Returns false if the changes were not completely applied and were added |
| // to the pending list to be tried again. |
| bool ProcessExtensionSyncData( |
| const extensions::ExtensionSyncData& extension_sync_data); |
| bool ProcessAppSyncData(const extensions::AppSyncData& app_sync_data); |
| |
| syncer::SyncChange PrepareToSyncUninstallExtension( |
| const extensions::Extension* extension, |
| bool extensions_ready); |
| void ProcessSyncUninstallExtension(const std::string& extension_id, |
| const syncer::SyncChange& sync_change); |
| |
| void SyncEnableExtension(const extensions::Extension& extension); |
| void SyncDisableExtension(const extensions::Extension& extension); |
| |
| void SyncOrderingChange(const std::string& extension_id); |
| |
| // |flare| provides a StartSyncFlare to the SyncableService. See |
| // sync_start_util for more. |
| void SetSyncStartFlare(const syncer::SyncableService::StartSyncFlare& flare); |
| |
| private: |
| // Return true if the sync type of |extension| matches |type|. |
| bool IsCorrectSyncType(const extensions::Extension& extension, |
| syncer::ModelType type) |
| const; |
| |
| // Whether the given extension has been enabled before sync has started. |
| bool IsPendingEnable(const std::string& extension_id) const; |
| |
| // Handles setting the extension specific values in |extension_sync_data| to |
| // the current system. |
| // Returns false if the changes were not completely applied and need to be |
| // tried again later. |
| bool ProcessExtensionSyncDataHelper( |
| const extensions::ExtensionSyncData& extension_sync_data, |
| syncer::ModelType type); |
| |
| // The normal profile associated with this ExtensionService. |
| Profile* profile_; |
| |
| // Preferences for the owning profile. |
| extensions::ExtensionPrefs* extension_prefs_; |
| |
| ExtensionService* extension_service_; |
| |
| extensions::AppSyncBundle app_sync_bundle_; |
| extensions::ExtensionSyncBundle extension_sync_bundle_; |
| |
| // Set of extensions/apps that have been enabled before sync has started. |
| extensions::PendingEnables pending_app_enables_; |
| extensions::PendingEnables pending_extension_enables_; |
| |
| scoped_ptr<ExtensionErrorUI> extension_error_ui_; |
| // Sequenced task runner for extension related file operations. |
| scoped_refptr<base::SequencedTaskRunner> file_task_runner_; |
| |
| // Run()ning tells sync to try and start soon, because syncable changes |
| // have started happening. It will cause sync to call us back |
| // asynchronously via MergeDataAndStartSyncing as soon as possible. |
| syncer::SyncableService::StartSyncFlare flare_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ExtensionSyncService); |
| }; |
| |
| #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SYNC_SERVICE_H_ |