| Index: chrome/browser/chromeos/settings/device_settings_service.cc
 | 
| diff --git a/chrome/browser/chromeos/settings/device_settings_service.cc b/chrome/browser/chromeos/settings/device_settings_service.cc
 | 
| index 73cd7567a3d06791ed78d67452bd804b6ba75897..d95ffbd9f3bcbf70d7f96f9476fda91283076b34 100644
 | 
| --- a/chrome/browser/chromeos/settings/device_settings_service.cc
 | 
| +++ b/chrome/browser/chromeos/settings/device_settings_service.cc
 | 
| @@ -129,13 +129,27 @@ void DeviceSettingsService::Load() {
 | 
|    EnqueueLoad(false);
 | 
|  }
 | 
|  
 | 
| +void DeviceSettingsService::LoadImmediately() {
 | 
| +  bool request_key_load = true;
 | 
| +  bool cloud_validations = true;
 | 
| +  if (device_mode_ == policy::DEVICE_MODE_ENTERPRISE_AD) {
 | 
| +    request_key_load = false;
 | 
| +    cloud_validations = false;
 | 
| +  }
 | 
| +  std::unique_ptr<SessionManagerOperation> operation(new LoadSettingsOperation(
 | 
| +      request_key_load, cloud_validations, true /*force_immediate_load*/,
 | 
| +      base::Bind(&DeviceSettingsService::HandleCompletedOperation,
 | 
| +                 weak_factory_.GetWeakPtr(), base::Closure())));
 | 
| +  operation->Start(session_manager_client_, owner_key_util_, public_key_);
 | 
| +}
 | 
| +
 | 
|  void DeviceSettingsService::Store(
 | 
|      std::unique_ptr<em::PolicyFetchResponse> policy,
 | 
|      const base::Closure& callback) {
 | 
|    // On Active Directory managed devices policy is written only by authpolicyd.
 | 
|    CHECK(device_mode_ != policy::DEVICE_MODE_ENTERPRISE_AD);
 | 
|    Enqueue(linked_ptr<SessionManagerOperation>(new StoreSettingsOperation(
 | 
| -      base::Bind(&DeviceSettingsService::HandleCompletedOperation,
 | 
| +      base::Bind(&DeviceSettingsService::HandleCompletedAsyncOperation,
 | 
|                   weak_factory_.GetWeakPtr(), callback),
 | 
|        std::move(policy))));
 | 
|  }
 | 
| @@ -233,8 +247,8 @@ void DeviceSettingsService::EnqueueLoad(bool request_key_load) {
 | 
|      cloud_validations = false;
 | 
|    }
 | 
|    linked_ptr<SessionManagerOperation> operation(new LoadSettingsOperation(
 | 
| -      request_key_load, cloud_validations,
 | 
| -      base::Bind(&DeviceSettingsService::HandleCompletedOperation,
 | 
| +      request_key_load, cloud_validations, false /*force_immediate_load*/,
 | 
| +      base::Bind(&DeviceSettingsService::HandleCompletedAsyncOperation,
 | 
|                   weak_factory_.GetWeakPtr(), base::Closure())));
 | 
|    Enqueue(operation);
 | 
|  }
 | 
| @@ -254,12 +268,23 @@ void DeviceSettingsService::StartNextOperation() {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void DeviceSettingsService::HandleCompletedOperation(
 | 
| +void DeviceSettingsService::HandleCompletedAsyncOperation(
 | 
|      const base::Closure& callback,
 | 
|      SessionManagerOperation* operation,
 | 
|      Status status) {
 | 
|    DCHECK_EQ(operation, pending_operations_.front().get());
 | 
| +  HandleCompletedOperation(callback, operation, status);
 | 
| +  // Only remove the pending operation here, so new operations triggered by
 | 
| +  // any of the callbacks above are queued up properly.
 | 
| +  pending_operations_.pop_front();
 | 
| +
 | 
| +  StartNextOperation();
 | 
| +}
 | 
|  
 | 
| +void DeviceSettingsService::HandleCompletedOperation(
 | 
| +    const base::Closure& callback,
 | 
| +    SessionManagerOperation* operation,
 | 
| +    Status status) {
 | 
|    store_status_ = status;
 | 
|    if (status == STORE_SUCCESS) {
 | 
|      policy_data_ = std::move(operation->policy_data());
 | 
| @@ -298,12 +323,6 @@ void DeviceSettingsService::HandleCompletedOperation(
 | 
|    // filter self-triggered updates.
 | 
|    if (!callback.is_null())
 | 
|      callback.Run();
 | 
| -
 | 
| -  // Only remove the pending operation here, so new operations triggered by any
 | 
| -  // of the callbacks above are queued up properly.
 | 
| -  pending_operations_.pop_front();
 | 
| -
 | 
| -  StartNextOperation();
 | 
|  }
 | 
|  
 | 
|  void DeviceSettingsService::HandleError(Status status,
 | 
| 
 |