Chromium Code Reviews| Index: content/browser/service_worker/service_worker_version.cc |
| diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc |
| index 50adf19c784ffdcc79de8a15e9702d286bece151..54218ef5a8c9a4dade5ed311415936a6282b27e8 100644 |
| --- a/content/browser/service_worker/service_worker_version.cc |
| +++ b/content/browser/service_worker/service_worker_version.cc |
| @@ -200,6 +200,18 @@ void OnEventDispatcherConnectionError( |
| } |
| } |
| +mojom::ServiceWorkerProviderInfoForStartWorkerPtr |
| +CompleteProviderHostPreparation( |
| + ServiceWorkerVersion* version, |
| + std::unique_ptr<ServiceWorkerProviderHost> provider_host, |
| + base::WeakPtr<ServiceWorkerContextCore> context, |
| + int process_id) { |
| + auto info = |
| + provider_host->CompleteStartWorkerPreparation(process_id, version); |
| + context->AddProviderHost(std::move(provider_host)); |
|
falken
2017/06/19 07:50:40
Could context be null?
If not, we could DCHECK(co
shimazu
2017/06/19 10:41:25
Done.
|
| + return info; |
| +} |
| + |
| } // namespace |
| const int ServiceWorkerVersion::kTimeoutTimerDelaySeconds = 30; |
| @@ -847,6 +859,9 @@ ServiceWorkerVersion::PendingRequest::~PendingRequest() {} |
| void ServiceWorkerVersion::OnThreadStarted() { |
| DCHECK_EQ(EmbeddedWorkerStatus::STARTING, running_status()); |
| + DCHECK(provider_host_); |
| + provider_host_->SetReadyToSendMessagesToWorker( |
| + embedded_worker()->thread_id()); |
| // Activate ping/pong now that JavaScript execution will start. |
| ping_controller_->Activate(); |
| } |
| @@ -1466,6 +1481,10 @@ void ServiceWorkerVersion::StartWorkerInternal() { |
| StartTimeoutTimer(); |
| + std::unique_ptr<ServiceWorkerProviderHost> pending_provider_host = |
| + ServiceWorkerProviderHost::PreCreateForController(context()); |
| + provider_host_ = pending_provider_host->AsWeakPtr(); |
| + |
| auto params = base::MakeUnique<EmbeddedWorkerStartParams>(); |
| params->service_worker_version_id = version_id_; |
| params->scope = scope_; |
| @@ -1474,7 +1493,12 @@ void ServiceWorkerVersion::StartWorkerInternal() { |
| params->pause_after_download = pause_after_download_; |
| embedded_worker_->Start( |
| - std::move(params), mojo::MakeRequest(&event_dispatcher_), |
| + std::move(params), |
| + // Unretained is used here because the callback will be owned by |
| + // |embedded_worker_| whose owner is |this|. |
| + base::BindOnce(&CompleteProviderHostPreparation, base::Unretained(this), |
| + base::Passed(&pending_provider_host), context()), |
| + mojo::MakeRequest(&event_dispatcher_), |
| base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
| weak_factory_.GetWeakPtr())); |
| event_dispatcher_.set_connection_error_handler(base::Bind( |