Index: chrome/browser/sync/glue/extension_change_processor.cc |
diff --git a/chrome/browser/sync/glue/extension_change_processor.cc b/chrome/browser/sync/glue/extension_change_processor.cc |
index 8a1bf727142284565e955bfcaf241bf0fbf248ac..dd0da34460f69262d1ea06975c28f1f8627d1e2c 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(); |
} |
} |