OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" | 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "base/test/simple_test_tick_clock.h" | 15 #include "base/test/simple_test_tick_clock.h" |
16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
17 #include "content/browser/browser_thread_impl.h" | 17 #include "content/browser/browser_thread_impl.h" |
18 #include "content/browser/message_port_service.h" | |
19 #include "content/browser/service_worker/embedded_worker_instance.h" | 18 #include "content/browser/service_worker/embedded_worker_instance.h" |
20 #include "content/browser/service_worker/embedded_worker_registry.h" | 19 #include "content/browser/service_worker/embedded_worker_registry.h" |
21 #include "content/browser/service_worker/embedded_worker_status.h" | 20 #include "content/browser/service_worker/embedded_worker_status.h" |
22 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 21 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
23 #include "content/browser/service_worker/service_worker_context_core.h" | 22 #include "content/browser/service_worker/service_worker_context_core.h" |
24 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 23 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
25 #include "content/browser/service_worker/service_worker_handle.h" | 24 #include "content/browser/service_worker/service_worker_handle.h" |
26 #include "content/browser/service_worker/service_worker_test_utils.h" | 25 #include "content/browser/service_worker/service_worker_test_utils.h" |
27 #include "content/common/service_worker/embedded_worker_messages.h" | 26 #include "content/common/service_worker/embedded_worker_messages.h" |
28 #include "content/common/service_worker/service_worker_messages.h" | 27 #include "content/common/service_worker/service_worker_messages.h" |
29 #include "content/common/service_worker/service_worker_types.h" | 28 #include "content/common/service_worker/service_worker_types.h" |
30 #include "content/common/service_worker/service_worker_utils.h" | 29 #include "content/common/service_worker/service_worker_utils.h" |
31 #include "content/public/common/content_switches.h" | 30 #include "content/public/common/content_switches.h" |
32 #include "content/public/test/mock_resource_context.h" | 31 #include "content/public/test/mock_resource_context.h" |
33 #include "content/public/test/test_browser_thread_bundle.h" | 32 #include "content/public/test/test_browser_thread_bundle.h" |
34 #include "content/test/test_content_browser_client.h" | 33 #include "content/test/test_content_browser_client.h" |
35 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
36 | 35 |
37 namespace content { | 36 namespace content { |
38 | 37 |
39 namespace { | 38 namespace { |
40 | 39 |
41 static void SaveStatusCallback(bool* called, | 40 static void SaveStatusCallback(bool* called, |
42 ServiceWorkerStatusCode* out, | 41 ServiceWorkerStatusCode* out, |
43 ServiceWorkerStatusCode status) { | 42 ServiceWorkerStatusCode status) { |
44 *called = true; | 43 *called = true; |
45 *out = status; | 44 *out = status; |
46 } | 45 } |
47 | 46 |
48 void SetUpDummyMessagePort(std::vector<int>* ports) { | 47 void SetUpDummyMessagePort(std::vector<MessagePort>* ports) { |
49 int port_id = -1; | 48 // Let the other end of the pipe close. |
50 MessagePortService::GetInstance()->Create(MSG_ROUTING_NONE, nullptr, | 49 mojo::MessagePipe pipe; |
51 &port_id); | 50 ports->push_back(MessagePort(std::move(pipe.handle0))); |
52 ports->push_back(port_id); | |
53 } | 51 } |
54 | 52 |
55 } // namespace | 53 } // namespace |
56 | 54 |
57 static const int kRenderFrameId = 1; | 55 static const int kRenderFrameId = 1; |
58 | 56 |
59 class TestingServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost { | 57 class TestingServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost { |
60 public: | 58 public: |
61 TestingServiceWorkerDispatcherHost( | 59 TestingServiceWorkerDispatcherHost( |
62 int process_id, | 60 int process_id, |
63 ServiceWorkerContextWrapper* context_wrapper, | 61 ServiceWorkerContextWrapper* context_wrapper, |
64 ResourceContext* resource_context, | 62 ResourceContext* resource_context, |
65 EmbeddedWorkerTestHelper* helper) | 63 EmbeddedWorkerTestHelper* helper) |
66 : ServiceWorkerDispatcherHost(process_id, nullptr, resource_context), | 64 : ServiceWorkerDispatcherHost(process_id, resource_context), |
67 bad_messages_received_count_(0), | 65 bad_messages_received_count_(0), |
68 helper_(helper) { | 66 helper_(helper) { |
69 Init(context_wrapper); | 67 Init(context_wrapper); |
70 } | 68 } |
71 | 69 |
72 bool Send(IPC::Message* message) override { return helper_->Send(message); } | 70 bool Send(IPC::Message* message) override { return helper_->Send(message); } |
73 | 71 |
74 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } | 72 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } |
75 | 73 |
76 void ShutdownForBadMessage() override { ++bad_messages_received_count_; } | 74 void ShutdownForBadMessage() override { ++bad_messages_received_count_; } |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 SendGetRegistrations(provider_id); | 229 SendGetRegistrations(provider_id); |
232 EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( | 230 EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( |
233 expected_message)); | 231 expected_message)); |
234 dispatcher_host_->ipc_sink()->ClearMessages(); | 232 dispatcher_host_->ipc_sink()->ClearMessages(); |
235 } | 233 } |
236 | 234 |
237 void DispatchExtendableMessageEvent( | 235 void DispatchExtendableMessageEvent( |
238 scoped_refptr<ServiceWorkerVersion> worker, | 236 scoped_refptr<ServiceWorkerVersion> worker, |
239 const base::string16& message, | 237 const base::string16& message, |
240 const url::Origin& source_origin, | 238 const url::Origin& source_origin, |
241 const std::vector<int>& sent_message_ports, | 239 const std::vector<MessagePort>& sent_message_ports, |
242 ServiceWorkerProviderHost* sender_provider_host, | 240 ServiceWorkerProviderHost* sender_provider_host, |
243 const ServiceWorkerDispatcherHost::StatusCallback& callback) { | 241 const ServiceWorkerDispatcherHost::StatusCallback& callback) { |
244 dispatcher_host_->DispatchExtendableMessageEvent( | 242 dispatcher_host_->DispatchExtendableMessageEvent( |
245 std::move(worker), message, source_origin, sent_message_ports, | 243 std::move(worker), message, source_origin, sent_message_ports, |
246 sender_provider_host, callback); | 244 sender_provider_host, callback); |
247 } | 245 } |
248 | 246 |
249 ServiceWorkerProviderHost* CreateServiceWorkerProviderHost(int provider_id) { | 247 ServiceWorkerProviderHost* CreateServiceWorkerProviderHost(int provider_id) { |
250 return new ServiceWorkerProviderHost( | 248 return new ServiceWorkerProviderHost( |
251 helper_->mock_render_process_id(), kRenderFrameId, provider_id, | 249 helper_->mock_render_process_id(), kRenderFrameId, provider_id, |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 ServiceWorkerMetrics::EventType::ACTIVATE, | 708 ServiceWorkerMetrics::EventType::ACTIVATE, |
711 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), | 709 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), |
712 base::TimeDelta::FromSeconds(10), ServiceWorkerVersion::KILL_ON_TIMEOUT); | 710 base::TimeDelta::FromSeconds(10), ServiceWorkerVersion::KILL_ON_TIMEOUT); |
713 | 711 |
714 // Advance clock by a couple seconds. | 712 // Advance clock by a couple seconds. |
715 tick_clock->Advance(base::TimeDelta::FromSeconds(4)); | 713 tick_clock->Advance(base::TimeDelta::FromSeconds(4)); |
716 base::TimeDelta remaining_time = version_->remaining_timeout(); | 714 base::TimeDelta remaining_time = version_->remaining_timeout(); |
717 EXPECT_EQ(base::TimeDelta::FromSeconds(6), remaining_time); | 715 EXPECT_EQ(base::TimeDelta::FromSeconds(6), remaining_time); |
718 | 716 |
719 // Dispatch ExtendableMessageEvent. | 717 // Dispatch ExtendableMessageEvent. |
720 std::vector<int> ports; | 718 std::vector<MessagePort> ports; |
721 SetUpDummyMessagePort(&ports); | 719 SetUpDummyMessagePort(&ports); |
722 called = false; | 720 called = false; |
723 status = SERVICE_WORKER_ERROR_MAX_VALUE; | 721 status = SERVICE_WORKER_ERROR_MAX_VALUE; |
724 DispatchExtendableMessageEvent( | 722 DispatchExtendableMessageEvent( |
725 version_, base::string16(), url::Origin(version_->scope().GetOrigin()), | 723 version_, base::string16(), url::Origin(version_->scope().GetOrigin()), |
726 ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); | 724 ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); |
727 for (int port : ports) | |
728 EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port)); | |
729 EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count()); | 725 EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count()); |
730 base::RunLoop().RunUntilIdle(); | 726 base::RunLoop().RunUntilIdle(); |
731 EXPECT_TRUE(called); | 727 EXPECT_TRUE(called); |
732 EXPECT_EQ(SERVICE_WORKER_OK, status); | 728 EXPECT_EQ(SERVICE_WORKER_OK, status); |
733 | 729 |
734 // Messages should be held until ports are created at the destination. | |
735 for (int port : ports) | |
736 EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port)); | |
737 | |
738 EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count()); | 730 EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count()); |
739 | 731 |
740 // Timeout of message event should not have extended life of service worker. | 732 // Timeout of message event should not have extended life of service worker. |
741 EXPECT_EQ(remaining_time, version_->remaining_timeout()); | 733 EXPECT_EQ(remaining_time, version_->remaining_timeout()); |
742 } | 734 } |
743 | 735 |
744 TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent_Fail) { | 736 TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent_Fail) { |
745 GURL pattern = GURL("http://www.example.com/"); | 737 GURL pattern = GURL("http://www.example.com/"); |
746 GURL script_url = GURL("http://www.example.com/service_worker.js"); | 738 GURL script_url = GURL("http://www.example.com/service_worker.js"); |
747 | 739 |
748 Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); | 740 Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); |
749 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_WORKER, pattern); | 741 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_WORKER, pattern); |
750 SetUpRegistration(pattern, script_url); | 742 SetUpRegistration(pattern, script_url); |
751 | 743 |
752 // Try to dispatch ExtendableMessageEvent. This should fail to start the | 744 // Try to dispatch ExtendableMessageEvent. This should fail to start the |
753 // worker and to dispatch the event. | 745 // worker and to dispatch the event. |
754 std::vector<int> ports; | 746 std::vector<MessagePort> ports; |
755 SetUpDummyMessagePort(&ports); | 747 SetUpDummyMessagePort(&ports); |
756 bool called = false; | 748 bool called = false; |
757 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 749 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
758 DispatchExtendableMessageEvent( | 750 DispatchExtendableMessageEvent( |
759 version_, base::string16(), url::Origin(version_->scope().GetOrigin()), | 751 version_, base::string16(), url::Origin(version_->scope().GetOrigin()), |
760 ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); | 752 ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); |
761 for (int port : ports) | |
762 EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port)); | |
763 base::RunLoop().RunUntilIdle(); | 753 base::RunLoop().RunUntilIdle(); |
764 EXPECT_TRUE(called); | 754 EXPECT_TRUE(called); |
765 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); | 755 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); |
766 | |
767 // The error callback should clean up the ports and handle. | |
768 for (int port : ports) | |
769 EXPECT_FALSE(MessagePortService::GetInstance()->AreMessagesHeld(port)); | |
770 } | 756 } |
771 | 757 |
772 TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId) { | 758 TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId) { |
773 GURL pattern = GURL("http://www.example.com/"); | 759 GURL pattern = GURL("http://www.example.com/"); |
774 GURL script_url = GURL("http://www.example.com/service_worker.js"); | 760 GURL script_url = GURL("http://www.example.com/service_worker.js"); |
775 | 761 |
776 Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); | 762 Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); |
777 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); | 763 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); |
778 SetUpRegistration(pattern, script_url); | 764 SetUpRegistration(pattern, script_url); |
779 | 765 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_FetchEventResponse( | 832 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_FetchEventResponse( |
847 version_->embedded_worker()->embedded_worker_id(), kFetchEventId, | 833 version_->embedded_worker()->embedded_worker_id(), kFetchEventId, |
848 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), | 834 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), |
849 base::Time::Now())); | 835 base::Time::Now())); |
850 | 836 |
851 base::RunLoop().RunUntilIdle(); | 837 base::RunLoop().RunUntilIdle(); |
852 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_); | 838 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_); |
853 } | 839 } |
854 | 840 |
855 } // namespace content | 841 } // namespace content |
OLD | NEW |