Index: chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.cc |
diff --git a/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.cc b/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.cc |
index b8b81e0fbcfdf7b23cb15b35f4488cd82f4192b6..1e52211bcc5ed15f6f707f0aa86a2ea941d43991 100644 |
--- a/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.cc |
+++ b/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.cc |
@@ -125,13 +125,14 @@ void PushMessagingInvalidationHandler::OnInvalidatorStateChange( |
void PushMessagingInvalidationHandler::OnIncomingInvalidation( |
const syncer::ObjectIdInvalidationMap& invalidation_map) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ invalidation_map.AcknowledgeAll(); |
+ |
syncer::ObjectIdSet ids = invalidation_map.GetObjectIds(); |
for (syncer::ObjectIdSet::const_iterator it = ids.begin(); |
it != ids.end(); ++it) { |
const syncer::SingleObjectInvalidationSet& list = |
invalidation_map.ForObject(*it); |
const syncer::Invalidation& invalidation = list.back(); |
- service_->AcknowledgeInvalidation(*it, invalidation.ack_handle()); |
std::string payload; |
if (invalidation.is_unknown_version()) { |
@@ -140,8 +141,7 @@ void PushMessagingInvalidationHandler::OnIncomingInvalidation( |
payload = list.back().payload(); |
} |
- syncer::ObjectIdSet::iterator suppressed_id = |
- suppressed_ids_.find(*it); |
+ syncer::ObjectIdSet::iterator suppressed_id = suppressed_ids_.find(*it); |
if (suppressed_id != suppressed_ids_.end()) { |
suppressed_ids_.erase(suppressed_id); |
continue; |
@@ -153,10 +153,29 @@ void PushMessagingInvalidationHandler::OnIncomingInvalidation( |
std::string extension_id; |
int subchannel; |
if (ObjectIdToExtensionAndSubchannel(*it, &extension_id, &subchannel)) { |
- DVLOG(2) << "Sending push message to reciever, extension is " |
- << extension_id << ", subchannel is " << subchannel |
- << ", and payload is " << payload; |
- delegate_->OnMessage(extension_id, subchannel, payload); |
+ const syncer::SingleObjectInvalidationSet& invalidation_list = |
+ invalidation_map.ForObject(*it); |
+ |
+ // We always forward unknown version invalidation when we receive one. |
+ if (invalidation_list.StartsWithUnknownVersion()) { |
+ DVLOG(2) << "Sending push message to reciever, extension is " |
+ << extension_id << ", subchannel is " << subchannel |
+ << "and payload was lost"; |
+ delegate_->OnMessage(extension_id, subchannel, std::string()); |
+ } |
+ |
+ // If we receive a new max version for this object, forward its payload. |
+ const syncer::Invalidation& max_invalidation = invalidation_list.back(); |
+ if (!max_invalidation.is_unknown_version() && |
+ max_invalidation.version() > max_object_version_map_[*it]) { |
+ max_object_version_map_[*it] = max_invalidation.version(); |
+ DVLOG(2) << "Sending push message to reciever, extension is " |
+ << extension_id << ", subchannel is " << subchannel |
+ << ", and payload is " << max_invalidation.payload(); |
+ delegate_->OnMessage(extension_id, |
+ subchannel, |
+ max_invalidation.payload()); |
+ } |
} |
} |
} |