| Index: content/browser/service_worker/embedded_worker_test_helper.cc
 | 
| diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
 | 
| index 54a8872a93768bf12d67eed4d0d00c5ac872ab5e..08c8774940d99aa68d21c53c87a57a277d5ee4e3 100644
 | 
| --- a/content/browser/service_worker/embedded_worker_test_helper.cc
 | 
| +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
 | 
| @@ -13,6 +13,8 @@
 | 
|  #include "base/atomic_sequence_num.h"
 | 
|  #include "base/bind.h"
 | 
|  #include "base/memory/ptr_util.h"
 | 
| +#include "base/message_loop/message_loop.h"
 | 
| +#include "base/run_loop.h"
 | 
|  #include "base/threading/thread_task_runner_handle.h"
 | 
|  #include "base/time/time.h"
 | 
|  #include "content/browser/service_worker/embedded_worker_instance.h"
 | 
| @@ -21,6 +23,7 @@
 | 
|  #include "content/browser/service_worker/service_worker_context_core.h"
 | 
|  #include "content/browser/service_worker/service_worker_context_wrapper.h"
 | 
|  #include "content/browser/service_worker/service_worker_dispatcher_host.h"
 | 
| +#include "content/browser/service_worker/service_worker_test_utils.h"
 | 
|  #include "content/common/background_fetch/background_fetch_types.h"
 | 
|  #include "content/common/service_worker/embedded_worker_messages.h"
 | 
|  #include "content/common/service_worker/embedded_worker_start_params.h"
 | 
| @@ -71,7 +74,8 @@ EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker(
 | 
|      const EmbeddedWorkerStartParams& params,
 | 
| -    mojom::ServiceWorkerEventDispatcherRequest dispatcher_request) {
 | 
| +    mojom::ServiceWorkerEventDispatcherRequest dispatcher_request,
 | 
| +    mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host) {
 | 
|    if (!helper_)
 | 
|      return;
 | 
|  
 | 
| @@ -82,11 +86,11 @@ void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker(
 | 
|    ASSERT_TRUE(worker);
 | 
|    EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
 | 
|  
 | 
| -  helper_->OnStartWorkerStub(params, std::move(dispatcher_request));
 | 
| +  helper_->OnStartWorkerStub(params, std::move(dispatcher_request),
 | 
| +                             std::move(instance_host));
 | 
|  }
 | 
|  
 | 
| -void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StopWorker(
 | 
| -    const StopWorkerCallback& callback) {
 | 
| +void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StopWorker() {
 | 
|    if (!helper_)
 | 
|      return;
 | 
|  
 | 
| @@ -97,7 +101,7 @@ void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StopWorker(
 | 
|    // is removed right after sending StopWorker.
 | 
|    if (worker)
 | 
|      EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status());
 | 
| -  helper_->OnStopWorkerStub(callback);
 | 
| +  helper_->OnStopWorkerStub(embedded_worker_id_.value());
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
 | 
| @@ -277,6 +281,7 @@ EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
 | 
|        wrapper_(new ServiceWorkerContextWrapper(browser_context_.get())),
 | 
|        mock_instance_clients_next_index_(0),
 | 
|        next_thread_id_(0),
 | 
| +      next_provider_id_(1000),
 | 
|        mock_render_process_id_(render_process_host_->GetID()),
 | 
|        new_mock_render_process_id_(new_render_process_host_->GetID()),
 | 
|        weak_factory_(this) {
 | 
| @@ -375,7 +380,8 @@ void EmbeddedWorkerTestHelper::OnStartWorker(
 | 
|      const GURL& scope,
 | 
|      const GURL& script_url,
 | 
|      bool pause_after_download,
 | 
| -    mojom::ServiceWorkerEventDispatcherRequest request) {
 | 
| +    mojom::ServiceWorkerEventDispatcherRequest request,
 | 
| +    mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
|    MockServiceWorkerEventDispatcher::Create(AsWeakPtr(), worker->thread_id(),
 | 
| @@ -383,6 +389,9 @@ void EmbeddedWorkerTestHelper::OnStartWorker(
 | 
|  
 | 
|    embedded_worker_id_service_worker_version_id_map_[embedded_worker_id] =
 | 
|        service_worker_version_id;
 | 
| +  embedded_worker_id_instance_host_ptr_map_[embedded_worker_id].Bind(
 | 
| +      std::move(instance_host));
 | 
| +
 | 
|    SimulateWorkerReadyForInspection(embedded_worker_id);
 | 
|    SimulateWorkerScriptCached(embedded_worker_id);
 | 
|    SimulateWorkerScriptLoaded(embedded_worker_id);
 | 
| @@ -391,15 +400,15 @@ void EmbeddedWorkerTestHelper::OnStartWorker(
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::OnResumeAfterDownload(int embedded_worker_id) {
 | 
| -  SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id);
 | 
| +  SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id,
 | 
| +                              GetNextProviderId());
 | 
|    SimulateWorkerScriptEvaluated(embedded_worker_id, true /* success */);
 | 
|    SimulateWorkerStarted(embedded_worker_id);
 | 
|  }
 | 
|  
 | 
| -void EmbeddedWorkerTestHelper::OnStopWorker(
 | 
| -    const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback) {
 | 
| +void EmbeddedWorkerTestHelper::OnStopWorker(int embedded_worker_id) {
 | 
|    // By default just notify the sender that the worker is stopped.
 | 
| -  callback.Run();
 | 
| +  SimulateWorkerStopped(embedded_worker_id);
 | 
|  }
 | 
|  
 | 
|  bool EmbeddedWorkerTestHelper::OnMessageToWorker(int thread_id,
 | 
| @@ -532,8 +541,10 @@ void EmbeddedWorkerTestHelper::SimulateWorkerReadyForInspection(
 | 
|      int embedded_worker_id) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
| -  registry()->OnWorkerReadyForInspection(worker->process_id(),
 | 
| -                                         embedded_worker_id);
 | 
| +  ASSERT_TRUE(embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]);
 | 
| +  embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]
 | 
| +      ->OnReadyForInspection();
 | 
| +  base::RunLoop().RunUntilIdle();
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::SimulateWorkerScriptCached(
 | 
| @@ -560,17 +571,29 @@ void EmbeddedWorkerTestHelper::SimulateWorkerScriptLoaded(
 | 
|      int embedded_worker_id) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
| -  registry()->OnWorkerScriptLoaded(worker->process_id(), embedded_worker_id);
 | 
| +  ASSERT_TRUE(embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]);
 | 
| +  embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]
 | 
| +      ->OnScriptLoaded();
 | 
| +  base::RunLoop().RunUntilIdle();
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::SimulateWorkerThreadStarted(
 | 
|      int thread_id,
 | 
| -    int embedded_worker_id) {
 | 
| -  thread_id_embedded_worker_id_map_[thread_id] = embedded_worker_id;
 | 
| +    int embedded_worker_id,
 | 
| +    int provider_id) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
| -  registry()->OnWorkerThreadStarted(worker->process_id(), thread_id,
 | 
| -                                    embedded_worker_id);
 | 
| +  // Prepare a provider host to be used by following OnThreadStarted().
 | 
| +  std::unique_ptr<ServiceWorkerProviderHost> host =
 | 
| +      CreateProviderHostForServiceWorkerContext(
 | 
| +          worker->process_id(), provider_id, true /* is_parent_frame_secure */,
 | 
| +          context()->AsWeakPtr());
 | 
| +  context()->AddProviderHost(std::move(host));
 | 
| +
 | 
| +  ASSERT_TRUE(embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]);
 | 
| +  embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]
 | 
| +      ->OnThreadStarted(thread_id, provider_id);
 | 
| +  base::RunLoop().RunUntilIdle();
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::SimulateWorkerScriptEvaluated(
 | 
| @@ -578,20 +601,27 @@ void EmbeddedWorkerTestHelper::SimulateWorkerScriptEvaluated(
 | 
|      bool success) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
| -  registry()->OnWorkerScriptEvaluated(worker->process_id(), embedded_worker_id,
 | 
| -                                      success);
 | 
| +  ASSERT_TRUE(embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]);
 | 
| +  embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]
 | 
| +      ->OnScriptEvaluated(success);
 | 
| +  base::RunLoop().RunUntilIdle();
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::SimulateWorkerStarted(int embedded_worker_id) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
| -  registry()->OnWorkerStarted(worker->process_id(), embedded_worker_id);
 | 
| +  ASSERT_TRUE(embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]);
 | 
| +  embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]->OnStarted();
 | 
