diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-17 07:35:04 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-17 07:35:04 +0000 |
commit | 90310d9d9e8a7a0f598d27b2982a7a4498e14138 (patch) | |
tree | bf5779408bd47ad2c36a0c08df907a61d905575f /chrome/browser/sync | |
parent | df37c6b66ee155d84f8c07cbd5d9e0d745799f3f (diff) | |
download | chromium_src-90310d9d9e8a7a0f598d27b2982a7a4498e14138.zip chromium_src-90310d9d9e8a7a0f598d27b2982a7a4498e14138.tar.gz chromium_src-90310d9d9e8a7a0f598d27b2982a7a4498e14138.tar.bz2 |
[Sync] Move some extension-sync-related logic to ExtensionService
Add ExtensionSyncData class to hold the data that goes between the
extension service and extension sync.
Add ProcessSyncData() method to ExtensionService (with unit tests!).
Remove now-unneeded extension sync functions.
BUG=77995
TEST=
Review URL: http://codereview.chromium.org/6852029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81899 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/sync')
-rw-r--r-- | chrome/browser/sync/glue/extension_change_processor.cc | 39 | ||||
-rw-r--r-- | chrome/browser/sync/glue/extension_sync.cc | 133 | ||||
-rw-r--r-- | chrome/browser/sync/glue/extension_sync.h | 10 | ||||
-rw-r--r-- | chrome/browser/sync/glue/extension_util.cc | 41 | ||||
-rw-r--r-- | chrome/browser/sync/glue/extension_util.h | 13 | ||||
-rw-r--r-- | chrome/browser/sync/glue/extension_util_unittest.cc | 16 |
6 files changed, 63 insertions, 189 deletions
diff --git a/chrome/browser/sync/glue/extension_change_processor.cc b/chrome/browser/sync/glue/extension_change_processor.cc index 8a1bf72..dd0da34 100644 --- a/chrome/browser/sync/glue/extension_change_processor.cc +++ b/chrome/browser/sync/glue/extension_change_processor.cc @@ -10,6 +10,7 @@ #include "base/logging.h" #include "base/stl_util-inl.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_sync_data.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/glue/extension_sync.h" #include "chrome/browser/sync/glue/extension_util.h" @@ -101,6 +102,7 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( } for (int i = 0; i < change_count; ++i) { const sync_api::SyncManager::ChangeRecord& change = changes[i]; + sync_pb::ExtensionSpecifics specifics; switch (change.action) { case sync_api::SyncManager::ChangeRecord::ACTION_ADD: case sync_api::SyncManager::ChangeRecord::ACTION_UPDATE: { @@ -113,30 +115,14 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( return; } DCHECK_EQ(node.GetModelType(), traits_.model_type); - const sync_pb::ExtensionSpecifics& specifics = - (*traits_.extension_specifics_getter)(node); - if (!IsExtensionSpecificsValid(specifics)) { - std::string error = - std::string("Invalid server specifics: ") + - ExtensionSpecificsToString(specifics); - error_handler()->OnUnrecoverableError(FROM_HERE, error); - return; - } - StopObserving(); - UpdateClient(traits_, specifics, extension_service_); - StartObserving(); + specifics = (*traits_.extension_specifics_getter)(node); break; } case sync_api::SyncManager::ChangeRecord::ACTION_DELETE: { - sync_pb::ExtensionSpecifics specifics; - if ((*traits_.extension_specifics_entity_getter)( + if (!(*traits_.extension_specifics_entity_getter)( change.specifics, &specifics)) { - StopObserving(); - RemoveFromClient(traits_, specifics.id(), extension_service_); - StartObserving(); - } else { std::stringstream error; - error << "Could not get extension ID for deleted node " + error << "Could not get extension specifics from deleted node " << change.id; error_handler()->OnUnrecoverableError(FROM_HERE, error.str()); LOG(DFATAL) << error.str(); @@ -144,6 +130,21 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( break; } } + ExtensionSyncData sync_data; + if (!GetExtensionSyncData(specifics, &sync_data)) { + // TODO(akalin): Should probably recover or drop. + std::string error = + std::string("Invalid server specifics: ") + + ExtensionSpecificsToString(specifics); + error_handler()->OnUnrecoverableError(FROM_HERE, error); + return; + } + sync_data.uninstalled = + (change.action == sync_api::SyncManager::ChangeRecord::ACTION_DELETE); + StopObserving(); + extension_service_->ProcessSyncData(sync_data, + traits_.is_valid_and_syncable); + StartObserving(); } } diff --git a/chrome/browser/sync/glue/extension_sync.cc b/chrome/browser/sync/glue/extension_sync.cc index b6693ad..1aedc4a 100644 --- a/chrome/browser/sync/glue/extension_sync.cc +++ b/chrome/browser/sync/glue/extension_sync.cc @@ -9,6 +9,7 @@ #include "base/logging.h" #include "chrome/browser/extensions/extension_updater.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_sync_data.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/glue/extension_data.h" @@ -234,75 +235,6 @@ bool UpdateServer( return true; } -// Tries to update the client data from the given extension data. -// extension_data->ServerNeedsUpdate() must not hold and -// extension_data->ClientNeedsUpdate() must hold before this function -// is called. If the update was successful, -// extension_data->ClientNeedsUpdate() will be false after this -// function is called. Otherwise, the extension needs updating to a -// new version. -void TryUpdateClient( - IsValidAndSyncablePredicate is_valid_and_syncable, - ExtensionServiceInterface* extensions_service, - ExtensionData* extension_data) { - DCHECK(!extension_data->NeedsUpdate(ExtensionData::SERVER)); - DCHECK(extension_data->NeedsUpdate(ExtensionData::CLIENT)); - const sync_pb::ExtensionSpecifics& specifics = - extension_data->merged_data(); - DcheckIsExtensionSpecificsValid(specifics); - const std::string& id = specifics.id(); - const Extension* extension = extensions_service->GetExtensionById(id, true); - if (extension) { - if (!is_valid_and_syncable(*extension)) { - LOG(DFATAL) << "TryUpdateClient() called for non-syncable extension " - << id; - return; - } - if (specifics.name() != extension->name()) { - LOG(WARNING) << "specifics for extension " << id - << "has a different name than the extension: " - << specifics.name() << " vs. " << extension->name(); - } - GURL update_url(specifics.update_url()); - if (update_url != extension->update_url()) { - LOG(WARNING) << "specifics for extension " << id - << "has a different update URL than the extension: " - << update_url.spec() << " vs. " << extension->update_url(); - } - if (specifics.enabled()) { - extensions_service->EnableExtension(id); - } else { - extensions_service->DisableExtension(id); - } - extensions_service->SetIsIncognitoEnabled(id, - specifics.incognito_enabled()); - { - sync_pb::ExtensionSpecifics extension_specifics; - GetExtensionSpecifics(*extension, *extensions_service, - &extension_specifics); - DCHECK(AreExtensionSpecificsUserPropertiesEqual( - specifics, extension_specifics)) - << ExtensionSpecificsToString(specifics) << ", " - << ExtensionSpecificsToString(extension_specifics); - } - if (!IsExtensionOutdated(*extension, specifics)) { - extension_data->ResolveData(ExtensionData::CLIENT); - DCHECK(!extension_data->NeedsUpdate(ExtensionData::CLIENT)); - } - } else { - GURL update_url(specifics.update_url()); - // TODO(akalin): Replace silent update with a list of enabled - // permissions. - extensions_service->pending_extension_manager()->AddFromSync( - id, update_url, - is_valid_and_syncable, - true, // install_silently - specifics.enabled(), - specifics.incognito_enabled()); - } - DCHECK(!extension_data->NeedsUpdate(ExtensionData::SERVER)); -} - } // namespace bool FlushExtensionData(const ExtensionSyncTraits& traits, @@ -329,14 +261,14 @@ bool FlushExtensionData(const ExtensionSyncTraits& traits, } } DCHECK(!extension_data.NeedsUpdate(ExtensionData::SERVER)); - if (extension_data.NeedsUpdate(ExtensionData::CLIENT)) { - TryUpdateClient(traits.is_valid_and_syncable, - extensions_service, &extension_data); - if (extension_data.NeedsUpdate(ExtensionData::CLIENT)) { - extensions_service->CheckForUpdatesSoon(); - } + ExtensionSyncData sync_data; + if (!GetExtensionSyncData(extension_data.merged_data(), &sync_data)) { + // TODO(akalin): Should probably recover or drop. + NOTREACHED(); + return false; } - DCHECK(!extension_data.NeedsUpdate(ExtensionData::SERVER)); + extensions_service->ProcessSyncData(sync_data, + traits.is_valid_and_syncable); } return true; } @@ -410,53 +342,4 @@ void RemoveServerData(const ExtensionSyncTraits& traits, } } -void UpdateClient(const ExtensionSyncTraits& traits, - const sync_pb::ExtensionSpecifics& server_data, - ExtensionServiceInterface* extensions_service) { - DcheckIsExtensionSpecificsValid(server_data); - ExtensionData extension_data = - ExtensionData::FromData(ExtensionData::SERVER, server_data); - const Extension* extension = - extensions_service->GetExtensionById(server_data.id(), true); - if (extension) { - if (!traits.is_valid_and_syncable(*extension)) { - LOG(WARNING) << "Ignoring server data for invalid or " - << "non-syncable extension " << extension->id(); - return; - } - sync_pb::ExtensionSpecifics client_data; - GetExtensionSpecifics(*extension, *extensions_service, - &client_data); - DcheckIsExtensionSpecificsValid(client_data); - extension_data = - ExtensionData::FromData(ExtensionData::CLIENT, client_data); - extension_data.SetData(ExtensionData::SERVER, true, server_data); - } - DCHECK(!extension_data.NeedsUpdate(ExtensionData::SERVER)); - if (extension_data.NeedsUpdate(ExtensionData::CLIENT)) { - TryUpdateClient(traits.is_valid_and_syncable, - extensions_service, &extension_data); - if (extension_data.NeedsUpdate(ExtensionData::CLIENT)) { - extensions_service->CheckForUpdatesSoon(); - } - } - DCHECK(!extension_data.NeedsUpdate(ExtensionData::SERVER)); -} - -void RemoveFromClient(const ExtensionSyncTraits& traits, - const std::string& id, - ExtensionServiceInterface* extensions_service) { - const Extension* extension = extensions_service->GetExtensionById(id, true); - if (extension) { - if (traits.is_valid_and_syncable(*extension)) { - extensions_service->UninstallExtension(id, false, NULL); - } else { - LOG(WARNING) << "Ignoring server data for invalid or " - << "non-syncable extension " << extension->id(); - } - } else { - LOG(ERROR) << "Trying to uninstall nonexistent extension " << id; - } -} - } // namespace browser_sync diff --git a/chrome/browser/sync/glue/extension_sync.h b/chrome/browser/sync/glue/extension_sync.h index 494c02d..e1f3f15 100644 --- a/chrome/browser/sync/glue/extension_sync.h +++ b/chrome/browser/sync/glue/extension_sync.h @@ -76,16 +76,6 @@ void RemoveServerData(const ExtensionSyncTraits& traits, const std::string& id, sync_api::UserShare* user_share); -// Starts updating the client data from the given server data. -void UpdateClient(const ExtensionSyncTraits& traits, - const sync_pb::ExtensionSpecifics& server_data, - ExtensionServiceInterface* extensions_service); - -// Removes existing client data for the given extension. -void RemoveFromClient(const ExtensionSyncTraits& traits, - const std::string& id, - ExtensionServiceInterface* extensions_service); - } // namespace browser_sync #endif // CHROME_BROWSER_SYNC_GLUE_EXTENSION_SYNC_H_ diff --git a/chrome/browser/sync/glue/extension_util.cc b/chrome/browser/sync/glue/extension_util.cc index 4d24a43..5578f89 100644 --- a/chrome/browser/sync/glue/extension_util.cc +++ b/chrome/browser/sync/glue/extension_util.cc @@ -12,6 +12,7 @@ #include "base/version.h" #include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_sync_data.h" #include "chrome/browser/sync/protocol/extension_specifics.pb.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_constants.h" @@ -157,19 +158,6 @@ void GetExtensionSpecifics(const Extension& extension, DcheckIsExtensionSpecificsValid(*specifics); } -bool IsExtensionOutdated(const Extension& extension, - const sync_pb::ExtensionSpecifics& specifics) { - DCHECK(IsExtensionValid(extension)); - DcheckIsExtensionSpecificsValid(specifics); - scoped_ptr<Version> specifics_version( - Version::GetVersionFromString(specifics.version())); - if (!specifics_version.get()) { - // If version is invalid, assume we're up-to-date. - return false; - } - return extension.version()->CompareTo(*specifics_version) < 0; -} - void MergeExtensionSpecifics( const sync_pb::ExtensionSpecifics& specifics, bool merge_user_properties, @@ -194,4 +182,31 @@ void MergeExtensionSpecifics( } } +bool GetExtensionSyncData( + const sync_pb::ExtensionSpecifics& specifics, + ExtensionSyncData* sync_data) { + if (!Extension::IdIsValid(specifics.id())) { + return false; + } + + scoped_ptr<Version> version( + Version::GetVersionFromString(specifics.version())); + if (!version.get()) { + return false; + } + + // The update URL must be either empty or valid. + GURL update_url(specifics.update_url()); + if (!update_url.is_empty() && !update_url.is_valid()) { + return false; + } + + sync_data->id = specifics.id(); + sync_data->update_url = update_url; + sync_data->version = *version; + sync_data->enabled = specifics.enabled(); + sync_data->incognito_enabled = specifics.incognito_enabled(); + return true; +} + } // namespace browser_sync diff --git a/chrome/browser/sync/glue/extension_util.h b/chrome/browser/sync/glue/extension_util.h index 6433dfd..d914a75 100644 --- a/chrome/browser/sync/glue/extension_util.h +++ b/chrome/browser/sync/glue/extension_util.h @@ -14,6 +14,7 @@ class Extension; class ExtensionPrefs; class ExtensionServiceInterface; +struct ExtensionSyncData; struct UninstalledExtensionInfo; namespace sync_pb { @@ -84,12 +85,6 @@ void GetExtensionSpecifics(const Extension& extension, const ExtensionServiceInterface& extension_service, sync_pb::ExtensionSpecifics* specifics); -// Returns whether or not the extension should be updated according to -// the specifics. |extension| must be syncable and |specifics| must -// be valid. -bool IsExtensionOutdated(const Extension& extension, - const sync_pb::ExtensionSpecifics& specifics); - // Merge |specifics| into |merged_specifics|. Both must be valid and // have the same ID. The merge policy is currently to copy the // non-user properties of |specifics| into |merged_specifics| (and the @@ -100,6 +95,12 @@ void MergeExtensionSpecifics( bool merge_user_properties, sync_pb::ExtensionSpecifics* merged_specifics); +// Fills |sync_data| with the data from |specifics|. Returns true iff +// succesful. +bool GetExtensionSyncData( + const sync_pb::ExtensionSpecifics& specifics, + ExtensionSyncData* sync_data); + } // namespace browser_sync #endif // CHROME_BROWSER_SYNC_GLUE_EXTENSION_UTIL_H_ diff --git a/chrome/browser/sync/glue/extension_util_unittest.cc b/chrome/browser/sync/glue/extension_util_unittest.cc index 4df21b9..35a4065 100644 --- a/chrome/browser/sync/glue/extension_util_unittest.cc +++ b/chrome/browser/sync/glue/extension_util_unittest.cc @@ -420,22 +420,6 @@ TEST_F(ExtensionUtilTest, GetExtensionSpecifics) { EXPECT_EQ(kName, specifics.name()); } -TEST_F(ExtensionUtilTest, IsExtensionOutdated) { - FilePath file_path(kExtensionFilePath); - scoped_refptr<Extension> extension( - MakeSyncableExtension(kVersion2, kValidUpdateUrl1, kName, file_path)); - sync_pb::ExtensionSpecifics specifics; - specifics.set_id(kValidId); - specifics.set_update_url(kValidUpdateUrl1); - - specifics.set_version(kVersion1); - EXPECT_FALSE(IsExtensionOutdated(*extension, specifics)); - specifics.set_version(kVersion2); - EXPECT_FALSE(IsExtensionOutdated(*extension, specifics)); - specifics.set_version(kVersion3); - EXPECT_TRUE(IsExtensionOutdated(*extension, specifics)); -} - // TODO(akalin): Make ExtensionService/ExtensionUpdater testable // enough to be able to write a unittest for SetExtensionProperties(). |