| Index: content/browser/background_sync/background_sync_manager.cc
|
| diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
|
| index 938a87b92513f166f18332679e7dbe667a7f0bcb..3e28bf3ac6e4fb76ec40379ff7c8448aa3040b26 100644
|
| --- a/content/browser/background_sync/background_sync_manager.cc
|
| +++ b/content/browser/background_sync/background_sync_manager.cc
|
| @@ -703,7 +703,7 @@ void BackgroundSyncManager::UnregisterImpl(
|
| return;
|
| }
|
|
|
| - const RefCountedRegistration* existing_registration =
|
| + RefCountedRegistration* existing_registration =
|
| LookupActiveRegistration(sw_registration_id, registration_key);
|
|
|
| if (!existing_registration ||
|
| @@ -715,6 +715,24 @@ void BackgroundSyncManager::UnregisterImpl(
|
| return;
|
| }
|
|
|
| + DCHECK(!existing_registration->value()->HasCompleted());
|
| +
|
| + bool firing = existing_registration->value()->sync_state() ==
|
| + BACKGROUND_SYNC_STATE_FIRING ||
|
| + existing_registration->value()->sync_state() ==
|
| + BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING;
|
| +
|
| + existing_registration->value()->set_sync_state(
|
| + firing ? BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING
|
| + : BACKGROUND_SYNC_STATE_UNREGISTERED);
|
| +
|
| + if (!firing) {
|
| + // If the registration is currently firing then wait to run
|
| + // RunDoneCallbacks until after it has finished as it might
|
| + // change state to SUCCESS first.
|
| + existing_registration->value()->RunDoneCallbacks();
|
| + }
|
| +
|
| RemoveActiveRegistration(sw_registration_id, registration_key);
|
|
|
| StoreRegistrations(sw_registration_id,
|
| @@ -754,6 +772,69 @@ void BackgroundSyncManager::UnregisterDidStore(int64 sw_registration_id,
|
| FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_OK));
|
| }
|
|
|
| +void BackgroundSyncManager::NotifyWhenDone(
|
| + BackgroundSyncRegistrationHandle::HandleId handle_id,
|
| + const StatusAndStateCallback& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + if (disabled_) {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
|
| + BACKGROUND_SYNC_STATE_FAILED));
|
| + return;
|
| + }
|
| +
|
| + scoped_ptr<BackgroundSyncRegistrationHandle> registration_handle =
|
| + DuplicateRegistrationHandle(handle_id);
|
| +
|
| + op_scheduler_.ScheduleOperation(
|
| + base::Bind(&BackgroundSyncManager::NotifyWhenDoneImpl,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(registration_handle.Pass()), callback));
|
| +}
|
| +
|
| +void BackgroundSyncManager::NotifyWhenDoneImpl(
|
| + scoped_ptr<BackgroundSyncRegistrationHandle> registration_handle,
|
| + const StatusAndStateCallback& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + DCHECK_EQ(SYNC_ONE_SHOT, registration_handle->options()->periodicity);
|
| +
|
| + if (disabled_) {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
|
| + BACKGROUND_SYNC_STATE_FAILED));
|
| + return;
|
| + }
|
| +
|
| + if (!registration_handle->registration()->HasCompleted()) {
|
| + registration_handle->registration()->AddDoneCallback(
|
| + base::Bind(&BackgroundSyncManager::NotifyWhenDoneDidFinish,
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| + op_scheduler_.CompleteOperationAndRunNext();
|
| + return;
|
| + }
|
| +
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_OK,
|
| + registration_handle->sync_state()));
|
| + op_scheduler_.CompleteOperationAndRunNext();
|
| +}
|
| +
|
| +void BackgroundSyncManager::NotifyWhenDoneDidFinish(
|
| + const StatusAndStateCallback& callback,
|
| + BackgroundSyncState sync_state) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + if (disabled_) {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
|
| + BACKGROUND_SYNC_STATE_FAILED));
|
| + return;
|
| + }
|
| +
|
| + callback.Run(BACKGROUND_SYNC_STATUS_OK, sync_state);
|
| +}
|
| +
|
| void BackgroundSyncManager::GetRegistrationImpl(
|
| int64 sw_registration_id,
|
| const RegistrationKey& registration_key,
|
| @@ -1025,10 +1106,19 @@ void BackgroundSyncManager::EventCompleteImpl(
|
|
|
| if (registration->options()->periodicity == SYNC_ONE_SHOT) {
|
| if (status_code != SERVICE_WORKER_OK) {
|
| - // TODO(jkarlin) Fire the sync event on the next page load controlled by
|
| + // TODO(jkarlin): Insert retry logic here. Be sure to check if the state
|
| + // is UNREGISTERED_WHILE_FIRING first. If so then set the state to failed
|
| + // if it was already out of retry attempts otherwise keep the state as
|
| + // unregistered. Then call RunDoneCallbacks(); (crbug.com/501838)
|
| + // TODO(jkarlin): Fire the sync event on the next page load controlled
|
| + // by
|
| // this registration. (crbug.com/479665)
|
| registration->set_sync_state(BACKGROUND_SYNC_STATE_FAILED);
|
| + registration->RunDoneCallbacks();
|
| } else {
|
| + registration->set_sync_state(BACKGROUND_SYNC_STATE_SUCCESS);
|
| + registration->RunDoneCallbacks();
|
| +
|
| RegistrationKey key(*registration);
|
| // Remove the registration if it's still active.
|
| RefCountedRegistration* active_registration =
|
|
|