Chromium Code Reviews| Index: chrome/browser/policy/cloud/cloud_policy_invalidator.h |
| diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator.h b/chrome/browser/policy/cloud/cloud_policy_invalidator.h |
| index 2575d1be371d67a6b97a3248e6e7dcc59eec0960..787c2e8ea63f7484c443c1448363f1e5117b6b69 100644 |
| --- a/chrome/browser/policy/cloud/cloud_policy_invalidator.h |
| +++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.h |
| @@ -12,11 +12,10 @@ |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/threading/thread_checker.h" |
| +#include "chrome/browser/policy/cloud/cloud_policy_core.h" |
| #include "chrome/browser/policy/cloud/cloud_policy_store.h" |
| #include "sync/notifier/invalidation_handler.h" |
| -class Profile; |
| - |
| namespace base { |
| class SequencedTaskRunner; |
| } |
| @@ -27,10 +26,9 @@ class InvalidationService; |
| namespace policy { |
| -class CloudPolicyInvalidationHandler; |
| - |
| // Listens for and provides policy invalidations. |
| class CloudPolicyInvalidator : public syncer::InvalidationHandler, |
| + public CloudPolicyCore::Observer, |
| public CloudPolicyStore::Observer { |
| public: |
| // The number of minutes to delay a policy refresh after receiving an |
| @@ -42,29 +40,25 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler, |
| static const int kMaxFetchDelayMin; |
| static const int kMaxFetchDelayMax; |
| - // |invalidation_handler| handles invalidations provided by this object and |
| - // must remain valid until Shutdown is called. |
| - // |store| is cloud policy store. It must remain valid until Shutdown is |
| - // called. |
| + // |core| is the cloud policy core which connects the various policy objects. |
| + // It must remain valid until Shutdown is called. |
| // |task_runner| is used for scheduling delayed tasks. It must post tasks to |
| // the main policy thread. |
| CloudPolicyInvalidator( |
| - CloudPolicyInvalidationHandler* invalidation_handler, |
| - CloudPolicyStore* store, |
| + CloudPolicyCore* core, |
| const scoped_refptr<base::SequencedTaskRunner>& task_runner); |
| virtual ~CloudPolicyInvalidator(); |
| - // Initializes the invalidator with the given profile. The invalidator uses |
| - // the profile to get a reference to the profile's invalidation service if |
| - // needed. Both the profile and the invalidation service must remain valid |
| - // until Shutdown is called. An Initialize method must only be called once. |
| - void InitializeWithProfile(Profile* profile); |
| - |
| - // Initializes the invalidator with the invalidation service. It must remain |
| - // valid until Shutdown is called. An Initialize method must only be called |
| - // once. |
| - void InitializeWithService( |
| - invalidation::InvalidationService* invalidation_service); |
| + // Initializes the invalidator. No invalidations will be generated before this |
| + // method is called. This method must only be called once. |
| + // |get_invalidation_service| is a callback which gets a pointer to the |
| + // invalidation service. It must be callable until Shutdown is called and the |
| + // pointer returned must also remain valid during that time. A callback is |
| + // passed instead of of the raw pointer so that the InvalidationService can be |
| + // lazily initialized. |
| + typedef base::Callback<invalidation::InvalidationService*()> |
| + GetInvalidationService; |
| + void Initialize(const GetInvalidationService& get_invalidation_service); |
|
Mattias Nissler (ping if slow)
2013/09/02 11:54:52
I still don't see why we can't pass the Invalidati
Steve Condie
2013/09/03 04:41:56
Creating and registering with the InvalidationServ
Mattias Nissler (ping if slow)
2013/09/03 14:46:36
Do you have a stack trace? This likely indicates a
Steve Condie
2013/09/04 18:00:38
Added a TODO to investigate a solution on the Inva
|
| // Shuts down and disables invalidations. It must be called before the object |
| // is destroyed. |
| @@ -81,23 +75,31 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler, |
| virtual void OnIncomingInvalidation( |
| const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; |
| + // CloudPolicyCore::Observer: |
| + virtual void OnCoreConnected(CloudPolicyCore* core) OVERRIDE; |
| + virtual void OnRefreshSchedulerStarted(CloudPolicyCore* core) OVERRIDE; |
| + virtual void OnCoreDisconnected(CloudPolicyCore* core) OVERRIDE; |
| + |
| // CloudPolicyStore::Observer: |
| virtual void OnStoreLoaded(CloudPolicyStore* store) OVERRIDE; |
| virtual void OnStoreError(CloudPolicyStore* store) OVERRIDE; |
| - protected: |
| - // Allows subclasses to create a weak pointer to the object. The pointer |
| - // should only be used to call one of the Initialize methods, as after the |
| - // object is initialized weak pointers may be invalidated at any time. |
| - base::WeakPtr<CloudPolicyInvalidator> GetWeakPtr(); |
| - |
| - private: |
| - // Initialize the invalidator. |
| - void Initialize(); |
| + // Expose the number of times the invalidator has refreshed the policy. For |
| + // testing only. |
| + int policy_refresh_count() { |
| + return policy_refresh_count_; |
| + } |
| - // Returns whether an Initialize method has been called. |
| - bool IsInitialized(); |
| + // Expose the number of times the invalidator has notified the refresh |
| + // scheduler of a state change. For testing only. |
| + int invalidations_enabled_count() { |
| + return invalidations_enabled_count_; |
| + } |
| + int invalidations_disabled_count() { |
| + return invalidations_disabled_count_; |
| + } |
| + private: |
| // Handle an invalidation to the policy. |
| void HandleInvalidation(const syncer::Invalidation& invalidation); |
| @@ -119,10 +121,14 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler, |
| // value changed. |
| void UpdateInvalidationsEnabled(); |
| - // Run the invalidate callback on the invalidation handler. is_missing_payload |
| - // is set to true if the callback is being invoked in response to an |
| - // invalidation with a missing payload. |
| - void RunInvalidateCallback(bool is_missing_payload); |
| + // Sets the current invalidation info on the cloud policy client. |
| + void SetInvalidationInfo(int64 invalidation_version, |
| + const std::string& payload); |
| + |
| + // Refresh the policy. |
| + // |is_missing_payload| is set to true if the callback is being invoked in |
| + // response to an invalidation with a missing payload. |
| + void RefreshPolicy(bool is_missing_payload); |
| // Acknowledge the latest invalidation. |
| void AcknowledgeInvalidation(); |
| @@ -131,18 +137,23 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler, |
| // when a policy is stored. |
| int GetPolicyRefreshMetric(); |
| - // The handler for invalidations provded by this object. |
| - CloudPolicyInvalidationHandler* invalidation_handler_; |
| + // The state of the object. |
| + enum State { |
| + UNINITIALIZED, |
| + STOPPED, |
| + STARTED, |
| + SHUT_DOWN |
| + }; |
| + State state_; |
| - // The cloud policy store. |
| - CloudPolicyStore* store_; |
| + // The cloud policy core. |
| + CloudPolicyCore* core_; |
| // Schedules delayed tasks. |
| const scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| - // The profile which will be used to get a reference to an invalidation |
| - // service. |
| - Profile* profile_; |
| + // The callback invoked to lazily retrieve the invalidation service. |
| + GetInvalidationService get_invalidation_service_; |
| // The invalidation service. |
| invalidation::InvalidationService* invalidation_service_; |
| @@ -191,29 +202,12 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler, |
| // thread. |
| base::ThreadChecker thread_checker_; |
| - DISALLOW_COPY_AND_ASSIGN(CloudPolicyInvalidator); |
| -}; |
| + // Counters used for testing. |
| + int policy_refresh_count_; |
| + int invalidations_enabled_count_; |
| + int invalidations_disabled_count_; |
| -// Handles invalidations to cloud policy objects. |
| -class CloudPolicyInvalidationHandler { |
| - public: |
| - virtual ~CloudPolicyInvalidationHandler() {} |
| - |
| - // This method is called when the current invalidation info should be set |
| - // on the cloud policy client. |
| - virtual void SetInvalidationInfo( |
| - int64 version, |
| - const std::string& payload) = 0; |
| - |
| - // This method is called when the policy should be refreshed due to an |
| - // invalidation. A policy fetch should be scheduled in the near future. |
| - virtual void InvalidatePolicy() = 0; |
| - |
| - // This method is called when the invalidator determines that the ability to |
| - // receive policy invalidations becomes enabled or disabled. The invalidator |
| - // starts in a disabled state, so the first call to this method is always when |
| - // the invalidator becomes enabled. |
| - virtual void OnInvalidatorStateChanged(bool invalidations_enabled) = 0; |
| + DISALLOW_COPY_AND_ASSIGN(CloudPolicyInvalidator); |
| }; |
| } // namespace policy |