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..1b1125b06c2b682ed6f5b3e1505010e67148da2e 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -200,6 +200,21 @@ void OnEventDispatcherConnectionError( |
} |
} |
+mojom::ServiceWorkerProviderInfoForStartWorkerPtr |
+CompleteProviderHostPreparation( |
+ ServiceWorkerVersion* version, |
+ std::unique_ptr<ServiceWorkerProviderHost> provider_host, |
+ base::WeakPtr<ServiceWorkerContextCore> context, |
+ int process_id) { |
+ // Caller should ensure |context| is alive when completing StartWorker |
+ // preparation. |
+ DCHECK(context); |
+ auto info = |
+ provider_host->CompleteStartWorkerPreparation(process_id, version); |
+ context->AddProviderHost(std::move(provider_host)); |
+ return info; |
+} |
+ |
} // namespace |
const int ServiceWorkerVersion::kTimeoutTimerDelaySeconds = 30; |
@@ -847,6 +862,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 +1484,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 +1496,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( |