Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/gcm_driver/gcm_driver_desktop.h" | 5 #include "components/gcm_driver/gcm_driver_desktop.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/profiler/scoped_tracker.h" | 17 #include "base/profiler/scoped_tracker.h" |
| 18 #include "base/sequenced_task_runner.h" | 18 #include "base/sequenced_task_runner.h" |
| 19 #include "base/task_runner_util.h" | |
| 19 #include "base/threading/sequenced_worker_pool.h" | 20 #include "base/threading/sequenced_worker_pool.h" |
| 20 #include "build/build_config.h" | 21 #include "build/build_config.h" |
| 21 #include "components/gcm_driver/gcm_account_mapper.h" | 22 #include "components/gcm_driver/gcm_account_mapper.h" |
| 22 #include "components/gcm_driver/gcm_app_handler.h" | 23 #include "components/gcm_driver/gcm_app_handler.h" |
| 23 #include "components/gcm_driver/gcm_channel_status_syncer.h" | 24 #include "components/gcm_driver/gcm_channel_status_syncer.h" |
| 24 #include "components/gcm_driver/gcm_client_factory.h" | 25 #include "components/gcm_driver/gcm_client_factory.h" |
| 25 #include "components/gcm_driver/gcm_delayed_task_controller.h" | 26 #include "components/gcm_driver/gcm_delayed_task_controller.h" |
| 26 #include "components/gcm_driver/instance_id/instance_id_impl.h" | 27 #include "components/gcm_driver/instance_id/instance_id_impl.h" |
| 27 #include "components/gcm_driver/system_encryptor.h" | 28 #include "components/gcm_driver/system_encryptor.h" |
| 28 #include "google_apis/gcm/engine/account_mapping.h" | 29 #include "google_apis/gcm/engine/account_mapping.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 | 99 |
| 99 void AddInstanceIDData(const std::string& app_id, | 100 void AddInstanceIDData(const std::string& app_id, |
| 100 const std::string& instance_id, | 101 const std::string& instance_id, |
| 101 const std::string& extra_data); | 102 const std::string& extra_data); |
| 102 void RemoveInstanceIDData(const std::string& app_id); | 103 void RemoveInstanceIDData(const std::string& app_id); |
| 103 void GetInstanceIDData(const std::string& app_id); | 104 void GetInstanceIDData(const std::string& app_id); |
| 104 void GetToken(const std::string& app_id, | 105 void GetToken(const std::string& app_id, |
| 105 const std::string& authorized_entity, | 106 const std::string& authorized_entity, |
| 106 const std::string& scope, | 107 const std::string& scope, |
| 107 const std::map<std::string, std::string>& options); | 108 const std::map<std::string, std::string>& options); |
| 109 bool ValidateRegistration(std::unique_ptr<RegistrationInfo> registration_info, | |
| 110 const std::string& registration_id); | |
| 108 void DeleteToken(const std::string& app_id, | 111 void DeleteToken(const std::string& app_id, |
| 109 const std::string& authorized_entity, | 112 const std::string& authorized_entity, |
| 110 const std::string& scope); | 113 const std::string& scope); |
| 111 | 114 |
| 112 void RecordDecryptionFailure(const std::string& app_id, | 115 void RecordDecryptionFailure(const std::string& app_id, |
| 113 GCMEncryptionProvider::DecryptionResult result); | 116 GCMEncryptionProvider::DecryptionResult result); |
| 114 | 117 |
| 115 // For testing purpose. Can be called from UI thread. Use with care. | 118 // For testing purpose. Can be called from UI thread. Use with care. |
| 116 GCMClient* gcm_client_for_testing() const { return gcm_client_.get(); } | 119 GCMClient* gcm_client_for_testing() const { return gcm_client_.get(); } |
| 117 | 120 |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 328 const std::string& app_id, | 331 const std::string& app_id, |
| 329 const std::vector<std::string>& sender_ids) { | 332 const std::vector<std::string>& sender_ids) { |
| 330 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 333 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| 331 | 334 |
| 332 std::unique_ptr<GCMRegistrationInfo> gcm_info(new GCMRegistrationInfo); | 335 std::unique_ptr<GCMRegistrationInfo> gcm_info(new GCMRegistrationInfo); |
| 333 gcm_info->app_id = app_id; | 336 gcm_info->app_id = app_id; |
| 334 gcm_info->sender_ids = sender_ids; | 337 gcm_info->sender_ids = sender_ids; |
| 335 gcm_client_->Register(make_linked_ptr<RegistrationInfo>(gcm_info.release())); | 338 gcm_client_->Register(make_linked_ptr<RegistrationInfo>(gcm_info.release())); |
| 336 } | 339 } |
| 337 | 340 |
| 341 bool GCMDriverDesktop::IOWorker::ValidateRegistration( | |
| 342 std::unique_ptr<RegistrationInfo> registration_info, | |
| 343 const std::string& registration_id) { | |
| 344 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | |
| 345 | |
| 346 return gcm_client_->ValidateRegistration( | |
| 347 make_linked_ptr(registration_info.release()), registration_id); | |
| 348 } | |
| 349 | |
| 338 void GCMDriverDesktop::IOWorker::Unregister(const std::string& app_id) { | 350 void GCMDriverDesktop::IOWorker::Unregister(const std::string& app_id) { |
| 339 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 351 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| 340 | 352 |
| 341 std::unique_ptr<GCMRegistrationInfo> gcm_info(new GCMRegistrationInfo); | 353 std::unique_ptr<GCMRegistrationInfo> gcm_info(new GCMRegistrationInfo); |
| 342 gcm_info->app_id = app_id; | 354 gcm_info->app_id = app_id; |
| 343 gcm_client_->Unregister( | 355 gcm_client_->Unregister( |
| 344 make_linked_ptr<RegistrationInfo>(gcm_info.release())); | 356 make_linked_ptr<RegistrationInfo>(gcm_info.release())); |
| 345 } | 357 } |
| 346 | 358 |
| 347 void GCMDriverDesktop::IOWorker::Send(const std::string& app_id, | 359 void GCMDriverDesktop::IOWorker::Send(const std::string& app_id, |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 553 base::Passed(&gcm_client_factory), | 565 base::Passed(&gcm_client_factory), |
| 554 chrome_build_info, | 566 chrome_build_info, |
| 555 store_path, | 567 store_path, |
| 556 request_context, | 568 request_context, |
| 557 blocking_task_runner)); | 569 blocking_task_runner)); |
| 558 } | 570 } |
| 559 | 571 |
| 560 GCMDriverDesktop::~GCMDriverDesktop() { | 572 GCMDriverDesktop::~GCMDriverDesktop() { |
| 561 } | 573 } |
| 562 | 574 |
| 575 void GCMDriverDesktop::ValidateRegistration( | |
| 576 const std::string& app_id, | |
| 577 const std::vector<std::string>& sender_ids, | |
| 578 const std::string& registration_id, | |
| 579 const ValidateRegistrationCallback& callback) { | |
| 580 DCHECK(!app_id.empty()); | |
| 581 DCHECK(!sender_ids.empty() && sender_ids.size() <= kMaxSenders); | |
| 582 DCHECK(!registration_id.empty()); | |
| 583 DCHECK(!callback.is_null()); | |
| 584 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | |
| 585 | |
| 586 GCMClient::Result result = EnsureStarted(GCMClient::IMMEDIATE_START); | |
| 587 if (result != GCMClient::SUCCESS) { | |
| 588 // Can't tell whether the registration is valid or not, so don't run the | |
| 589 // callback (let it hang indefinitely). | |
|
Peter Beverloo
2017/03/20 23:50:13
I guess this is OK from a lifetime point of view b
johnme
2017/03/30 18:36:38
Acknowledged.
| |
| 590 return; | |
| 591 } | |
| 592 | |
| 593 // Only validating current state, so ignore pending register_callbacks_. | |
| 594 | |
| 595 auto gcm_info = base::MakeUnique<GCMRegistrationInfo>(); | |
| 596 gcm_info->app_id = app_id; | |
| 597 gcm_info->sender_ids = sender_ids; | |
| 598 // Normalize the sender IDs by making them sorted. | |
| 599 std::sort(gcm_info->sender_ids.begin(), gcm_info->sender_ids.end()); | |
| 600 | |
| 601 if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { | |
| 602 delayed_task_controller_->AddTask( | |
| 603 base::Bind(&GCMDriverDesktop::DoValidateRegistration, | |
| 604 weak_ptr_factory_.GetWeakPtr(), base::Passed(&gcm_info), | |
| 605 registration_id, callback)); | |
| 606 return; | |
| 607 } | |
| 608 | |
| 609 DoValidateRegistration(std::move(gcm_info), registration_id, callback); | |
| 610 } | |
| 611 | |
| 612 void GCMDriverDesktop::DoValidateRegistration( | |
| 613 std::unique_ptr<RegistrationInfo> registration_info, | |
| 614 const std::string& registration_id, | |
| 615 const ValidateRegistrationCallback& callback) { | |
| 616 base::PostTaskAndReplyWithResult( | |
| 617 io_thread_.get(), FROM_HERE, | |
| 618 base::Bind(&GCMDriverDesktop::IOWorker::ValidateRegistration, | |
| 619 base::Unretained(io_worker_.get()), | |
| 620 base::Passed(®istration_info), registration_id), | |
| 621 callback); | |
| 622 } | |
| 623 | |
| 563 void GCMDriverDesktop::Shutdown() { | 624 void GCMDriverDesktop::Shutdown() { |
| 564 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 625 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 565 | 626 |
| 566 Stop(); | 627 Stop(); |
| 567 GCMDriver::Shutdown(); | 628 GCMDriver::Shutdown(); |
| 568 | 629 |
| 569 // Dispose the syncer in order to release the reference to | 630 // Dispose the syncer in order to release the reference to |
| 570 // URLRequestContextGetter that needs to be done before IOThread gets | 631 // URLRequestContextGetter that needs to be done before IOThread gets |
| 571 // deleted. | 632 // deleted. |
| 572 gcm_channel_status_syncer_.reset(); | 633 gcm_channel_status_syncer_.reset(); |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 887 io_thread_->PostTask( | 948 io_thread_->PostTask( |
| 888 FROM_HERE, | 949 FROM_HERE, |
| 889 base::Bind(&GCMDriverDesktop::IOWorker::GetToken, | 950 base::Bind(&GCMDriverDesktop::IOWorker::GetToken, |
| 890 base::Unretained(io_worker_.get()), | 951 base::Unretained(io_worker_.get()), |
| 891 app_id, | 952 app_id, |
| 892 authorized_entity, | 953 authorized_entity, |
| 893 scope, | 954 scope, |
| 894 options)); | 955 options)); |
| 895 } | 956 } |
| 896 | 957 |
| 958 void GCMDriverDesktop::ValidateToken(const std::string& app_id, | |
| 959 const std::string& authorized_entity, | |
| 960 const std::string& scope, | |
| 961 const std::string& token, | |
| 962 const ValidateTokenCallback& callback) { | |
| 963 DCHECK(!app_id.empty()); | |
| 964 DCHECK(!authorized_entity.empty()); | |
| 965 DCHECK(!scope.empty()); | |
| 966 DCHECK(!token.empty()); | |
| 967 DCHECK(!callback.is_null()); | |
| 968 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | |
| 969 | |
| 970 GCMClient::Result result = EnsureStarted(GCMClient::IMMEDIATE_START); | |
| 971 if (result != GCMClient::SUCCESS) { | |
| 972 // Can't tell whether the registration is valid or not, so don't run the | |
| 973 // callback (let it hang indefinitely). | |
| 974 return; | |
| 975 } | |
| 976 | |
| 977 // Only validating current state, so ignore pending get_token_callbacks_. | |
| 978 | |
| 979 auto instance_id_info = base::MakeUnique<InstanceIDTokenInfo>(); | |
| 980 instance_id_info->app_id = app_id; | |
| 981 instance_id_info->authorized_entity = authorized_entity; | |
| 982 instance_id_info->scope = scope; | |
| 983 | |
| 984 if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { | |
| 985 delayed_task_controller_->AddTask( | |
| 986 base::Bind(&GCMDriverDesktop::DoValidateRegistration, | |
| 987 weak_ptr_factory_.GetWeakPtr(), | |
| 988 base::Passed(&instance_id_info), token, callback)); | |
| 989 return; | |
| 990 } | |
| 991 | |
| 992 DoValidateRegistration(std::move(instance_id_info), token, callback); | |
| 993 } | |
| 994 | |
| 897 void GCMDriverDesktop::DeleteToken(const std::string& app_id, | 995 void GCMDriverDesktop::DeleteToken(const std::string& app_id, |
| 898 const std::string& authorized_entity, | 996 const std::string& authorized_entity, |
| 899 const std::string& scope, | 997 const std::string& scope, |
| 900 const DeleteTokenCallback& callback) { | 998 const DeleteTokenCallback& callback) { |
| 901 DCHECK(!app_id.empty()); | 999 DCHECK(!app_id.empty()); |
| 902 DCHECK(!authorized_entity.empty()); | 1000 DCHECK(!authorized_entity.empty()); |
| 903 DCHECK(!scope.empty()); | 1001 DCHECK(!scope.empty()); |
| 904 DCHECK(!callback.is_null()); | 1002 DCHECK(!callback.is_null()); |
| 905 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 1003 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 906 | 1004 |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1336 | 1434 |
| 1337 if (std::get<1>(a) < std::get<1>(b)) | 1435 if (std::get<1>(a) < std::get<1>(b)) |
| 1338 return true; | 1436 return true; |
| 1339 if (std::get<1>(a) > std::get<1>(b)) | 1437 if (std::get<1>(a) > std::get<1>(b)) |
| 1340 return false; | 1438 return false; |
| 1341 | 1439 |
| 1342 return std::get<2>(a) < std::get<2>(b); | 1440 return std::get<2>(a) < std::get<2>(b); |
| 1343 } | 1441 } |
| 1344 | 1442 |
| 1345 } // namespace gcm | 1443 } // namespace gcm |
| OLD | NEW |