Index: chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
index f30a5fa61b485dee1cf72513c399510bd704de24..4be1cc7276ee6305ae08946c86f97440e0bdf418 100644 |
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
@@ -146,6 +146,132 @@ void DoesPrivateKeyExistAsync( |
callback); |
} |
+template <typename E> |
+bool Eq(const E& lhs, const E& rhs) { |
+ return lhs == rhs; |
+} |
+ |
+template <> |
+bool Eq<em::AppPackEntryProto>(const em::AppPackEntryProto& lhs, |
+ const em::AppPackEntryProto& rhs) { |
+ if (lhs.has_extension_id() != rhs.has_extension_id()) |
+ return false; |
+ if (lhs.has_extension_id() && lhs.extension_id() != rhs.extension_id()) |
+ return false; |
+ if (lhs.has_update_url() != rhs.has_update_url()) |
+ return false; |
+ if (lhs.has_update_url() && lhs.update_url() != rhs.update_url()) |
+ return false; |
+ if (lhs.has_obsolete_online_only() != rhs.has_obsolete_online_only()) |
+ return false; |
+ if (lhs.has_obsolete_online_only() && |
+ lhs.obsolete_online_only() != rhs.obsolete_online_only()) |
+ return false; |
+ return true; |
+} |
+ |
+template <> |
+bool Eq<em::KioskAppInfoProto>(const em::KioskAppInfoProto& lhs, |
+ const em::KioskAppInfoProto& rhs) { |
+ if (lhs.has_app_id() != rhs.has_app_id()) |
+ return false; |
+ if (lhs.has_app_id() && lhs.app_id() != rhs.app_id()) |
+ return false; |
+ if (lhs.has_update_url() != rhs.has_update_url()) |
+ return false; |
+ if (lhs.has_update_url() && lhs.update_url() != rhs.update_url()) |
+ return false; |
+ return true; |
+} |
+ |
+template <> |
+bool Eq<em::DeviceLocalAccountInfoProto>( |
+ const em::DeviceLocalAccountInfoProto& lhs, |
+ const em::DeviceLocalAccountInfoProto& rhs) { |
+ if (lhs.has_deprecated_public_session_id() != |
+ rhs.has_deprecated_public_session_id()) { |
+ return false; |
+ } |
+ if (lhs.has_deprecated_public_session_id() && |
+ lhs.deprecated_public_session_id() != |
+ rhs.deprecated_public_session_id()) { |
+ return false; |
+ } |
+ if (lhs.has_account_id() != rhs.has_account_id()) |
+ return false; |
+ if (lhs.has_account_id() && lhs.account_id() != rhs.account_id()) |
+ return false; |
+ if (lhs.has_type() != rhs.has_type()) |
+ return false; |
+ if (lhs.has_type() && lhs.type() != rhs.type()) |
+ return false; |
+ if (lhs.has_kiosk_app() != rhs.has_kiosk_app()) |
+ return false; |
+ if (lhs.has_kiosk_app() && !Eq(lhs.kiosk_app(), rhs.kiosk_app())) |
+ return false; |
+ return true; |
+} |
+ |
+template <template <typename> class R, typename E> |
Mattias Nissler (ping if slow)
2014/11/07 16:07:35
Could use better names for R and E to indicate wha
|
+bool Exists(const R<E>& collection, const E& elem) { |
+ for (const auto& e : collection) { |
+ if (Eq(e, elem)) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+template <template <typename> class R, typename E> |
+void Merge(const R<E>& from, R<E>* to) { |
+ for (const auto& f : from) { |
+ if (!Exists(*to, f)) |
+ *to->Add() = f; |
Mattias Nissler (ping if slow)
2014/11/07 16:07:35
If merging only ever adds fields, how would I actu
ygorshenin1
2014/11/07 17:24:32
You're right, it's impossible to remove values fro
|
+ } |
+} |
+ |
+void MergeSettings(const em::ChromeDeviceSettingsProto& from, |
+ em::ChromeDeviceSettingsProto* to) { |
+ ::google::protobuf::RepeatedPtrField<std::string> user_whitelist( |
+ to->user_whitelist().user_whitelist()); |
+ Merge(from.user_whitelist().user_whitelist(), &user_whitelist); |
+ |
+ ::google::protobuf::RepeatedPtrField<em::AppPackEntryProto> app_pack( |
+ to->app_pack().app_pack()); |
+ Merge(from.app_pack().app_pack(), &app_pack); |
+ |
+ ::google::protobuf::RepeatedPtrField<std::string> app_id( |
+ to->pinned_apps().app_id()); |
+ Merge(from.pinned_apps().app_id(), &app_id); |
+ |
+ ::google::protobuf::RepeatedField<int> connection_types( |
+ to->auto_update_settings().allowed_connection_types()); |
+ Merge(from.auto_update_settings().allowed_connection_types(), |
+ &connection_types); |
+ |
+ ::google::protobuf::RepeatedPtrField<std::string> start_up_urls( |
+ to->start_up_urls().start_up_urls()); |
+ Merge(from.start_up_urls().start_up_urls(), &start_up_urls); |
+ |
+ ::google::protobuf::RepeatedPtrField<em::DeviceLocalAccountInfoProto> account( |
+ to->device_local_accounts().account()); |
+ Merge(from.device_local_accounts().account(), &account); |
+ |
+ em::ChromeDeviceSettingsProto settings = from; |
+ settings.MergeFrom(*to); |
+ settings.mutable_user_whitelist()->mutable_user_whitelist()->CopyFrom( |
+ user_whitelist); |
+ settings.mutable_app_pack()->mutable_app_pack()->CopyFrom(app_pack); |
+ settings.mutable_pinned_apps()->mutable_app_id()->CopyFrom(app_id); |
+ settings.mutable_auto_update_settings() |
+ ->mutable_allowed_connection_types() |
+ ->CopyFrom(connection_types); |
+ settings.mutable_start_up_urls()->mutable_start_up_urls()->CopyFrom( |
+ start_up_urls); |
+ settings.mutable_device_local_accounts()->mutable_account()->CopyFrom( |
+ account); |
+ to->Swap(&settings); |
+} |
+ |
} // namespace |
OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS( |
@@ -633,10 +759,8 @@ bool OwnerSettingsServiceChromeOS::UpdateFromService() { |
!device_settings_service_->device_settings()) { |
return false; |
} |
- enterprise_management::ChromeDeviceSettingsProto settings = |
- *device_settings_service_->device_settings(); |
- settings.MergeFrom(device_settings_); |
- device_settings_.Swap(&settings); |
+ MergeSettings(*device_settings_service_->device_settings(), |
+ &device_settings_); |
return true; |
} |