| 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 |