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 e836b1ed5d910b2dcb5419fab2ce38e9b7d9083e..808bd273b9d3e09db2cfa81ab42f09428df30f29 100644 |
--- a/chrome/browser/sync/glue/extension_change_processor.cc |
+++ b/chrome/browser/sync/glue/extension_change_processor.cc |
@@ -9,9 +9,11 @@ |
#include "base/logging.h" |
#include "chrome/browser/chrome_thread.h" |
-#include "chrome/browser/sync/engine/syncapi.h" |
-#include "chrome/browser/sync/glue/extension_model_associator.h" |
+#include "chrome/browser/profile.h" |
+#include "chrome/browser/extensions/extensions_service.h" |
+#include "chrome/browser/sync/glue/extension_sync.h" |
#include "chrome/browser/sync/glue/extension_util.h" |
+#include "chrome/browser/sync/protocol/extension_specifics.pb.h" |
#include "chrome/common/extensions/extension.h" |
#include "chrome/common/notification_details.h" |
#include "chrome/common/notification_source.h" |
@@ -19,14 +21,12 @@ |
namespace browser_sync { |
ExtensionChangeProcessor::ExtensionChangeProcessor( |
- UnrecoverableErrorHandler* error_handler, |
- ExtensionModelAssociator* extension_model_associator) |
+ UnrecoverableErrorHandler* error_handler) |
: ChangeProcessor(error_handler), |
- extension_model_associator_(extension_model_associator), |
+ traits_(GetExtensionSyncTraits()), |
profile_(NULL) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
DCHECK(error_handler); |
- DCHECK(extension_model_associator_); |
} |
ExtensionChangeProcessor::~ExtensionChangeProcessor() { |
@@ -43,32 +43,45 @@ void ExtensionChangeProcessor::Observe(NotificationType type, |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
DCHECK(running()); |
DCHECK(profile_); |
- switch (type.value) { |
- case NotificationType::EXTENSION_LOADED: |
- case NotificationType::EXTENSION_UPDATE_DISABLED: |
- case NotificationType::EXTENSION_UNLOADED: |
- case NotificationType::EXTENSION_UNLOADED_DISABLED: { |
- DCHECK_EQ(Source<Profile>(source).ptr(), profile_); |
- Extension* extension = Details<Extension>(details).ptr(); |
- CHECK(extension); |
- // Ignore non-syncable extensions. |
- if (!IsExtensionSyncable(*extension)) { |
- return; |
- } |
- const std::string& id = extension->id(); |
- LOG(INFO) << "Got change notification of type " << type.value |
- << " for extension " << id; |
- if (!extension_model_associator_->OnClientUpdate(id)) { |
- std::string error = std::string("Client update failed for ") + id; |
- error_handler()->OnUnrecoverableError(FROM_HERE, error); |
- return; |
- } |
- break; |
+ if ((type != NotificationType::EXTENSION_LOADED) && |
+ (type != NotificationType::EXTENSION_UPDATE_DISABLED) && |
+ (type != NotificationType::EXTENSION_UNLOADED) && |
+ (type != NotificationType::EXTENSION_UNLOADED_DISABLED)) { |
+ LOG(DFATAL) << "Received unexpected notification of type " |
+ << type.value; |
+ return; |
+ } |
+ DCHECK_EQ(Source<Profile>(source).ptr(), profile_); |
+ const Extension* extension = Details<Extension>(details).ptr(); |
+ CHECK(extension); |
+ // Ignore non-syncable extensions. |
+ if (!IsExtensionValidAndSyncable( |
+ *extension, traits_.allowed_extension_types)) { |
+ return; |
+ } |
+ const std::string& id = extension->id(); |
+ LOG(INFO) << "Got notification of type " << type.value |
+ << " for extension " << id; |
+ ExtensionsService* extensions_service = |
+ GetExtensionsServiceFromProfile(profile_); |
+ // Whether an extension is loaded or not isn't an indicator of |
+ // whether it's installed or not; some extension actions unload and |
+ // then reload an extension to force listeners to update. |
+ bool extension_installed = |
+ (extensions_service->GetExtensionById(id, true) != NULL); |
+ if (extension_installed) { |
+ LOG(INFO) << "Extension " << id |
+ << " is installed; updating server data"; |
+ std::string error; |
+ if (!UpdateServerData(traits_, *extension, |
+ profile_->GetProfileSyncService(), &error)) { |
+ error_handler()->OnUnrecoverableError(FROM_HERE, error); |
} |
- default: |
- LOG(DFATAL) << "Received unexpected notification of type " |
- << type.value; |
- break; |
+ } else { |
+ LOG(INFO) << "Extension " << id |
+ << " is not installed; removing server data"; |
+ RemoveServerData(traits_, *extension, |
+ profile_->GetProfileSyncService()); |
} |
} |
@@ -80,6 +93,8 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( |
if (!running()) { |
return; |
} |
+ ExtensionsService* extensions_service = |
+ GetExtensionsServiceFromProfile(profile_); |
for (int i = 0; i < change_count; ++i) { |
const sync_api::SyncManager::ChangeRecord& change = changes[i]; |
switch (change.action) { |
@@ -93,9 +108,9 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( |
error_handler()->OnUnrecoverableError(FROM_HERE, error.str()); |
return; |
} |
- DCHECK_EQ(node.GetModelType(), syncable::EXTENSIONS); |
+ DCHECK_EQ(node.GetModelType(), traits_.model_type); |
const sync_pb::ExtensionSpecifics& specifics = |
- node.GetExtensionSpecifics(); |
+ (*traits_.extension_specifics_getter)(node); |
if (!IsExtensionSpecificsValid(specifics)) { |
std::string error = |
std::string("Invalid server specifics: ") + |
@@ -104,15 +119,17 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( |
return; |
} |
StopObserving(); |
- extension_model_associator_->OnServerUpdate(specifics); |
+ UpdateClient(traits_, specifics, extensions_service); |
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()); |
+ sync_pb::ExtensionSpecifics specifics; |
+ if ((*traits_.extension_specifics_entity_getter)( |
+ change.specifics, &specifics)) { |
+ StopObserving(); |
+ RemoveFromClient(traits_, specifics.id(), extensions_service); |
+ StartObserving(); |
} else { |
std::stringstream error; |
error << "Could not get extension ID for deleted node " |
@@ -120,7 +137,6 @@ void ExtensionChangeProcessor::ApplyChangesFromSyncModel( |
error_handler()->OnUnrecoverableError(FROM_HERE, error.str()); |
LOG(DFATAL) << error.str(); |
} |
- StartObserving(); |
break; |
} |
} |