Commit 764fc6e0 authored by Aga Wronska's avatar Aga Wronska Committed by Commit Bot

Do not block child session on policy refresh after initial policy fetch

Bug: 963696

Change-Id: Ib60cbe41bdd99d45625e6b0950c6bda738a06349
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1611026Reviewed-by: default avatarMaksim Ivanov <emaxx@chromium.org>
Reviewed-by: default avatarPavol Marko <pmarko@chromium.org>
Reviewed-by: default avatarLutz Justen <ljusten@chromium.org>
Commit-Queue: Aga Wronska <agawronska@chromium.org>
Cr-Commit-Position: refs/heads/master@{#662820}
parent 471eb215
......@@ -4,6 +4,7 @@
#include "chrome/browser/chromeos/child_accounts/child_policy_observer.h"
#include "base/optional.h"
#include "base/timer/timer.h"
#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
#include "chrome/browser/profiles/profile.h"
......@@ -12,7 +13,16 @@
namespace chromeos {
ChildPolicyObserver::ChildPolicyObserver(Profile* profile) : profile_(profile) {
GetUserCloudPolicyManager()->core()->service()->AddObserver(this);
policy::CloudPolicyService* cloud_policy_service =
GetUserCloudPolicyManager()->core()->service();
base::Optional<bool> initial_policy_refresh_result =
cloud_policy_service->initial_policy_refresh_result();
if (initial_policy_refresh_result) {
OnPolicyReady(*initial_policy_refresh_result
? InitialPolicyRefreshResult::kPolicyRefreshed
: InitialPolicyRefreshResult::kPolicyRefreshError);
}
cloud_policy_service->AddObserver(this);
}
ChildPolicyObserver::~ChildPolicyObserver() {
......@@ -52,11 +62,11 @@ bool ChildPolicyObserver::IsChildPolicyReady() const {
void ChildPolicyObserver::OnPolicyReady(
InitialPolicyRefreshResult refresh_result) {
DCHECK_NE(InitialPolicyRefreshResult::kUnknown, refresh_result);
DCHECK_EQ(InitialPolicyRefreshResult::kUnknown, refresh_result_);
refresh_timeout_timer_.reset();
refresh_result_ = refresh_result;
if (refresh_result_ == InitialPolicyRefreshResult::kUnknown)
refresh_result_ = refresh_result;
if (on_policy_ready_)
std::move(on_policy_ready_).Run(profile_, refresh_result_);
......
......@@ -216,6 +216,9 @@ void CloudPolicyService::CheckInitializationCompleted() {
}
void CloudPolicyService::RefreshCompleted(bool success) {
if (!initial_policy_refresh_result_.has_value())
initial_policy_refresh_result_ = success;
// Clear state and |refresh_callbacks_| before actually invoking them, s.t.
// triggering new policy fetches behaves as expected.
std::vector<RefreshPolicyCallback> callbacks;
......
......@@ -12,6 +12,7 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/optional.h"
#include "components/policy/core/common/cloud/cloud_policy_client.h"
#include "components/policy/core/common/cloud/cloud_policy_store.h"
#include "components/policy/policy_export.h"
......@@ -79,6 +80,13 @@ class POLICY_EXPORT CloudPolicyService : public CloudPolicyClient::Observer,
bool IsInitializationComplete() const { return initialization_complete_; }
// If initial policy refresh was completed returns its result.
// This allows ChildPolicyObserver to know whether policy was fetched before
// profile creation.
base::Optional<bool> initial_policy_refresh_result() const {
return initial_policy_refresh_result_;
}
private:
// Helper function that is called when initialization may be complete, and
// which is responsible for notifying observers.
......@@ -128,6 +136,10 @@ class POLICY_EXPORT CloudPolicyService : public CloudPolicyClient::Observer,
// is complete).
bool initialization_complete_;
// Set to true if initial policy refresh was successful. Set to false
// otherwise.
base::Optional<bool> initial_policy_refresh_result_;
// Observers who will receive notifications when the service has finished
// initializing.
base::ObserverList<Observer, true>::Unchecked observers_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment