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 eb6e0ce148f3225bb51706443fc63244187ccf04..e96e87c0af74172fed9be3742028ed30aaa5e7b1 100644 |
--- a/components/gcm_driver/gcm_driver_desktop.cc |
+++ b/components/gcm_driver/gcm_driver_desktop.cc |
@@ -16,6 +16,7 @@ |
#include "base/metrics/histogram_macros.h" |
#include "base/profiler/scoped_tracker.h" |
#include "base/sequenced_task_runner.h" |
+#include "base/task_runner_util.h" |
#include "base/threading/sequenced_worker_pool.h" |
#include "build/build_config.h" |
#include "components/gcm_driver/gcm_account_mapper.h" |
@@ -105,6 +106,8 @@ class GCMDriverDesktop::IOWorker : public GCMClient::Delegate { |
const std::string& authorized_entity, |
const std::string& scope, |
const std::map<std::string, std::string>& options); |
+ bool ValidateRegistration(std::unique_ptr<RegistrationInfo> registration_info, |
+ const std::string& registration_id); |
void DeleteToken(const std::string& app_id, |
const std::string& authorized_entity, |
const std::string& scope); |
@@ -335,6 +338,15 @@ void GCMDriverDesktop::IOWorker::Register( |
gcm_client_->Register(make_linked_ptr<RegistrationInfo>(gcm_info.release())); |
} |
+bool GCMDriverDesktop::IOWorker::ValidateRegistration( |
+ std::unique_ptr<RegistrationInfo> registration_info, |
+ const std::string& registration_id) { |
+ DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
+ |
+ return gcm_client_->ValidateRegistration( |
+ make_linked_ptr(registration_info.release()), registration_id); |
+} |
+ |
void GCMDriverDesktop::IOWorker::Unregister(const std::string& app_id) { |
DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
@@ -560,6 +572,55 @@ GCMDriverDesktop::GCMDriverDesktop( |
GCMDriverDesktop::~GCMDriverDesktop() { |
} |
+void GCMDriverDesktop::ValidateRegistration( |
+ const std::string& app_id, |
+ const std::vector<std::string>& sender_ids, |
+ const std::string& registration_id, |
+ const ValidateRegistrationCallback& callback) { |
+ DCHECK(!app_id.empty()); |
+ DCHECK(!sender_ids.empty() && sender_ids.size() <= kMaxSenders); |
+ DCHECK(!registration_id.empty()); |
+ DCHECK(!callback.is_null()); |
+ DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
+ |
+ GCMClient::Result result = EnsureStarted(GCMClient::IMMEDIATE_START); |
+ if (result != GCMClient::SUCCESS) { |
+ // Can't tell whether the registration is valid or not, so don't run the |
+ // callback (let it hang indefinitely). |
+ return; |
+ } |
+ |
+ // Only validating current state, so ignore pending register_callbacks_. |
+ |
+ auto gcm_info = base::MakeUnique<GCMRegistrationInfo>(); |
+ gcm_info->app_id = app_id; |
+ gcm_info->sender_ids = sender_ids; |
+ // Normalize the sender IDs by making them sorted. |
+ std::sort(gcm_info->sender_ids.begin(), gcm_info->sender_ids.end()); |
+ |
+ if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { |
+ delayed_task_controller_->AddTask( |
+ base::Bind(&GCMDriverDesktop::DoValidateRegistration, |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&gcm_info), |
+ registration_id, callback)); |
+ return; |
+ } |
+ |
+ DoValidateRegistration(std::move(gcm_info), registration_id, callback); |
+} |
+ |
+void GCMDriverDesktop::DoValidateRegistration( |
+ std::unique_ptr<RegistrationInfo> registration_info, |
+ const std::string& registration_id, |
+ const ValidateRegistrationCallback& callback) { |
+ base::PostTaskAndReplyWithResult( |
+ io_thread_.get(), FROM_HERE, |
+ base::Bind(&GCMDriverDesktop::IOWorker::ValidateRegistration, |
+ base::Unretained(io_worker_.get()), |
+ base::Passed(®istration_info), registration_id), |
+ callback); |
+} |
+ |
void GCMDriverDesktop::Shutdown() { |
DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
@@ -894,6 +955,43 @@ void GCMDriverDesktop::DoGetToken( |
options)); |
} |
+void GCMDriverDesktop::ValidateToken(const std::string& app_id, |
+ const std::string& authorized_entity, |
+ const std::string& scope, |
+ const std::string& token, |
+ const ValidateTokenCallback& callback) { |
+ DCHECK(!app_id.empty()); |
+ DCHECK(!authorized_entity.empty()); |
+ DCHECK(!scope.empty()); |
+ DCHECK(!token.empty()); |
+ DCHECK(!callback.is_null()); |
+ DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
+ |
+ GCMClient::Result result = EnsureStarted(GCMClient::IMMEDIATE_START); |
+ if (result != GCMClient::SUCCESS) { |
+ // Can't tell whether the registration is valid or not, so don't run the |
+ // callback (let it hang indefinitely). |
+ return; |
+ } |
+ |
+ // Only validating current state, so ignore pending get_token_callbacks_. |
+ |
+ auto instance_id_info = base::MakeUnique<InstanceIDTokenInfo>(); |
+ instance_id_info->app_id = app_id; |
+ instance_id_info->authorized_entity = authorized_entity; |
+ instance_id_info->scope = scope; |
+ |
+ if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { |
+ delayed_task_controller_->AddTask( |
+ base::Bind(&GCMDriverDesktop::DoValidateRegistration, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ base::Passed(&instance_id_info), token, callback)); |
+ return; |
+ } |
+ |
+ DoValidateRegistration(std::move(instance_id_info), token, callback); |
+} |
+ |
void GCMDriverDesktop::DeleteToken(const std::string& app_id, |
const std::string& authorized_entity, |
const std::string& scope, |