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 46d5a7a4dd8ae4ac728c413eadb5f1578ced0414..434c1f9ad4f903d37cb439b020fbd26063811710 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
@@ -22,11 +22,13 @@ |
#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_handle.h" |
+#include "content/browser/service_worker/service_worker_navigation_handle_core.h" |
#include "content/browser/service_worker/service_worker_test_utils.h" |
#include "content/common/service_worker/embedded_worker_messages.h" |
#include "content/common/service_worker/service_worker_messages.h" |
#include "content/common/service_worker/service_worker_types.h" |
#include "content/common/service_worker/service_worker_utils.h" |
+#include "content/public/common/browser_side_navigation_policy.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/test/mock_resource_context.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
@@ -50,6 +52,47 @@ 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; |
+} |
+ |
+std::unique_ptr<ServiceWorkerNavigationHandleCore> CreateNavigationHandleCore( |
+ ServiceWorkerContextWrapper* context_wrapper) { |
+ std::unique_ptr<ServiceWorkerNavigationHandleCore> navigation_handle_core; |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind( |
+ [](ServiceWorkerContextWrapper* wrapper) { |
+ return base::MakeUnique<ServiceWorkerNavigationHandleCore>(nullptr, |
+ wrapper); |
+ }, |
+ context_wrapper), |
+ base::Bind( |
+ [](std::unique_ptr<ServiceWorkerNavigationHandleCore>* dest, |
+ std::unique_ptr<ServiceWorkerNavigationHandleCore> src) { |
+ *dest = std::move(src); |
+ }, |
+ &navigation_handle_core)); |
+ base::RunLoop().RunUntilIdle(); |
+ return navigation_handle_core; |
+} |
+ |
} // namespace |
static const int kRenderFrameId = 1; |
@@ -168,6 +211,11 @@ class ServiceWorkerDispatcherHostTest : public testing::Test { |
const int64_t kProviderId = 99; |
ServiceWorkerProviderHostInfo info(kProviderId, MSG_ROUTING_NONE, type, |
true /* is_parent_frame_secure */); |
+ mojom::ServiceWorkerProviderAssociatedPtr client_ptr; |
+ remote_endpoint_.client_request = mojo::MakeIsolatedRequest(&client_ptr); |
+ info.client_ptr_info = client_ptr.PassInterface(); |
+ info.host_request = mojo::MakeIsolatedRequest(&remote_endpoint_.host_ptr); |
+ |
dispatcher_host_->OnProviderCreated(std::move(info)); |
helper_->SimulateAddProcessToPattern(pattern, |
helper_->mock_render_process_id()); |
@@ -253,7 +301,7 @@ class ServiceWorkerDispatcherHostTest : public testing::Test { |
int provider_id) { |
return CreateProviderHostWithDispatcherHost( |
helper_->mock_render_process_id(), provider_id, context()->AsWeakPtr(), |
- kRenderFrameId, dispatcher_host_.get()); |
+ kRenderFrameId, dispatcher_host_.get(), &remote_endpoint_); |
} |
TestBrowserThreadBundle browser_thread_bundle_; |
@@ -263,6 +311,7 @@ class ServiceWorkerDispatcherHostTest : public testing::Test { |
scoped_refptr<ServiceWorkerRegistration> registration_; |
scoped_refptr<ServiceWorkerVersion> version_; |
ServiceWorkerProviderHost* provider_host_; |
+ ServiceWorkerRemoteProviderEndpoint remote_endpoint_; |
}; |
class ServiceWorkerTestContentBrowserClient : public TestContentBrowserClient { |
@@ -509,32 +558,64 @@ TEST_F(ServiceWorkerDispatcherHostTest, EarlyContextDeletion) { |
} |
TEST_F(ServiceWorkerDispatcherHostTest, ProviderCreatedAndDestroyed) { |
- const int kProviderId = 1001; |
+ const int kProviderId = (IsBrowserSideNavigationEnabled() ? -2 : 1001); |
falken
2017/05/22 08:28:12
Can PlzNavigate be -1001 also to make it look symm
shimazu
2017/05/23 06:29:33
Actually it should be -2 because kProviderId is no
falken
2017/05/23 08:31:49
Can you add a comment like:
// For PlzNavigate, k
|
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 |
falken
2017/05/22 08:28:12
nit: period at end of sentence
shimazu
2017/05/23 06:29:33
Done.
|
+ ServiceWorkerProviderHostInfo host_info_1(kProviderId, 1 /* route_id */, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ ServiceWorkerProviderHostInfo host_info_2(kProviderId, 1 /* route_id */, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ ServiceWorkerProviderHostInfo host_info_3(kProviderId, 1 /* route_id */, |
+ 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); |
+ |
+ // PlzNavigate |
+ std::unique_ptr<ServiceWorkerNavigationHandleCore> navigation_handle_core; |
+ if (IsBrowserSideNavigationEnabled()) { |
+ navigation_handle_core = |
+ CreateNavigationHandleCore(helper_->context_wrapper()); |
+ ASSERT_TRUE(navigation_handle_core); |
+ // ProviderHost should be created before OnProviderCreated. |
+ navigation_handle_core->DidPreCreateProviderHost( |
+ ServiceWorkerProviderHost::PreCreateNavigationHost( |
+ helper_->context()->AsWeakPtr(), true /* are_ancestors_secure */, |
+ base::Callback<WebContents*(void)>())); |
+ } |
+ |
+ 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_); |
+ // PlzNavigate |
+ // Prepare another navigation handle to create another provider host. |
+ if (IsBrowserSideNavigationEnabled()) { |
+ navigation_handle_core = |
+ CreateNavigationHandleCore(helper_->context_wrapper()); |
+ ASSERT_TRUE(navigation_handle_core); |
+ // ProviderHost should be created before OnProviderCreated. |
+ navigation_handle_core->DidPreCreateProviderHost( |
+ ServiceWorkerProviderHost::PreCreateNavigationHost( |
+ helper_->context()->AsWeakPtr(), true /* are_ancestors_secure */, |
+ base::Callback<WebContents*(void)>())); |
+ } |
// 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; |
@@ -669,9 +750,15 @@ TEST_F(ServiceWorkerDispatcherHostTest, CleanupOnRendererCrash) { |
// To show the new dispatcher can operate, simulate provider creation. Since |
// the old dispatcher cleaned up the old provider host, the new one won't |
// complain. |
- new_dispatcher_host->OnProviderCreated(ServiceWorkerProviderHostInfo( |
- provider_id, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
- true /* is_parent_frame_secure */)); |
+ ServiceWorkerProviderHostInfo host_info(provider_id, MSG_ROUTING_NONE, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ true /* is_parent_frame_secure */); |
+ ServiceWorkerRemoteProviderEndpoint remote_endpoint; |
+ mojom::ServiceWorkerProviderAssociatedPtr client_ptr; |
+ remote_endpoint.client_request = mojo::MakeIsolatedRequest(&client_ptr); |
+ host_info.client_ptr_info = client_ptr.PassInterface(); |
+ host_info.host_request = mojo::MakeIsolatedRequest(&remote_endpoint.host_ptr); |
+ new_dispatcher_host->OnProviderCreated(std::move(host_info)); |
EXPECT_EQ(0, new_dispatcher_host->bad_messages_received_count_); |
} |