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). |
| 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 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1342 | 1440 |
1343 if (std::get<1>(a) < std::get<1>(b)) | 1441 if (std::get<1>(a) < std::get<1>(b)) |
1344 return true; | 1442 return true; |
1345 if (std::get<1>(a) > std::get<1>(b)) | 1443 if (std::get<1>(a) > std::get<1>(b)) |
1346 return false; | 1444 return false; |
1347 | 1445 |
1348 return std::get<2>(a) < std::get<2>(b); | 1446 return std::get<2>(a) < std::get<2>(b); |
1349 } | 1447 } |
1350 | 1448 |
1351 } // namespace gcm | 1449 } // namespace gcm |
OLD | NEW |