Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Unified Diff: chrome/browser/sync/glue/extension_model_associator.cc

Issue 3063002: Merge 53127 - Added checks to handle unsyncable extensions.... (Closed) Base URL: svn://svn.chromium.org/chrome/branches/472/src/
Patch Set: Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/sync/glue/extension_model_associator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « chrome/browser/sync/glue/extension_model_associator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698