| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/embedded_worker_test_helper.h" | 5 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/atomic_sequence_num.h" | 11 #include "base/atomic_sequence_num.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/memory/scoped_vector.h" | 13 #include "base/memory/scoped_vector.h" |
| 14 #include "base/threading/thread_task_runner_handle.h" | 14 #include "base/threading/thread_task_runner_handle.h" |
| 15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 16 #include "content/browser/message_port_message_filter.h" | 16 #include "content/browser/message_port_message_filter.h" |
| 17 #include "content/browser/service_worker/embedded_worker_instance.h" | 17 #include "content/browser/service_worker/embedded_worker_instance.h" |
| 18 #include "content/browser/service_worker/embedded_worker_registry.h" | 18 #include "content/browser/service_worker/embedded_worker_registry.h" |
| 19 #include "content/browser/service_worker/embedded_worker_status.h" | 19 #include "content/browser/service_worker/embedded_worker_status.h" |
| 20 #include "content/browser/service_worker/service_worker_context_core.h" | 20 #include "content/browser/service_worker/service_worker_context_core.h" |
| 21 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 21 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 22 #include "content/common/service_worker/embedded_worker_messages.h" | 22 #include "content/common/service_worker/embedded_worker_messages.h" |
| 23 #include "content/common/service_worker/embedded_worker_setup.mojom.h" | 23 #include "content/common/service_worker/embedded_worker_setup.mojom.h" |
| 24 #include "content/common/service_worker/embedded_worker_start_params.h" | 24 #include "content/common/service_worker/embedded_worker_start_params.h" |
| 25 #include "content/common/service_worker/fetch_event_dispatcher.mojom.h" | 25 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h" |
| 26 #include "content/common/service_worker/service_worker_messages.h" | 26 #include "content/common/service_worker/service_worker_messages.h" |
| 27 #include "content/common/service_worker/service_worker_utils.h" |
| 27 #include "content/public/common/push_event_payload.h" | 28 #include "content/public/common/push_event_payload.h" |
| 28 #include "content/public/test/mock_render_process_host.h" | 29 #include "content/public/test/mock_render_process_host.h" |
| 29 #include "content/public/test/test_browser_context.h" | 30 #include "content/public/test/test_browser_context.h" |
| 30 #include "mojo/public/cpp/bindings/interface_request.h" | 31 #include "mojo/public/cpp/bindings/interface_request.h" |
| 31 #include "mojo/public/cpp/bindings/strong_binding.h" | 32 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 32 #include "services/service_manager/public/cpp/interface_provider.h" | 33 #include "services/service_manager/public/cpp/interface_provider.h" |
| 33 #include "services/service_manager/public/cpp/interface_registry.h" | 34 #include "services/service_manager/public/cpp/interface_registry.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
| 35 | 36 |
| 36 namespace content { | 37 namespace content { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 63 explicit MockEmbeddedWorkerSetup( | 64 explicit MockEmbeddedWorkerSetup( |
| 64 const base::WeakPtr<EmbeddedWorkerTestHelper>& helper) | 65 const base::WeakPtr<EmbeddedWorkerTestHelper>& helper) |
| 65 : helper_(helper) {} | 66 : helper_(helper) {} |
| 66 | 67 |
| 67 static void Create(const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, | 68 static void Create(const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, |
| 68 mojom::EmbeddedWorkerSetupRequest request) { | 69 mojom::EmbeddedWorkerSetupRequest request) { |
| 69 mojo::MakeStrongBinding(base::MakeUnique<MockEmbeddedWorkerSetup>(helper), | 70 mojo::MakeStrongBinding(base::MakeUnique<MockEmbeddedWorkerSetup>(helper), |
| 70 std::move(request)); | 71 std::move(request)); |
| 71 } | 72 } |
| 72 | 73 |
| 73 void ExchangeInterfaceProviders( | 74 void AttachServiceWorkerEventDispatcher( |
| 74 int32_t thread_id, | 75 int32_t thread_id, |
| 75 service_manager::mojom::InterfaceProviderRequest request, | 76 mojom::ServiceWorkerEventDispatcherRequest request) override { |
| 76 service_manager::mojom::InterfaceProviderPtr remote_interfaces) override { | |
| 77 if (!helper_) | 77 if (!helper_) |
| 78 return; | 78 return; |
| 79 helper_->OnSetupMojoStub(thread_id, std::move(request), | 79 helper_->OnSetupMojo(thread_id, std::move(request)); |
| 80 std::move(remote_interfaces)); | |
| 81 } | 80 } |
| 82 | 81 |
| 83 private: | 82 private: |
| 84 base::WeakPtr<EmbeddedWorkerTestHelper> helper_; | 83 base::WeakPtr<EmbeddedWorkerTestHelper> helper_; |
| 85 }; | 84 }; |
| 86 | 85 |
| 87 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: | 86 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: |
| 88 MockEmbeddedWorkerInstanceClient( | 87 MockEmbeddedWorkerInstanceClient( |
| 89 base::WeakPtr<EmbeddedWorkerTestHelper> helper) | 88 base::WeakPtr<EmbeddedWorkerTestHelper> helper) |
| 90 : helper_(helper), binding_(this) {} | 89 : helper_(helper), binding_(this) {} |
| 91 | 90 |
| 92 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: | 91 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: |
| 93 ~MockEmbeddedWorkerInstanceClient() {} | 92 ~MockEmbeddedWorkerInstanceClient() {} |
| 94 | 93 |
| 95 void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker( | 94 void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker( |
| 96 const EmbeddedWorkerStartParams& params, | 95 const EmbeddedWorkerStartParams& params, |
| 97 service_manager::mojom::InterfaceProviderPtr browser_interfaces, | 96 mojom::ServiceWorkerEventDispatcherRequest dispatcher_request) { |
| 98 service_manager::mojom::InterfaceProviderRequest renderer_request) { | |
| 99 if (!helper_) | 97 if (!helper_) |
| 100 return; | 98 return; |
| 101 | 99 |
| 102 embedded_worker_id_ = params.embedded_worker_id; | 100 embedded_worker_id_ = params.embedded_worker_id; |
| 103 | 101 |
| 104 EmbeddedWorkerInstance* worker = | 102 EmbeddedWorkerInstance* worker = |
| 105 helper_->registry()->GetWorker(params.embedded_worker_id); | 103 helper_->registry()->GetWorker(params.embedded_worker_id); |
| 106 ASSERT_TRUE(worker != NULL); | 104 ASSERT_TRUE(worker != NULL); |
| 107 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); | 105 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); |
| 108 | 106 |
| 109 base::ThreadTaskRunnerHandle::Get()->PostTask( | 107 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 110 FROM_HERE, | 108 FROM_HERE, |
| 111 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, helper_->AsWeakPtr(), | 109 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, helper_->AsWeakPtr(), |
| 112 params.embedded_worker_id, params.service_worker_version_id, | 110 params.embedded_worker_id, params.service_worker_version_id, |
| 113 params.scope, params.script_url, params.pause_after_download)); | 111 params.scope, params.script_url, params.pause_after_download)); |
| 114 base::ThreadTaskRunnerHandle::Get()->PostTask( | 112 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 115 FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnSetupMojoStub, | 113 FROM_HERE, |
| 116 helper_->AsWeakPtr(), worker->thread_id(), | 114 base::Bind(&EmbeddedWorkerTestHelper::OnSetupMojo, helper_->AsWeakPtr(), |
| 117 base::Passed(&renderer_request), | 115 worker->thread_id(), base::Passed(&dispatcher_request))); |
| 118 base::Passed(&browser_interfaces))); | |
| 119 } | 116 } |
| 120 | 117 |
| 121 void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StopWorker( | 118 void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StopWorker( |
| 122 const StopWorkerCallback& callback) { | 119 const StopWorkerCallback& callback) { |
| 123 if (!helper_) | 120 if (!helper_) |
| 124 return; | 121 return; |
| 125 | 122 |
| 126 ASSERT_TRUE(embedded_worker_id_); | 123 ASSERT_TRUE(embedded_worker_id_); |
| 127 EmbeddedWorkerInstance* worker = | 124 EmbeddedWorkerInstance* worker = |
| 128 helper_->registry()->GetWorker(embedded_worker_id_.value()); | 125 helper_->registry()->GetWorker(embedded_worker_id_.value()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 147 base::MakeUnique<MockEmbeddedWorkerInstanceClient>(helper)); | 144 base::MakeUnique<MockEmbeddedWorkerInstanceClient>(helper)); |
| 148 } | 145 } |
| 149 | 146 |
| 150 std::unique_ptr<MockEmbeddedWorkerInstanceClient>& client = | 147 std::unique_ptr<MockEmbeddedWorkerInstanceClient>& client = |
| 151 clients->at(next_client_index); | 148 clients->at(next_client_index); |
| 152 helper->mock_instance_clients_next_index_ = next_client_index + 1; | 149 helper->mock_instance_clients_next_index_ = next_client_index + 1; |
| 153 if (client) | 150 if (client) |
| 154 client->binding_.Bind(std::move(request)); | 151 client->binding_.Bind(std::move(request)); |
| 155 } | 152 } |
| 156 | 153 |
| 157 class EmbeddedWorkerTestHelper::MockFetchEventDispatcher | 154 class EmbeddedWorkerTestHelper::MockServiceWorkerEventDispatcher |
| 158 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { | 155 : public NON_EXPORTED_BASE(mojom::ServiceWorkerEventDispatcher) { |
| 159 public: | 156 public: |
| 160 static void Create(const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, | 157 static void Create(const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, |
| 161 int thread_id, | 158 int thread_id, |
| 162 mojom::FetchEventDispatcherRequest request) { | 159 mojom::ServiceWorkerEventDispatcherRequest request) { |
| 163 mojo::MakeStrongBinding( | 160 mojo::MakeStrongBinding( |
| 164 base::MakeUnique<MockFetchEventDispatcher>(helper, thread_id), | 161 base::MakeUnique<MockServiceWorkerEventDispatcher>(helper, thread_id), |
| 165 std::move(request)); | 162 std::move(request)); |
| 166 } | 163 } |
| 167 | 164 |
| 168 MockFetchEventDispatcher( | 165 MockServiceWorkerEventDispatcher( |
| 169 const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, | 166 const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, |
| 170 int thread_id) | 167 int thread_id) |
| 171 : helper_(helper), thread_id_(thread_id) {} | 168 : helper_(helper), thread_id_(thread_id) {} |
| 172 | 169 |
| 173 ~MockFetchEventDispatcher() override {} | 170 ~MockServiceWorkerEventDispatcher() override {} |
| 174 | 171 |
| 175 void DispatchFetchEvent(int fetch_event_id, | 172 void DispatchFetchEvent(int fetch_event_id, |
| 176 const ServiceWorkerFetchRequest& request, | 173 const ServiceWorkerFetchRequest& request, |
| 177 mojom::FetchEventPreloadHandlePtr preload_handle, | 174 mojom::FetchEventPreloadHandlePtr preload_handle, |
| 178 const DispatchFetchEventCallback& callback) override { | 175 const DispatchFetchEventCallback& callback) override { |
| 179 if (!helper_) | 176 if (!helper_) |
| 180 return; | 177 return; |
| 181 helper_->OnFetchEventStub(thread_id_, fetch_event_id, request, | 178 helper_->OnFetchEventStub(thread_id_, fetch_event_id, request, |
| 182 std::move(preload_handle), callback); | 179 std::move(preload_handle), callback); |
| 183 } | 180 } |
| 184 | 181 |
| 182 void DispatchSyncEvent( |
| 183 const std::string& tag, |
| 184 blink::mojom::BackgroundSyncEventLastChance last_chance, |
| 185 const DispatchSyncEventCallback& callback) override { |
| 186 NOTIMPLEMENTED(); |
| 187 } |
| 188 |
| 185 private: | 189 private: |
| 186 base::WeakPtr<EmbeddedWorkerTestHelper> helper_; | 190 base::WeakPtr<EmbeddedWorkerTestHelper> helper_; |
| 187 const int thread_id_; | 191 const int thread_id_; |
| 188 }; | 192 }; |
| 189 | 193 |
| 190 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( | 194 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( |
| 191 const base::FilePath& user_data_directory) | 195 const base::FilePath& user_data_directory) |
| 192 : browser_context_(new TestBrowserContext), | 196 : browser_context_(new TestBrowserContext), |
| 193 render_process_host_(new MockRenderProcessHost(browser_context_.get())), | 197 render_process_host_(new MockRenderProcessHost(browser_context_.get())), |
| 194 new_render_process_host_( | 198 new_render_process_host_( |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEventStub) | 310 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEventStub) |
| 307 IPC_MESSAGE_UNHANDLED(handled = false) | 311 IPC_MESSAGE_UNHANDLED(handled = false) |
| 308 IPC_END_MESSAGE_MAP() | 312 IPC_END_MESSAGE_MAP() |
| 309 // Record all messages directed to inner script context. | 313 // Record all messages directed to inner script context. |
| 310 inner_sink_.OnMessageReceived(message); | 314 inner_sink_.OnMessageReceived(message); |
| 311 return handled; | 315 return handled; |
| 312 } | 316 } |
| 313 | 317 |
| 314 void EmbeddedWorkerTestHelper::OnSetupMojo( | 318 void EmbeddedWorkerTestHelper::OnSetupMojo( |
| 315 int thread_id, | 319 int thread_id, |
| 316 service_manager::InterfaceRegistry* interface_registry) { | 320 mojom::ServiceWorkerEventDispatcherRequest dispatcher_request) { |
| 317 interface_registry->AddInterface(base::Bind(&MockFetchEventDispatcher::Create, | 321 MockServiceWorkerEventDispatcher::Create(AsWeakPtr(), thread_id, |
| 318 weak_factory_.GetWeakPtr(), | 322 std::move(dispatcher_request)); |
| 319 thread_id)); | |
| 320 } | 323 } |
| 321 | 324 |
| 322 void EmbeddedWorkerTestHelper::OnActivateEvent(int embedded_worker_id, | 325 void EmbeddedWorkerTestHelper::OnActivateEvent(int embedded_worker_id, |
| 323 int request_id) { | 326 int request_id) { |
| 324 SimulateSend(new ServiceWorkerHostMsg_ActivateEventFinished( | 327 SimulateSend(new ServiceWorkerHostMsg_ActivateEventFinished( |
| 325 embedded_worker_id, request_id, | 328 embedded_worker_id, request_id, |
| 326 blink::WebServiceWorkerEventResultCompleted, base::Time::Now())); | 329 blink::WebServiceWorkerEventResultCompleted, base::Time::Now())); |
| 327 } | 330 } |
| 328 | 331 |
| 329 void EmbeddedWorkerTestHelper::OnExtendableMessageEvent(int embedded_worker_id, | 332 void EmbeddedWorkerTestHelper::OnExtendableMessageEvent(int embedded_worker_id, |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 } | 522 } |
| 520 | 523 |
| 521 void EmbeddedWorkerTestHelper::OnPushEventStub( | 524 void EmbeddedWorkerTestHelper::OnPushEventStub( |
| 522 int request_id, | 525 int request_id, |
| 523 const PushEventPayload& payload) { | 526 const PushEventPayload& payload) { |
| 524 base::ThreadTaskRunnerHandle::Get()->PostTask( | 527 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 525 FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnPushEvent, AsWeakPtr(), | 528 FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnPushEvent, AsWeakPtr(), |
| 526 current_embedded_worker_id_, request_id, payload)); | 529 current_embedded_worker_id_, request_id, payload)); |
| 527 } | 530 } |
| 528 | 531 |
| 529 void EmbeddedWorkerTestHelper::OnSetupMojoStub( | |
| 530 int thread_id, | |
| 531 service_manager::mojom::InterfaceProviderRequest request, | |
| 532 service_manager::mojom::InterfaceProviderPtr remote_interfaces) { | |
| 533 auto local = | |
| 534 base::MakeUnique<service_manager::InterfaceRegistry>(std::string()); | |
| 535 local->Bind(std::move(request), service_manager::Identity(), | |
| 536 service_manager::InterfaceProviderSpec(), | |
| 537 service_manager::Identity(), | |
| 538 service_manager::InterfaceProviderSpec()); | |
| 539 | |
| 540 std::unique_ptr<service_manager::InterfaceProvider> remote( | |
| 541 new service_manager::InterfaceProvider); | |
| 542 remote->Bind(std::move(remote_interfaces)); | |
| 543 | |
| 544 OnSetupMojo(thread_id, local.get()); | |
| 545 InterfaceRegistryAndProvider pair(std::move(local), std::move(remote)); | |
| 546 thread_id_service_registry_map_[thread_id] = std::move(pair); | |
| 547 } | |
| 548 | |
| 549 EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() { | 532 EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() { |
| 550 DCHECK(context()); | 533 DCHECK(context()); |
| 551 return context()->embedded_worker_registry(); | 534 return context()->embedded_worker_registry(); |
| 552 } | 535 } |
| 553 | 536 |
| 554 MessagePortMessageFilter* | 537 MessagePortMessageFilter* |
| 555 EmbeddedWorkerTestHelper::NewMessagePortMessageFilter() { | 538 EmbeddedWorkerTestHelper::NewMessagePortMessageFilter() { |
| 556 scoped_refptr<MessagePortMessageFilter> filter( | 539 scoped_refptr<MessagePortMessageFilter> filter( |
| 557 new MockMessagePortMessageFilter); | 540 new MockMessagePortMessageFilter); |
| 558 message_port_message_filters_.push_back(filter); | 541 message_port_message_filters_.push_back(filter); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 575 service_manager::InterfaceProviderSpec()); | 558 service_manager::InterfaceProviderSpec()); |
| 576 | 559 |
| 577 std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces( | 560 std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces( |
| 578 new service_manager::InterfaceProvider); | 561 new service_manager::InterfaceProvider); |
| 579 remote_interfaces->Bind(std::move(interfaces)); | 562 remote_interfaces->Bind(std::move(interfaces)); |
| 580 rph->SetRemoteInterfaces(std::move(remote_interfaces)); | 563 rph->SetRemoteInterfaces(std::move(remote_interfaces)); |
| 581 return registry; | 564 return registry; |
| 582 } | 565 } |
| 583 | 566 |
| 584 } // namespace content | 567 } // namespace content |
| OLD | NEW |