Chromium Code Reviews| 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 b71b9340422c815ce888443436451a95c472b52e..2c8db03ca751cafa81fe6cda90dc2df0414e95cb 100644 |
| --- a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc |
| +++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc |
| @@ -42,7 +42,6 @@ CloudPolicyInvalidator::CloudPolicyInvalidator( |
| invalid_(false), |
| invalidation_version_(0), |
| unknown_version_invalidation_count_(0), |
| - ack_handle_(syncer::AckHandle::InvalidAckHandle()), |
| weak_factory_(this), |
| max_fetch_delay_(kMaxFetchDelayDefault), |
| policy_hash_value_(0) { |
| @@ -98,6 +97,16 @@ void CloudPolicyInvalidator::OnIncomingInvalidation( |
| NOTREACHED(); |
| return; |
| } |
| + |
| + // Acknowledge all except the invalidation with the highest version. |
| + syncer::SingleObjectInvalidationSet::const_reverse_iterator it = |
| + list.rbegin(); |
| + ++it; |
| + for ( ; it != list.rend(); ++it) { |
| + it->Acknowledge(); |
| + } |
| + |
| + // Handle the highest version invalidation. |
| HandleInvalidation(list.back()); |
| } |
| @@ -154,10 +163,12 @@ void CloudPolicyInvalidator::OnStoreError(CloudPolicyStore* store) {} |
| void CloudPolicyInvalidator::HandleInvalidation( |
| const syncer::Invalidation& invalidation) { |
| - // The invalidation service may send an invalidation more than once if there |
| - // is a delay in acknowledging it. Duplicate invalidations are ignored. |
| - if (invalid_ && ack_handle_.Equals(invalidation.ack_handle())) |
| + // Ignore old invalidations. |
| + if (invalid_ && |
| + !invalidation.is_unknown_version() && |
| + invalidation.version() <= invalidation_version_) { |
| return; |
| + } |
| // If there is still a pending invalidation, acknowledge it, since we only |
| // care about the latest invalidation. |
| @@ -166,7 +177,7 @@ void CloudPolicyInvalidator::HandleInvalidation( |
| // Update invalidation state. |
| invalid_ = true; |
| - ack_handle_ = invalidation.ack_handle(); |
| + invalidation_.reset(new syncer::Invalidation(invalidation)); |
| // When an invalidation with unknown version is received, use negative |
| // numbers based on the number of such invalidations received. This |
| @@ -322,8 +333,9 @@ void CloudPolicyInvalidator::AcknowledgeInvalidation() { |
| DCHECK(invalid_); |
| invalid_ = false; |
| core_->client()->SetInvalidationInfo(0, std::string()); |
| - invalidation_service_->AcknowledgeInvalidation(object_id_, ack_handle_); |
| - // Cancel any scheduled policy refreshes. |
| + invalidation_->Acknowledge(); |
| + invalidation_.reset(); |
| + // Cancel any scheduled invalidate callbacks. |
|
Steve Condie
2013/11/25 19:57:29
Change back to current comment. I think this was t
rlarocque
2013/11/25 21:51:25
Thanks for noticing. This patch has been in progr
|
| weak_factory_.InvalidateWeakPtrs(); |
| } |