1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_dispatcher_host.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/file_path.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/browser_thread_impl.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_instance.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_registry.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_test_helper.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_wrapper.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/service_worker/embedded_worker_messages.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/service_worker/service_worker_messages.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/common/content_switches.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content { 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const int kRenderProcessId = 1; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestingServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost { 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingServiceWorkerDispatcherHost( 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ServiceWorkerContextWrapper* context_wrapper, 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EmbeddedWorkerTestHelper* helper) 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : ServiceWorkerDispatcherHost(process_id, NULL), 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bad_messages_received_count_(0), 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper_(helper) { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Init(context_wrapper); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool Send(IPC::Message* message) OVERRIDE { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return helper_->Send(message); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void BadMessageReceived() OVERRIDE { 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ++bad_messages_received_count_; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int bad_messages_received_count_; 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EmbeddedWorkerTestHelper* helper_; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~TestingServiceWorkerDispatcherHost() {} 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class ServiceWorkerDispatcherHostTest : public testing::Test { 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) protected: 576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ServiceWorkerDispatcherHostTest() 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void SetUp() { 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) helper_.reset(new EmbeddedWorkerTestHelper(kRenderProcessId)); 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_ = new TestingServiceWorkerDispatcherHost( 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kRenderProcessId, context_wrapper(), helper_.get()); 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void TearDown() { 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) helper_.reset(); 686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ServiceWorkerContextCore* context() { return helper_->context(); } 716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ServiceWorkerContextWrapper* context_wrapper() { 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return helper_->context_wrapper(); 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void SendRegister(int64 provider_id, GURL pattern, GURL worker_url) { 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ServiceWorkerHostMsg_RegisterServiceWorker( 786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) -1, -1, provider_id, pattern, worker_url)); 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void Register(int64 provider_id, 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL pattern, 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL worker_url, 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32 expected_message) { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(provider_id, pattern, worker_url); 876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( 886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) expected_message)); 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->ipc_sink()->ClearMessages(); 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void SendUnregister(int64 provider_id, GURL pattern) { 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ServiceWorkerHostMsg_UnregisterServiceWorker( 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) -1, -1, provider_id, pattern)); 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void Unregister(int64 provider_id, GURL pattern, uint32 expected_message) { 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendUnregister(provider_id, pattern); 1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) expected_message)); 1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->ipc_sink()->ClearMessages(); 1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SendGetRegistration(int64 provider_id, GURL document_url) { 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher_host_->OnMessageReceived( 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceWorkerHostMsg_GetRegistration( 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1, -1, provider_id, document_url)); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void GetRegistration(int64 provider_id, 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL document_url, 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32 expected_message) { 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendGetRegistration(provider_id, document_url); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci expected_message)); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher_host_->ipc_sink()->ClearMessages(); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) TestBrowserThreadBundle browser_thread_bundle_; 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<EmbeddedWorkerTestHelper> helper_; 1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_refptr<TestingServiceWorkerDispatcherHost> dispatcher_host_; 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}; 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 127116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Register_SameOrigin) { 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int64 kProviderId = 99; // Dummy value 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL)); 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host->SetDocumentUrl(GURL("https://www.example.com/foo")); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr(); 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context()->AddProviderHost(host.Pass()); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Register(kProviderId, 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://www.example.com/"), 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("https://www.example.com/bar"), 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceWorkerMsg_ServiceWorkerRegistered::ID); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 141116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Register_CrossOrigin) { 1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const int64 kProviderId = 99; // Dummy value 1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL)); 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host->SetDocumentUrl(GURL("https://www.example.com/foo")); 1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr(); 1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) context()->AddProviderHost(host.Pass()); 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Script has a different host 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(kProviderId, 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://www.example.com/"), 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("https://foo.example.com/bar")); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Scope has a different host 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(kProviderId, 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://foo.example.com/"), 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("https://www.example.com/bar")); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Script has a different port 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(kProviderId, 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://www.example.com/"), 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("https://www.example.com:8080/bar")); 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(3, dispatcher_host_->bad_messages_received_count_); 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Scope has a different transport 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(kProviderId, 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("wss://www.example.com/"), 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("https://www.example.com/bar")); 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(4, dispatcher_host_->bad_messages_received_count_); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Script and scope have different hosts 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(kProviderId, 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://foo.example.com/"), 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("https://foo.example.com/bar")); 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(5, dispatcher_host_->bad_messages_received_count_); 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Script and scope URLs are invalid 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendRegister(kProviderId, 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(), 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("h@ttps://@")); 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(6, dispatcher_host_->bad_messages_received_count_); 1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 186116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Unregister_SameOrigin) { 1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const int64 kProviderId = 99; // Dummy value 1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL)); 1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) host->SetDocumentUrl(GURL("http://www.example.com/foo")); 1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr(); 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) context()->AddProviderHost(host.Pass()); 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Unregister(kProviderId, 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("http://www.example.com/"), 1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ServiceWorkerMsg_ServiceWorkerUnregistered::ID); 1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 199116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Unregister_CrossOrigin) { 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int64 kProviderId = 99; // Dummy value 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL)); 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host->SetDocumentUrl(GURL("http://www.example.com/foo")); 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr(); 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context()->AddProviderHost(host.Pass()); 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendUnregister(kProviderId, GURL("http://foo.example.com/")); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ServiceWorkerDispatcherHostTest, EarlyContextDeletion) { 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu helper_->ShutdownContext(); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Let the shutdown reach the simulated IO thread. 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Register(-1, 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(), 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(), 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceWorkerMsg_ServiceWorkerRegistrationError::ID); 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ServiceWorkerDispatcherHostTest, ProviderCreatedAndDestroyed) { 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kProviderId = 1001; // Test with a value != kRenderProcessId. 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerHostMsg_ProviderCreated(kProviderId)); 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(context()->GetProviderHost(kRenderProcessId, kProviderId)); 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Two with the same ID should be seen as a bad message. 2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerHostMsg_ProviderCreated(kProviderId)); 2336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerHostMsg_ProviderDestroyed(kProviderId)); 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(context()->GetProviderHost(kRenderProcessId, kProviderId)); 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Destroying an ID that does not exist warrants a bad message. 2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerHostMsg_ProviderDestroyed(kProviderId)); 2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_); 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Deletion of the dispatcher_host should cause providers for that 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // process to get deleted as well. 2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_->OnMessageReceived( 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerHostMsg_ProviderCreated(kProviderId)); 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(context()->GetProviderHost(kRenderProcessId, kProviderId)); 2496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_TRUE(dispatcher_host_->HasOneRef()); 2506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dispatcher_host_ = NULL; 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(context()->GetProviderHost(kRenderProcessId, kProviderId)); 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_SameOrigin) { 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int64 kProviderId = 99; // Dummy value 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL)); 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host->SetDocumentUrl(GURL("https://www.example.com/foo")); 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr(); 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context()->AddProviderHost(host.Pass()); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetRegistration(kProviderId, 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL("https://www.example.com/"), 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceWorkerMsg_DidGetRegistration::ID); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_CrossOrigin) { 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int64 kProviderId = 99; // Dummy value 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL)); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host->SetDocumentUrl(GURL("https://www.example.com/foo")); 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr(); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context()->AddProviderHost(host.Pass()); 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendGetRegistration(kProviderId, GURL("https://foo.example.com/")); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_EarlyContextDeletion) { 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci helper_->ShutdownContext(); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Let the shutdown reach the simulated IO thread. 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetRegistration(-1, 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL(), 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceWorkerMsg_ServiceWorkerGetRegistrationError::ID); 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace content 291