| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "sync/notifier/chrome_invalidation_client.h" | 5 #include "sync/notifier/chrome_invalidation_client.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/callback.h" |
| 10 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 11 #include "base/logging.h" | 12 #include "base/logging.h" |
| 12 #include "base/tracked_objects.h" | 13 #include "base/tracked_objects.h" |
| 13 #include "google/cacheinvalidation/include/invalidation-client-factory.h" | |
| 14 #include "google/cacheinvalidation/include/invalidation-client.h" | 14 #include "google/cacheinvalidation/include/invalidation-client.h" |
| 15 #include "google/cacheinvalidation/include/types.h" | 15 #include "google/cacheinvalidation/include/types.h" |
| 16 #include "google/cacheinvalidation/types.pb.h" | 16 #include "google/cacheinvalidation/types.pb.h" |
| 17 #include "jingle/notifier/listener/push_client.h" | 17 #include "jingle/notifier/listener/push_client.h" |
| 18 #include "sync/notifier/invalidation_util.h" | 18 #include "sync/notifier/invalidation_util.h" |
| 19 #include "sync/notifier/registration_manager.h" | 19 #include "sync/notifier/registration_manager.h" |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 const char kApplicationName[] = "chrome-sync"; | 23 const char kApplicationName[] = "chrome-sync"; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 41 } | 41 } |
| 42 | 42 |
| 43 ChromeInvalidationClient::~ChromeInvalidationClient() { | 43 ChromeInvalidationClient::~ChromeInvalidationClient() { |
| 44 DCHECK(CalledOnValidThread()); | 44 DCHECK(CalledOnValidThread()); |
| 45 push_client_->RemoveObserver(this); | 45 push_client_->RemoveObserver(this); |
| 46 Stop(); | 46 Stop(); |
| 47 DCHECK(!listener_); | 47 DCHECK(!listener_); |
| 48 } | 48 } |
| 49 | 49 |
| 50 void ChromeInvalidationClient::Start( | 50 void ChromeInvalidationClient::Start( |
| 51 const CreateInvalidationClientCallback& |
| 52 create_invalidation_client_callback, |
| 51 const std::string& client_id, const std::string& client_info, | 53 const std::string& client_id, const std::string& client_info, |
| 52 const std::string& state, | 54 const std::string& state, |
| 53 const InvalidationVersionMap& initial_max_invalidation_versions, | 55 const InvalidationVersionMap& initial_max_invalidation_versions, |
| 54 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | 56 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, |
| 55 Listener* listener) { | 57 Listener* listener) { |
| 56 DCHECK(CalledOnValidThread()); | 58 DCHECK(CalledOnValidThread()); |
| 57 Stop(); | 59 Stop(); |
| 58 | 60 |
| 59 chrome_system_resources_.set_platform(client_info); | 61 chrome_system_resources_.set_platform(client_info); |
| 60 chrome_system_resources_.Start(); | 62 chrome_system_resources_.Start(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 78 } | 80 } |
| 79 invalidation_state_tracker_ = invalidation_state_tracker; | 81 invalidation_state_tracker_ = invalidation_state_tracker; |
| 80 DCHECK(invalidation_state_tracker_.IsInitialized()); | 82 DCHECK(invalidation_state_tracker_.IsInitialized()); |
| 81 | 83 |
| 82 DCHECK(!listener_); | 84 DCHECK(!listener_); |
| 83 DCHECK(listener); | 85 DCHECK(listener); |
| 84 listener_ = listener; | 86 listener_ = listener; |
| 85 | 87 |
| 86 int client_type = ipc::invalidation::ClientType::CHROME_SYNC; | 88 int client_type = ipc::invalidation::ClientType::CHROME_SYNC; |
| 87 invalidation_client_.reset( | 89 invalidation_client_.reset( |
| 88 invalidation::CreateInvalidationClient( | 90 create_invalidation_client_callback.Run( |
| 89 &chrome_system_resources_, client_type, client_id, | 91 &chrome_system_resources_, client_type, client_id, |
| 90 kApplicationName, this)); | 92 kApplicationName, this)); |
| 91 invalidation_client_->Start(); | 93 invalidation_client_->Start(); |
| 92 | 94 |
| 93 registration_manager_.reset( | 95 registration_manager_.reset( |
| 94 new RegistrationManager(invalidation_client_.get())); | 96 new RegistrationManager(invalidation_client_.get())); |
| 95 } | 97 } |
| 96 | 98 |
| 97 void ChromeInvalidationClient::UpdateCredentials( | 99 void ChromeInvalidationClient::UpdateCredentials( |
| 98 const std::string& email, const std::string& token) { | 100 const std::string& email, const std::string& token) { |
| 99 DCHECK(CalledOnValidThread()); | 101 DCHECK(CalledOnValidThread()); |
| 100 chrome_system_resources_.network()->UpdateCredentials(email, token); | 102 chrome_system_resources_.network()->UpdateCredentials(email, token); |
| 101 } | 103 } |
| 102 | 104 |
| 103 void ChromeInvalidationClient::RegisterIds(const ObjectIdSet& ids) { | 105 void ChromeInvalidationClient::UpdateRegisteredIds(const ObjectIdSet& ids) { |
| 104 DCHECK(CalledOnValidThread()); | 106 DCHECK(CalledOnValidThread()); |
| 105 registered_ids_ = ids; | 107 registered_ids_ = ids; |
| 106 // |ticl_state_| can go to NO_NOTIFICATION_ERROR even without a | 108 // |ticl_state_| can go to NO_NOTIFICATION_ERROR even without a |
| 107 // working XMPP connection (as observed by us), so check it instead | 109 // working XMPP connection (as observed by us), so check it instead |
| 108 // of GetState() (see http://crbug.com/139424). | 110 // of GetState() (see http://crbug.com/139424). |
| 109 if (ticl_state_ == NO_NOTIFICATION_ERROR && registration_manager_.get()) { | 111 if (ticl_state_ == NO_NOTIFICATION_ERROR && registration_manager_.get()) { |
| 110 registration_manager_->SetRegisteredIds(registered_ids_); | 112 registration_manager_->UpdateRegisteredIds(registered_ids_); |
| 111 } | 113 } |
| 112 // TODO(akalin): Clear invalidation versions for unregistered types. | 114 // TODO(akalin): Clear invalidation versions for unregistered types. |
| 113 } | 115 } |
| 114 | 116 |
| 115 void ChromeInvalidationClient::Ready( | 117 void ChromeInvalidationClient::Ready( |
| 116 invalidation::InvalidationClient* client) { | 118 invalidation::InvalidationClient* client) { |
| 119 DCHECK(CalledOnValidThread()); |
| 120 DCHECK_EQ(client, invalidation_client_.get()); |
| 117 ticl_state_ = NO_NOTIFICATION_ERROR; | 121 ticl_state_ = NO_NOTIFICATION_ERROR; |
| 118 EmitStateChange(); | 122 EmitStateChange(); |
| 119 registration_manager_->SetRegisteredIds(registered_ids_); | 123 registration_manager_->UpdateRegisteredIds(registered_ids_); |
| 120 } | 124 } |
| 121 | 125 |
| 122 void ChromeInvalidationClient::Invalidate( | 126 void ChromeInvalidationClient::Invalidate( |
| 123 invalidation::InvalidationClient* client, | 127 invalidation::InvalidationClient* client, |
| 124 const invalidation::Invalidation& invalidation, | 128 const invalidation::Invalidation& invalidation, |
| 125 const invalidation::AckHandle& ack_handle) { | 129 const invalidation::AckHandle& ack_handle) { |
| 126 DCHECK(CalledOnValidThread()); | 130 DCHECK(CalledOnValidThread()); |
| 131 DCHECK_EQ(client, invalidation_client_.get()); |
| 127 DVLOG(1) << "Invalidate: " << InvalidationToString(invalidation); | 132 DVLOG(1) << "Invalidate: " << InvalidationToString(invalidation); |
| 128 | 133 |
| 129 const invalidation::ObjectId& id = invalidation.object_id(); | 134 const invalidation::ObjectId& id = invalidation.object_id(); |
| 130 | 135 |
| 131 // The invalidation API spec allows for the possibility of redundant | 136 // The invalidation API spec allows for the possibility of redundant |
| 132 // invalidations, so keep track of the max versions and drop | 137 // invalidations, so keep track of the max versions and drop |
| 133 // invalidations with old versions. | 138 // invalidations with old versions. |
| 134 // | 139 // |
| 135 // TODO(akalin): Now that we keep track of registered ids, we | 140 // TODO(akalin): Now that we keep track of registered ids, we |
| 136 // should drop invalidations for unregistered ids. We may also | 141 // should drop invalidations for unregistered ids. We may also |
| (...skipping 26 matching lines...) Expand all Loading... |
| 163 // TODO(akalin): We should really acknowledge only after we get the | 168 // TODO(akalin): We should really acknowledge only after we get the |
| 164 // updates from the sync server. (see http://crbug.com/78462). | 169 // updates from the sync server. (see http://crbug.com/78462). |
| 165 client->Acknowledge(ack_handle); | 170 client->Acknowledge(ack_handle); |
| 166 } | 171 } |
| 167 | 172 |
| 168 void ChromeInvalidationClient::InvalidateUnknownVersion( | 173 void ChromeInvalidationClient::InvalidateUnknownVersion( |
| 169 invalidation::InvalidationClient* client, | 174 invalidation::InvalidationClient* client, |
| 170 const invalidation::ObjectId& object_id, | 175 const invalidation::ObjectId& object_id, |
| 171 const invalidation::AckHandle& ack_handle) { | 176 const invalidation::AckHandle& ack_handle) { |
| 172 DCHECK(CalledOnValidThread()); | 177 DCHECK(CalledOnValidThread()); |
| 178 DCHECK_EQ(client, invalidation_client_.get()); |
| 173 DVLOG(1) << "InvalidateUnknownVersion"; | 179 DVLOG(1) << "InvalidateUnknownVersion"; |
| 174 | 180 |
| 175 ObjectIdPayloadMap id_payloads; | 181 ObjectIdPayloadMap id_payloads; |
| 176 id_payloads[object_id] = std::string(); | 182 id_payloads[object_id] = std::string(); |
| 177 EmitInvalidation(id_payloads); | 183 EmitInvalidation(id_payloads); |
| 178 // TODO(akalin): We should really acknowledge only after we get the | 184 // TODO(akalin): We should really acknowledge only after we get the |
| 179 // updates from the sync server. (see http://crbug.com/78462). | 185 // updates from the sync server. (see http://crbug.com/78462). |
| 180 client->Acknowledge(ack_handle); | 186 client->Acknowledge(ack_handle); |
| 181 } | 187 } |
| 182 | 188 |
| 183 // This should behave as if we got an invalidation with version | 189 // This should behave as if we got an invalidation with version |
| 184 // UNKNOWN_OBJECT_VERSION for all known data types. | 190 // UNKNOWN_OBJECT_VERSION for all known data types. |
| 185 void ChromeInvalidationClient::InvalidateAll( | 191 void ChromeInvalidationClient::InvalidateAll( |
| 186 invalidation::InvalidationClient* client, | 192 invalidation::InvalidationClient* client, |
| 187 const invalidation::AckHandle& ack_handle) { | 193 const invalidation::AckHandle& ack_handle) { |
| 188 DCHECK(CalledOnValidThread()); | 194 DCHECK(CalledOnValidThread()); |
| 195 DCHECK_EQ(client, invalidation_client_.get()); |
| 189 DVLOG(1) << "InvalidateAll"; | 196 DVLOG(1) << "InvalidateAll"; |
| 190 | 197 |
| 191 ObjectIdPayloadMap id_payloads; | 198 ObjectIdPayloadMap id_payloads; |
| 192 for (ObjectIdSet::const_iterator it = registered_ids_.begin(); | 199 for (ObjectIdSet::const_iterator it = registered_ids_.begin(); |
| 193 it != registered_ids_.end(); ++it) { | 200 it != registered_ids_.end(); ++it) { |
| 194 id_payloads[*it] = std::string(); | 201 id_payloads[*it] = std::string(); |
| 195 } | 202 } |
| 196 EmitInvalidation(id_payloads); | 203 EmitInvalidation(id_payloads); |
| 197 // TODO(akalin): We should really acknowledge only after we get the | 204 // TODO(akalin): We should really acknowledge only after we get the |
| 198 // updates from the sync server. (see http://crbug.com/76482). | 205 // updates from the sync server. (see http://crbug.com/76482). |
| 199 client->Acknowledge(ack_handle); | 206 client->Acknowledge(ack_handle); |
| 200 } | 207 } |
| 201 | 208 |
| 202 void ChromeInvalidationClient::EmitInvalidation( | 209 void ChromeInvalidationClient::EmitInvalidation( |
| 203 const ObjectIdPayloadMap& id_payloads) { | 210 const ObjectIdPayloadMap& id_payloads) { |
| 204 DCHECK(CalledOnValidThread()); | 211 DCHECK(CalledOnValidThread()); |
| 205 listener_->OnInvalidate(id_payloads); | 212 listener_->OnInvalidate(id_payloads); |
| 206 } | 213 } |
| 207 | 214 |
| 208 void ChromeInvalidationClient::InformRegistrationStatus( | 215 void ChromeInvalidationClient::InformRegistrationStatus( |
| 209 invalidation::InvalidationClient* client, | 216 invalidation::InvalidationClient* client, |
| 210 const invalidation::ObjectId& object_id, | 217 const invalidation::ObjectId& object_id, |
| 211 InvalidationListener::RegistrationState new_state) { | 218 InvalidationListener::RegistrationState new_state) { |
| 212 DCHECK(CalledOnValidThread()); | 219 DCHECK(CalledOnValidThread()); |
| 220 DCHECK_EQ(client, invalidation_client_.get()); |
| 213 DVLOG(1) << "InformRegistrationStatus: " | 221 DVLOG(1) << "InformRegistrationStatus: " |
| 214 << ObjectIdToString(object_id) << " " << new_state; | 222 << ObjectIdToString(object_id) << " " << new_state; |
| 215 | 223 |
| 216 if (new_state != InvalidationListener::REGISTERED) { | 224 if (new_state != InvalidationListener::REGISTERED) { |
| 217 // Let |registration_manager_| handle the registration backoff policy. | 225 // Let |registration_manager_| handle the registration backoff policy. |
| 218 registration_manager_->MarkRegistrationLost(object_id); | 226 registration_manager_->MarkRegistrationLost(object_id); |
| 219 } | 227 } |
| 220 } | 228 } |
| 221 | 229 |
| 222 void ChromeInvalidationClient::InformRegistrationFailure( | 230 void ChromeInvalidationClient::InformRegistrationFailure( |
| 223 invalidation::InvalidationClient* client, | 231 invalidation::InvalidationClient* client, |
| 224 const invalidation::ObjectId& object_id, | 232 const invalidation::ObjectId& object_id, |
| 225 bool is_transient, | 233 bool is_transient, |
| 226 const std::string& error_message) { | 234 const std::string& error_message) { |
| 227 DCHECK(CalledOnValidThread()); | 235 DCHECK(CalledOnValidThread()); |
| 236 DCHECK_EQ(client, invalidation_client_.get()); |
| 228 DVLOG(1) << "InformRegistrationFailure: " | 237 DVLOG(1) << "InformRegistrationFailure: " |
| 229 << ObjectIdToString(object_id) | 238 << ObjectIdToString(object_id) |
| 230 << "is_transient=" << is_transient | 239 << "is_transient=" << is_transient |
| 231 << ", message=" << error_message; | 240 << ", message=" << error_message; |
| 232 | 241 |
| 233 if (is_transient) { | 242 if (is_transient) { |
| 234 // We don't care about |unknown_hint|; we let | 243 // We don't care about |unknown_hint|; we let |
| 235 // |registration_manager_| handle the registration backoff policy. | 244 // |registration_manager_| handle the registration backoff policy. |
| 236 registration_manager_->MarkRegistrationLost(object_id); | 245 registration_manager_->MarkRegistrationLost(object_id); |
| 237 } else { | 246 } else { |
| 238 // Non-transient failures are permanent, so block any future | 247 // Non-transient failures are permanent, so block any future |
| 239 // registration requests for |model_type|. (This happens if the | 248 // registration requests for |model_type|. (This happens if the |
| 240 // server doesn't recognize the data type, which could happen for | 249 // server doesn't recognize the data type, which could happen for |
| 241 // brand-new data types.) | 250 // brand-new data types.) |
| 242 registration_manager_->DisableId(object_id); | 251 registration_manager_->DisableId(object_id); |
| 243 } | 252 } |
| 244 } | 253 } |
| 245 | 254 |
| 246 void ChromeInvalidationClient::ReissueRegistrations( | 255 void ChromeInvalidationClient::ReissueRegistrations( |
| 247 invalidation::InvalidationClient* client, | 256 invalidation::InvalidationClient* client, |
| 248 const std::string& prefix, | 257 const std::string& prefix, |
| 249 int prefix_length) { | 258 int prefix_length) { |
| 250 DCHECK(CalledOnValidThread()); | 259 DCHECK(CalledOnValidThread()); |
| 260 DCHECK_EQ(client, invalidation_client_.get()); |
| 251 DVLOG(1) << "AllRegistrationsLost"; | 261 DVLOG(1) << "AllRegistrationsLost"; |
| 252 registration_manager_->MarkAllRegistrationsLost(); | 262 registration_manager_->MarkAllRegistrationsLost(); |
| 253 } | 263 } |
| 254 | 264 |
| 255 void ChromeInvalidationClient::InformError( | 265 void ChromeInvalidationClient::InformError( |
| 256 invalidation::InvalidationClient* client, | 266 invalidation::InvalidationClient* client, |
| 257 const invalidation::ErrorInfo& error_info) { | 267 const invalidation::ErrorInfo& error_info) { |
| 268 DCHECK(CalledOnValidThread()); |
| 269 DCHECK_EQ(client, invalidation_client_.get()); |
| 258 LOG(ERROR) << "Ticl error " << error_info.error_reason() << ": " | 270 LOG(ERROR) << "Ticl error " << error_info.error_reason() << ": " |
| 259 << error_info.error_message() | 271 << error_info.error_message() |
| 260 << " (transient = " << error_info.is_transient() << ")"; | 272 << " (transient = " << error_info.is_transient() << ")"; |
| 261 if (error_info.error_reason() == invalidation::ErrorReason::AUTH_FAILURE) { | 273 if (error_info.error_reason() == invalidation::ErrorReason::AUTH_FAILURE) { |
| 262 ticl_state_ = NOTIFICATION_CREDENTIALS_REJECTED; | 274 ticl_state_ = NOTIFICATION_CREDENTIALS_REJECTED; |
| 263 } else { | 275 } else { |
| 264 ticl_state_ = TRANSIENT_NOTIFICATION_ERROR; | 276 ticl_state_ = TRANSIENT_NOTIFICATION_ERROR; |
| 265 } | 277 } |
| 266 EmitStateChange(); | 278 EmitStateChange(); |
| 267 } | 279 } |
| 268 | 280 |
| 269 void ChromeInvalidationClient::WriteState(const std::string& state) { | 281 void ChromeInvalidationClient::WriteState(const std::string& state) { |
| 270 DCHECK(CalledOnValidThread()); | 282 DCHECK(CalledOnValidThread()); |
| 271 DVLOG(1) << "WriteState"; | 283 DVLOG(1) << "WriteState"; |
| 272 invalidation_state_tracker_.Call( | 284 invalidation_state_tracker_.Call( |
| 273 FROM_HERE, &InvalidationStateTracker::SetInvalidationState, state); | 285 FROM_HERE, &InvalidationStateTracker::SetInvalidationState, state); |
| 274 } | 286 } |
| 275 | 287 |
| 288 void ChromeInvalidationClient::StopForTest() { |
| 289 DCHECK(CalledOnValidThread()); |
| 290 Stop(); |
| 291 } |
| 292 |
| 276 void ChromeInvalidationClient::Stop() { | 293 void ChromeInvalidationClient::Stop() { |
| 277 DCHECK(CalledOnValidThread()); | 294 DCHECK(CalledOnValidThread()); |
| 278 if (!invalidation_client_.get()) { | 295 if (!invalidation_client_.get()) { |
| 279 return; | 296 return; |
| 280 } | 297 } |
| 281 | 298 |
| 282 registration_manager_.reset(); | 299 registration_manager_.reset(); |
| 283 chrome_system_resources_.Stop(); | 300 chrome_system_resources_.Stop(); |
| 284 invalidation_client_->Stop(); | 301 invalidation_client_->Stop(); |
| 285 | 302 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 EmitStateChange(); | 349 EmitStateChange(); |
| 333 } | 350 } |
| 334 | 351 |
| 335 void ChromeInvalidationClient::OnIncomingNotification( | 352 void ChromeInvalidationClient::OnIncomingNotification( |
| 336 const notifier::Notification& notification) { | 353 const notifier::Notification& notification) { |
| 337 DCHECK(CalledOnValidThread()); | 354 DCHECK(CalledOnValidThread()); |
| 338 // Do nothing, since this is already handled by |invalidation_client_|. | 355 // Do nothing, since this is already handled by |invalidation_client_|. |
| 339 } | 356 } |
| 340 | 357 |
| 341 } // namespace syncer | 358 } // namespace syncer |
| OLD | NEW |