| 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 25 matching lines...) Expand all Loading... |
| 36 | 36 |
| 37 namespace content { | 37 namespace content { |
| 38 | 38 |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 // The key used to index the background sync data in ServiceWorkerStorage. | 41 // The key used to index the background sync data in ServiceWorkerStorage. |
| 42 const char kBackgroundSyncUserDataKey[] = "BackgroundSyncUserData"; | 42 const char kBackgroundSyncUserDataKey[] = "BackgroundSyncUserData"; |
| 43 | 43 |
| 44 void RecordFailureAndPostError( | 44 void RecordFailureAndPostError( |
| 45 BackgroundSyncStatus status, | 45 BackgroundSyncStatus status, |
| 46 const BackgroundSyncManager::StatusAndRegistrationCallback& callback) { | 46 BackgroundSyncManager::StatusAndRegistrationCallback callback) { |
| 47 BackgroundSyncMetrics::CountRegisterFailure(status); | 47 BackgroundSyncMetrics::CountRegisterFailure(status); |
| 48 | 48 |
| 49 base::ThreadTaskRunnerHandle::Get()->PostTask( | 49 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 50 FROM_HERE, base::Bind(callback, status, nullptr)); | 50 FROM_HERE, base::BindOnce(std::move(callback), status, nullptr)); |
| 51 } | 51 } |
| 52 | 52 |
| 53 // Returns nullptr if the browser context cannot be accessed for any reason. | 53 // Returns nullptr if the browser context cannot be accessed for any reason. |
| 54 BrowserContext* GetBrowserContextOnUIThread( | 54 BrowserContext* GetBrowserContextOnUIThread( |
| 55 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) { | 55 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) { |
| 56 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 56 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 57 | 57 |
| 58 if (!service_worker_context) | 58 if (!service_worker_context) |
| 59 return nullptr; | 59 return nullptr; |
| 60 StoragePartitionImpl* storage_partition_impl = | 60 StoragePartitionImpl* storage_partition_impl = |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 BackgroundSyncManager::~BackgroundSyncManager() { | 186 BackgroundSyncManager::~BackgroundSyncManager() { |
| 187 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 187 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 188 | 188 |
| 189 service_worker_context_->RemoveObserver(this); | 189 service_worker_context_->RemoveObserver(this); |
| 190 } | 190 } |
| 191 | 191 |
| 192 void BackgroundSyncManager::Register( | 192 void BackgroundSyncManager::Register( |
| 193 int64_t sw_registration_id, | 193 int64_t sw_registration_id, |
| 194 const BackgroundSyncRegistrationOptions& options, | 194 const BackgroundSyncRegistrationOptions& options, |
| 195 const StatusAndRegistrationCallback& callback) { | 195 StatusAndRegistrationCallback callback) { |
| 196 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 196 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 197 | 197 |
| 198 if (disabled_) { | 198 if (disabled_) { |
| 199 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); | 199 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, |
| 200 std::move(callback)); |
| 200 return; | 201 return; |
| 201 } | 202 } |
| 202 | 203 |
| 203 op_scheduler_.ScheduleOperation( | 204 op_scheduler_.ScheduleOperation(base::BindOnce( |
| 204 base::Bind(&BackgroundSyncManager::RegisterCheckIfHasMainFrame, | 205 &BackgroundSyncManager::RegisterCheckIfHasMainFrame, |
| 205 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, options, | 206 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, options, |
| 206 op_scheduler_.WrapCallbackToRunNext(callback))); | 207 op_scheduler_.WrapCallbackToRunNext(std::move(callback)))); |
| 207 } | 208 } |
| 208 | 209 |
| 209 void BackgroundSyncManager::GetRegistrations( | 210 void BackgroundSyncManager::GetRegistrations( |
| 210 int64_t sw_registration_id, | 211 int64_t sw_registration_id, |
| 211 const StatusAndRegistrationsCallback& callback) { | 212 StatusAndRegistrationsCallback callback) { |
| 212 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 213 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 213 | 214 |
| 214 if (disabled_) { | 215 if (disabled_) { |
| 215 base::ThreadTaskRunnerHandle::Get()->PostTask( | 216 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 216 FROM_HERE, | 217 FROM_HERE, |
| 217 base::Bind( | 218 base::BindOnce( |
| 218 callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, | 219 std::move(callback), BACKGROUND_SYNC_STATUS_STORAGE_ERROR, |
| 219 base::Passed( | 220 base::Passed( |
| 220 std::vector<std::unique_ptr<BackgroundSyncRegistration>>()))); | 221 std::vector<std::unique_ptr<BackgroundSyncRegistration>>()))); |
| 221 return; | 222 return; |
| 222 } | 223 } |
| 223 | 224 |
| 224 op_scheduler_.ScheduleOperation( | 225 op_scheduler_.ScheduleOperation( |
| 225 base::Bind(&BackgroundSyncManager::GetRegistrationsImpl, | 226 base::BindOnce(&BackgroundSyncManager::GetRegistrationsImpl, |
| 226 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, | 227 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, |
| 227 op_scheduler_.WrapCallbackToRunNext(callback))); | 228 op_scheduler_.WrapCallbackToRunNext(std::move(callback)))); |
| 228 } | 229 } |
| 229 | 230 |
| 230 void BackgroundSyncManager::OnRegistrationDeleted(int64_t sw_registration_id, | 231 void BackgroundSyncManager::OnRegistrationDeleted(int64_t sw_registration_id, |
| 231 const GURL& pattern) { | 232 const GURL& pattern) { |
| 232 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 233 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 233 | 234 |
| 234 // Operations already in the queue will either fail when they write to storage | 235 // Operations already in the queue will either fail when they write to storage |
| 235 // or return stale results based on registrations loaded in memory. This is | 236 // or return stale results based on registrations loaded in memory. This is |
| 236 // inconsequential since the service worker is gone. | 237 // inconsequential since the service worker is gone. |
| 237 op_scheduler_.ScheduleOperation( | 238 op_scheduler_.ScheduleOperation( |
| 238 base::Bind(&BackgroundSyncManager::OnRegistrationDeletedImpl, | 239 base::BindOnce(&BackgroundSyncManager::OnRegistrationDeletedImpl, |
| 239 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, | 240 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, |
| 240 MakeEmptyCompletion())); | 241 MakeEmptyCompletion())); |
| 241 } | 242 } |
| 242 | 243 |
| 243 void BackgroundSyncManager::OnStorageWiped() { | 244 void BackgroundSyncManager::OnStorageWiped() { |
| 244 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 245 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 245 | 246 |
| 246 // Operations already in the queue will either fail when they write to storage | 247 // Operations already in the queue will either fail when they write to storage |
| 247 // or return stale results based on registrations loaded in memory. This is | 248 // or return stale results based on registrations loaded in memory. This is |
| 248 // inconsequential since the service workers are gone. | 249 // inconsequential since the service workers are gone. |
| 249 op_scheduler_.ScheduleOperation( | 250 op_scheduler_.ScheduleOperation( |
| 250 base::Bind(&BackgroundSyncManager::OnStorageWipedImpl, | 251 base::BindOnce(&BackgroundSyncManager::OnStorageWipedImpl, |
| 251 weak_ptr_factory_.GetWeakPtr(), MakeEmptyCompletion())); | 252 weak_ptr_factory_.GetWeakPtr(), MakeEmptyCompletion())); |
| 252 } | 253 } |
| 253 | 254 |
| 254 void BackgroundSyncManager::SetMaxSyncAttemptsForTesting(int max_attempts) { | 255 void BackgroundSyncManager::SetMaxSyncAttemptsForTesting(int max_attempts) { |
| 255 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 256 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 256 op_scheduler_.ScheduleOperation(base::Bind( | 257 op_scheduler_.ScheduleOperation(base::BindOnce( |
| 257 &BackgroundSyncManager::SetMaxSyncAttemptsImpl, | 258 &BackgroundSyncManager::SetMaxSyncAttemptsImpl, |
| 258 weak_ptr_factory_.GetWeakPtr(), max_attempts, MakeEmptyCompletion())); | 259 weak_ptr_factory_.GetWeakPtr(), max_attempts, MakeEmptyCompletion())); |
| 259 } | 260 } |
| 260 | 261 |
| 261 void BackgroundSyncManager::EmulateDispatchSyncEvent( | 262 void BackgroundSyncManager::EmulateDispatchSyncEvent( |
| 262 const std::string& tag, | 263 const std::string& tag, |
| 263 scoped_refptr<ServiceWorkerVersion> active_version, | 264 scoped_refptr<ServiceWorkerVersion> active_version, |
| 264 bool last_chance, | 265 bool last_chance, |
| 265 const ServiceWorkerVersion::StatusCallback& callback) { | 266 const ServiceWorkerVersion::StatusCallback& callback) { |
| 266 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 267 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 280 disabled_(false), | 281 disabled_(false), |
| 281 num_firing_registrations_(0), | 282 num_firing_registrations_(0), |
| 282 clock_(new base::DefaultClock()), | 283 clock_(new base::DefaultClock()), |
| 283 weak_ptr_factory_(this) { | 284 weak_ptr_factory_(this) { |
| 284 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 285 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 285 | 286 |
| 286 service_worker_context_->AddObserver(this); | 287 service_worker_context_->AddObserver(this); |
| 287 | 288 |
| 288 #if defined(OS_ANDROID) | 289 #if defined(OS_ANDROID) |
| 289 network_observer_.reset(new BackgroundSyncNetworkObserverAndroid( | 290 network_observer_.reset(new BackgroundSyncNetworkObserverAndroid( |
| 290 base::Bind(&BackgroundSyncManager::OnNetworkChanged, | 291 base::BindRepeating(&BackgroundSyncManager::OnNetworkChanged, |
| 291 weak_ptr_factory_.GetWeakPtr()))); | 292 weak_ptr_factory_.GetWeakPtr()))); |
| 292 #else | 293 #else |
| 293 network_observer_.reset(new BackgroundSyncNetworkObserver( | 294 network_observer_.reset(new BackgroundSyncNetworkObserver( |
| 294 base::Bind(&BackgroundSyncManager::OnNetworkChanged, | 295 base::BindRepeating(&BackgroundSyncManager::OnNetworkChanged, |
| 295 weak_ptr_factory_.GetWeakPtr()))); | 296 weak_ptr_factory_.GetWeakPtr()))); |
| 296 #endif | 297 #endif |
| 297 } | 298 } |
| 298 | 299 |
| 299 void BackgroundSyncManager::Init() { | 300 void BackgroundSyncManager::Init() { |
| 300 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 301 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 301 DCHECK(!op_scheduler_.ScheduledOperations()); | 302 DCHECK(!op_scheduler_.ScheduledOperations()); |
| 302 DCHECK(!disabled_); | 303 DCHECK(!disabled_); |
| 303 | 304 |
| 304 op_scheduler_.ScheduleOperation(base::Bind(&BackgroundSyncManager::InitImpl, | 305 op_scheduler_.ScheduleOperation( |
| 305 weak_ptr_factory_.GetWeakPtr(), | 306 base::BindOnce(&BackgroundSyncManager::InitImpl, |
| 306 MakeEmptyCompletion())); | 307 weak_ptr_factory_.GetWeakPtr(), MakeEmptyCompletion())); |
| 307 } | 308 } |
| 308 | 309 |
| 309 void BackgroundSyncManager::InitImpl(const base::Closure& callback) { | 310 void BackgroundSyncManager::InitImpl(base::OnceClosure callback) { |
| 310 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 311 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 311 | 312 |
| 312 if (disabled_) { | 313 if (disabled_) { |
| 313 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 314 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 315 std::move(callback)); |
| 314 return; | 316 return; |
| 315 } | 317 } |
| 316 | 318 |
| 317 BrowserThread::PostTaskAndReplyWithResult( | 319 BrowserThread::PostTaskAndReplyWithResult( |
| 318 BrowserThread::UI, FROM_HERE, | 320 BrowserThread::UI, FROM_HERE, |
| 319 base::Bind(&GetControllerParameters, service_worker_context_, | 321 base::BindOnce(&GetControllerParameters, service_worker_context_, |
| 320 base::Passed( | 322 base::Passed(base::MakeUnique<BackgroundSyncParameters>( |
| 321 base::MakeUnique<BackgroundSyncParameters>(*parameters_))), | 323 *parameters_))), |
| 322 base::Bind(&BackgroundSyncManager::InitDidGetControllerParameters, | 324 base::BindOnce(&BackgroundSyncManager::InitDidGetControllerParameters, |
| 323 weak_ptr_factory_.GetWeakPtr(), callback)); | 325 weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| 324 } | 326 } |
| 325 | 327 |
| 326 void BackgroundSyncManager::InitDidGetControllerParameters( | 328 void BackgroundSyncManager::InitDidGetControllerParameters( |
| 327 const base::Closure& callback, | 329 base::OnceClosure callback, |
| 328 std::unique_ptr<BackgroundSyncParameters> updated_parameters) { | 330 std::unique_ptr<BackgroundSyncParameters> updated_parameters) { |
| 329 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 331 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 330 | 332 |
| 331 parameters_ = std::move(updated_parameters); | 333 parameters_ = std::move(updated_parameters); |
| 332 if (parameters_->disable) { | 334 if (parameters_->disable) { |
| 333 disabled_ = true; | 335 disabled_ = true; |
| 334 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 336 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 337 std::move(callback)); |
| 335 return; | 338 return; |
| 336 } | 339 } |
| 337 | 340 |
| 338 GetDataFromBackend( | 341 GetDataFromBackend(kBackgroundSyncUserDataKey, |
| 339 kBackgroundSyncUserDataKey, | 342 base::AdaptCallbackForRepeating(base::BindOnce( |
| 340 base::Bind(&BackgroundSyncManager::InitDidGetDataFromBackend, | 343 &BackgroundSyncManager::InitDidGetDataFromBackend, |
| 341 weak_ptr_factory_.GetWeakPtr(), callback)); | 344 weak_ptr_factory_.GetWeakPtr(), std::move(callback)))); |
| 342 } | 345 } |
| 343 | 346 |
| 344 void BackgroundSyncManager::InitDidGetDataFromBackend( | 347 void BackgroundSyncManager::InitDidGetDataFromBackend( |
| 345 const base::Closure& callback, | 348 base::OnceClosure callback, |
| 346 const std::vector<std::pair<int64_t, std::string>>& user_data, | 349 const std::vector<std::pair<int64_t, std::string>>& user_data, |
| 347 ServiceWorkerStatusCode status) { | 350 ServiceWorkerStatusCode status) { |
| 348 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 351 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 349 | 352 |
| 350 if (status != SERVICE_WORKER_OK && status != SERVICE_WORKER_ERROR_NOT_FOUND) { | 353 if (status != SERVICE_WORKER_OK && status != SERVICE_WORKER_ERROR_NOT_FOUND) { |
| 351 LOG(ERROR) << "BackgroundSync failed to init due to backend failure."; | 354 LOG(ERROR) << "BackgroundSync failed to init due to backend failure."; |
| 352 DisableAndClearManager(callback); | 355 DisableAndClearManager(std::move(callback)); |
| 353 return; | 356 return; |
| 354 } | 357 } |
| 355 | 358 |
| 356 bool corruption_detected = false; | 359 bool corruption_detected = false; |
| 357 for (const std::pair<int64_t, std::string>& data : user_data) { | 360 for (const std::pair<int64_t, std::string>& data : user_data) { |
| 358 BackgroundSyncRegistrationsProto registrations_proto; | 361 BackgroundSyncRegistrationsProto registrations_proto; |
| 359 if (registrations_proto.ParseFromString(data.second)) { | 362 if (registrations_proto.ParseFromString(data.second)) { |
| 360 BackgroundSyncRegistrations* registrations = | 363 BackgroundSyncRegistrations* registrations = |
| 361 &active_registrations_[data.first]; | 364 &active_registrations_[data.first]; |
| 362 registrations->next_id = registrations_proto.next_registration_id(); | 365 registrations->next_id = registrations_proto.next_registration_id(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 385 base::Time::FromInternalValue(registration_proto.delay_until())); | 388 base::Time::FromInternalValue(registration_proto.delay_until())); |
| 386 } | 389 } |
| 387 } | 390 } |
| 388 | 391 |
| 389 if (corruption_detected) | 392 if (corruption_detected) |
| 390 break; | 393 break; |
| 391 } | 394 } |
| 392 | 395 |
| 393 if (corruption_detected) { | 396 if (corruption_detected) { |
| 394 LOG(ERROR) << "Corruption detected in background sync backend"; | 397 LOG(ERROR) << "Corruption detected in background sync backend"; |
| 395 DisableAndClearManager(callback); | 398 DisableAndClearManager(std::move(callback)); |
| 396 return; | 399 return; |
| 397 } | 400 } |
| 398 | 401 |
| 399 FireReadyEvents(); | 402 FireReadyEvents(); |
| 400 | 403 |
| 401 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 404 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); |
| 402 } | 405 } |
| 403 | 406 |
| 404 void BackgroundSyncManager::RegisterCheckIfHasMainFrame( | 407 void BackgroundSyncManager::RegisterCheckIfHasMainFrame( |
| 405 int64_t sw_registration_id, | 408 int64_t sw_registration_id, |
| 406 const BackgroundSyncRegistrationOptions& options, | 409 const BackgroundSyncRegistrationOptions& options, |
| 407 const StatusAndRegistrationCallback& callback) { | 410 StatusAndRegistrationCallback callback) { |
| 408 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 411 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 409 | 412 |
| 410 ServiceWorkerRegistration* sw_registration = | 413 ServiceWorkerRegistration* sw_registration = |
| 411 service_worker_context_->GetLiveRegistration(sw_registration_id); | 414 service_worker_context_->GetLiveRegistration(sw_registration_id); |
| 412 if (!sw_registration || !sw_registration->active_version()) { | 415 if (!sw_registration || !sw_registration->active_version()) { |
| 413 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, | 416 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, |
| 414 callback); | 417 std::move(callback)); |
| 415 return; | 418 return; |
| 416 } | 419 } |
| 417 | 420 |
| 418 HasMainFrameProviderHost( | 421 HasMainFrameProviderHost( |
| 419 sw_registration->pattern().GetOrigin(), | 422 sw_registration->pattern().GetOrigin(), |
| 420 base::Bind(&BackgroundSyncManager::RegisterDidCheckIfMainFrame, | 423 base::BindOnce(&BackgroundSyncManager::RegisterDidCheckIfMainFrame, |
| 421 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, options, | 424 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, |
| 422 callback)); | 425 options, std::move(callback))); |
| 423 } | 426 } |
| 424 | 427 |
| 425 void BackgroundSyncManager::RegisterDidCheckIfMainFrame( | 428 void BackgroundSyncManager::RegisterDidCheckIfMainFrame( |
| 426 int64_t sw_registration_id, | 429 int64_t sw_registration_id, |
| 427 const BackgroundSyncRegistrationOptions& options, | 430 const BackgroundSyncRegistrationOptions& options, |
| 428 const StatusAndRegistrationCallback& callback, | 431 StatusAndRegistrationCallback callback, |
| 429 bool has_main_frame_client) { | 432 bool has_main_frame_client) { |
| 430 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 433 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 431 | 434 |
| 432 if (!has_main_frame_client) { | 435 if (!has_main_frame_client) { |
| 433 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, callback); | 436 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, |
| 437 std::move(callback)); |
| 434 return; | 438 return; |
| 435 } | 439 } |
| 436 RegisterImpl(sw_registration_id, options, callback); | 440 RegisterImpl(sw_registration_id, options, std::move(callback)); |
| 437 } | 441 } |
| 438 | 442 |
| 439 void BackgroundSyncManager::RegisterImpl( | 443 void BackgroundSyncManager::RegisterImpl( |
| 440 int64_t sw_registration_id, | 444 int64_t sw_registration_id, |
| 441 const BackgroundSyncRegistrationOptions& options, | 445 const BackgroundSyncRegistrationOptions& options, |
| 442 const StatusAndRegistrationCallback& callback) { | 446 StatusAndRegistrationCallback callback) { |
| 443 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 447 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 444 | 448 |
| 445 if (disabled_) { | 449 if (disabled_) { |
| 446 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); | 450 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, |
| 451 std::move(callback)); |
| 447 return; | 452 return; |
| 448 } | 453 } |
| 449 | 454 |
| 450 if (options.tag.length() > kMaxTagLength) { | 455 if (options.tag.length() > kMaxTagLength) { |
| 451 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, callback); | 456 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, |
| 457 std::move(callback)); |
| 452 return; | 458 return; |
| 453 } | 459 } |
| 454 | 460 |
| 455 ServiceWorkerRegistration* sw_registration = | 461 ServiceWorkerRegistration* sw_registration = |
| 456 service_worker_context_->GetLiveRegistration(sw_registration_id); | 462 service_worker_context_->GetLiveRegistration(sw_registration_id); |
| 457 if (!sw_registration || !sw_registration->active_version()) { | 463 if (!sw_registration || !sw_registration->active_version()) { |
| 458 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, | 464 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, |
| 459 callback); | 465 std::move(callback)); |
| 460 return; | 466 return; |
| 461 } | 467 } |
| 462 | 468 |
| 463 BrowserThread::PostTaskAndReplyWithResult( | 469 BrowserThread::PostTaskAndReplyWithResult( |
| 464 BrowserThread::UI, FROM_HERE, | 470 BrowserThread::UI, FROM_HERE, |
| 465 base::Bind(&GetBackgroundSyncPermissionOnUIThread, | 471 base::BindOnce(&GetBackgroundSyncPermissionOnUIThread, |
| 466 service_worker_context_, | 472 service_worker_context_, |
| 467 sw_registration->pattern().GetOrigin()), | 473 sw_registration->pattern().GetOrigin()), |
| 468 base::Bind(&BackgroundSyncManager::RegisterDidAskForPermission, | 474 base::BindOnce(&BackgroundSyncManager::RegisterDidAskForPermission, |
| 469 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, options, | 475 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, |
| 470 callback)); | 476 options, std::move(callback))); |
| 471 } | 477 } |
| 472 | 478 |
| 473 void BackgroundSyncManager::RegisterDidAskForPermission( | 479 void BackgroundSyncManager::RegisterDidAskForPermission( |
| 474 int64_t sw_registration_id, | 480 int64_t sw_registration_id, |
| 475 const BackgroundSyncRegistrationOptions& options, | 481 const BackgroundSyncRegistrationOptions& options, |
| 476 const StatusAndRegistrationCallback& callback, | 482 StatusAndRegistrationCallback callback, |
| 477 blink::mojom::PermissionStatus permission_status) { | 483 blink::mojom::PermissionStatus permission_status) { |
| 478 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 484 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 479 | 485 |
| 480 if (permission_status == blink::mojom::PermissionStatus::DENIED) { | 486 if (permission_status == blink::mojom::PermissionStatus::DENIED) { |
| 481 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_PERMISSION_DENIED, | 487 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_PERMISSION_DENIED, |
| 482 callback); | 488 std::move(callback)); |
| 483 return; | 489 return; |
| 484 } | 490 } |
| 485 DCHECK(permission_status == blink::mojom::PermissionStatus::GRANTED); | 491 DCHECK(permission_status == blink::mojom::PermissionStatus::GRANTED); |
| 486 | 492 |
| 487 ServiceWorkerRegistration* sw_registration = | 493 ServiceWorkerRegistration* sw_registration = |
| 488 service_worker_context_->GetLiveRegistration(sw_registration_id); | 494 service_worker_context_->GetLiveRegistration(sw_registration_id); |
| 489 if (!sw_registration || !sw_registration->active_version()) { | 495 if (!sw_registration || !sw_registration->active_version()) { |
| 490 // The service worker was shut down in the interim. | 496 // The service worker was shut down in the interim. |
| 491 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, | 497 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, |
| 492 callback); | 498 std::move(callback)); |
| 493 return; | 499 return; |
| 494 } | 500 } |
| 495 | 501 |
| 496 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 502 BrowserThread::PostTask( |
| 497 base::Bind(&NotifyBackgroundSyncRegisteredOnUIThread, | 503 BrowserThread::UI, FROM_HERE, |
| 498 service_worker_context_, | 504 base::BindOnce(&NotifyBackgroundSyncRegisteredOnUIThread, |
| 499 sw_registration->pattern().GetOrigin())); | 505 service_worker_context_, |
| 506 sw_registration->pattern().GetOrigin())); |
| 500 | 507 |
| 501 BackgroundSyncRegistration* existing_registration = | 508 BackgroundSyncRegistration* existing_registration = |
| 502 LookupActiveRegistration(sw_registration_id, options.tag); | 509 LookupActiveRegistration(sw_registration_id, options.tag); |
| 503 if (existing_registration) { | 510 if (existing_registration) { |
| 504 DCHECK(existing_registration->options()->Equals(options)); | 511 DCHECK(existing_registration->options()->Equals(options)); |
| 505 | 512 |
| 506 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = | 513 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = |
| 507 AreOptionConditionsMet(options) | 514 AreOptionConditionsMet(options) |
| 508 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE | 515 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE |
| 509 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; | 516 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; |
| 510 BackgroundSyncMetrics::CountRegisterSuccess( | 517 BackgroundSyncMetrics::CountRegisterSuccess( |
| 511 registration_could_fire, | 518 registration_could_fire, |
| 512 BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE); | 519 BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE); |
| 513 | 520 |
| 514 if (existing_registration->IsFiring()) { | 521 if (existing_registration->IsFiring()) { |
| 515 existing_registration->set_sync_state( | 522 existing_registration->set_sync_state( |
| 516 blink::mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING); | 523 blink::mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING); |
| 517 } | 524 } |
| 518 | 525 |
| 519 base::ThreadTaskRunnerHandle::Get()->PostTask( | 526 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 520 FROM_HERE, | 527 FROM_HERE, |
| 521 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, | 528 base::BindOnce( |
| 522 base::Passed(base::MakeUnique<BackgroundSyncRegistration>( | 529 std::move(callback), BACKGROUND_SYNC_STATUS_OK, |
| 523 *existing_registration)))); | 530 base::Passed(base::MakeUnique<BackgroundSyncRegistration>( |
| 531 *existing_registration)))); |
| 524 return; | 532 return; |
| 525 } | 533 } |
| 526 | 534 |
| 527 BackgroundSyncRegistration new_registration; | 535 BackgroundSyncRegistration new_registration; |
| 528 | 536 |
| 529 *new_registration.options() = options; | 537 *new_registration.options() = options; |
| 530 | 538 |
| 531 BackgroundSyncRegistrations* registrations = | 539 BackgroundSyncRegistrations* registrations = |
| 532 &active_registrations_[sw_registration_id]; | 540 &active_registrations_[sw_registration_id]; |
| 533 new_registration.set_id(registrations->next_id++); | 541 new_registration.set_id(registrations->next_id++); |
| 534 | 542 |
| 535 AddActiveRegistration(sw_registration_id, | 543 AddActiveRegistration(sw_registration_id, |
| 536 sw_registration->pattern().GetOrigin(), | 544 sw_registration->pattern().GetOrigin(), |
| 537 new_registration); | 545 new_registration); |
| 538 | 546 |
| 539 StoreRegistrations( | 547 StoreRegistrations(sw_registration_id, |
| 540 sw_registration_id, | 548 base::AdaptCallbackForRepeating(base::BindOnce( |
| 541 base::Bind(&BackgroundSyncManager::RegisterDidStore, | 549 &BackgroundSyncManager::RegisterDidStore, |
| 542 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, | 550 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, |
| 543 new_registration, callback)); | 551 new_registration, std::move(callback)))); |
| 544 } | 552 } |
| 545 | 553 |
| 546 void BackgroundSyncManager::DisableAndClearManager( | 554 void BackgroundSyncManager::DisableAndClearManager(base::OnceClosure callback) { |
| 547 const base::Closure& callback) { | |
| 548 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 555 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 549 | 556 |
| 550 if (disabled_) { | 557 if (disabled_) { |
| 551 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 558 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 559 std::move(callback)); |
| 552 return; | 560 return; |
| 553 } | 561 } |
| 554 | 562 |
| 555 disabled_ = true; | 563 disabled_ = true; |
| 556 | 564 |
| 557 active_registrations_.clear(); | 565 active_registrations_.clear(); |
| 558 | 566 |
| 559 // Delete all backend entries. The memory representation of registered syncs | 567 // Delete all backend entries. The memory representation of registered syncs |
| 560 // may be out of sync with storage (e.g., due to corruption detection on | 568 // may be out of sync with storage (e.g., due to corruption detection on |
| 561 // loading from storage), so reload the registrations from storage again. | 569 // loading from storage), so reload the registrations from storage again. |
| 562 GetDataFromBackend( | 570 GetDataFromBackend( |
| 563 kBackgroundSyncUserDataKey, | 571 kBackgroundSyncUserDataKey, |
| 564 base::Bind(&BackgroundSyncManager::DisableAndClearDidGetRegistrations, | 572 base::AdaptCallbackForRepeating(base::BindOnce( |
| 565 weak_ptr_factory_.GetWeakPtr(), callback)); | 573 &BackgroundSyncManager::DisableAndClearDidGetRegistrations, |
| 574 weak_ptr_factory_.GetWeakPtr(), std::move(callback)))); |
| 566 } | 575 } |
| 567 | 576 |
| 568 void BackgroundSyncManager::DisableAndClearDidGetRegistrations( | 577 void BackgroundSyncManager::DisableAndClearDidGetRegistrations( |
| 569 const base::Closure& callback, | 578 base::OnceClosure callback, |
| 570 const std::vector<std::pair<int64_t, std::string>>& user_data, | 579 const std::vector<std::pair<int64_t, std::string>>& user_data, |
| 571 ServiceWorkerStatusCode status) { | 580 ServiceWorkerStatusCode status) { |
| 572 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 581 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 573 | 582 |
| 574 if (status != SERVICE_WORKER_OK || user_data.empty()) { | 583 if (status != SERVICE_WORKER_OK || user_data.empty()) { |
| 575 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 584 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 585 std::move(callback)); |
| 576 return; | 586 return; |
| 577 } | 587 } |
| 578 | 588 |
| 579 base::Closure barrier_closure = | 589 base::RepeatingClosure barrier_closure = |
| 580 base::BarrierClosure(user_data.size(), callback); | 590 base::BarrierClosure(user_data.size(), std::move(callback)); |
| 581 | 591 |
| 582 for (const auto& sw_id_and_regs : user_data) { | 592 for (const auto& sw_id_and_regs : user_data) { |
| 583 service_worker_context_->ClearRegistrationUserData( | 593 service_worker_context_->ClearRegistrationUserData( |
| 584 sw_id_and_regs.first, {kBackgroundSyncUserDataKey}, | 594 sw_id_and_regs.first, {kBackgroundSyncUserDataKey}, |
| 585 base::Bind(&BackgroundSyncManager::DisableAndClearManagerClearedOne, | 595 base::AdaptCallbackForRepeating(base::BindOnce( |
| 586 weak_ptr_factory_.GetWeakPtr(), barrier_closure)); | 596 &BackgroundSyncManager::DisableAndClearManagerClearedOne, |
| 597 weak_ptr_factory_.GetWeakPtr(), barrier_closure))); |
| 587 } | 598 } |
| 588 } | 599 } |
| 589 | 600 |
| 590 void BackgroundSyncManager::DisableAndClearManagerClearedOne( | 601 void BackgroundSyncManager::DisableAndClearManagerClearedOne( |
| 591 const base::Closure& barrier_closure, | 602 base::OnceClosure barrier_closure, |
| 592 ServiceWorkerStatusCode status) { | 603 ServiceWorkerStatusCode status) { |
| 593 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 604 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 594 | 605 |
| 595 // The status doesn't matter at this point, there is nothing else to be done. | 606 // The status doesn't matter at this point, there is nothing else to be done. |
| 596 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, barrier_closure); | 607 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 608 std::move(barrier_closure)); |
| 597 } | 609 } |
| 598 | 610 |
| 599 BackgroundSyncRegistration* BackgroundSyncManager::LookupActiveRegistration( | 611 BackgroundSyncRegistration* BackgroundSyncManager::LookupActiveRegistration( |
| 600 int64_t sw_registration_id, | 612 int64_t sw_registration_id, |
| 601 const std::string& tag) { | 613 const std::string& tag) { |
| 602 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 614 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 603 | 615 |
| 604 SWIdToRegistrationsMap::iterator it = | 616 SWIdToRegistrationsMap::iterator it = |
| 605 active_registrations_.find(sw_registration_id); | 617 active_registrations_.find(sw_registration_id); |
| 606 if (it == active_registrations_.end()) | 618 if (it == active_registrations_.end()) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 bool success = registrations_proto.SerializeToString(&serialized); | 658 bool success = registrations_proto.SerializeToString(&serialized); |
| 647 DCHECK(success); | 659 DCHECK(success); |
| 648 | 660 |
| 649 StoreDataInBackend(sw_registration_id, registrations.origin, | 661 StoreDataInBackend(sw_registration_id, registrations.origin, |
| 650 kBackgroundSyncUserDataKey, serialized, callback); | 662 kBackgroundSyncUserDataKey, serialized, callback); |
| 651 } | 663 } |
| 652 | 664 |
| 653 void BackgroundSyncManager::RegisterDidStore( | 665 void BackgroundSyncManager::RegisterDidStore( |
| 654 int64_t sw_registration_id, | 666 int64_t sw_registration_id, |
| 655 const BackgroundSyncRegistration& new_registration, | 667 const BackgroundSyncRegistration& new_registration, |
| 656 const StatusAndRegistrationCallback& callback, | 668 StatusAndRegistrationCallback callback, |
| 657 ServiceWorkerStatusCode status) { | 669 ServiceWorkerStatusCode status) { |
| 658 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 670 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 659 | 671 |
| 660 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { | 672 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { |
| 661 // The service worker registration is gone. | 673 // The service worker registration is gone. |
| 662 active_registrations_.erase(sw_registration_id); | 674 active_registrations_.erase(sw_registration_id); |
| 663 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); | 675 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, |
| 676 std::move(callback)); |
| 664 return; | 677 return; |
| 665 } | 678 } |
| 666 | 679 |
| 667 if (status != SERVICE_WORKER_OK) { | 680 if (status != SERVICE_WORKER_OK) { |
| 668 LOG(ERROR) << "BackgroundSync failed to store registration due to backend " | 681 LOG(ERROR) << "BackgroundSync failed to store registration due to backend " |
| 669 "failure."; | 682 "failure."; |
| 670 BackgroundSyncMetrics::CountRegisterFailure( | 683 BackgroundSyncMetrics::CountRegisterFailure( |
| 671 BACKGROUND_SYNC_STATUS_STORAGE_ERROR); | 684 BACKGROUND_SYNC_STATUS_STORAGE_ERROR); |
| 672 DisableAndClearManager( | 685 DisableAndClearManager(base::BindOnce( |
| 673 base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, nullptr)); | 686 std::move(callback), BACKGROUND_SYNC_STATUS_STORAGE_ERROR, nullptr)); |
| 674 return; | 687 return; |
| 675 } | 688 } |
| 676 | 689 |
| 677 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = | 690 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = |
| 678 AreOptionConditionsMet(*new_registration.options()) | 691 AreOptionConditionsMet(*new_registration.options()) |
| 679 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE | 692 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE |
| 680 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; | 693 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; |
| 681 BackgroundSyncMetrics::CountRegisterSuccess( | 694 BackgroundSyncMetrics::CountRegisterSuccess( |
| 682 registration_could_fire, | 695 registration_could_fire, |
| 683 BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE); | 696 BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE); |
| 684 | 697 |
| 685 FireReadyEvents(); | 698 FireReadyEvents(); |
| 686 | 699 |
| 687 base::ThreadTaskRunnerHandle::Get()->PostTask( | 700 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 688 FROM_HERE, | 701 FROM_HERE, |
| 689 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, | 702 base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK, |
| 690 base::Passed(base::MakeUnique<BackgroundSyncRegistration>( | 703 base::Passed(base::MakeUnique<BackgroundSyncRegistration>( |
| 691 new_registration)))); | 704 new_registration)))); |
| 692 } | 705 } |
| 693 | 706 |
| 694 void BackgroundSyncManager::RemoveActiveRegistration(int64_t sw_registration_id, | 707 void BackgroundSyncManager::RemoveActiveRegistration(int64_t sw_registration_id, |
| 695 const std::string& tag) { | 708 const std::string& tag) { |
| 696 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 709 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 697 DCHECK(LookupActiveRegistration(sw_registration_id, tag)); | 710 DCHECK(LookupActiveRegistration(sw_registration_id, tag)); |
| 698 | 711 |
| 699 BackgroundSyncRegistrations* registrations = | 712 BackgroundSyncRegistrations* registrations = |
| 700 &active_registrations_[sw_registration_id]; | 713 &active_registrations_[sw_registration_id]; |
| 701 | 714 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 const std::string& tag, | 756 const std::string& tag, |
| 744 scoped_refptr<ServiceWorkerVersion> active_version, | 757 scoped_refptr<ServiceWorkerVersion> active_version, |
| 745 blink::mojom::BackgroundSyncEventLastChance last_chance, | 758 blink::mojom::BackgroundSyncEventLastChance last_chance, |
| 746 const ServiceWorkerVersion::StatusCallback& callback) { | 759 const ServiceWorkerVersion::StatusCallback& callback) { |
| 747 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 760 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 748 DCHECK(active_version); | 761 DCHECK(active_version); |
| 749 | 762 |
| 750 if (active_version->running_status() != EmbeddedWorkerStatus::RUNNING) { | 763 if (active_version->running_status() != EmbeddedWorkerStatus::RUNNING) { |
| 751 active_version->RunAfterStartWorker( | 764 active_version->RunAfterStartWorker( |
| 752 ServiceWorkerMetrics::EventType::SYNC, | 765 ServiceWorkerMetrics::EventType::SYNC, |
| 753 base::Bind(&BackgroundSyncManager::DispatchSyncEvent, | 766 base::AdaptCallbackForRepeating( |
| 754 weak_ptr_factory_.GetWeakPtr(), tag, active_version, | 767 base::BindOnce(&BackgroundSyncManager::DispatchSyncEvent, |
| 755 last_chance, callback), | 768 weak_ptr_factory_.GetWeakPtr(), tag, active_version, |
| 769 last_chance, callback)), |
| 756 callback); | 770 callback); |
| 757 return; | 771 return; |
| 758 } | 772 } |
| 759 | 773 |
| 760 int request_id = active_version->StartRequestWithCustomTimeout( | 774 int request_id = active_version->StartRequestWithCustomTimeout( |
| 761 ServiceWorkerMetrics::EventType::SYNC, callback, | 775 ServiceWorkerMetrics::EventType::SYNC, callback, |
| 762 parameters_->max_sync_event_duration, | 776 parameters_->max_sync_event_duration, |
| 763 ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); | 777 ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); |
| 764 | 778 |
| 765 active_version->event_dispatcher()->DispatchSyncEvent( | 779 active_version->event_dispatcher()->DispatchSyncEvent( |
| 766 tag, last_chance, | 780 tag, last_chance, |
| 767 base::Bind(&OnSyncEventFinished, std::move(active_version), request_id, | 781 base::BindOnce(&OnSyncEventFinished, std::move(active_version), |
| 768 callback)); | 782 request_id, callback)); |
| 769 } | 783 } |
| 770 | 784 |
| 771 void BackgroundSyncManager::ScheduleDelayedTask(const base::Closure& callback, | 785 void BackgroundSyncManager::ScheduleDelayedTask(base::OnceClosure callback, |
| 772 base::TimeDelta delay) { | 786 base::TimeDelta delay) { |
| 773 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, callback, | 787 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 774 delay); | 788 FROM_HERE, std::move(callback), delay); |
| 775 } | 789 } |
| 776 | 790 |
| 777 void BackgroundSyncManager::HasMainFrameProviderHost( | 791 void BackgroundSyncManager::HasMainFrameProviderHost(const GURL& origin, |
| 778 const GURL& origin, | 792 BoolCallback callback) { |
| 779 const BoolCallback& callback) { | 793 service_worker_context_->HasMainFrameProviderHost( |
| 780 service_worker_context_->HasMainFrameProviderHost(origin, callback); | 794 origin, base::AdaptCallbackForRepeating(std::move(callback))); |
| 781 } | 795 } |
| 782 | 796 |
| 783 void BackgroundSyncManager::GetRegistrationsImpl( | 797 void BackgroundSyncManager::GetRegistrationsImpl( |
| 784 int64_t sw_registration_id, | 798 int64_t sw_registration_id, |
| 785 const StatusAndRegistrationsCallback& callback) { | 799 StatusAndRegistrationsCallback callback) { |
| 786 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 800 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 787 | 801 |
| 788 std::vector<std::unique_ptr<BackgroundSyncRegistration>> out_registrations; | 802 std::vector<std::unique_ptr<BackgroundSyncRegistration>> out_registrations; |
| 789 | 803 |
| 790 if (disabled_) { | 804 if (disabled_) { |
| 791 base::ThreadTaskRunnerHandle::Get()->PostTask( | 805 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 792 FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, | 806 FROM_HERE, base::BindOnce(std::move(callback), |
| 793 base::Passed(&out_registrations))); | 807 BACKGROUND_SYNC_STATUS_STORAGE_ERROR, |
| 808 base::Passed(&out_registrations))); |
| 794 return; | 809 return; |
| 795 } | 810 } |
| 796 | 811 |
| 797 SWIdToRegistrationsMap::iterator it = | 812 SWIdToRegistrationsMap::iterator it = |
| 798 active_registrations_.find(sw_registration_id); | 813 active_registrations_.find(sw_registration_id); |
| 799 | 814 |
| 800 if (it != active_registrations_.end()) { | 815 if (it != active_registrations_.end()) { |
| 801 const BackgroundSyncRegistrations& registrations = it->second; | 816 const BackgroundSyncRegistrations& registrations = it->second; |
| 802 for (const auto& tag_and_registration : registrations.registration_map) { | 817 for (const auto& tag_and_registration : registrations.registration_map) { |
| 803 const BackgroundSyncRegistration& registration = | 818 const BackgroundSyncRegistration& registration = |
| 804 tag_and_registration.second; | 819 tag_and_registration.second; |
| 805 out_registrations.push_back( | 820 out_registrations.push_back( |
| 806 base::MakeUnique<BackgroundSyncRegistration>(registration)); | 821 base::MakeUnique<BackgroundSyncRegistration>(registration)); |
| 807 } | 822 } |
| 808 } | 823 } |
| 809 | 824 |
| 810 base::ThreadTaskRunnerHandle::Get()->PostTask( | 825 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 811 FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, | 826 FROM_HERE, base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK, |
| 812 base::Passed(&out_registrations))); | 827 base::Passed(&out_registrations))); |
| 813 } | 828 } |
| 814 | 829 |
| 815 bool BackgroundSyncManager::AreOptionConditionsMet( | 830 bool BackgroundSyncManager::AreOptionConditionsMet( |
| 816 const BackgroundSyncRegistrationOptions& options) { | 831 const BackgroundSyncRegistrationOptions& options) { |
| 817 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 832 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 818 return network_observer_->NetworkSufficient(options.network_state); | 833 return network_observer_->NetworkSufficient(options.network_state); |
| 819 } | 834 } |
| 820 | 835 |
| 821 bool BackgroundSyncManager::IsRegistrationReadyToFire( | 836 bool BackgroundSyncManager::IsRegistrationReadyToFire( |
| 822 const BackgroundSyncRegistration& registration) { | 837 const BackgroundSyncRegistration& registration) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 866 delayed_sync_task_.Reset(base::Bind(&BackgroundSyncManager::FireReadyEvents, | 881 delayed_sync_task_.Reset(base::Bind(&BackgroundSyncManager::FireReadyEvents, |
| 867 weak_ptr_factory_.GetWeakPtr())); | 882 weak_ptr_factory_.GetWeakPtr())); |
| 868 ScheduleDelayedTask(delayed_sync_task_.callback(), soonest_wakeup_delta); | 883 ScheduleDelayedTask(delayed_sync_task_.callback(), soonest_wakeup_delta); |
| 869 } | 884 } |
| 870 | 885 |
| 871 // In case the browser closes (or to prevent it from closing), call | 886 // In case the browser closes (or to prevent it from closing), call |
| 872 // RunInBackground to either wake up the browser at the wakeup delta or to | 887 // RunInBackground to either wake up the browser at the wakeup delta or to |
| 873 // keep the browser running. | 888 // keep the browser running. |
| 874 BrowserThread::PostTask( | 889 BrowserThread::PostTask( |
| 875 BrowserThread::UI, FROM_HERE, | 890 BrowserThread::UI, FROM_HERE, |
| 876 base::Bind(RunInBackgroundOnUIThread, service_worker_context_, | 891 base::BindOnce( |
| 877 !soonest_wakeup_delta.is_max() /* should run in background */, | 892 RunInBackgroundOnUIThread, service_worker_context_, |
| 878 soonest_wakeup_delta.InMilliseconds())); | 893 !soonest_wakeup_delta.is_max() /* should run in background */, |
| 894 soonest_wakeup_delta.InMilliseconds())); |
| 879 } | 895 } |
| 880 | 896 |
| 881 void BackgroundSyncManager::FireReadyEvents() { | 897 void BackgroundSyncManager::FireReadyEvents() { |
| 882 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 898 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 883 | 899 |
| 884 if (disabled_) | 900 if (disabled_) |
| 885 return; | 901 return; |
| 886 | 902 |
| 887 op_scheduler_.ScheduleOperation( | 903 op_scheduler_.ScheduleOperation( |
| 888 base::Bind(&BackgroundSyncManager::FireReadyEventsImpl, | 904 base::BindOnce(&BackgroundSyncManager::FireReadyEventsImpl, |
| 889 weak_ptr_factory_.GetWeakPtr(), MakeEmptyCompletion())); | 905 weak_ptr_factory_.GetWeakPtr(), MakeEmptyCompletion())); |
| 890 } | 906 } |
| 891 | 907 |
| 892 void BackgroundSyncManager::FireReadyEventsImpl(const base::Closure& callback) { | 908 void BackgroundSyncManager::FireReadyEventsImpl(base::OnceClosure callback) { |
| 893 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 909 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 894 | 910 |
| 895 if (disabled_) { | 911 if (disabled_) { |
| 896 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 912 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 913 std::move(callback)); |
| 897 return; | 914 return; |
| 898 } | 915 } |
| 899 | 916 |
| 900 // Find the registrations that are ready to run. | 917 // Find the registrations that are ready to run. |
| 901 std::vector<std::pair<int64_t, std::string>> sw_id_and_tags_to_fire; | 918 std::vector<std::pair<int64_t, std::string>> sw_id_and_tags_to_fire; |
| 902 | 919 |
| 903 for (auto& sw_id_and_registrations : active_registrations_) { | 920 for (auto& sw_id_and_registrations : active_registrations_) { |
| 904 const int64_t service_worker_id = sw_id_and_registrations.first; | 921 const int64_t service_worker_id = sw_id_and_registrations.first; |
| 905 for (auto& key_and_registration : | 922 for (auto& key_and_registration : |
| 906 sw_id_and_registrations.second.registration_map) { | 923 sw_id_and_registrations.second.registration_map) { |
| 907 BackgroundSyncRegistration* registration = &key_and_registration.second; | 924 BackgroundSyncRegistration* registration = &key_and_registration.second; |
| 908 if (IsRegistrationReadyToFire(*registration)) { | 925 if (IsRegistrationReadyToFire(*registration)) { |
| 909 sw_id_and_tags_to_fire.push_back( | 926 sw_id_and_tags_to_fire.push_back( |
| 910 std::make_pair(service_worker_id, key_and_registration.first)); | 927 std::make_pair(service_worker_id, key_and_registration.first)); |
| 911 // The state change is not saved to persistent storage because | 928 // The state change is not saved to persistent storage because |
| 912 // if the sync event is killed mid-sync then it should return to | 929 // if the sync event is killed mid-sync then it should return to |
| 913 // SYNC_STATE_PENDING. | 930 // SYNC_STATE_PENDING. |
| 914 registration->set_sync_state(blink::mojom::BackgroundSyncState::FIRING); | 931 registration->set_sync_state(blink::mojom::BackgroundSyncState::FIRING); |
| 915 } | 932 } |
| 916 } | 933 } |
| 917 } | 934 } |
| 918 | 935 |
| 919 if (sw_id_and_tags_to_fire.empty()) { | 936 if (sw_id_and_tags_to_fire.empty()) { |
| 920 RunInBackgroundIfNecessary(); | 937 RunInBackgroundIfNecessary(); |
| 921 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 938 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 939 std::move(callback)); |
| 922 return; | 940 return; |
| 923 } | 941 } |
| 924 | 942 |
| 925 base::TimeTicks start_time = base::TimeTicks::Now(); | 943 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 926 | 944 |
| 927 // Fire the sync event of the ready registrations and run |callback| once | 945 // Fire the sync event of the ready registrations and run |callback| once |
| 928 // they're all done. | 946 // they're all done. |
| 929 base::Closure events_fired_barrier_closure = base::BarrierClosure( | 947 base::RepeatingClosure events_fired_barrier_closure = base::BarrierClosure( |
| 930 sw_id_and_tags_to_fire.size(), | 948 sw_id_and_tags_to_fire.size(), |
| 931 base::Bind(&BackgroundSyncManager::FireReadyEventsAllEventsFiring, | 949 base::BindOnce(&BackgroundSyncManager::FireReadyEventsAllEventsFiring, |
| 932 weak_ptr_factory_.GetWeakPtr(), callback)); | 950 weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| 933 | 951 |
| 934 // Record the total time taken after all events have run to completion. | 952 // Record the total time taken after all events have run to completion. |
| 935 base::Closure events_completed_barrier_closure = | 953 base::RepeatingClosure events_completed_barrier_closure = |
| 936 base::BarrierClosure(sw_id_and_tags_to_fire.size(), | 954 base::BarrierClosure(sw_id_and_tags_to_fire.size(), |
| 937 base::Bind(&OnAllSyncEventsCompleted, start_time, | 955 base::BindOnce(&OnAllSyncEventsCompleted, start_time, |
| 938 sw_id_and_tags_to_fire.size())); | 956 sw_id_and_tags_to_fire.size())); |
| 939 | 957 |
| 940 for (const auto& sw_id_and_tag : sw_id_and_tags_to_fire) { | 958 for (const auto& sw_id_and_tag : sw_id_and_tags_to_fire) { |
| 941 int64_t service_worker_id = sw_id_and_tag.first; | 959 int64_t service_worker_id = sw_id_and_tag.first; |
| 942 const BackgroundSyncRegistration* registration = | 960 const BackgroundSyncRegistration* registration = |
| 943 LookupActiveRegistration(service_worker_id, sw_id_and_tag.second); | 961 LookupActiveRegistration(service_worker_id, sw_id_and_tag.second); |
| 944 DCHECK(registration); | 962 DCHECK(registration); |
| 945 | 963 |
| 946 service_worker_context_->FindReadyRegistrationForId( | 964 service_worker_context_->FindReadyRegistrationForId( |
| 947 service_worker_id, active_registrations_[service_worker_id].origin, | 965 service_worker_id, active_registrations_[service_worker_id].origin, |
| 948 base::Bind(&BackgroundSyncManager::FireReadyEventsDidFindRegistration, | 966 base::AdaptCallbackForRepeating(base::BindOnce( |
| 949 weak_ptr_factory_.GetWeakPtr(), sw_id_and_tag.second, | 967 &BackgroundSyncManager::FireReadyEventsDidFindRegistration, |
| 950 registration->id(), events_fired_barrier_closure, | 968 weak_ptr_factory_.GetWeakPtr(), sw_id_and_tag.second, |
| 951 events_completed_barrier_closure)); | 969 registration->id(), events_fired_barrier_closure, |
| 970 events_completed_barrier_closure))); |
| 952 } | 971 } |
| 953 } | 972 } |
| 954 | 973 |
| 955 void BackgroundSyncManager::FireReadyEventsDidFindRegistration( | 974 void BackgroundSyncManager::FireReadyEventsDidFindRegistration( |
| 956 const std::string& tag, | 975 const std::string& tag, |
| 957 BackgroundSyncRegistration::RegistrationId registration_id, | 976 BackgroundSyncRegistration::RegistrationId registration_id, |
| 958 const base::Closure& event_fired_callback, | 977 base::OnceClosure event_fired_callback, |
| 959 const base::Closure& event_completed_callback, | 978 base::OnceClosure event_completed_callback, |
| 960 ServiceWorkerStatusCode service_worker_status, | 979 ServiceWorkerStatusCode service_worker_status, |
| 961 scoped_refptr<ServiceWorkerRegistration> service_worker_registration) { | 980 scoped_refptr<ServiceWorkerRegistration> service_worker_registration) { |
| 962 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 981 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 963 if (service_worker_status != SERVICE_WORKER_OK) { | 982 if (service_worker_status != SERVICE_WORKER_OK) { |
| 964 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 983 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 965 event_fired_callback); | 984 FROM_HERE, std::move(event_fired_callback)); |
| 966 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 985 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 967 event_completed_callback); | 986 FROM_HERE, std::move(event_completed_callback)); |
| 968 return; | 987 return; |
| 969 } | 988 } |
| 970 | 989 |
| 971 BackgroundSyncRegistration* registration = | 990 BackgroundSyncRegistration* registration = |
| 972 LookupActiveRegistration(service_worker_registration->id(), tag); | 991 LookupActiveRegistration(service_worker_registration->id(), tag); |
| 973 DCHECK(registration); | 992 DCHECK(registration); |
| 974 | 993 |
| 975 num_firing_registrations_ += 1; | 994 num_firing_registrations_ += 1; |
| 976 | 995 |
| 977 blink::mojom::BackgroundSyncEventLastChance last_chance = | 996 blink::mojom::BackgroundSyncEventLastChance last_chance = |
| 978 registration->num_attempts() == parameters_->max_sync_attempts - 1 | 997 registration->num_attempts() == parameters_->max_sync_attempts - 1 |
| 979 ? blink::mojom::BackgroundSyncEventLastChance::IS_LAST_CHANCE | 998 ? blink::mojom::BackgroundSyncEventLastChance::IS_LAST_CHANCE |
| 980 : blink::mojom::BackgroundSyncEventLastChance::IS_NOT_LAST_CHANCE; | 999 : blink::mojom::BackgroundSyncEventLastChance::IS_NOT_LAST_CHANCE; |
| 981 | 1000 |
| 982 HasMainFrameProviderHost( | 1001 HasMainFrameProviderHost( |
| 983 service_worker_registration->pattern().GetOrigin(), | 1002 service_worker_registration->pattern().GetOrigin(), |
| 984 base::Bind(&BackgroundSyncMetrics::RecordEventStarted)); | 1003 base::BindOnce(&BackgroundSyncMetrics::RecordEventStarted)); |
| 985 | 1004 |
| 986 DispatchSyncEvent( | 1005 DispatchSyncEvent( |
| 987 registration->options()->tag, | 1006 registration->options()->tag, |
| 988 service_worker_registration->active_version(), last_chance, | 1007 service_worker_registration->active_version(), last_chance, |
| 989 base::Bind(&BackgroundSyncManager::EventComplete, | 1008 base::AdaptCallbackForRepeating(base::BindOnce( |
| 990 weak_ptr_factory_.GetWeakPtr(), service_worker_registration, | 1009 &BackgroundSyncManager::EventComplete, weak_ptr_factory_.GetWeakPtr(), |
| 991 service_worker_registration->id(), tag, | 1010 service_worker_registration, service_worker_registration->id(), tag, |
| 992 event_completed_callback)); | 1011 std::move(event_completed_callback)))); |
| 993 | 1012 |
| 994 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 1013 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 995 event_fired_callback); | 1014 FROM_HERE, std::move(event_fired_callback)); |
| 996 } | 1015 } |
| 997 | 1016 |
| 998 void BackgroundSyncManager::FireReadyEventsAllEventsFiring( | 1017 void BackgroundSyncManager::FireReadyEventsAllEventsFiring( |
| 999 const base::Closure& callback) { | 1018 base::OnceClosure callback) { |
| 1000 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1019 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1001 | 1020 |
| 1002 RunInBackgroundIfNecessary(); | 1021 RunInBackgroundIfNecessary(); |
| 1003 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1022 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); |
| 1004 } | 1023 } |
| 1005 | 1024 |
| 1006 // |service_worker_registration| is just to keep the registration alive | 1025 // |service_worker_registration| is just to keep the registration alive |
| 1007 // while the event is firing. | 1026 // while the event is firing. |
| 1008 void BackgroundSyncManager::EventComplete( | 1027 void BackgroundSyncManager::EventComplete( |
| 1009 scoped_refptr<ServiceWorkerRegistration> service_worker_registration, | 1028 scoped_refptr<ServiceWorkerRegistration> service_worker_registration, |
| 1010 int64_t service_worker_id, | 1029 int64_t service_worker_id, |
| 1011 const std::string& tag, | 1030 const std::string& tag, |
| 1012 const base::Closure& callback, | 1031 base::OnceClosure callback, |
| 1013 ServiceWorkerStatusCode status_code) { | 1032 ServiceWorkerStatusCode status_code) { |
| 1014 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1033 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1015 | 1034 |
| 1016 if (disabled_) { | 1035 if (disabled_) { |
| 1017 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1036 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1037 std::move(callback)); |
| 1018 return; | 1038 return; |
| 1019 } | 1039 } |
| 1020 | 1040 |
| 1021 op_scheduler_.ScheduleOperation( | 1041 op_scheduler_.ScheduleOperation(base::BindOnce( |
| 1022 base::Bind(&BackgroundSyncManager::EventCompleteImpl, | 1042 &BackgroundSyncManager::EventCompleteImpl, weak_ptr_factory_.GetWeakPtr(), |
| 1023 weak_ptr_factory_.GetWeakPtr(), service_worker_id, tag, | 1043 service_worker_id, tag, status_code, |
| 1024 status_code, op_scheduler_.WrapCallbackToRunNext(callback))); | 1044 op_scheduler_.WrapCallbackToRunNext(std::move(callback)))); |
| 1025 } | 1045 } |
| 1026 | 1046 |
| 1027 void BackgroundSyncManager::EventCompleteImpl( | 1047 void BackgroundSyncManager::EventCompleteImpl( |
| 1028 int64_t service_worker_id, | 1048 int64_t service_worker_id, |
| 1029 const std::string& tag, | 1049 const std::string& tag, |
| 1030 ServiceWorkerStatusCode status_code, | 1050 ServiceWorkerStatusCode status_code, |
| 1031 const base::Closure& callback) { | 1051 base::OnceClosure callback) { |
| 1032 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1052 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1033 | 1053 |
| 1034 if (disabled_) { | 1054 if (disabled_) { |
| 1035 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1055 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1056 std::move(callback)); |
| 1036 return; | 1057 return; |
| 1037 } | 1058 } |
| 1038 | 1059 |
| 1039 num_firing_registrations_ -= 1; | 1060 num_firing_registrations_ -= 1; |
| 1040 | 1061 |
| 1041 BackgroundSyncRegistration* registration = | 1062 BackgroundSyncRegistration* registration = |
| 1042 LookupActiveRegistration(service_worker_id, tag); | 1063 LookupActiveRegistration(service_worker_id, tag); |
| 1043 if (!registration) { | 1064 if (!registration) { |
| 1044 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1065 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1066 std::move(callback)); |
| 1045 return; | 1067 return; |
| 1046 } | 1068 } |
| 1047 | 1069 |
| 1048 DCHECK_NE(blink::mojom::BackgroundSyncState::PENDING, | 1070 DCHECK_NE(blink::mojom::BackgroundSyncState::PENDING, |
| 1049 registration->sync_state()); | 1071 registration->sync_state()); |
| 1050 | 1072 |
| 1051 registration->set_num_attempts(registration->num_attempts() + 1); | 1073 registration->set_num_attempts(registration->num_attempts() + 1); |
| 1052 | 1074 |
| 1053 // The event ran to completion, we should count it, no matter what happens | 1075 // The event ran to completion, we should count it, no matter what happens |
| 1054 // from here. | 1076 // from here. |
| 1055 ServiceWorkerRegistration* sw_registration = | 1077 ServiceWorkerRegistration* sw_registration = |
| 1056 service_worker_context_->GetLiveRegistration(service_worker_id); | 1078 service_worker_context_->GetLiveRegistration(service_worker_id); |
| 1057 if (sw_registration) { | 1079 if (sw_registration) { |
| 1058 HasMainFrameProviderHost( | 1080 HasMainFrameProviderHost( |
| 1059 sw_registration->pattern().GetOrigin(), | 1081 sw_registration->pattern().GetOrigin(), |
| 1060 base::Bind(&BackgroundSyncMetrics::RecordEventResult, | 1082 base::BindOnce(&BackgroundSyncMetrics::RecordEventResult, |
| 1061 status_code == SERVICE_WORKER_OK)); | 1083 status_code == SERVICE_WORKER_OK)); |
| 1062 } | 1084 } |
| 1063 | 1085 |
| 1064 bool registration_completed = true; | 1086 bool registration_completed = true; |
| 1065 bool can_retry = | 1087 bool can_retry = |
| 1066 registration->num_attempts() < parameters_->max_sync_attempts; | 1088 registration->num_attempts() < parameters_->max_sync_attempts; |
| 1067 | 1089 |
| 1068 if (registration->sync_state() == | 1090 if (registration->sync_state() == |
| 1069 blink::mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING) { | 1091 blink::mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING) { |
| 1070 registration->set_sync_state(blink::mojom::BackgroundSyncState::PENDING); | 1092 registration->set_sync_state(blink::mojom::BackgroundSyncState::PENDING); |
| 1071 registration->set_num_attempts(0); | 1093 registration->set_num_attempts(0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1083 if (registration_completed) { | 1105 if (registration_completed) { |
| 1084 const std::string& tag = registration->options()->tag; | 1106 const std::string& tag = registration->options()->tag; |
| 1085 BackgroundSyncRegistration* active_registration = | 1107 BackgroundSyncRegistration* active_registration = |
| 1086 LookupActiveRegistration(service_worker_id, tag); | 1108 LookupActiveRegistration(service_worker_id, tag); |
| 1087 if (active_registration && | 1109 if (active_registration && |
| 1088 active_registration->id() == registration->id()) { | 1110 active_registration->id() == registration->id()) { |
| 1089 RemoveActiveRegistration(service_worker_id, tag); | 1111 RemoveActiveRegistration(service_worker_id, tag); |
| 1090 } | 1112 } |
| 1091 } | 1113 } |
| 1092 | 1114 |
| 1093 StoreRegistrations( | 1115 StoreRegistrations(service_worker_id, |
| 1094 service_worker_id, | 1116 base::AdaptCallbackForRepeating(base::BindOnce( |
| 1095 base::Bind(&BackgroundSyncManager::EventCompleteDidStore, | 1117 &BackgroundSyncManager::EventCompleteDidStore, |
| 1096 weak_ptr_factory_.GetWeakPtr(), service_worker_id, callback)); | 1118 weak_ptr_factory_.GetWeakPtr(), service_worker_id, |
| 1119 std::move(callback)))); |
| 1097 } | 1120 } |
| 1098 | 1121 |
| 1099 void BackgroundSyncManager::EventCompleteDidStore( | 1122 void BackgroundSyncManager::EventCompleteDidStore( |
| 1100 int64_t service_worker_id, | 1123 int64_t service_worker_id, |
| 1101 const base::Closure& callback, | 1124 base::OnceClosure callback, |
| 1102 ServiceWorkerStatusCode status_code) { | 1125 ServiceWorkerStatusCode status_code) { |
| 1103 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1126 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1104 | 1127 |
| 1105 if (status_code == SERVICE_WORKER_ERROR_NOT_FOUND) { | 1128 if (status_code == SERVICE_WORKER_ERROR_NOT_FOUND) { |
| 1106 // The registration is gone. | 1129 // The registration is gone. |
| 1107 active_registrations_.erase(service_worker_id); | 1130 active_registrations_.erase(service_worker_id); |
| 1108 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1131 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1132 std::move(callback)); |
| 1109 return; | 1133 return; |
| 1110 } | 1134 } |
| 1111 | 1135 |
| 1112 if (status_code != SERVICE_WORKER_OK) { | 1136 if (status_code != SERVICE_WORKER_OK) { |
| 1113 LOG(ERROR) << "BackgroundSync failed to store registration due to backend " | 1137 LOG(ERROR) << "BackgroundSync failed to store registration due to backend " |
| 1114 "failure."; | 1138 "failure."; |
| 1115 DisableAndClearManager(callback); | 1139 DisableAndClearManager(std::move(callback)); |
| 1116 return; | 1140 return; |
| 1117 } | 1141 } |
| 1118 | 1142 |
| 1119 // Fire any ready events and call RunInBackground if anything is waiting. | 1143 // Fire any ready events and call RunInBackground if anything is waiting. |
| 1120 FireReadyEvents(); | 1144 FireReadyEvents(); |
| 1121 | 1145 |
| 1122 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1146 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); |
| 1123 } | 1147 } |
| 1124 | 1148 |
| 1125 // static | 1149 // static |
| 1126 void BackgroundSyncManager::OnAllSyncEventsCompleted( | 1150 void BackgroundSyncManager::OnAllSyncEventsCompleted( |
| 1127 const base::TimeTicks& start_time, | 1151 const base::TimeTicks& start_time, |
| 1128 int number_of_batched_sync_events) { | 1152 int number_of_batched_sync_events) { |
| 1129 // Record the combined time taken by all sync events. | 1153 // Record the combined time taken by all sync events. |
| 1130 BackgroundSyncMetrics::RecordBatchSyncEventComplete( | 1154 BackgroundSyncMetrics::RecordBatchSyncEventComplete( |
| 1131 base::TimeTicks::Now() - start_time, number_of_batched_sync_events); | 1155 base::TimeTicks::Now() - start_time, number_of_batched_sync_events); |
| 1132 } | 1156 } |
| 1133 | 1157 |
| 1134 void BackgroundSyncManager::OnRegistrationDeletedImpl( | 1158 void BackgroundSyncManager::OnRegistrationDeletedImpl( |
| 1135 int64_t sw_registration_id, | 1159 int64_t sw_registration_id, |
| 1136 const base::Closure& callback) { | 1160 base::OnceClosure callback) { |
| 1137 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1161 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1138 | 1162 |
| 1139 // The backend (ServiceWorkerStorage) will delete the data, so just delete the | 1163 // The backend (ServiceWorkerStorage) will delete the data, so just delete the |
| 1140 // memory representation here. | 1164 // memory representation here. |
| 1141 active_registrations_.erase(sw_registration_id); | 1165 active_registrations_.erase(sw_registration_id); |
| 1142 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1166 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); |
| 1143 } | 1167 } |
| 1144 | 1168 |
| 1145 void BackgroundSyncManager::OnStorageWipedImpl(const base::Closure& callback) { | 1169 void BackgroundSyncManager::OnStorageWipedImpl(base::OnceClosure callback) { |
| 1146 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1170 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1147 | 1171 |
| 1148 active_registrations_.clear(); | 1172 active_registrations_.clear(); |
| 1149 disabled_ = false; | 1173 disabled_ = false; |
| 1150 InitImpl(callback); | 1174 InitImpl(std::move(callback)); |
| 1151 } | 1175 } |
| 1152 | 1176 |
| 1153 void BackgroundSyncManager::OnNetworkChanged() { | 1177 void BackgroundSyncManager::OnNetworkChanged() { |
| 1154 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1178 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1155 | 1179 |
| 1156 FireReadyEvents(); | 1180 FireReadyEvents(); |
| 1157 } | 1181 } |
| 1158 | 1182 |
| 1159 void BackgroundSyncManager::SetMaxSyncAttemptsImpl( | 1183 void BackgroundSyncManager::SetMaxSyncAttemptsImpl(int max_attempts, |
| 1160 int max_attempts, | 1184 base::OnceClosure callback) { |
| 1161 const base::Closure& callback) { | |
| 1162 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1185 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1163 | 1186 |
| 1164 parameters_->max_sync_attempts = max_attempts; | 1187 parameters_->max_sync_attempts = max_attempts; |
| 1165 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 1188 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); |
| 1166 } | 1189 } |
| 1167 | 1190 |
| 1168 base::Closure BackgroundSyncManager::MakeEmptyCompletion() { | 1191 base::OnceClosure BackgroundSyncManager::MakeEmptyCompletion() { |
| 1169 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1192 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1170 return op_scheduler_.WrapCallbackToRunNext(base::Bind(&base::DoNothing)); | 1193 return op_scheduler_.WrapCallbackToRunNext(base::BindOnce(&base::DoNothing)); |
| 1171 } | 1194 } |
| 1172 | 1195 |
| 1173 } // namespace content | 1196 } // namespace content |
| OLD | NEW |