| Index: chrome/browser/policy/cloud/cloud_policy_invalidator.cc
|
| diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
|
| index 5012fe7a3998a386029a0b6b5f9782b03f6b487d..e880225811197a249a383bcd723454db84753dc8 100644
|
| --- a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
|
| +++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
|
| @@ -14,7 +14,8 @@
|
| #include "base/time/time.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/invalidation/invalidation_service.h"
|
| -#include "chrome/browser/invalidation/invalidation_service_factory.h"
|
| +#include "chrome/browser/policy/cloud/cloud_policy_client.h"
|
| +#include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h"
|
| #include "chrome/browser/policy/cloud/enterprise_metrics.h"
|
| #include "chrome/common/chrome_switches.h"
|
| #include "policy/policy_constants.h"
|
| @@ -28,13 +29,11 @@ const int CloudPolicyInvalidator::kMaxFetchDelayMin = 1000;
|
| const int CloudPolicyInvalidator::kMaxFetchDelayMax = 300000;
|
|
|
| CloudPolicyInvalidator::CloudPolicyInvalidator(
|
| - CloudPolicyInvalidationHandler* invalidation_handler,
|
| - CloudPolicyStore* store,
|
| + CloudPolicyCore* core,
|
| const scoped_refptr<base::SequencedTaskRunner>& task_runner)
|
| - : invalidation_handler_(invalidation_handler),
|
| - store_(store),
|
| + : state_(UNINITIALIZED),
|
| + core_(core),
|
| task_runner_(task_runner),
|
| - profile_(NULL),
|
| invalidation_service_(NULL),
|
| invalidations_enabled_(false),
|
| invalidation_service_enabled_(false),
|
| @@ -44,40 +43,45 @@ CloudPolicyInvalidator::CloudPolicyInvalidator(
|
| unknown_version_invalidation_count_(0),
|
| ack_handle_(syncer::AckHandle::InvalidAckHandle()),
|
| weak_factory_(this),
|
| - max_fetch_delay_(kMaxFetchDelayDefault) {
|
| - DCHECK(invalidation_handler);
|
| - DCHECK(store);
|
| + max_fetch_delay_(kMaxFetchDelayDefault),
|
| + policy_refresh_count_(0) {
|
| + DCHECK(core);
|
| DCHECK(task_runner.get());
|
| - DCHECK(!IsInitialized());
|
| }
|
|
|
| -CloudPolicyInvalidator::~CloudPolicyInvalidator() {}
|
| -
|
| -void CloudPolicyInvalidator::InitializeWithProfile(Profile* profile) {
|
| - DCHECK(!IsInitialized());
|
| - DCHECK(profile);
|
| - profile_ = profile;
|
| - Initialize();
|
| +CloudPolicyInvalidator::~CloudPolicyInvalidator() {
|
| + DCHECK(state_ == SHUT_DOWN);
|
| }
|
|
|
| -void CloudPolicyInvalidator::InitializeWithService(
|
| +void CloudPolicyInvalidator::Initialize(
|
| invalidation::InvalidationService* invalidation_service) {
|
| - DCHECK(!IsInitialized());
|
| + DCHECK(state_ == UNINITIALIZED);
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(invalidation_service);
|
| invalidation_service_ = invalidation_service;
|
| - Initialize();
|
| + state_ = STOPPED;
|
| + core_->AddObserver(this);
|
| + if (core_->refresh_scheduler())
|
| + OnRefreshSchedulerStarted(core_);
|
| }
|
|
|
| void CloudPolicyInvalidator::Shutdown() {
|
| - if (IsInitialized()) {
|
| + DCHECK(state_ != SHUT_DOWN);
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (state_ == STARTED) {
|
| if (registered_timestamp_)
|
| invalidation_service_->UnregisterInvalidationHandler(this);
|
| - store_->RemoveObserver(this);
|
| + core_->store()->RemoveObserver(this);
|
| + weak_factory_.InvalidateWeakPtrs();
|
| }
|
| + if (state_ != UNINITIALIZED)
|
| + core_->RemoveObserver(this);
|
| + state_ = SHUT_DOWN;
|
| }
|
|
|
| void CloudPolicyInvalidator::OnInvalidatorStateChange(
|
| syncer::InvalidatorState state) {
|
| + DCHECK(state_ == STARTED);
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| invalidation_service_enabled_ = state == syncer::INVALIDATIONS_ENABLED;
|
| UpdateInvalidationsEnabled();
|
| @@ -85,6 +89,7 @@ void CloudPolicyInvalidator::OnInvalidatorStateChange(
|
|
|
| void CloudPolicyInvalidator::OnIncomingInvalidation(
|
| const syncer::ObjectIdInvalidationMap& invalidation_map) {
|
| + DCHECK(state_ == STARTED);
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| const syncer::ObjectIdInvalidationMap::const_iterator invalidation =
|
| invalidation_map.find(object_id_);
|
| @@ -95,8 +100,28 @@ void CloudPolicyInvalidator::OnIncomingInvalidation(
|
| HandleInvalidation(invalidation->second);
|
| }
|
|
|
| +void CloudPolicyInvalidator::OnCoreConnected(CloudPolicyCore* core) {}
|
| +
|
| +void CloudPolicyInvalidator::OnRefreshSchedulerStarted(CloudPolicyCore* core) {
|
| + DCHECK(state_ == STOPPED);
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + state_ = STARTED;
|
| + OnStoreLoaded(core_->store());
|
| + core_->store()->AddObserver(this);
|
| +}
|
| +
|
| +void CloudPolicyInvalidator::OnCoreDisconnecting(CloudPolicyCore* core) {
|
| + DCHECK(state_ == STARTED || state_ == STOPPED);
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (state_ == STARTED) {
|
| + Unregister();
|
| + core_->store()->RemoveObserver(this);
|
| + state_ = STOPPED;
|
| + }
|
| +}
|
| +
|
| void CloudPolicyInvalidator::OnStoreLoaded(CloudPolicyStore* store) {
|
| - DCHECK(IsInitialized());
|
| + DCHECK(state_ == STARTED);
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| if (registered_timestamp_) {
|
| // Update the kMetricPolicyRefresh histogram. In some cases, this object can
|
| @@ -124,21 +149,6 @@ void CloudPolicyInvalidator::OnStoreLoaded(CloudPolicyStore* store) {
|
|
|
| void CloudPolicyInvalidator::OnStoreError(CloudPolicyStore* store) {}
|
|
|
| -base::WeakPtr<CloudPolicyInvalidator> CloudPolicyInvalidator::GetWeakPtr() {
|
| - DCHECK(!IsInitialized());
|
| - return weak_factory_.GetWeakPtr();
|
| -}
|
| -
|
| -void CloudPolicyInvalidator::Initialize() {
|
| - OnStoreLoaded(store_);
|
| - store_->AddObserver(this);
|
| -}
|
| -
|
| -bool CloudPolicyInvalidator::IsInitialized() {
|
| - // Could have been initialized with a profile or invalidation service.
|
| - return profile_ || invalidation_service_;
|
| -}
|
| -
|
| void CloudPolicyInvalidator::HandleInvalidation(
|
| const syncer::Invalidation& invalidation) {
|
| // The invalidation service may send an invalidation more than once if there
|
| @@ -171,20 +181,20 @@ void CloudPolicyInvalidator::HandleInvalidation(
|
| base::TimeDelta delay = base::TimeDelta::FromMilliseconds(
|
| base::RandInt(20, max_fetch_delay_));
|
|
|
| - // If there is a payload, the invalidate callback can run at any time, so set
|
| - // the version and payload on the client immediately. Otherwise, the callback
|
| + // If there is a payload, the policy can be refreshed at any time, so set
|
| + // the version and payload on the client immediately. Otherwise, the refresh
|
| // must only run after at least kMissingPayloadDelay minutes.
|
| const std::string& payload = invalidation.payload;
|
| if (!invalidation.payload.empty())
|
| - invalidation_handler_->SetInvalidationInfo(invalidation_version_, payload);
|
| + core_->client()->SetInvalidationInfo(invalidation_version_, payload);
|
| else
|
| delay += base::TimeDelta::FromMinutes(kMissingPayloadDelay);
|
|
|
| - // Schedule the invalidate callback to run.
|
| + // Schedule the policy to be refreshed.
|
| task_runner_->PostDelayedTask(
|
| FROM_HERE,
|
| base::Bind(
|
| - &CloudPolicyInvalidator::RunInvalidateCallback,
|
| + &CloudPolicyInvalidator::RefreshPolicy,
|
| weak_factory_.GetWeakPtr(),
|
| payload.empty() /* is_missing_payload */),
|
| delay);
|
| @@ -217,15 +227,6 @@ void CloudPolicyInvalidator::UpdateRegistration(
|
| void CloudPolicyInvalidator::Register(
|
| int64 timestamp,
|
| const invalidation::ObjectId& object_id) {
|
| - // Get the invalidation service from the profile if needed.
|
| - if (!invalidation_service_) {
|
| - DCHECK(profile_);
|
| - invalidation_service_ =
|
| - invalidation::InvalidationServiceFactory::GetForProfile(profile_);
|
| - if (!invalidation_service_)
|
| - return;
|
| - }
|
| -
|
| // Register this handler with the invalidation service if needed.
|
| if (!registered_timestamp_) {
|
| OnInvalidatorStateChange(invalidation_service_->GetInvalidatorState());
|
| @@ -295,33 +296,32 @@ void CloudPolicyInvalidator::UpdateInvalidationsEnabled() {
|
| invalidation_service_enabled_ && registered_timestamp_;
|
| if (invalidations_enabled_ != invalidations_enabled) {
|
| invalidations_enabled_ = invalidations_enabled;
|
| - invalidation_handler_->OnInvalidatorStateChanged(invalidations_enabled);
|
| + core_->refresh_scheduler()->SetInvalidationServiceAvailability(
|
| + invalidations_enabled);
|
| }
|
| }
|
|
|
| -void CloudPolicyInvalidator::RunInvalidateCallback(bool is_missing_payload) {
|
| +void CloudPolicyInvalidator::RefreshPolicy(bool is_missing_payload) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| // In the missing payload case, the invalidation version has not been set on
|
| // the client yet, so set it now that the required time has elapsed.
|
| - if (is_missing_payload) {
|
| - invalidation_handler_->SetInvalidationInfo(
|
| - invalidation_version_,
|
| - std::string());
|
| - }
|
| - invalidation_handler_->InvalidatePolicy();
|
| + if (is_missing_payload)
|
| + core_->client()->SetInvalidationInfo(invalidation_version_, std::string());
|
| + core_->refresh_scheduler()->RefreshSoon();
|
| + policy_refresh_count_++;
|
| }
|
|
|
| void CloudPolicyInvalidator::AcknowledgeInvalidation() {
|
| DCHECK(invalid_);
|
| invalid_ = false;
|
| - invalidation_handler_->SetInvalidationInfo(0, std::string());
|
| + core_->client()->SetInvalidationInfo(0, std::string());
|
| invalidation_service_->AcknowledgeInvalidation(object_id_, ack_handle_);
|
| - // Cancel any scheduled invalidate callbacks.
|
| + // Cancel any scheduled policy refreshes.
|
| weak_factory_.InvalidateWeakPtrs();
|
| }
|
|
|
| int CloudPolicyInvalidator::GetPolicyRefreshMetric() {
|
| - if (store_->policy_changed()) {
|
| + if (core_->store()->policy_changed()) {
|
| if (invalid_)
|
| return METRIC_POLICY_REFRESH_INVALIDATED_CHANGED;
|
| if (invalidations_enabled_)
|
|
|