| 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 b6f4b42279f1b79b1e1884744bab30b562fca976..21d9950d532e602add4a6674614da126397e80be 100644
|
| --- a/chrome/browser/sync/glue/extension_change_processor.cc
|
| +++ b/chrome/browser/sync/glue/extension_change_processor.cc
|
| @@ -9,6 +9,8 @@
|
|
|
| #include "base/logging.h"
|
| #include "chrome/browser/chrome_thread.h"
|
| +#include "chrome/browser/extensions/extensions_service.h"
|
| +#include "chrome/browser/profile.h"
|
| #include "chrome/browser/sync/engine/syncapi.h"
|
| #include "chrome/browser/sync/glue/extension_model_associator.h"
|
| #include "chrome/browser/sync/glue/extension_util.h"
|
| @@ -51,6 +53,7 @@ void ExtensionChangeProcessor::Observe(NotificationType type,
|
| DCHECK_EQ(Source<Profile>(source).ptr(), profile_);
|
| Extension* extension = Details<Extension>(details).ptr();
|
| CHECK(extension);
|
| + // Ignore non-syncable extensions.
|
| if (!IsExtensionSyncable(*extension)) {
|
| return;
|
| }
|
| @@ -102,23 +105,51 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel(
|
| error_handler()->OnUnrecoverableError(FROM_HERE, error);
|
| return;
|
| }
|
| + const std::string& id = specifics.id();
|
| + CHECK(profile_);
|
| + ExtensionsService* extensions_service =
|
| + profile_->GetExtensionsService();
|
| + CHECK(extensions_service);
|
| + Extension* extension =
|
| + extensions_service->GetExtensionById(id, true);
|
| + if (extension && !IsExtensionSyncable(*extension)) {
|
| + LOG(WARNING) << "Not updating unsyncable extension " << id;
|
| + return;
|
| + }
|
| StopObserving();
|
| - extension_model_associator_->OnServerUpdate(specifics);
|
| + extension_model_associator_->OnServerUpdate(specifics, extension);
|
| StartObserving();
|
| break;
|
| }
|
| case sync_api::SyncManager::ChangeRecord::ACTION_DELETE: {
|
| - StopObserving();
|
| - if (change.specifics.HasExtension(sync_pb::extension)) {
|
| - extension_model_associator_->OnServerRemove(
|
| - change.specifics.GetExtension(sync_pb::extension).id());
|
| - } else {
|
| + if (!change.specifics.HasExtension(sync_pb::extension)) {
|
| std::stringstream error;
|
| - error << "Could not get extension ID for deleted node "
|
| + error << "Could not get extension ID for delete node "
|
| << change.id;
|
| error_handler()->OnUnrecoverableError(FROM_HERE, error.str());
|
| LOG(DFATAL) << error.str();
|
| + return;
|
| }
|
| + const std::string& id =
|
| + change.specifics.GetExtension(sync_pb::extension).id();
|
| + CHECK(profile_);
|
| + ExtensionsService* extensions_service =
|
| + profile_->GetExtensionsService();
|
| + CHECK(extensions_service);
|
| + Extension* extension =
|
| + extensions_service->GetExtensionById(id, true);
|
| + if (!extension) {
|
| + LOG(ERROR) << "Trying to uninstall nonexistent extension " << id
|
| + << " for delete node " << change.id;
|
| + return;
|
| + }
|
| + if (!IsExtensionSyncable(*extension)) {
|
| + LOG(WARNING) << "Not uninstalling unsyncable extension " << id
|
| + << " for delete node " << change.id;
|
| + return;
|
| + }
|
| + StopObserving();
|
| + extensions_service->UninstallExtension(id, false);
|
| StartObserving();
|
| break;
|
| }
|
|
|