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

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

Issue 19733003: Implement cloud policy invalidations using the invalidation service framework. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 5 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
new file mode 100644
index 0000000000000000000000000000000000000000..2b92c44a3a07dba38ae9548b6d3ee87479b14d2a
--- /dev/null
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.h
@@ -0,0 +1,221 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_POLICY_CLOUD_CLOUD_POLICY_INVALIDATOR_H_
+#define CHROME_BROWSER_POLICY_CLOUD_CLOUD_POLICY_INVALIDATOR_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/callback.h"
+#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_store.h"
+#include "sync/notifier/invalidation_handler.h"
+
+class Profile;
+
+namespace base {
+class SequencedTaskRunner;
+}
+
+namespace invalidation {
+class InvalidationService;
+}
+
+namespace policy {
+
+class CloudPolicyInvalidationHandler;
+
+// Listens for and provides policy invalidations.
+class CloudPolicyInvalidator : public syncer::InvalidationHandler,
+ public CloudPolicyStore::Observer {
+ public:
+ // The number of minutes to delay a policy refresh after receiving an
+ // invalidation with no payload.
+ static const int kMissingPayloadDelay;
+
+ // The default, min and max values for max_fetch_delay_.
+ static const int kMaxFetchDelayDefault;
+ 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.
+ // |task_runner| is used for scheduling delayed tasks. It must post tasks to
+ // the main policy thread.
+ CloudPolicyInvalidator(
+ 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.
+ void Shutdown();
+
+ // Whether the invalidator currently has the ability to receive invalidations.
+ bool invalidations_enabled() {
+ return invalidations_enabled_;
+ }
+
+ // syncer::InvalidationHandler:
+ virtual void OnInvalidatorStateChange(
+ syncer::InvalidatorState state) OVERRIDE;
+ virtual void OnIncomingInvalidation(
+ const syncer::ObjectIdInvalidationMap& invalidation_map) 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();
+
+ // Returns whether an Initialize method has been called.
+ bool IsInitialized();
+
+ // Handle an invalidation to the policy.
+ void HandleInvalidation(const syncer::Invalidation& invalidation);
+
+ // Update object registration with the invalidation service based on the
+ // given policy data.
+ void UpdateRegistration(const enterprise_management::PolicyData* policy);
+
+ // Registers the given object with the invalidation service.
+ void Register(int64 timestamp, const invalidation::ObjectId& object_id);
+
+ // Unregisters the current object with the invalidation service.
+ void Unregister();
+
+ // Update |max_fetch_delay_| based on the given policy map.
+ void UpdateMaxFetchDelay(const PolicyMap& policy_map);
+ void set_max_fetch_delay(int delay);
+
+ // Updates invalidations_enabled_ and calls the invalidation handler if the
+ // 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);
+
+ // Acknowledge the latest invalidation.
+ void AcknowledgeInvalidation();
+
+ // Get the kMetricPolicyRefresh histogram metric which should be incremented
+ // when a policy is stored.
+ int GetPolicyRefreshMetric();
+
+ // The handler for invalidations provded by this object.
+ CloudPolicyInvalidationHandler* invalidation_handler_;
+
+ // The cloud policy store.
+ CloudPolicyStore* store_;
+
+ // 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_;
+
+ // Whether the invalidator currently has the ability to receive invalidations.
+ // This is true if the invalidation service is enabled and the invalidator
+ // has registered for a policy object.
+ bool invalidations_enabled_;
+
+ // Whether the invalidation service is currently enabled.
+ bool invalidation_service_enabled_;
+
+ // The timestamp of the PolicyData at which this object registered for policy
+ // invalidations. Set to zero if the object has not registered yet.
+ int64 registered_timestamp_;
+
+ // The object id representing the policy in the invalidation service.
+ invalidation::ObjectId object_id_;
+
+ // Whether the policy is current invalid. This is set to true when an
+ // invalidation is received and reset when the policy fetched due to the
+ // invalidation is stored.
+ bool invalid_;
+
+ // The version of the latest invalidation received. This is compared to
+ // the invalidation version of policy stored to determine when the
+ // invalidated policy is up-to-date.
+ int64 invalidation_version_;
+
+ // The number of invalidations with unknown version received. Since such
+ // invalidations do not provide a version number, this count is used to set
+ // invalidation_version_ when such invalidations occur.
+ int unknown_version_invalidation_count_;
+
+ // The acknowledgment handle for the current invalidation.
+ syncer::AckHandle ack_handle_;
+
+ // WeakPtrFactory used to create callbacks to this object.
+ base::WeakPtrFactory<CloudPolicyInvalidator> weak_factory_;
+
+ // The maximum random delay, in ms, between receiving an invalidation and
+ // fetching the new policy.
+ int max_fetch_delay_;
+
+ // A thread checker to make sure that callbacks are invoked on the correct
+ // thread.
+ base::ThreadChecker thread_checker_;
+
+ DISALLOW_COPY_AND_ASSIGN(CloudPolicyInvalidator);
+};
+
+// 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;
+};
+
+} // namespace policy
+
+#endif // CHROME_BROWSER_POLICY_CLOUD_CLOUD_POLICY_INVALIDATOR_H_

Powered by Google App Engine
This is Rietveld 408576698