Index: components/gcm_driver/gcm_driver_desktop.cc |
diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc |
index b967feac46094e52ee6f2f2364c0a269cf8db9fe..2ff4187cb13f3a865dedc0edd63793aeb8983d9a 100644 |
--- a/components/gcm_driver/gcm_driver_desktop.cc |
+++ b/components/gcm_driver/gcm_driver_desktop.cc |
@@ -107,6 +107,9 @@ class GCMDriverDesktop::IOWorker : public GCMClient::Delegate { |
const std::string& authorized_entity, |
const std::string& scope); |
+ void RecordDecryptionFailure(const std::string& app_id, |
+ GCMEncryptionProvider::DecryptionFailure reason); |
+ |
// For testing purpose. Can be called from UI thread. Use with care. |
GCMClient* gcm_client_for_testing() const { return gcm_client_.get(); } |
@@ -496,6 +499,13 @@ void GCMDriverDesktop::IOWorker::RemoveHeartbeatInterval( |
gcm_client_->RemoveHeartbeatInterval(scope); |
} |
+void GCMDriverDesktop::IOWorker::RecordDecryptionFailure( |
+ const std::string& app_id, |
+ GCMEncryptionProvider::DecryptionFailure reason) { |
+ DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
+ gcm_client_->RecordDecryptionFailure(app_id, reason); |
+} |
+ |
GCMDriverDesktop::GCMDriverDesktop( |
scoped_ptr<GCMClientFactory> gcm_client_factory, |
const GCMClient::ChromeBuildInfo& chrome_build_info, |
@@ -722,6 +732,17 @@ void GCMDriverDesktop::DoSend(const std::string& app_id, |
message)); |
} |
+void GCMDriverDesktop::RecordDecryptionFailure( |
+ const std::string& app_id, |
+ GCMEncryptionProvider::DecryptionFailure reason) { |
+ DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
+ io_thread_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&GCMDriverDesktop::IOWorker::RecordDecryptionFailure, |
+ base::Unretained(io_worker_.get()), |
+ app_id, reason)); |
+} |
+ |
GCMClient* GCMDriverDesktop::GetGCMClientForTesting() const { |
DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
return io_worker_ ? io_worker_->gcm_client_for_testing() : NULL; |