Index: chrome/browser/sync/glue/extension_model_associator.cc |
diff --git a/chrome/browser/sync/glue/extension_model_associator.cc b/chrome/browser/sync/glue/extension_model_associator.cc |
index 3ff404d57e8e89b26933d630af999736bb4c493e..c88ddbac51ca2dfea977090f43be048512938b9a 100644 |
--- a/chrome/browser/sync/glue/extension_model_associator.cc |
+++ b/chrome/browser/sync/glue/extension_model_associator.cc |
@@ -55,6 +55,7 @@ ExtensionData* SetOrCreateData( |
void GetSyncableExtensionsClientData( |
const ExtensionList& extensions, |
ExtensionsService* extensions_service, |
+ std::set<std::string>* unsyncable_extensions, |
ExtensionDataMap* extension_data_map) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
for (ExtensionList::const_iterator it = extensions.begin(); |
@@ -73,6 +74,8 @@ void GetSyncableExtensionsClientData( |
// Assumes this is called before any server data is read. |
DCHECK(extension_data.NeedsUpdate(ExtensionData::SERVER)); |
DCHECK(!extension_data.NeedsUpdate(ExtensionData::CLIENT)); |
+ } else { |
+ unsyncable_extensions->insert(extension.id()); |
} |
} |
} |
@@ -99,6 +102,7 @@ bool ExtensionModelAssociator::AssociateModels() { |
return false; |
} |
+ std::set<std::string> unsyncable_extensions; |
ExtensionDataMap extension_data_map; |
// Read client-side data. Do this first so server data takes |
@@ -109,13 +113,15 @@ bool ExtensionModelAssociator::AssociateModels() { |
const ExtensionList* extensions = extensions_service->extensions(); |
CHECK(extensions); |
GetSyncableExtensionsClientData( |
- *extensions, extensions_service, &extension_data_map); |
+ *extensions, extensions_service, |
+ &unsyncable_extensions, &extension_data_map); |
const ExtensionList* disabled_extensions = |
extensions_service->disabled_extensions(); |
CHECK(disabled_extensions); |
GetSyncableExtensionsClientData( |
- *disabled_extensions, extensions_service, &extension_data_map); |
+ *disabled_extensions, extensions_service, |
+ &unsyncable_extensions, &extension_data_map); |
} |
// Read server-side data. |
@@ -133,12 +139,19 @@ bool ExtensionModelAssociator::AssociateModels() { |
LOG(ERROR) << "Invalid extensions specifics for id " << id; |
return false; |
} |
- // Pass in false for merge_user_properties so client user |
- // settings always take precedence. |
- const ExtensionData& extension_data = |
- *SetOrCreateData(&extension_data_map, |
- ExtensionData::SERVER, false, server_data); |
- DcheckIsExtensionSpecificsValid(extension_data.merged_data()); |
+ // Don't process server data for extensions we know are |
+ // unsyncable. This doesn't catch everything, as if we don't |
+ // have the extension already installed we can't check, but we |
+ // also check at extension install time. |
+ if (unsyncable_extensions.find(server_data.id()) == |
+ unsyncable_extensions.end()) { |
+ // Pass in false for merge_user_properties so client user |
+ // settings always take precedence. |
+ const ExtensionData& extension_data = |
+ *SetOrCreateData(&extension_data_map, |
+ ExtensionData::SERVER, false, server_data); |
+ DcheckIsExtensionSpecificsValid(extension_data.merged_data()); |
+ } |
id = sync_node.GetSuccessorId(); |
} |
} |
@@ -204,9 +217,17 @@ bool ExtensionModelAssociator::OnClientUpdate(const std::string& id) { |
LOG(ERROR) << kNoExtensionsFolderError; |
return false; |
} |
- |
- sync_pb::ExtensionSpecifics client_data; |
- if (GetExtensionDataFromClient(id, &client_data)) { |
+ ExtensionsService* extensions_service = GetExtensionsService(); |
+ Extension* extension = extensions_service->GetExtensionById(id, true); |
+ if (extension) { |
+ if (!IsExtensionSyncable(*extension)) { |
+ LOG(DFATAL) << "OnClientUpdate() called for non-syncable extension " |
+ << id; |
+ return false; |
+ } |
+ sync_pb::ExtensionSpecifics client_data; |
+ GetExtensionSpecifics(*extension, extensions_service, &client_data); |
+ DcheckIsExtensionSpecificsValid(client_data); |
ExtensionData extension_data = |
ExtensionData::FromData(ExtensionData::CLIENT, client_data); |
sync_pb::ExtensionSpecifics server_data; |
@@ -241,13 +262,21 @@ bool ExtensionModelAssociator::OnClientUpdate(const std::string& id) { |
} |
void ExtensionModelAssociator::OnServerUpdate( |
- const sync_pb::ExtensionSpecifics& server_data) { |
+ const sync_pb::ExtensionSpecifics& server_data, |
+ Extension* extension) { |
DcheckIsExtensionSpecificsValid(server_data); |
ExtensionData extension_data = |
ExtensionData::FromData(ExtensionData::SERVER, server_data); |
- sync_pb::ExtensionSpecifics client_data; |
- if (GetExtensionDataFromClient(server_data.id(), &client_data)) { |
- ExtensionData extension_data = |
+ if (extension) { |
+ if (!IsExtensionSyncable(*extension)) { |
+ LOG(DFATAL) << "OnServerUpdate() called for non-syncable extension " |
+ << extension->id(); |
+ return; |
+ } |
+ sync_pb::ExtensionSpecifics client_data; |
+ GetExtensionSpecifics(*extension, GetExtensionsService(), &client_data); |
+ DcheckIsExtensionSpecificsValid(client_data); |
+ extension_data = |
ExtensionData::FromData(ExtensionData::CLIENT, client_data); |
extension_data.SetData(ExtensionData::SERVER, true, server_data); |
} |
@@ -261,16 +290,6 @@ void ExtensionModelAssociator::OnServerUpdate( |
DCHECK(!extension_data.NeedsUpdate(ExtensionData::SERVER)); |
} |
-void ExtensionModelAssociator::OnServerRemove(const std::string& id) { |
- ExtensionsService* extensions_service = GetExtensionsService(); |
- Extension* extension = extensions_service->GetExtensionById(id, true); |
- if (extension) { |
- extensions_service->UninstallExtension(id, false); |
- } else { |
- LOG(ERROR) << "Trying to uninstall nonexistent extension " << id; |
- } |
-} |
- |
ExtensionsService* ExtensionModelAssociator::GetExtensionsService() { |
CHECK(sync_service_); |
Profile* profile = sync_service_->profile(); |
@@ -280,18 +299,6 @@ ExtensionsService* ExtensionModelAssociator::GetExtensionsService() { |
return extensions_service; |
} |
-bool ExtensionModelAssociator::GetExtensionDataFromClient( |
- const std::string& id, sync_pb::ExtensionSpecifics* client_data) { |
- ExtensionsService* extensions_service = GetExtensionsService(); |
- Extension* extension = extensions_service->GetExtensionById(id, true); |
- if (!extension) { |
- return false; |
- } |
- GetExtensionSpecifics(*extension, extensions_service, client_data); |
- DcheckIsExtensionSpecificsValid(*client_data); |
- return true; |
-} |
- |
bool ExtensionModelAssociator::GetExtensionDataFromServer( |
const std::string& id, sync_api::WriteTransaction* trans, |
const sync_api::ReadNode& root, |
@@ -360,6 +367,11 @@ void ExtensionModelAssociator::TryUpdateClient( |
const std::string& id = specifics.id(); |
Extension* extension = extensions_service->GetExtensionById(id, true); |
if (extension) { |
+ if (!IsExtensionSyncable(*extension)) { |
+ LOG(DFATAL) << "TryUpdateClient() called for non-syncable extension " |
+ << extension->id(); |
+ return; |
+ } |
SetExtensionProperties(specifics, extensions_service, extension); |
{ |
sync_pb::ExtensionSpecifics extension_specifics; |