Index: chrome/browser/sync/glue/extension_model_associator.cc |
=================================================================== |
--- chrome/browser/sync/glue/extension_model_associator.cc (revision 53365) |
+++ chrome/browser/sync/glue/extension_model_associator.cc (working copy) |
@@ -55,6 +55,7 @@ |
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 @@ |
// 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 @@ |
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 @@ |
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 @@ |
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 @@ |
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; |
@@ -245,9 +266,19 @@ |
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 = |
+ ExtensionsService* extensions_service = GetExtensionsService(); |
+ Extension* extension = |
+ extensions_service->GetExtensionById(server_data.id(), true); |
+ if (extension) { |
+ if (!IsExtensionSyncable(*extension)) { |
+ // Ignore updates for non-syncable extensions (we may get those |
+ // for extensions that were previously syncable). |
+ 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); |
} |
@@ -265,7 +296,9 @@ |
ExtensionsService* extensions_service = GetExtensionsService(); |
Extension* extension = extensions_service->GetExtensionById(id, true); |
if (extension) { |
- extensions_service->UninstallExtension(id, false); |
+ if (IsExtensionSyncable(*extension)) { |
+ extensions_service->UninstallExtension(id, false); |
+ } |
} else { |
LOG(ERROR) << "Trying to uninstall nonexistent extension " << id; |
} |
@@ -280,18 +313,6 @@ |
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 +381,11 @@ |
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; |