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 |
deleted file mode 100644 |
index 6f091b599f3fea8ee4426a070d451ebdae9afb29..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.cc |
+++ /dev/null |
@@ -1,199 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.h" |
- |
-#include <algorithm> |
-#include <vector> |
- |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_split.h" |
-#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_delegate.h" |
-#include "components/crx_file/id_util.h" |
-#include "components/invalidation/invalidation_service.h" |
-#include "components/invalidation/object_id_invalidation_map.h" |
-#include "extensions/common/extension.h" |
-#include "google/cacheinvalidation/types.pb.h" |
- |
-namespace extensions { |
- |
-namespace { |
- |
-const int kNumberOfSubchannels = 4; |
- |
-// Chrome push messaging object IDs currently have the following format: |
-// <format type>/<GAIA ID>/<extension ID>/<subchannel> |
-// <format type> must be 'U', and <GAIA ID> is handled server-side so the client |
-// never sees it. |
-syncer::ObjectIdSet ExtensionIdToObjectIds(const std::string& extension_id) { |
- syncer::ObjectIdSet object_ids; |
- for (int i = 0; i < kNumberOfSubchannels; ++i) { |
- std::string name("U/"); |
- name += extension_id; |
- name += "/"; |
- name += base::IntToString(i); |
- object_ids.insert(invalidation::ObjectId( |
- ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, |
- name)); |
- } |
- return object_ids; |
-} |
- |
-// Returns true iff the conversion was successful. |
-bool ObjectIdToExtensionAndSubchannel(const invalidation::ObjectId& object_id, |
- std::string* extension_id, |
- int* subchannel) { |
- if (object_id.source() != |
- ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING) { |
- DLOG(WARNING) << "Invalid source: " << object_id.source(); |
- return false; |
- } |
- |
- const std::string& name = object_id.name(); |
- std::vector<std::string> components; |
- base::SplitStringDontTrim(name, '/', &components); |
- if (components.size() < 3) { |
- DLOG(WARNING) << "Invalid format type from object name " << name; |
- return false; |
- } |
- if (components[0] != "U") { |
- DLOG(WARNING) << "Invalid format type from object name " << name; |
- return false; |
- } |
- if (!crx_file::id_util::IdIsValid(components[1])) { |
- DLOG(WARNING) << "Invalid extension ID from object name " << name; |
- return false; |
- } |
- *extension_id = components[1]; |
- if (!base::StringToInt(components[2], subchannel)) { |
- DLOG(WARNING) << "Subchannel not a number from object name " << name; |
- return false; |
- } |
- if (*subchannel < 0 || *subchannel >= kNumberOfSubchannels) { |
- DLOG(WARNING) << "Subchannel out of range from object name " << name; |
- return false; |
- } |
- return true; |
-} |
- |
-} // namespace |
- |
-PushMessagingInvalidationHandler::PushMessagingInvalidationHandler( |
- invalidation::InvalidationService* service, |
- PushMessagingInvalidationHandlerDelegate* delegate) |
- : service_(service), |
- delegate_(delegate) { |
- DCHECK(service_); |
- service_->RegisterInvalidationHandler(this); |
-} |
- |
-PushMessagingInvalidationHandler::~PushMessagingInvalidationHandler() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- service_->UnregisterInvalidationHandler(this); |
-} |
- |
-void PushMessagingInvalidationHandler::SuppressInitialInvalidationsForExtension( |
- const std::string& extension_id) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- const syncer::ObjectIdSet& suppressed_ids = |
- ExtensionIdToObjectIds(extension_id); |
- suppressed_ids_.insert(suppressed_ids.begin(), suppressed_ids.end()); |
-} |
- |
-void PushMessagingInvalidationHandler::RegisterExtension( |
- const std::string& extension_id) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(crx_file::id_util::IdIsValid(extension_id)); |
- registered_extensions_.insert(extension_id); |
- UpdateRegistrations(); |
-} |
- |
-void PushMessagingInvalidationHandler::UnregisterExtension( |
- const std::string& extension_id) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(crx_file::id_util::IdIsValid(extension_id)); |
- registered_extensions_.erase(extension_id); |
- UpdateRegistrations(); |
-} |
- |
-void PushMessagingInvalidationHandler::OnInvalidatorStateChange( |
- syncer::InvalidatorState state) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- // Nothing to do. |
-} |
- |
-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(); |
- |
- std::string payload; |
- if (invalidation.is_unknown_version()) { |
- payload = std::string(); |
- } else { |
- payload = list.back().payload(); |
- } |
- |
- syncer::ObjectIdSet::iterator suppressed_id = suppressed_ids_.find(*it); |
- if (suppressed_id != suppressed_ids_.end()) { |
- suppressed_ids_.erase(suppressed_id); |
- continue; |
- } |
- DVLOG(2) << "Incoming push message, id is: " |
- << syncer::ObjectIdToString(*it) |
- << " and payload is:" << payload; |
- |
- std::string extension_id; |
- int subchannel; |
- if (ObjectIdToExtensionAndSubchannel(*it, &extension_id, &subchannel)) { |
- 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 receiver, 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 receiver, extension is " |
- << extension_id << ", subchannel is " << subchannel |
- << ", and payload is " << max_invalidation.payload(); |
- delegate_->OnMessage(extension_id, |
- subchannel, |
- max_invalidation.payload()); |
- } |
- } |
- } |
-} |
- |
-std::string PushMessagingInvalidationHandler::GetOwnerName() const { |
- return "PushMessagingApi"; |
-} |
- |
-void PushMessagingInvalidationHandler::UpdateRegistrations() { |
- syncer::ObjectIdSet ids; |
- for (std::set<std::string>::const_iterator it = |
- registered_extensions_.begin(); it != registered_extensions_.end(); |
- ++it) { |
- const syncer::ObjectIdSet& object_ids = ExtensionIdToObjectIds(*it); |
- ids.insert(object_ids.begin(), object_ids.end()); |
- } |
- service_->UpdateRegisteredInvalidationIds(this, ids); |
-} |
- |
-} // namespace extensions |