Index: chrome/browser/policy/cloud_policy_provider_impl.cc |
diff --git a/chrome/browser/policy/cloud_policy_provider_impl.cc b/chrome/browser/policy/cloud_policy_provider_impl.cc |
index d1c3f3b7a21b50289370dc6f0524bcc5caeb9c40..9428636aead547797264e20c528ac9813e72019e 100644 |
--- a/chrome/browser/policy/cloud_policy_provider_impl.cc |
+++ b/chrome/browser/policy/cloud_policy_provider_impl.cc |
@@ -4,14 +4,19 @@ |
#include "chrome/browser/policy/cloud_policy_provider_impl.h" |
+#include <algorithm> |
+ |
+#include "chrome/browser/policy/browser_policy_connector.h" |
#include "chrome/browser/policy/configuration_policy_pref_store.h" |
namespace policy { |
CloudPolicyProviderImpl::CloudPolicyProviderImpl( |
+ BrowserPolicyConnector* browser_policy_connector, |
const PolicyDefinitionList* policy_list, |
CloudPolicyCacheBase::PolicyLevel level) |
: CloudPolicyProvider(policy_list), |
+ browser_policy_connector_(browser_policy_connector), |
level_(level), |
initialization_complete_(true) {} |
@@ -29,19 +34,23 @@ bool CloudPolicyProviderImpl::IsInitializationComplete() const { |
return initialization_complete_; |
} |
+void CloudPolicyProviderImpl::RefreshPolicies() { |
+ pending_update_caches_ = caches_; |
+ if (pending_update_caches_.empty()) |
+ NotifyPolicyUpdated(); |
+ else |
+ browser_policy_connector_->FetchCloudPolicy(); |
+} |
+ |
void CloudPolicyProviderImpl::OnCacheUpdate(CloudPolicyCacheBase* cache) { |
+ RemoveCache(cache, &pending_update_caches_); |
RecombineCachesAndTriggerUpdate(); |
} |
void CloudPolicyProviderImpl::OnCacheGoingAway(CloudPolicyCacheBase* cache) { |
cache->RemoveObserver(this); |
- for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i) { |
- if (*i == cache) { |
- caches_.erase(i); |
- break; |
- } |
- } |
- |
+ RemoveCache(cache, &caches_); |
+ RemoveCache(cache, &pending_update_caches_); |
RecombineCachesAndTriggerUpdate(); |
} |
@@ -112,7 +121,15 @@ void CloudPolicyProviderImpl::RecombineCachesAndTriggerUpdate() { |
// Trigger a notification. |
combined_.Swap(&newly_combined); |
- NotifyPolicyUpdated(); |
+ if (pending_update_caches_.empty()) |
+ NotifyPolicyUpdated(); |
+} |
+ |
+void CloudPolicyProviderImpl::RemoveCache(CloudPolicyCacheBase* cache, |
+ ListType* caches) { |
+ ListType::iterator it = std::find(caches->begin(), caches->end(), cache); |
+ if (it != caches->end()) |
+ caches->erase(it); |
} |
} // namespace policy |