Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1404)

Unified Diff: chrome/browser/policy/cloud/cloud_policy_invalidator.h

Issue 23592017: Fix policy invalidator lifecycle bugs for Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..76e19b9912f9bdb72c0e77f26c669b5a2611cb6d 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator.h
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.h
@@ -15,8 +15,6 @@
#include "chrome/browser/policy/cloud/cloud_policy_store.h"
#include "sync/notifier/invalidation_handler.h"
-class Profile;
-
namespace base {
class SequencedTaskRunner;
}
@@ -42,6 +40,16 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler,
static const int kMaxFetchDelayMin;
static const int kMaxFetchDelayMax;
+ // A callback used to get a pointer to an invalidation service.
+ typedef base::Callback<invalidation::InvalidationService*()>
+ GetInvalidationService;
+
+ // |get_invalidation_service| is a callback which gets a pointer to the
+ // invalidation service. The pointer returned is not owned by this object and
+ // must remain valid until Shutdown is called. A callback is passed instead of
+ // of the raw pointer so that the InvalidationService can be lazily
+ // initialized. This prevents attempting to access the service before it is
+ // ready or if it is not needed.
Mattias Nissler (ping if slow) 2013/08/29 16:02:30 Can you tell me more about the not-ready case? It
Steve Condie 2013/08/30 00:16:35 The requirements to turn on the invalidator are 1)
Mattias Nissler (ping if slow) 2013/09/02 11:54:52 Why?
// |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
@@ -49,25 +57,29 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler,
// |task_runner| is used for scheduling delayed tasks. It must post tasks to
// the main policy thread.
CloudPolicyInvalidator(
+ const GetInvalidationService& get_invalidation_service,
CloudPolicyInvalidationHandler* invalidation_handler,
CloudPolicyStore* store,
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);
-
- // Shuts down and disables invalidations. It must be called before the object
- // is destroyed.
+ // Starts the invalidator. This method should be called after the invalidation
+ // handler is ready to receive invalidations and the invalidation service is
+ // ready for use. This method must only be called when the object is in the
+ // stopped state (the initial state) and moves the object into the started
+ // state.
+ void Start();
+
+ // Stops the invalidator. This method should be only called when the cloud
+ // policy is being discarded because the user explicitly signed out; it should
+ // not be called for a normal session shutdown. This method must only be
+ // called when the object is in the started state and moves the object into
+ // the stopped state.
+ void Stop();
+
+ // Shuts down the invalidator. This method must be called before the object
+ // is destroyed. It can be called when the object is in either the started or
+ // stopped state and moves the object into the shut-down state.
void Shutdown();
// Whether the invalidator currently has the ability to receive invalidations.
@@ -85,19 +97,7 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler,
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();
-
- // Returns whether an Initialize method has been called.
- bool IsInitialized();
-
// Handle an invalidation to the policy.
void HandleInvalidation(const syncer::Invalidation& invalidation);
@@ -131,7 +131,18 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler,
// when a policy is stored.
int GetPolicyRefreshMetric();
- // The handler for invalidations provded by this object.
+ // The state of the object.
+ enum State {
+ STOPPED,
+ STARTED,
+ SHUT_DOWN
+ };
+ State state_;
+
+ // The callback invoked to lazily retrieve the invalidation service.
+ GetInvalidationService get_invalidation_service_;
+
+ // The handler for invalidations provided by this object.
CloudPolicyInvalidationHandler* invalidation_handler_;
// The cloud policy store.
@@ -140,10 +151,6 @@ class CloudPolicyInvalidator : public syncer::InvalidationHandler,
// 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 invalidation service.
invalidation::InvalidationService* invalidation_service_;

Powered by Google App Engine
This is Rietveld 408576698