Chromium Code Reviews| Index: content/browser/service_worker/service_worker_context_wrapper.cc |
| diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc |
| index 64ae3ea762f36fabfff18ff825a3dd97d0accf63..ffd4c1de9b56c2de92adc91f48cda59764fb6d1f 100644 |
| --- a/content/browser/service_worker/service_worker_context_wrapper.cc |
| +++ b/content/browser/service_worker/service_worker_context_wrapper.cc |
| @@ -22,6 +22,7 @@ |
| #include "base/threading/sequenced_worker_pool.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| +#include "content/browser/service_worker/embedded_worker_registry.h" |
|
falken
2016/09/30 01:48:55
Is this used? Can it just be embedded_worker_statu
lazyboy
2016/09/30 08:02:15
Thanks.
Done.
|
| #include "content/browser/service_worker/service_worker_context_core.h" |
| #include "content/browser/service_worker/service_worker_context_observer.h" |
| #include "content/browser/service_worker/service_worker_process_manager.h" |
| @@ -377,6 +378,13 @@ void ServiceWorkerContextWrapper::DidFinishNavigationHintTaskOnUI( |
| callback.Run(result); |
| } |
| +void ServiceWorkerContextWrapper::ExternalRequestErrorCallback( |
| + int64_t service_worker_version_id, |
| + ServiceWorkerStatusCode status) { |
| + if (status != SERVICE_WORKER_OK) |
| + pending_external_requests_[service_worker_version_id].pop(); |
|
falken
2016/09/30 01:48:55
Hmm... it might be slightly safer to bind the requ
lazyboy
2016/09/30 08:02:15
It won't be possible to do this without changing S
|
| +} |
| + |
| bool ServiceWorkerContextWrapper::IsRunningNavigationHintTask( |
| int render_process_id) const { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| @@ -825,6 +833,50 @@ void ServiceWorkerContextWrapper::ShutdownOnIO() { |
| context_core_.reset(); |
| } |
| +bool ServiceWorkerContextWrapper::IncrementPendingActivity( |
| + int64_t service_worker_version_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + ServiceWorkerVersion* version = |
| + context()->GetLiveVersion(service_worker_version_id); |
| + if (!version) { |
| + DVLOG(1) << "ServiceWorkerVersion not found: " << service_worker_version_id; |
| + return false; |
|
falken
2016/09/30 01:48:55
Sorry I didn't suggest this sooner. Consider havin
lazyboy
2016/09/30 08:02:15
Done.
|
| + } |
| + if (version->running_status() != EmbeddedWorkerStatus::RUNNING) { |
| + DVLOG(1) << "ServiceWorkerVersion is not running: " |
| + << service_worker_version_id; |
| + return false; |
| + } |
| + int request_id = version->StartRequest( |
| + ServiceWorkerMetrics::EventType::EXTERNAL_REQUEST, |
| + base::Bind(&ServiceWorkerContextWrapper::ExternalRequestErrorCallback, |
| + this, service_worker_version_id)); |
| + pending_external_requests_[service_worker_version_id].push(request_id); |
| + return true; |
| +} |
| + |
| +bool ServiceWorkerContextWrapper::DecrementPendingActivity( |
| + int64_t service_worker_version_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + ServiceWorkerVersion* version = |
| + context()->GetLiveVersion(service_worker_version_id); |
| + |
| + std::queue<int>& pending_requests = |
| + pending_external_requests_[service_worker_version_id]; |
| + DCHECK(pending_requests.size() > 0); |
|
falken
2016/09/30 01:48:55
Now that requests can be removed by the error call
lazyboy
2016/09/30 08:02:15
Slightly modified code now, but done.
|
| + int request_id = pending_requests.front(); |
| + pending_requests.pop(); |
| + |
| + // The service worker should be present and running. |
| + if (!version || version->running_status() != EmbeddedWorkerStatus::RUNNING) { |
| + NOTREACHED() |
| + << "Failed to decrement pending activity of ServiceWorkerVersion: " |
| + << service_worker_version_id; |
| + return false; |
| + } |
| + return version->FinishRequest(request_id, true, base::Time::Now()); |
| +} |
| + |
| void ServiceWorkerContextWrapper::DidDeleteAndStartOver( |
| ServiceWorkerStatusCode status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |