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 |