Index: chrome/browser/extensions/extension_service.h |
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h |
index f3ce5864c4edc1aaa544788a57fb4fcfbb4dd472..18dffac8015adfc509754c4b522f010e4ab9a9dd 100644 |
--- a/chrome/browser/extensions/extension_service.h |
+++ b/chrome/browser/extensions/extension_service.h |
@@ -28,12 +28,16 @@ |
#include "chrome/browser/extensions/extension_prefs.h" |
#include "chrome/browser/extensions/extension_permissions_api.h" |
#include "chrome/browser/extensions/extension_process_manager.h" |
+#include "chrome/browser/extensions/extension_sync_data.h" |
#include "chrome/browser/extensions/extension_toolbar_model.h" |
#include "chrome/browser/extensions/extensions_quota_service.h" |
#include "chrome/browser/extensions/external_extension_provider_interface.h" |
#include "chrome/browser/extensions/pending_extension_manager.h" |
#include "chrome/browser/extensions/sandboxed_extension_unpacker.h" |
#include "chrome/browser/prefs/pref_change_registrar.h" |
+#include "chrome/browser/sync/api/sync_change.h" |
+#include "chrome/browser/sync/api/syncable_service.h" |
+#include "chrome/common/extensions/extension.h" |
#include "chrome/common/extensions/extension_constants.h" |
#include "content/browser/browser_thread.h" |
#include "content/common/notification_observer.h" |
@@ -52,18 +56,19 @@ class ExtensionManagementEventRouter; |
class ExtensionPreferenceEventRouter; |
class ExtensionServiceBackend; |
class ExtensionSettings; |
-struct ExtensionSyncData; |
+class ExtensionSyncData; |
class ExtensionToolbarModel; |
class ExtensionUpdater; |
class ExtensionWebNavigationEventRouter; |
class GURL; |
class PendingExtensionManager; |
class Profile; |
+class SyncData; |
class Version; |
// This is an interface class to encapsulate the dependencies that |
// various classes have on ExtensionService. This allows easy mocking. |
-class ExtensionServiceInterface { |
+class ExtensionServiceInterface : public SyncableService { |
public: |
// A function that returns true if the given extension should be |
// included and false if it should be filtered out. Identical to |
@@ -99,34 +104,6 @@ class ExtensionServiceInterface { |
// TODO(akalin): Remove this method (and others) once we refactor |
// themes sync to not use it directly. |
virtual void CheckForUpdatesSoon() = 0; |
- |
- // Methods used by sync. |
- // |
- // TODO(akalin): We'll eventually need separate methods for app |
- // sync. See http://crbug.com/58077 and http://crbug.com/61447. |
- |
- // Get the sync data for |extension|. If |extension| passes |
- // |filter|, fill in |extension_sync_data| and return true. |
- // Otherwise, return false. |
- // |
- // Ideally, we'd just have to pass in the extension ID, but the |
- // service may not know about the extension anymore (if it's |
- // unloaded). |
- virtual bool GetSyncData(const Extension& extension, |
- ExtensionFilter filter, |
- ExtensionSyncData* extension_sync_data) const = 0; |
- |
- // Return a list of ExtensionSyncData objects for all extensions |
- // matching |filter|. |
- virtual std::vector<ExtensionSyncData> GetSyncDataList( |
- ExtensionFilter filter) const = 0; |
- |
- // Take any actions required to make the local state of the |
- // extension match the state in |extension_sync_data| (including |
- // installing/uninstalling the extension). |
- virtual void ProcessSyncData( |
- const ExtensionSyncData& extension_sync_data, |
- ExtensionFilter filter) = 0; |
}; |
// Manages installed and running Chromium extensions. |
@@ -429,16 +406,16 @@ class ExtensionService |
virtual void CheckForUpdatesSoon() OVERRIDE; |
- // Sync methods implementation. |
- virtual bool GetSyncData( |
- const Extension& extension, |
- ExtensionFilter filter, |
- ExtensionSyncData* extension_sync_data) const OVERRIDE; |
- virtual std::vector<ExtensionSyncData> GetSyncDataList( |
- ExtensionFilter filter) const OVERRIDE; |
- virtual void ProcessSyncData( |
- const ExtensionSyncData& extension_sync_data, |
- ExtensionFilter filter) OVERRIDE; |
+ // SyncableService implementation. |
+ virtual SyncError MergeDataAndStartSyncing( |
+ syncable::ModelType type, |
+ const SyncDataList& initial_sync_data, |
+ SyncChangeProcessor* sync_processor) OVERRIDE; |
+ virtual void StopSyncing(syncable::ModelType type) OVERRIDE; |
+ virtual SyncDataList GetAllSyncData(syncable::ModelType type) const OVERRIDE; |
+ virtual SyncError ProcessSyncChanges( |
+ const tracked_objects::Location& from_here, |
+ const SyncChangeList& change_list) OVERRIDE; |
void set_extensions_enabled(bool enabled) { extensions_enabled_ = enabled; } |
bool extensions_enabled() { return extensions_enabled_; } |
@@ -554,6 +531,20 @@ class ExtensionService |
#endif |
private: |
+ // Bundle of type (app or extension)-specific sync stuff. |
+ struct SyncBundle { |
+ SyncBundle(); |
+ ~SyncBundle(); |
+ |
+ bool HasExtensionId(const std::string& id) const; |
+ bool HasPendingExtensionId(const std::string& id) const; |
+ |
+ ExtensionFilter filter; |
+ std::set<std::string> synced_extensions; |
+ std::map<std::string, ExtensionSyncData> pending_sync_data; |
+ SyncChangeProcessor* sync_processor; |
+ }; |
+ |
// Contains Extension data that can change during the life of the process, |
// but does not persist across restarts. |
struct ExtensionRuntimeData { |
@@ -580,16 +571,38 @@ class ExtensionService |
}; |
typedef std::list<NaClModuleInfo> NaClModuleInfoList; |
- // Gets the sync data for the given extension. |
- ExtensionSyncData GetSyncDataHelper(const Extension& extension) const; |
+ // Notifies Sync (if needed) of a newly-installed extension or a change to |
+ // an existing extension. |
+ void SyncExtensionChangeIfNeeded(const Extension& extension); |
+ |
+ // Get the appropriate SyncBundle, given some representation of Sync data. |
+ SyncBundle* GetSyncBundleForExtension(const Extension& extension); |
+ SyncBundle* GetSyncBundleForExtensionSyncData( |
+ const ExtensionSyncData& extension_sync_data); |
+ SyncBundle* GetSyncBundleForModelType(syncable::ModelType type); |
+ const SyncBundle* GetSyncBundleForModelTypeConst(syncable::ModelType type) |
+ const; |
+ |
+ // Gets the ExtensionSyncData for all extensions. |
+ std::vector<ExtensionSyncData> GetSyncDataList( |
+ const SyncBundle& bundle) const; |
+ |
+ // Gets the sync data for the given extension, assuming that the extension is |
+ // syncable. |
+ ExtensionSyncData GetSyncData(const Extension& extension) const; |
// Appends sync data objects for every extension in |extensions| |
// that passes |filter|. |
void GetSyncDataListHelper( |
const ExtensionList& extensions, |
- ExtensionFilter filter, |
+ const SyncBundle& bundle, |
std::vector<ExtensionSyncData>* sync_data_list) const; |
+ // Applies the change specified in an ExtensionSyncData to the current system. |
+ void ProcessExtensionSyncData( |
+ const ExtensionSyncData& extension_sync_data, |
+ SyncBundle& bundle); |
+ |
// Clear all persistent data that may have been stored by the extension. |
void ClearExtensionData(const GURL& extension_url); |
@@ -771,6 +784,9 @@ class ExtensionService |
NaClModuleInfoList nacl_module_list_; |
+ SyncBundle app_sync_bundle_; |
+ SyncBundle extension_sync_bundle_; |
+ |
FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, |
InstallAppsWithUnlimtedStorage); |
FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, |