Index: content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
index 0c3fdb678eea6b56ab493ca2eba85d61c9dd2b4d..acc89f9fb74b019ba7c0f43519728e407469d84a 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
@@ -50,6 +50,26 @@ void SetUpDummyMessagePort(std::vector<MessagePort>* ports) { |
ports->push_back(MessagePort(std::move(pipe.handle0))); |
} |
+struct RemoteProviderInfo { |
+ mojom::ServiceWorkerProviderHostAssociatedPtr host_ptr; |
+ mojom::ServiceWorkerProviderAssociatedRequest client_request; |
+}; |
+ |
+RemoteProviderInfo SetupProviderHostInfoPtrs( |
+ ServiceWorkerProviderHostInfo* host_info) { |
+ RemoteProviderInfo remote_info; |
+ mojom::ServiceWorkerProviderAssociatedPtr browser_side_client_ptr; |
+ remote_info.client_request = |
+ mojo::MakeIsolatedRequest(&browser_side_client_ptr); |
+ host_info->host_request = mojo::MakeIsolatedRequest(&remote_info.host_ptr); |
+ host_info->client_ptr_info = browser_side_client_ptr.PassInterface(); |
+ EXPECT_TRUE(host_info->host_request.is_pending()); |
+ EXPECT_TRUE(host_info->client_ptr_info.is_valid()); |
+ EXPECT_TRUE(remote_info.host_ptr.is_bound()); |
+ EXPECT_TRUE(remote_info.client_request.is_pending()); |
+ return remote_info; |
+} |
+ |
} // namespace |
static const int kRenderFrameId = 1; |
@@ -509,29 +529,35 @@ TEST_F(ServiceWorkerDispatcherHostTest, ProviderCreatedAndDestroyed) { |
const int kProviderId = 1001; |
int process_id = helper_->mock_render_process_id(); |
- dispatcher_host_->OnProviderCreated(ServiceWorkerProviderHostInfo( |
- kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
- true /* is_parent_frame_secure */)); |
+ // Setup ServiceWorkerProviderHostInfo |
+ ServiceWorkerProviderHostInfo host_info_1(kProviderId, MSG_ROUTING_NONE, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ ServiceWorkerProviderHostInfo host_info_2(kProviderId, MSG_ROUTING_NONE, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ ServiceWorkerProviderHostInfo host_info_3(kProviderId, MSG_ROUTING_NONE, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ RemoteProviderInfo remote_info_1 = SetupProviderHostInfoPtrs(&host_info_1); |
+ RemoteProviderInfo remote_info_2 = SetupProviderHostInfoPtrs(&host_info_2); |
+ RemoteProviderInfo remote_info_3 = SetupProviderHostInfoPtrs(&host_info_3); |
+ |
+ dispatcher_host_->OnProviderCreated(std::move(host_info_1)); |
EXPECT_TRUE(context()->GetProviderHost(process_id, kProviderId)); |
// Two with the same ID should be seen as a bad message. |
- dispatcher_host_->OnProviderCreated(ServiceWorkerProviderHostInfo( |
- kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
- true /* is_parent_frame_secure */)); |
+ dispatcher_host_->OnProviderCreated(std::move(host_info_2)); |
EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); |
- dispatcher_host_->OnProviderDestroyed(kProviderId); |
+ // Releasing the interface pointer destroys the counterpart. |
+ remote_info_1.host_ptr.reset(); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_FALSE(context()->GetProviderHost(process_id, kProviderId)); |
- // Destroying an ID that does not exist warrants a bad message. |
- dispatcher_host_->OnProviderDestroyed(kProviderId); |
- EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_); |
- |
// Deletion of the dispatcher_host should cause providers for that |
// process to get deleted as well. |
- dispatcher_host_->OnProviderCreated(ServiceWorkerProviderHostInfo( |
- kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
- true /* is_parent_frame_secure */)); |
+ dispatcher_host_->OnProviderCreated(std::move(host_info_3)); |
EXPECT_TRUE(context()->GetProviderHost(process_id, kProviderId)); |
EXPECT_TRUE(dispatcher_host_->HasOneRef()); |
dispatcher_host_ = nullptr; |