Index: chrome/browser/extensions/extension_sync_data.cc |
diff --git a/chrome/browser/extensions/extension_sync_data.cc b/chrome/browser/extensions/extension_sync_data.cc |
index 31df101642edf351192b45e09a965aed685d0941..aa56051c8b87a101115ab8177ee30b002979a529 100644 |
--- a/chrome/browser/extensions/extension_sync_data.cc |
+++ b/chrome/browser/extensions/extension_sync_data.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/extensions/extension_sync_data.h" |
#include "base/logging.h" |
+#include "base/metrics/histogram_macros.h" |
#include "base/strings/stringprintf.h" |
#include "chrome/browser/extensions/app_sync_data.h" |
#include "chrome/browser/extensions/extension_service.h" |
@@ -27,36 +28,37 @@ std::string GetExtensionSpecificsLogMessage( |
specifics.update_url().c_str()); |
} |
-} // namespace |
+enum BadSyncDataReason { |
+ // Invalid extension ID. |
+ BAD_EXTENSION_ID, |
-ExtensionSyncData::ExtensionSyncData() |
- : uninstalled_(false), |
- enabled_(false), |
- incognito_enabled_(false), |
- remote_install_(false), |
- all_urls_enabled_(BOOLEAN_UNSET), |
- installed_by_custodian_(false) { |
-} |
+ // Invalid version. |
+ BAD_VERSION, |
-ExtensionSyncData::ExtensionSyncData(const syncer::SyncData& sync_data) |
- : uninstalled_(false), |
- enabled_(false), |
- incognito_enabled_(false), |
- remote_install_(false), |
- all_urls_enabled_(BOOLEAN_UNSET), |
- installed_by_custodian_(false) { |
- PopulateFromSyncData(sync_data); |
+ // Invalid update URL. |
+ BAD_UPDATE_URL, |
+ |
+ // No ExtensionSpecifics in the EntitySpecifics. |
+ NO_EXTENSION_SPECIFICS, |
+ |
+ // Must be at the end. |
+ NUM_BAD_SYNC_DATA_REASONS |
+}; |
+ |
+void RecordBadSyncData(BadSyncDataReason reason) { |
+ UMA_HISTOGRAM_ENUMERATION("Extensions.BadSyncDataReason", reason, |
+ NUM_BAD_SYNC_DATA_REASONS); |
} |
-ExtensionSyncData::ExtensionSyncData(const syncer::SyncChange& sync_change) |
- : uninstalled_(sync_change.change_type() == |
- syncer::SyncChange::ACTION_DELETE), |
+} // namespace |
+ |
+ExtensionSyncData::ExtensionSyncData() |
+ : uninstalled_(false), |
enabled_(false), |
incognito_enabled_(false), |
remote_install_(false), |
all_urls_enabled_(BOOLEAN_UNSET), |
installed_by_custodian_(false) { |
- PopulateFromSyncData(sync_change.sync_data()); |
} |
ExtensionSyncData::ExtensionSyncData(const Extension& extension, |
@@ -79,6 +81,28 @@ ExtensionSyncData::ExtensionSyncData(const Extension& extension, |
ExtensionSyncData::~ExtensionSyncData() {} |
+// static |
+scoped_ptr<ExtensionSyncData> ExtensionSyncData::CreateFromSyncData( |
+ const syncer::SyncData& sync_data) { |
+ scoped_ptr<ExtensionSyncData> data(new ExtensionSyncData); |
+ if (data->PopulateFromSyncData(sync_data)) |
+ return data.Pass(); |
+ return scoped_ptr<ExtensionSyncData>(); |
+} |
+ |
+// static |
+scoped_ptr<ExtensionSyncData> ExtensionSyncData::CreateFromSyncChange( |
+ const syncer::SyncChange& sync_change) { |
+ scoped_ptr<ExtensionSyncData> data( |
+ CreateFromSyncData(sync_change.sync_data())); |
+ if (!data.get()) |
+ return scoped_ptr<ExtensionSyncData>(); |
+ |
+ data->set_uninstalled(sync_change.change_type() == |
+ syncer::SyncChange::ACTION_DELETE); |
+ return data.Pass(); |
+} |
+ |
syncer::SyncData ExtensionSyncData::GetSyncData() const { |
sync_pb::EntitySpecifics specifics; |
PopulateExtensionSpecifics(specifics.mutable_extension()); |
@@ -106,24 +130,30 @@ void ExtensionSyncData::PopulateExtensionSpecifics( |
specifics->set_name(name_); |
} |
-void ExtensionSyncData::PopulateFromExtensionSpecifics( |
+bool ExtensionSyncData::PopulateFromExtensionSpecifics( |
const sync_pb::ExtensionSpecifics& specifics) { |
if (!crx_file::id_util::IdIsValid(specifics.id())) { |
- LOG(FATAL) << "Attempt to sync bad ExtensionSpecifics (bad ID):\n" |
+ LOG(ERROR) << "Attempt to sync bad ExtensionSpecifics (bad ID):\n" |
<< GetExtensionSpecificsLogMessage(specifics); |
+ RecordBadSyncData(BAD_EXTENSION_ID); |
+ return false; |
} |
Version specifics_version(specifics.version()); |
if (!specifics_version.IsValid()) { |
- LOG(FATAL) << "Attempt to sync bad ExtensionSpecifics (bad version):\n" |
+ LOG(ERROR) << "Attempt to sync bad ExtensionSpecifics (bad version):\n" |
<< GetExtensionSpecificsLogMessage(specifics); |
+ RecordBadSyncData(BAD_VERSION); |
+ return false; |
} |
// The update URL must be either empty or valid. |
GURL specifics_update_url(specifics.update_url()); |
if (!specifics_update_url.is_empty() && !specifics_update_url.is_valid()) { |
- LOG(FATAL) << "Attempt to sync bad ExtensionSpecifics (bad update URL):\n" |
+ LOG(ERROR) << "Attempt to sync bad ExtensionSpecifics (bad update URL):\n" |
<< GetExtensionSpecificsLogMessage(specifics); |
+ RecordBadSyncData(BAD_UPDATE_URL); |
+ return false; |
} |
id_ = specifics.id(); |
@@ -142,21 +172,23 @@ void ExtensionSyncData::PopulateFromExtensionSpecifics( |
remote_install_ = specifics.remote_install(); |
installed_by_custodian_ = specifics.installed_by_custodian(); |
name_ = specifics.name(); |
+ return true; |
} |
void ExtensionSyncData::set_uninstalled(bool uninstalled) { |
uninstalled_ = uninstalled; |
} |
-void ExtensionSyncData::PopulateFromSyncData( |
+bool ExtensionSyncData::PopulateFromSyncData( |
const syncer::SyncData& sync_data) { |
const sync_pb::EntitySpecifics& entity_specifics = sync_data.GetSpecifics(); |
- if (entity_specifics.has_extension()) { |
- PopulateFromExtensionSpecifics(entity_specifics.extension()); |
- } else { |
- LOG(FATAL) << "Attempt to sync bad EntitySpecifics."; |
- } |
+ if (entity_specifics.has_extension()) |
+ return PopulateFromExtensionSpecifics(entity_specifics.extension()); |
+ |
+ LOG(ERROR) << "Attempt to sync bad EntitySpecifics: no extension data."; |
+ RecordBadSyncData(NO_EXTENSION_SPECIFICS); |
+ return false; |
} |
} // namespace extensions |