OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/background_sync/background_sync_manager.h" | 5 #include "content/browser/background_sync/background_sync_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/barrier_closure.h" | 9 #include "base/barrier_closure.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 sync_manager->Init(); | 142 sync_manager->Init(); |
143 return make_scoped_ptr(sync_manager); | 143 return make_scoped_ptr(sync_manager); |
144 } | 144 } |
145 | 145 |
146 BackgroundSyncManager::~BackgroundSyncManager() { | 146 BackgroundSyncManager::~BackgroundSyncManager() { |
147 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 147 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
148 | 148 |
149 service_worker_context_->RemoveObserver(this); | 149 service_worker_context_->RemoveObserver(this); |
150 } | 150 } |
151 | 151 |
152 BackgroundSyncManager::RegistrationKey::RegistrationKey( | |
153 const BackgroundSyncRegistration& registration) | |
154 : RegistrationKey(registration.options()->tag) {} | |
155 | |
156 BackgroundSyncManager::RegistrationKey::RegistrationKey( | |
157 const BackgroundSyncRegistrationOptions& options) | |
158 : RegistrationKey(options.tag) {} | |
159 | |
160 BackgroundSyncManager::RegistrationKey::RegistrationKey(const std::string& tag) | |
161 : value_("o_" + tag) { | |
162 // Note that the "o_" prefix on the key is because at one time one-shots were | |
163 // prefixed with an "o_" and periodic with a "p_". Removing the "o_" requires | |
164 // migration. | |
165 } | |
166 | |
167 void BackgroundSyncManager::Register( | 152 void BackgroundSyncManager::Register( |
168 int64_t sw_registration_id, | 153 int64_t sw_registration_id, |
169 const BackgroundSyncRegistrationOptions& options, | 154 const BackgroundSyncRegistrationOptions& options, |
170 bool requested_from_service_worker, | 155 bool requested_from_service_worker, |
171 const StatusAndRegistrationCallback& callback) { | 156 const StatusAndRegistrationCallback& callback) { |
172 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 157 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
173 | 158 |
174 if (disabled_) { | 159 if (disabled_) { |
175 BackgroundSyncMetrics::CountRegisterFailure( | 160 BackgroundSyncMetrics::CountRegisterFailure( |
176 BACKGROUND_SYNC_STATUS_STORAGE_ERROR); | 161 BACKGROUND_SYNC_STATUS_STORAGE_ERROR); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 for (int i = 0, max = registrations_proto.registration_size(); i < max; | 325 for (int i = 0, max = registrations_proto.registration_size(); i < max; |
341 ++i) { | 326 ++i) { |
342 const BackgroundSyncRegistrationProto& registration_proto = | 327 const BackgroundSyncRegistrationProto& registration_proto = |
343 registrations_proto.registration(i); | 328 registrations_proto.registration(i); |
344 | 329 |
345 if (registration_proto.id() >= registrations->next_id) { | 330 if (registration_proto.id() >= registrations->next_id) { |
346 corruption_detected = true; | 331 corruption_detected = true; |
347 break; | 332 break; |
348 } | 333 } |
349 | 334 |
350 RegistrationKey registration_key(registration_proto.tag()); | |
351 | |
352 BackgroundSyncRegistration* registration = | 335 BackgroundSyncRegistration* registration = |
353 ®istrations->registration_map[registration_key]; | 336 ®istrations->registration_map[registration_proto.tag()]; |
354 | 337 |
355 BackgroundSyncRegistrationOptions* options = registration->options(); | 338 BackgroundSyncRegistrationOptions* options = registration->options(); |
356 options->tag = registration_proto.tag(); | 339 options->tag = registration_proto.tag(); |
357 options->network_state = registration_proto.network_state(); | 340 options->network_state = registration_proto.network_state(); |
358 | 341 |
359 registration->set_id(registration_proto.id()); | 342 registration->set_id(registration_proto.id()); |
360 registration->set_num_attempts(registration_proto.num_attempts()); | 343 registration->set_num_attempts(registration_proto.num_attempts()); |
361 registration->set_delay_until( | 344 registration->set_delay_until( |
362 base::Time::FromInternalValue(registration_proto.delay_until())); | 345 base::Time::FromInternalValue(registration_proto.delay_until())); |
363 } | 346 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 PostErrorResponse(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, callback); | 428 PostErrorResponse(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, callback); |
446 return; | 429 return; |
447 } | 430 } |
448 | 431 |
449 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 432 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
450 base::Bind(&NotifyBackgroundSyncRegisteredOnUIThread, | 433 base::Bind(&NotifyBackgroundSyncRegisteredOnUIThread, |
451 service_worker_context_, | 434 service_worker_context_, |
452 sw_registration->pattern().GetOrigin())); | 435 sw_registration->pattern().GetOrigin())); |
453 | 436 |
454 BackgroundSyncRegistration* existing_registration = | 437 BackgroundSyncRegistration* existing_registration = |
455 LookupActiveRegistration(sw_registration_id, RegistrationKey(options)); | 438 LookupActiveRegistration(sw_registration_id, options.tag); |
456 if (existing_registration) { | 439 if (existing_registration) { |
457 DCHECK(existing_registration->options()->Equals(options)); | 440 DCHECK(existing_registration->options()->Equals(options)); |
458 | 441 |
459 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = | 442 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = |
460 AreOptionConditionsMet(options) | 443 AreOptionConditionsMet(options) |
461 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE | 444 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE |
462 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; | 445 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; |
463 BackgroundSyncMetrics::CountRegisterSuccess( | 446 BackgroundSyncMetrics::CountRegisterSuccess( |
464 registration_could_fire, | 447 registration_could_fire, |
465 BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE); | 448 BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 ServiceWorkerStatusCode status) { | 530 ServiceWorkerStatusCode status) { |
548 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 531 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
549 | 532 |
550 // The status doesn't matter at this point, there is nothing else to be done. | 533 // The status doesn't matter at this point, there is nothing else to be done. |
551 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 534 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
552 base::Bind(barrier_closure)); | 535 base::Bind(barrier_closure)); |
553 } | 536 } |
554 | 537 |
555 BackgroundSyncRegistration* BackgroundSyncManager::LookupActiveRegistration( | 538 BackgroundSyncRegistration* BackgroundSyncManager::LookupActiveRegistration( |
556 int64_t sw_registration_id, | 539 int64_t sw_registration_id, |
557 const RegistrationKey& registration_key) { | 540 const std::string& tag) { |
558 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 541 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
559 | 542 |
560 SWIdToRegistrationsMap::iterator it = | 543 SWIdToRegistrationsMap::iterator it = |
561 active_registrations_.find(sw_registration_id); | 544 active_registrations_.find(sw_registration_id); |
562 if (it == active_registrations_.end()) | 545 if (it == active_registrations_.end()) |
563 return nullptr; | 546 return nullptr; |
564 | 547 |
565 BackgroundSyncRegistrations& registrations = it->second; | 548 BackgroundSyncRegistrations& registrations = it->second; |
566 DCHECK_LE(BackgroundSyncRegistration::kInitialId, registrations.next_id); | 549 DCHECK_LE(BackgroundSyncRegistration::kInitialId, registrations.next_id); |
567 DCHECK(!registrations.origin.is_empty()); | 550 DCHECK(!registrations.origin.is_empty()); |
568 | 551 |
569 auto key_and_registration_iter = | 552 auto key_and_registration_iter = registrations.registration_map.find(tag); |
570 registrations.registration_map.find(registration_key); | |
571 if (key_and_registration_iter == registrations.registration_map.end()) | 553 if (key_and_registration_iter == registrations.registration_map.end()) |
572 return nullptr; | 554 return nullptr; |
573 | 555 |
574 return &key_and_registration_iter->second; | 556 return &key_and_registration_iter->second; |
575 } | 557 } |
576 | 558 |
577 void BackgroundSyncManager::StoreRegistrations( | 559 void BackgroundSyncManager::StoreRegistrations( |
578 int64_t sw_registration_id, | 560 int64_t sw_registration_id, |
579 const ServiceWorkerStorage::StatusCallback& callback) { | 561 const ServiceWorkerStorage::StatusCallback& callback) { |
580 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 562 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 | 626 |
645 FireReadyEvents(); | 627 FireReadyEvents(); |
646 | 628 |
647 base::ThreadTaskRunnerHandle::Get()->PostTask( | 629 base::ThreadTaskRunnerHandle::Get()->PostTask( |
648 FROM_HERE, | 630 FROM_HERE, |
649 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, | 631 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, |
650 base::Passed(make_scoped_ptr( | 632 base::Passed(make_scoped_ptr( |
651 new BackgroundSyncRegistration(new_registration))))); | 633 new BackgroundSyncRegistration(new_registration))))); |
652 } | 634 } |
653 | 635 |
654 void BackgroundSyncManager::RemoveActiveRegistration( | 636 void BackgroundSyncManager::RemoveActiveRegistration(int64_t sw_registration_id, |
655 int64_t sw_registration_id, | 637 const std::string& tag) { |
656 const RegistrationKey& registration_key) { | |
657 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 638 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
658 DCHECK(LookupActiveRegistration(sw_registration_id, registration_key)); | 639 DCHECK(LookupActiveRegistration(sw_registration_id, tag)); |
659 | 640 |
660 BackgroundSyncRegistrations* registrations = | 641 BackgroundSyncRegistrations* registrations = |
661 &active_registrations_[sw_registration_id]; | 642 &active_registrations_[sw_registration_id]; |
662 | 643 |
663 registrations->registration_map.erase(registration_key); | 644 registrations->registration_map.erase(tag); |
664 } | 645 } |
665 | 646 |
666 void BackgroundSyncManager::AddActiveRegistration( | 647 void BackgroundSyncManager::AddActiveRegistration( |
667 int64_t sw_registration_id, | 648 int64_t sw_registration_id, |
668 const GURL& origin, | 649 const GURL& origin, |
669 const BackgroundSyncRegistration& sync_registration) { | 650 const BackgroundSyncRegistration& sync_registration) { |
670 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 651 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
671 DCHECK(sync_registration.IsValid()); | 652 DCHECK(sync_registration.IsValid()); |
672 | 653 |
673 BackgroundSyncRegistrations* registrations = | 654 BackgroundSyncRegistrations* registrations = |
674 &active_registrations_[sw_registration_id]; | 655 &active_registrations_[sw_registration_id]; |
675 registrations->origin = origin; | 656 registrations->origin = origin; |
676 | 657 |
677 RegistrationKey registration_key(sync_registration); | 658 registrations->registration_map[sync_registration.options()->tag] = |
678 registrations->registration_map[registration_key] = sync_registration; | 659 sync_registration; |
679 } | 660 } |
680 | 661 |
681 void BackgroundSyncManager::StoreDataInBackend( | 662 void BackgroundSyncManager::StoreDataInBackend( |
682 int64_t sw_registration_id, | 663 int64_t sw_registration_id, |
683 const GURL& origin, | 664 const GURL& origin, |
684 const std::string& backend_key, | 665 const std::string& backend_key, |
685 const std::string& data, | 666 const std::string& data, |
686 const ServiceWorkerStorage::StatusCallback& callback) { | 667 const ServiceWorkerStorage::StatusCallback& callback) { |
687 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 668 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
688 | 669 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 void BackgroundSyncManager::FireReadyEventsImpl(const base::Closure& callback) { | 837 void BackgroundSyncManager::FireReadyEventsImpl(const base::Closure& callback) { |
857 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 838 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
858 | 839 |
859 if (disabled_) { | 840 if (disabled_) { |
860 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 841 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
861 base::Bind(callback)); | 842 base::Bind(callback)); |
862 return; | 843 return; |
863 } | 844 } |
864 | 845 |
865 // Find the registrations that are ready to run. | 846 // Find the registrations that are ready to run. |
866 std::vector<std::pair<int64_t, RegistrationKey>> sw_id_and_keys_to_fire; | 847 std::vector<std::pair<int64_t, std::string>> sw_id_and_tags_to_fire; |
867 | 848 |
868 for (auto& sw_id_and_registrations : active_registrations_) { | 849 for (auto& sw_id_and_registrations : active_registrations_) { |
869 const int64_t service_worker_id = sw_id_and_registrations.first; | 850 const int64_t service_worker_id = sw_id_and_registrations.first; |
870 for (auto& key_and_registration : | 851 for (auto& key_and_registration : |
871 sw_id_and_registrations.second.registration_map) { | 852 sw_id_and_registrations.second.registration_map) { |
872 BackgroundSyncRegistration* registration = &key_and_registration.second; | 853 BackgroundSyncRegistration* registration = &key_and_registration.second; |
873 if (IsRegistrationReadyToFire(*registration)) { | 854 if (IsRegistrationReadyToFire(*registration)) { |
874 sw_id_and_keys_to_fire.push_back( | 855 sw_id_and_tags_to_fire.push_back( |
875 std::make_pair(service_worker_id, key_and_registration.first)); | 856 std::make_pair(service_worker_id, key_and_registration.first)); |
876 // The state change is not saved to persistent storage because | 857 // The state change is not saved to persistent storage because |
877 // if the sync event is killed mid-sync then it should return to | 858 // if the sync event is killed mid-sync then it should return to |
878 // SYNC_STATE_PENDING. | 859 // SYNC_STATE_PENDING. |
879 registration->set_sync_state(BackgroundSyncState::FIRING); | 860 registration->set_sync_state(BackgroundSyncState::FIRING); |
880 } | 861 } |
881 } | 862 } |
882 } | 863 } |
883 | 864 |
884 if (sw_id_and_keys_to_fire.empty()) { | 865 if (sw_id_and_tags_to_fire.empty()) { |
885 RunInBackgroundIfNecessary(); | 866 RunInBackgroundIfNecessary(); |
886 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 867 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
887 base::Bind(callback)); | 868 base::Bind(callback)); |
888 return; | 869 return; |
889 } | 870 } |
890 | 871 |
891 base::TimeTicks start_time = base::TimeTicks::Now(); | 872 base::TimeTicks start_time = base::TimeTicks::Now(); |
892 | 873 |
893 // Fire the sync event of the ready registrations and run |callback| once | 874 // Fire the sync event of the ready registrations and run |callback| once |
894 // they're all done. | 875 // they're all done. |
895 base::Closure events_fired_barrier_closure = base::BarrierClosure( | 876 base::Closure events_fired_barrier_closure = base::BarrierClosure( |
896 sw_id_and_keys_to_fire.size(), | 877 sw_id_and_tags_to_fire.size(), |
897 base::Bind(&BackgroundSyncManager::FireReadyEventsAllEventsFiring, | 878 base::Bind(&BackgroundSyncManager::FireReadyEventsAllEventsFiring, |
898 weak_ptr_factory_.GetWeakPtr(), callback)); | 879 weak_ptr_factory_.GetWeakPtr(), callback)); |
899 | 880 |
900 // Record the total time taken after all events have run to completion. | 881 // Record the total time taken after all events have run to completion. |
901 base::Closure events_completed_barrier_closure = | 882 base::Closure events_completed_barrier_closure = |
902 base::BarrierClosure(sw_id_and_keys_to_fire.size(), | 883 base::BarrierClosure(sw_id_and_tags_to_fire.size(), |
903 base::Bind(&OnAllSyncEventsCompleted, start_time, | 884 base::Bind(&OnAllSyncEventsCompleted, start_time, |
904 sw_id_and_keys_to_fire.size())); | 885 sw_id_and_tags_to_fire.size())); |
905 | 886 |
906 for (const auto& sw_id_and_key : sw_id_and_keys_to_fire) { | 887 for (const auto& sw_id_and_tag : sw_id_and_tags_to_fire) { |
907 int64_t service_worker_id = sw_id_and_key.first; | 888 int64_t service_worker_id = sw_id_and_tag.first; |
908 const BackgroundSyncRegistration* registration = | 889 const BackgroundSyncRegistration* registration = |
909 LookupActiveRegistration(service_worker_id, sw_id_and_key.second); | 890 LookupActiveRegistration(service_worker_id, sw_id_and_tag.second); |
910 DCHECK(registration); | 891 DCHECK(registration); |
911 | 892 |
912 service_worker_context_->FindReadyRegistrationForId( | 893 service_worker_context_->FindReadyRegistrationForId( |
913 service_worker_id, active_registrations_[service_worker_id].origin, | 894 service_worker_id, active_registrations_[service_worker_id].origin, |
914 base::Bind(&BackgroundSyncManager::FireReadyEventsDidFindRegistration, | 895 base::Bind(&BackgroundSyncManager::FireReadyEventsDidFindRegistration, |
915 weak_ptr_factory_.GetWeakPtr(), sw_id_and_key.second, | 896 weak_ptr_factory_.GetWeakPtr(), sw_id_and_tag.second, |
916 registration->id(), events_fired_barrier_closure, | 897 registration->id(), events_fired_barrier_closure, |
917 events_completed_barrier_closure)); | 898 events_completed_barrier_closure)); |
918 } | 899 } |
919 } | 900 } |
920 | 901 |
921 void BackgroundSyncManager::FireReadyEventsDidFindRegistration( | 902 void BackgroundSyncManager::FireReadyEventsDidFindRegistration( |
922 const RegistrationKey& registration_key, | 903 const std::string& tag, |
923 BackgroundSyncRegistration::RegistrationId registration_id, | 904 BackgroundSyncRegistration::RegistrationId registration_id, |
924 const base::Closure& event_fired_callback, | 905 const base::Closure& event_fired_callback, |
925 const base::Closure& event_completed_callback, | 906 const base::Closure& event_completed_callback, |
926 ServiceWorkerStatusCode service_worker_status, | 907 ServiceWorkerStatusCode service_worker_status, |
927 const scoped_refptr<ServiceWorkerRegistration>& | 908 const scoped_refptr<ServiceWorkerRegistration>& |
928 service_worker_registration) { | 909 service_worker_registration) { |
929 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 910 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
930 if (service_worker_status != SERVICE_WORKER_OK) { | 911 if (service_worker_status != SERVICE_WORKER_OK) { |
931 base::ThreadTaskRunnerHandle::Get()->PostTask( | 912 base::ThreadTaskRunnerHandle::Get()->PostTask( |
932 FROM_HERE, base::Bind(event_fired_callback)); | 913 FROM_HERE, base::Bind(event_fired_callback)); |
933 base::ThreadTaskRunnerHandle::Get()->PostTask( | 914 base::ThreadTaskRunnerHandle::Get()->PostTask( |
934 FROM_HERE, base::Bind(event_completed_callback)); | 915 FROM_HERE, base::Bind(event_completed_callback)); |
935 return; | 916 return; |
936 } | 917 } |
937 | 918 |
938 BackgroundSyncRegistration* registration = LookupActiveRegistration( | 919 BackgroundSyncRegistration* registration = |
939 service_worker_registration->id(), registration_key); | 920 LookupActiveRegistration(service_worker_registration->id(), tag); |
940 DCHECK(registration); | 921 DCHECK(registration); |
941 | 922 |
942 num_firing_registrations_ += 1; | 923 num_firing_registrations_ += 1; |
943 | 924 |
944 BackgroundSyncEventLastChance last_chance = | 925 BackgroundSyncEventLastChance last_chance = |
945 registration->num_attempts() == parameters_->max_sync_attempts - 1 | 926 registration->num_attempts() == parameters_->max_sync_attempts - 1 |
946 ? BackgroundSyncEventLastChance::IS_LAST_CHANCE | 927 ? BackgroundSyncEventLastChance::IS_LAST_CHANCE |
947 : BackgroundSyncEventLastChance::IS_NOT_LAST_CHANCE; | 928 : BackgroundSyncEventLastChance::IS_NOT_LAST_CHANCE; |
948 | 929 |
949 HasMainFrameProviderHost( | 930 HasMainFrameProviderHost( |
950 service_worker_registration->pattern().GetOrigin(), | 931 service_worker_registration->pattern().GetOrigin(), |
951 base::Bind(&BackgroundSyncMetrics::RecordEventStarted)); | 932 base::Bind(&BackgroundSyncMetrics::RecordEventStarted)); |
952 | 933 |
953 DispatchSyncEvent( | 934 DispatchSyncEvent( |
954 registration->options()->tag, | 935 registration->options()->tag, |
955 service_worker_registration->active_version(), last_chance, | 936 service_worker_registration->active_version(), last_chance, |
956 base::Bind(&BackgroundSyncManager::EventComplete, | 937 base::Bind(&BackgroundSyncManager::EventComplete, |
957 weak_ptr_factory_.GetWeakPtr(), service_worker_registration, | 938 weak_ptr_factory_.GetWeakPtr(), service_worker_registration, |
958 service_worker_registration->id(), registration_key, | 939 service_worker_registration->id(), tag, |
959 event_completed_callback)); | 940 event_completed_callback)); |
960 | 941 |
961 base::ThreadTaskRunnerHandle::Get()->PostTask( | 942 base::ThreadTaskRunnerHandle::Get()->PostTask( |
962 FROM_HERE, base::Bind(event_fired_callback)); | 943 FROM_HERE, base::Bind(event_fired_callback)); |
963 } | 944 } |
964 | 945 |
965 void BackgroundSyncManager::FireReadyEventsAllEventsFiring( | 946 void BackgroundSyncManager::FireReadyEventsAllEventsFiring( |
966 const base::Closure& callback) { | 947 const base::Closure& callback) { |
967 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 948 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
968 | 949 |
969 RunInBackgroundIfNecessary(); | 950 RunInBackgroundIfNecessary(); |
970 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 951 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
971 base::Bind(callback)); | 952 base::Bind(callback)); |
972 } | 953 } |
973 | 954 |
974 // |service_worker_registration| is just to keep the registration alive | 955 // |service_worker_registration| is just to keep the registration alive |
975 // while the event is firing. | 956 // while the event is firing. |
976 void BackgroundSyncManager::EventComplete( | 957 void BackgroundSyncManager::EventComplete( |
977 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, | 958 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, |
978 int64_t service_worker_id, | 959 int64_t service_worker_id, |
979 const RegistrationKey& registration_key, | 960 const std::string& tag, |
980 const base::Closure& callback, | 961 const base::Closure& callback, |
981 ServiceWorkerStatusCode status_code) { | 962 ServiceWorkerStatusCode status_code) { |
982 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 963 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
983 | 964 |
984 if (disabled_) { | 965 if (disabled_) { |
985 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 966 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
986 base::Bind(callback)); | 967 base::Bind(callback)); |
987 return; | 968 return; |
988 } | 969 } |
989 | 970 |
990 op_scheduler_.ScheduleOperation(base::Bind( | 971 op_scheduler_.ScheduleOperation(base::Bind( |
991 &BackgroundSyncManager::EventCompleteImpl, weak_ptr_factory_.GetWeakPtr(), | 972 &BackgroundSyncManager::EventCompleteImpl, weak_ptr_factory_.GetWeakPtr(), |
992 service_worker_id, registration_key, status_code, | 973 service_worker_id, tag, status_code, MakeClosureCompletion(callback))); |
993 MakeClosureCompletion(callback))); | |
994 } | 974 } |
995 | 975 |
996 void BackgroundSyncManager::EventCompleteImpl( | 976 void BackgroundSyncManager::EventCompleteImpl( |
997 int64_t service_worker_id, | 977 int64_t service_worker_id, |
998 const RegistrationKey& registration_key, | 978 const std::string& tag, |
999 ServiceWorkerStatusCode status_code, | 979 ServiceWorkerStatusCode status_code, |
1000 const base::Closure& callback) { | 980 const base::Closure& callback) { |
1001 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 981 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1002 | 982 |
1003 if (disabled_) { | 983 if (disabled_) { |
1004 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 984 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
1005 base::Bind(callback)); | 985 base::Bind(callback)); |
1006 return; | 986 return; |
1007 } | 987 } |
1008 | 988 |
1009 num_firing_registrations_ -= 1; | 989 num_firing_registrations_ -= 1; |
1010 | 990 |
1011 BackgroundSyncRegistration* registration = | 991 BackgroundSyncRegistration* registration = |
1012 LookupActiveRegistration(service_worker_id, registration_key); | 992 LookupActiveRegistration(service_worker_id, tag); |
1013 if (!registration) { | 993 if (!registration) { |
1014 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 994 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
1015 base::Bind(callback)); | 995 base::Bind(callback)); |
1016 return; | 996 return; |
1017 } | 997 } |
1018 | 998 |
1019 DCHECK_NE(BackgroundSyncState::PENDING, registration->sync_state()); | 999 DCHECK_NE(BackgroundSyncState::PENDING, registration->sync_state()); |
1020 | 1000 |
1021 registration->set_num_attempts(registration->num_attempts() + 1); | 1001 registration->set_num_attempts(registration->num_attempts() + 1); |
1022 | 1002 |
(...skipping 21 matching lines...) Expand all Loading... |
1044 can_retry) { // Sync failed but can retry | 1024 can_retry) { // Sync failed but can retry |
1045 registration->set_sync_state(BackgroundSyncState::PENDING); | 1025 registration->set_sync_state(BackgroundSyncState::PENDING); |
1046 registration->set_delay_until(clock_->Now() + | 1026 registration->set_delay_until(clock_->Now() + |
1047 parameters_->initial_retry_delay * | 1027 parameters_->initial_retry_delay * |
1048 pow(parameters_->retry_delay_factor, | 1028 pow(parameters_->retry_delay_factor, |
1049 registration->num_attempts() - 1)); | 1029 registration->num_attempts() - 1)); |
1050 registration_completed = false; | 1030 registration_completed = false; |
1051 } | 1031 } |
1052 | 1032 |
1053 if (registration_completed) { | 1033 if (registration_completed) { |
1054 RegistrationKey key(*registration); | 1034 const std::string& tag = registration->options()->tag; |
1055 BackgroundSyncRegistration* active_registration = | 1035 BackgroundSyncRegistration* active_registration = |
1056 LookupActiveRegistration(service_worker_id, key); | 1036 LookupActiveRegistration(service_worker_id, tag); |
1057 if (active_registration && | 1037 if (active_registration && |
1058 active_registration->id() == registration->id()) { | 1038 active_registration->id() == registration->id()) { |
1059 RemoveActiveRegistration(service_worker_id, key); | 1039 RemoveActiveRegistration(service_worker_id, tag); |
1060 } | 1040 } |
1061 } | 1041 } |
1062 | 1042 |
1063 StoreRegistrations( | 1043 StoreRegistrations( |
1064 service_worker_id, | 1044 service_worker_id, |
1065 base::Bind(&BackgroundSyncManager::EventCompleteDidStore, | 1045 base::Bind(&BackgroundSyncManager::EventCompleteDidStore, |
1066 weak_ptr_factory_.GetWeakPtr(), service_worker_id, callback)); | 1046 weak_ptr_factory_.GetWeakPtr(), service_worker_id, callback)); |
1067 } | 1047 } |
1068 | 1048 |
1069 void BackgroundSyncManager::EventCompleteDidStore( | 1049 void BackgroundSyncManager::EventCompleteDidStore( |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1207 BackgroundSyncManager::MakeStatusCompletion(const StatusCallback& callback) { | 1187 BackgroundSyncManager::MakeStatusCompletion(const StatusCallback& callback) { |
1208 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1188 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1209 | 1189 |
1210 return base::Bind( | 1190 return base::Bind( |
1211 &BackgroundSyncManager::CompleteOperationCallback<StatusCallback, | 1191 &BackgroundSyncManager::CompleteOperationCallback<StatusCallback, |
1212 BackgroundSyncStatus>, | 1192 BackgroundSyncStatus>, |
1213 weak_ptr_factory_.GetWeakPtr(), callback); | 1193 weak_ptr_factory_.GetWeakPtr(), callback); |
1214 } | 1194 } |
1215 | 1195 |
1216 } // namespace content | 1196 } // namespace content |
OLD | NEW |