Chromium Code Reviews| 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 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 54 | 54 |
| 55 } // namespace | 55 } // namespace |
| 56 | 56 |
| 57 static const int kRenderFrameId = 1; | 57 static const int kRenderFrameId = 1; |
| 58 | 58 |
| 59 class TestingServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost { | 59 class TestingServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost { |
| 60 public: | 60 public: |
| 61 TestingServiceWorkerDispatcherHost( | 61 TestingServiceWorkerDispatcherHost( |
| 62 int process_id, | 62 int process_id, |
| 63 ServiceWorkerContextWrapper* context_wrapper, | 63 ServiceWorkerContextWrapper* context_wrapper, |
| 64 MessagePortMessageFilter* message_port_message_filter, | |
| 64 ResourceContext* resource_context, | 65 ResourceContext* resource_context, |
| 65 EmbeddedWorkerTestHelper* helper) | 66 EmbeddedWorkerTestHelper* helper) |
| 66 : ServiceWorkerDispatcherHost(process_id, nullptr, resource_context), | 67 : ServiceWorkerDispatcherHost(process_id, |
| 68 message_port_message_filter, | |
| 69 resource_context), | |
| 67 bad_messages_received_count_(0), | 70 bad_messages_received_count_(0), |
| 68 helper_(helper) { | 71 helper_(helper) { |
| 69 Init(context_wrapper); | 72 Init(context_wrapper); |
| 70 } | 73 } |
| 71 | 74 |
| 72 bool Send(IPC::Message* message) override { return helper_->Send(message); } | 75 bool Send(IPC::Message* message) override { return helper_->Send(message); } |
| 73 | 76 |
| 74 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } | 77 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } |
| 75 | 78 |
| 76 void ShutdownForBadMessage() override { ++bad_messages_received_count_; } | 79 void ShutdownForBadMessage() override { ++bad_messages_received_count_; } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 helper_.reset(); | 116 helper_.reset(); |
| 114 } | 117 } |
| 115 | 118 |
| 116 ServiceWorkerContextCore* context() { return helper_->context(); } | 119 ServiceWorkerContextCore* context() { return helper_->context(); } |
| 117 ServiceWorkerContextWrapper* context_wrapper() { | 120 ServiceWorkerContextWrapper* context_wrapper() { |
| 118 return helper_->context_wrapper(); | 121 return helper_->context_wrapper(); |
| 119 } | 122 } |
| 120 | 123 |
| 121 void Initialize(std::unique_ptr<EmbeddedWorkerTestHelper> helper) { | 124 void Initialize(std::unique_ptr<EmbeddedWorkerTestHelper> helper) { |
| 122 helper_.reset(helper.release()); | 125 helper_.reset(helper.release()); |
| 126 int process_id = helper_->mock_render_process_id(); | |
| 127 // Inherit the message filter for message ports. | |
| 128 MessagePortMessageFilter* message_port_filter = | |
| 129 context()->GetDispatcherHost(process_id)->message_port_message_filter(); | |
| 130 context()->RemoveDispatcherHost(process_id); | |
| 123 dispatcher_host_ = new TestingServiceWorkerDispatcherHost( | 131 dispatcher_host_ = new TestingServiceWorkerDispatcherHost( |
| 124 helper_->mock_render_process_id(), context_wrapper(), | 132 process_id, context_wrapper(), message_port_filter, &resource_context_, |
| 125 &resource_context_, helper_.get()); | 133 helper_.get()); |
| 126 } | 134 } |
| 127 | 135 |
| 128 void SetUpRegistration(const GURL& scope, const GURL& script_url) { | 136 void SetUpRegistration(const GURL& scope, const GURL& script_url) { |
| 129 registration_ = new ServiceWorkerRegistration( | 137 registration_ = new ServiceWorkerRegistration( |
| 130 scope, 1L, helper_->context()->AsWeakPtr()); | 138 scope, 1L, helper_->context()->AsWeakPtr()); |
| 131 version_ = new ServiceWorkerVersion(registration_.get(), script_url, 1L, | 139 version_ = new ServiceWorkerVersion(registration_.get(), script_url, 1L, |
| 132 helper_->context()->AsWeakPtr()); | 140 helper_->context()->AsWeakPtr()); |
| 133 std::vector<ServiceWorkerDatabase::ResourceRecord> records; | 141 std::vector<ServiceWorkerDatabase::ResourceRecord> records; |
| 134 records.push_back( | 142 records.push_back( |
| 135 ServiceWorkerDatabase::ResourceRecord(10, version_->script_url(), 100)); | 143 ServiceWorkerDatabase::ResourceRecord(10, version_->script_url(), 100)); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 149 registration_.get(), version_.get(), | 157 registration_.get(), version_.get(), |
| 150 base::Bind(&SaveStatusCallback, &called, &status)); | 158 base::Bind(&SaveStatusCallback, &called, &status)); |
| 151 base::RunLoop().RunUntilIdle(); | 159 base::RunLoop().RunUntilIdle(); |
| 152 EXPECT_TRUE(called); | 160 EXPECT_TRUE(called); |
| 153 EXPECT_EQ(SERVICE_WORKER_OK, status); | 161 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 154 } | 162 } |
| 155 | 163 |
| 156 void SendSetHostedVersionId(int provider_id, | 164 void SendSetHostedVersionId(int provider_id, |
| 157 int64_t version_id, | 165 int64_t version_id, |
| 158 int embedded_worker_id) { | 166 int embedded_worker_id) { |
| 159 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_SetVersionId( | 167 dispatcher_host_->OnSetHostedVersionId(provider_id, version_id, |
| 160 provider_id, version_id, embedded_worker_id)); | 168 embedded_worker_id); |
| 161 } | 169 } |
| 162 | 170 |
| 163 void SendProviderCreated(ServiceWorkerProviderType type, | 171 void SendProviderCreated(ServiceWorkerProviderType type, |
| 164 const GURL& pattern) { | 172 const GURL& pattern) { |
| 165 const int64_t kProviderId = 99; | 173 const int64_t kProviderId = 99; |
| 166 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_ProviderCreated( | 174 ServiceWorkerProviderHostInfo info(kProviderId, MSG_ROUTING_NONE, type, |
| 167 kProviderId, MSG_ROUTING_NONE, type, | 175 true); |
|
falken
2017/02/13 05:59:24
Let's document /* is_parent_frame_secure */ or rei
shimazu
2017/02/13 08:20:19
Oops, I forgot to add the note, thanks:)
| |
| 168 true /* is_parent_frame_secure */)); | 176 dispatcher_host_->OnProviderCreated(std::move(info)); |
| 169 helper_->SimulateAddProcessToPattern(pattern, | 177 helper_->SimulateAddProcessToPattern(pattern, |
| 170 helper_->mock_render_process_id()); | 178 helper_->mock_render_process_id()); |
| 171 provider_host_ = context()->GetProviderHost( | 179 provider_host_ = context()->GetProviderHost( |
| 172 helper_->mock_render_process_id(), kProviderId); | 180 helper_->mock_render_process_id(), kProviderId); |
| 173 } | 181 } |
| 174 | 182 |
| 175 void SendRegister(int64_t provider_id, GURL pattern, GURL worker_url) { | 183 void SendRegister(int64_t provider_id, GURL pattern, GURL worker_url) { |
| 176 dispatcher_host_->OnMessageReceived( | 184 dispatcher_host_->OnMessageReceived( |
| 177 ServiceWorkerHostMsg_RegisterServiceWorker( | 185 ServiceWorkerHostMsg_RegisterServiceWorker( |
| 178 -1, -1, provider_id, pattern, worker_url)); | 186 -1, -1, provider_id, pattern, worker_url)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 const base::string16& message, | 247 const base::string16& message, |
| 240 const url::Origin& source_origin, | 248 const url::Origin& source_origin, |
| 241 const std::vector<int>& sent_message_ports, | 249 const std::vector<int>& sent_message_ports, |
| 242 ServiceWorkerProviderHost* sender_provider_host, | 250 ServiceWorkerProviderHost* sender_provider_host, |
| 243 const ServiceWorkerDispatcherHost::StatusCallback& callback) { | 251 const ServiceWorkerDispatcherHost::StatusCallback& callback) { |
| 244 dispatcher_host_->DispatchExtendableMessageEvent( | 252 dispatcher_host_->DispatchExtendableMessageEvent( |
| 245 std::move(worker), message, source_origin, sent_message_ports, | 253 std::move(worker), message, source_origin, sent_message_ports, |
| 246 sender_provider_host, callback); | 254 sender_provider_host, callback); |
| 247 } | 255 } |
| 248 | 256 |
| 249 ServiceWorkerProviderHost* CreateServiceWorkerProviderHost(int provider_id) { | 257 std::unique_ptr<ServiceWorkerProviderHost> CreateServiceWorkerProviderHost( |
| 250 return new ServiceWorkerProviderHost( | 258 int provider_id) { |
| 251 helper_->mock_render_process_id(), kRenderFrameId, provider_id, | 259 return CreateProviderHostWithDispatcherHost( |
| 252 SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 260 helper_->mock_render_process_id(), provider_id, context()->AsWeakPtr(), |
| 253 ServiceWorkerProviderHost::FrameSecurityLevel::SECURE, | 261 kRenderFrameId, dispatcher_host_.get()); |
| 254 context()->AsWeakPtr(), dispatcher_host_.get()); | |
| 255 } | 262 } |
| 256 | 263 |
| 257 TestBrowserThreadBundle browser_thread_bundle_; | 264 TestBrowserThreadBundle browser_thread_bundle_; |
| 258 content::MockResourceContext resource_context_; | 265 content::MockResourceContext resource_context_; |
| 259 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; | 266 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
| 260 scoped_refptr<TestingServiceWorkerDispatcherHost> dispatcher_host_; | 267 scoped_refptr<TestingServiceWorkerDispatcherHost> dispatcher_host_; |
| 261 scoped_refptr<ServiceWorkerRegistration> registration_; | 268 scoped_refptr<ServiceWorkerRegistration> registration_; |
| 262 scoped_refptr<ServiceWorkerVersion> version_; | 269 scoped_refptr<ServiceWorkerVersion> version_; |
| 263 ServiceWorkerProviderHost* provider_host_; | 270 ServiceWorkerProviderHost* provider_host_; |
| 264 }; | 271 }; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 503 Register(-1, | 510 Register(-1, |
| 504 GURL(), | 511 GURL(), |
| 505 GURL(), | 512 GURL(), |
| 506 ServiceWorkerMsg_ServiceWorkerRegistrationError::ID); | 513 ServiceWorkerMsg_ServiceWorkerRegistrationError::ID); |
| 507 } | 514 } |
| 508 | 515 |
| 509 TEST_F(ServiceWorkerDispatcherHostTest, ProviderCreatedAndDestroyed) { | 516 TEST_F(ServiceWorkerDispatcherHostTest, ProviderCreatedAndDestroyed) { |
| 510 const int kProviderId = 1001; | 517 const int kProviderId = 1001; |
| 511 int process_id = helper_->mock_render_process_id(); | 518 int process_id = helper_->mock_render_process_id(); |
| 512 | 519 |
| 513 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_ProviderCreated( | 520 dispatcher_host_->OnProviderCreated(ServiceWorkerProviderHostInfo( |
| 514 kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 521 kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
| 515 true /* is_parent_frame_secure */)); | 522 true /* is_parent_frame_secure */)); |
| 516 EXPECT_TRUE(context()->GetProviderHost(process_id, kProviderId)); | 523 EXPECT_TRUE(context()->GetProviderHost(process_id, kProviderId)); |
| 517 | 524 |
| 518 // Two with the same ID should be seen as a bad message. | 525 // Two with the same ID should be seen as a bad message. |
| 519 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_ProviderCreated( | 526 dispatcher_host_->OnProviderCreated(ServiceWorkerProviderHostInfo( |
| 520 kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 527 kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
| 521 true /* is_parent_frame_secure */)); | 528 true /* is_parent_frame_secure */)); |
| 522 EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); | 529 EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); |
| 523 | 530 |
| 524 dispatcher_host_->OnMessageReceived( | 531 dispatcher_host_->OnProviderDestroyed(kProviderId); |
| 525 ServiceWorkerHostMsg_ProviderDestroyed(kProviderId)); | |
| 526 EXPECT_FALSE(context()->GetProviderHost(process_id, kProviderId)); | 532 EXPECT_FALSE(context()->GetProviderHost(process_id, kProviderId)); |
| 527 | 533 |
| 528 // Destroying an ID that does not exist warrants a bad message. | 534 // Destroying an ID that does not exist warrants a bad message. |
| 529 dispatcher_host_->OnMessageReceived( | 535 dispatcher_host_->OnProviderDestroyed(kProviderId); |
| 530 ServiceWorkerHostMsg_ProviderDestroyed(kProviderId)); | |
| 531 EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_); | 536 EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_); |
| 532 | 537 |
| 533 // Deletion of the dispatcher_host should cause providers for that | 538 // Deletion of the dispatcher_host should cause providers for that |
| 534 // process to get deleted as well. | 539 // process to get deleted as well. |
| 535 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_ProviderCreated( | 540 dispatcher_host_->OnProviderCreated(ServiceWorkerProviderHostInfo( |
| 536 kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 541 kProviderId, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
| 537 true /* is_parent_frame_secure */)); | 542 true /* is_parent_frame_secure */)); |
| 538 EXPECT_TRUE(context()->GetProviderHost(process_id, kProviderId)); | 543 EXPECT_TRUE(context()->GetProviderHost(process_id, kProviderId)); |
| 539 EXPECT_TRUE(dispatcher_host_->HasOneRef()); | 544 EXPECT_TRUE(dispatcher_host_->HasOneRef()); |
| 540 dispatcher_host_ = NULL; | 545 dispatcher_host_ = nullptr; |
| 541 EXPECT_FALSE(context()->GetProviderHost(process_id, kProviderId)); | 546 EXPECT_FALSE(context()->GetProviderHost(process_id, kProviderId)); |
| 542 } | 547 } |
| 543 | 548 |
| 544 TEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_SameOrigin) { | 549 TEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_SameOrigin) { |
| 545 const int64_t kProviderId = 99; // Dummy value | 550 const int64_t kProviderId = 99; // Dummy value |
| 546 std::unique_ptr<ServiceWorkerProviderHost> host( | 551 std::unique_ptr<ServiceWorkerProviderHost> host( |
| 547 CreateServiceWorkerProviderHost(kProviderId)); | 552 CreateServiceWorkerProviderHost(kProviderId)); |
| 548 host->SetDocumentUrl(GURL("https://www.example.com/foo")); | 553 host->SetDocumentUrl(GURL("https://www.example.com/foo")); |
| 549 context()->AddProviderHost(std::move(host)); | 554 context()->AddProviderHost(std::move(host)); |
| 550 | 555 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 656 dispatcher_host_->OnFilterRemoved(); | 661 dispatcher_host_->OnFilterRemoved(); |
| 657 | 662 |
| 658 // The dispatcher host should clean up the state from the process. | 663 // The dispatcher host should clean up the state from the process. |
| 659 EXPECT_FALSE(context()->GetProviderHost(process_id, provider_id)); | 664 EXPECT_FALSE(context()->GetProviderHost(process_id, provider_id)); |
| 660 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 665 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
| 661 | 666 |
| 662 // We should be able to hook up a new dispatcher host although the old object | 667 // We should be able to hook up a new dispatcher host although the old object |
| 663 // is not yet destroyed. This is what the browser does when reusing a crashed | 668 // is not yet destroyed. This is what the browser does when reusing a crashed |
| 664 // render process. | 669 // render process. |
| 665 scoped_refptr<TestingServiceWorkerDispatcherHost> new_dispatcher_host( | 670 scoped_refptr<TestingServiceWorkerDispatcherHost> new_dispatcher_host( |
| 666 new TestingServiceWorkerDispatcherHost( | 671 new TestingServiceWorkerDispatcherHost(process_id, context_wrapper(), |
| 667 process_id, context_wrapper(), &resource_context_, helper_.get())); | 672 nullptr, &resource_context_, |
| 673 helper_.get())); | |
| 668 | 674 |
| 669 // To show the new dispatcher can operate, simulate provider creation. Since | 675 // To show the new dispatcher can operate, simulate provider creation. Since |
| 670 // the old dispatcher cleaned up the old provider host, the new one won't | 676 // the old dispatcher cleaned up the old provider host, the new one won't |
| 671 // complain. | 677 // complain. |
| 672 new_dispatcher_host->OnMessageReceived(ServiceWorkerHostMsg_ProviderCreated( | 678 new_dispatcher_host->OnProviderCreated(ServiceWorkerProviderHostInfo( |
| 673 provider_id, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 679 provider_id, MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
| 674 true /* is_parent_frame_secure */)); | 680 true /* is_parent_frame_secure */)); |
| 675 EXPECT_EQ(0, new_dispatcher_host->bad_messages_received_count_); | 681 EXPECT_EQ(0, new_dispatcher_host->bad_messages_received_count_); |
| 676 } | 682 } |
| 677 | 683 |
| 678 TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent) { | 684 TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent) { |
| 679 GURL pattern = GURL("http://www.example.com/"); | 685 GURL pattern = GURL("http://www.example.com/"); |
| 680 GURL script_url = GURL("http://www.example.com/service_worker.js"); | 686 GURL script_url = GURL("http://www.example.com/service_worker.js"); |
| 681 | 687 |
| 682 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); | 688 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_FetchEventResponse( | 852 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_FetchEventResponse( |
| 847 version_->embedded_worker()->embedded_worker_id(), kFetchEventId, | 853 version_->embedded_worker()->embedded_worker_id(), kFetchEventId, |
| 848 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), | 854 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), |
| 849 base::Time::Now())); | 855 base::Time::Now())); |
| 850 | 856 |
| 851 base::RunLoop().RunUntilIdle(); | 857 base::RunLoop().RunUntilIdle(); |
| 852 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_); | 858 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_); |
| 853 } | 859 } |
| 854 | 860 |
| 855 } // namespace content | 861 } // namespace content |
| OLD | NEW |