summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-17 07:35:04 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-17 07:35:04 +0000
commit90310d9d9e8a7a0f598d27b2982a7a4498e14138 (patch)
treebf5779408bd47ad2c36a0c08df907a61d905575f /chrome/browser/sync
parentdf37c6b66ee155d84f8c07cbd5d9e0d745799f3f (diff)
downloadchromium_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.cc39
-rw-r--r--chrome/browser/sync/glue/extension_sync.cc133
-rw-r--r--chrome/browser/sync/glue/extension_sync.h10
-rw-r--r--chrome/browser/sync/glue/extension_util.cc41
-rw-r--r--chrome/browser/sync/glue/extension_util.h13
-rw-r--r--chrome/browser/sync/glue/extension_util_unittest.cc16
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().