| +  base::RunLoop().RunUntilIdle();
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::SimulateWorkerStopped(int embedded_worker_id) {
 | 
|    EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
 | 
| -  if (worker)
 | 
| -    registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id);
 | 
| +  if (worker) {
 | 
| +    ASSERT_TRUE(embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]);
 | 
| +    embedded_worker_id_instance_host_ptr_map_[embedded_worker_id]->OnStopped();
 | 
| +    base::RunLoop().RunUntilIdle();
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::SimulateSend(IPC::Message* message) {
 | 
| @@ -601,7 +631,8 @@ void EmbeddedWorkerTestHelper::SimulateSend(IPC::Message* message) {
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::OnStartWorkerStub(
 | 
|      const EmbeddedWorkerStartParams& params,
 | 
| -    mojom::ServiceWorkerEventDispatcherRequest request) {
 | 
| +    mojom::ServiceWorkerEventDispatcherRequest request,
 | 
| +    mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host) {
 | 
|    EmbeddedWorkerInstance* worker =
 | 
|        registry()->GetWorker(params.embedded_worker_id);
 | 
|    ASSERT_TRUE(worker);
 | 
| @@ -611,7 +642,7 @@ void EmbeddedWorkerTestHelper::OnStartWorkerStub(
 | 
|        base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, AsWeakPtr(),
 | 
|                   params.embedded_worker_id, params.service_worker_version_id,
 | 
|                   params.scope, params.script_url, params.pause_after_download,
 | 
| -                 base::Passed(&request)));
 | 
| +                 base::Passed(&request), base::Passed(&instance_host)));
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::OnResumeAfterDownloadStub(
 | 
| @@ -623,11 +654,10 @@ void EmbeddedWorkerTestHelper::OnResumeAfterDownloadStub(
 | 
|                              AsWeakPtr(), embedded_worker_id));
 | 
|  }
 | 
|  
 | 
| -void EmbeddedWorkerTestHelper::OnStopWorkerStub(
 | 
| -    const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback) {
 | 
| +void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) {
 | 
|    base::ThreadTaskRunnerHandle::Get()->PostTask(
 | 
|        FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker,
 | 
| -                            AsWeakPtr(), callback));
 | 
| +                            AsWeakPtr(), embedded_worker_id));
 | 
|  }
 | 
|  
 | 
|  void EmbeddedWorkerTestHelper::OnMessageToWorkerStub(
 | 
| 
 |