Index: content/browser/service_worker/service_worker_provider_host_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_provider_host_unittest.cc b/content/browser/service_worker/service_worker_provider_host_unittest.cc |
index ce0560be5e6e4003d99cd3ad8eab9158f3c1bf93..1a410882c89df55db79141462411259f3c31e086 100644 |
--- a/content/browser/service_worker/service_worker_provider_host_unittest.cc |
+++ b/content/browser/service_worker/service_worker_provider_host_unittest.cc |
@@ -98,6 +98,25 @@ class ServiceWorkerProviderHostTest : public testing::Test { |
return host_raw; |
} |
+ ServiceWorkerProviderHost* CreateProviderHostWithMojo( |
+ const GURL& document_url, |
+ mojom::ServiceWorkerProviderHostAssociatedPtr* host_ptr, |
+ mojom::ServiceWorkerProviderAssociatedPtr client_ptr) { |
+ ServiceWorkerProviderHostInfo info(next_provider_id_++, MSG_ROUTING_NONE, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ info.host_request = mojo::MakeIsolatedRequest(host_ptr); |
+ info.client_ptr_info = client_ptr.PassInterface(); |
+ std::unique_ptr<ServiceWorkerProviderHost> host = |
+ ServiceWorkerProviderHost::Create( |
+ helper_->mock_render_process_id(), std::move(info), |
+ helper_->context()->AsWeakPtr(), nullptr); |
+ ServiceWorkerProviderHost* host_raw = host.get(); |
+ host->SetDocumentUrl(document_url); |
+ context_->AddProviderHost(std::move(host)); |
+ return host_raw; |
+ } |
+ |
TestBrowserThreadBundle thread_bundle_; |
std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
ServiceWorkerContextCore* context_; |
@@ -224,4 +243,36 @@ TEST_F(ServiceWorkerProviderHostTest, ContextSecurity) { |
provider_host_insecure_parent->IsContextSecureForServiceWorker()); |
} |
+class MockServiceWorkerProvider : public mojom::ServiceWorkerProvider { |
+ public: |
+ MockServiceWorkerProvider( |
+ mojom::ServiceWorkerProviderAssociatedRequest request) |
+ : binding_(this, std::move(request)) {} |
+ bool is_bound() const { return binding_.is_bound(); } |
+ |
+ private: |
+ mojo::AssociatedBinding<mojom::ServiceWorkerProvider> binding_; |
+}; |
+ |
+TEST_F(ServiceWorkerProviderHostTest, RemoveProvider) { |
+ // Prepare mojo pointers living on the renderer side. |
+ mojom::ServiceWorkerProviderAssociatedPtr provider_client_ptr; |
+ MockServiceWorkerProvider provider_client( |
+ mojo::MakeIsolatedRequest(&provider_client_ptr)); |
+ mojom::ServiceWorkerProviderHostAssociatedPtr provider_host_ptr; |
+ |
+ // Create a provider host connected with the renderer process. |
+ ServiceWorkerProviderHost* provider_host = CreateProviderHostWithMojo( |
+ GURL("https://www.example.com/example1.html"), &provider_host_ptr, |
+ std::move(provider_client_ptr)); |
+ int process_id = provider_host->process_id(); |
+ int provider_id = provider_host->provider_id(); |
+ EXPECT_TRUE(context_->GetProviderHost(process_id, provider_id)); |
+ |
+ // Disconnect the mojo pipe from the renderer side. |
+ provider_host_ptr.reset(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(context_->GetProviderHost(process_id, provider_id)); |
+} |
+ |
} // namespace content |