| 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..1912712a441e5b0c481134f822c1e3dd19a0d3b3 100644
|
| --- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| +++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| @@ -157,7 +157,6 @@ OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS(
|
| profile_(profile),
|
| waiting_for_profile_creation_(true),
|
| waiting_for_tpm_token_(true),
|
| - has_pending_changes_(false),
|
| weak_factory_(this),
|
| store_settings_factory_(this) {
|
| if (TPMTokenLoader::IsInitialized()) {
|
| @@ -180,8 +179,6 @@ OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS(
|
| registrar_.Add(this,
|
| chrome::NOTIFICATION_PROFILE_CREATED,
|
| content::Source<Profile>(profile_));
|
| -
|
| - UpdateFromService();
|
| }
|
|
|
| OwnerSettingsServiceChromeOS::~OwnerSettingsServiceChromeOS() {
|
| @@ -215,15 +212,23 @@ bool OwnerSettingsServiceChromeOS::Set(const std::string& setting,
|
| if (!IsOwner() && !IsOwnerInTests(user_id_))
|
| return false;
|
|
|
| - UpdateDeviceSettings(setting, value, device_settings_);
|
| + pending_changes_.add(setting, make_scoped_ptr(value.DeepCopy()));
|
| +
|
| + em::ChromeDeviceSettingsProto settings;
|
| + if (tentative_settings_.get()) {
|
| + settings = *tentative_settings_;
|
| + } else if (device_settings_service_->status() ==
|
| + DeviceSettingsService::STORE_SUCCESS &&
|
| + device_settings_service_->device_settings()) {
|
| + settings = *device_settings_service_->device_settings();
|
| + }
|
| + UpdateDeviceSettings(setting, value, settings);
|
| em::PolicyData policy_data;
|
| policy_data.set_username(user_id_);
|
| - CHECK(device_settings_.SerializeToString(policy_data.mutable_policy_value()));
|
| - FOR_EACH_OBSERVER(OwnerSettingsService::Observer,
|
| - observers_,
|
| + CHECK(settings.SerializeToString(policy_data.mutable_policy_value()));
|
| + FOR_EACH_OBSERVER(OwnerSettingsService::Observer, observers_,
|
| OnTentativeChangesInPolicy(policy_data));
|
| - has_pending_changes_ = true;
|
| - StoreDeviceSettings();
|
| + StorePendingChanges();
|
| return true;
|
| }
|
|
|
| @@ -236,12 +241,9 @@ bool OwnerSettingsServiceChromeOS::CommitTentativeDeviceSettings(
|
| << user_id_;
|
| return false;
|
| }
|
| - CHECK(device_settings_.ParseFromString(policy->policy_value()));
|
| - FOR_EACH_OBSERVER(OwnerSettingsService::Observer,
|
| - observers_,
|
| - OnTentativeChangesInPolicy(*policy));
|
| - has_pending_changes_ = true;
|
| - StoreDeviceSettings();
|
| + tentative_settings_.reset(new em::ChromeDeviceSettingsProto);
|
| + CHECK(tentative_settings_->ParseFromString(policy->policy_value()));
|
| + StorePendingChanges();
|
| return true;
|
| }
|
|
|
| @@ -273,12 +275,12 @@ void OwnerSettingsServiceChromeOS::OwnerKeySet(bool success) {
|
|
|
| void OwnerSettingsServiceChromeOS::OwnershipStatusChanged() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - StoreDeviceSettings();
|
| + StorePendingChanges();
|
| }
|
|
|
| void OwnerSettingsServiceChromeOS::DeviceSettingsUpdated() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - StoreDeviceSettings();
|
| + StorePendingChanges();
|
| }
|
|
|
| void OwnerSettingsServiceChromeOS::OnDeviceSettingsServiceShutdown() {
|
| @@ -586,17 +588,32 @@ void OwnerSettingsServiceChromeOS::ReloadKeypairImpl(const base::Callback<
|
| callback));
|
| }
|
|
|
| -void OwnerSettingsServiceChromeOS::StoreDeviceSettings() {
|
| - if (!has_pending_changes_ || store_settings_factory_.HasWeakPtrs())
|
| +void OwnerSettingsServiceChromeOS::StorePendingChanges() {
|
| + if (!has_pending_changes() || store_settings_factory_.HasWeakPtrs() ||
|
| + !device_settings_service_) {
|
| return;
|
| - if (!UpdateFromService())
|
| + }
|
| +
|
| + em::ChromeDeviceSettingsProto settings;
|
| + if (tentative_settings_.get()) {
|
| + settings.Swap(tentative_settings_.get());
|
| + tentative_settings_.reset();
|
| + } else if (device_settings_service_->status() ==
|
| + DeviceSettingsService::STORE_SUCCESS &&
|
| + device_settings_service_->device_settings()) {
|
| + settings = *device_settings_service_->device_settings();
|
| + } else {
|
| return;
|
| + }
|
| +
|
| + for (const auto& change : pending_changes_)
|
| + UpdateDeviceSettings(change.first, *change.second, settings);
|
| + pending_changes_.clear();
|
| +
|
| scoped_ptr<em::PolicyData> policy = AssemblePolicy(
|
| - user_id_, device_settings_service_->policy_data(), &device_settings_);
|
| - has_pending_changes_ = false;
|
| + user_id_, device_settings_service_->policy_data(), &settings);
|
| bool rv = AssembleAndSignPolicyAsync(
|
| - content::BrowserThread::GetBlockingPool(),
|
| - policy.Pass(),
|
| + content::BrowserThread::GetBlockingPool(), policy.Pass(),
|
| base::Bind(&OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned,
|
| store_settings_factory_.GetWeakPtr()));
|
| if (!rv)
|
| @@ -621,23 +638,7 @@ void OwnerSettingsServiceChromeOS::OnSignedPolicyStored(bool success) {
|
| FOR_EACH_OBSERVER(OwnerSettingsService::Observer,
|
| observers_,
|
| OnSignedPolicyStored(success));
|
| - StoreDeviceSettings();
|
| - if (!success)
|
| - has_pending_changes_ = true;
|
| -}
|
| -
|
| -bool OwnerSettingsServiceChromeOS::UpdateFromService() {
|
| - if (!device_settings_service_ ||
|
| - device_settings_service_->status() !=
|
| - DeviceSettingsService::STORE_SUCCESS ||
|
| - !device_settings_service_->device_settings()) {
|
| - return false;
|
| - }
|
| - enterprise_management::ChromeDeviceSettingsProto settings =
|
| - *device_settings_service_->device_settings();
|
| - settings.MergeFrom(device_settings_);
|
| - device_settings_.Swap(&settings);
|
| - return true;
|
| + StorePendingChanges();
|
| }
|
|
|
| } // namespace chromeos
|
|
|