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/embedded_worker_instance.h" | 5 #include "content/browser/service_worker/embedded_worker_instance.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 26 matching lines...) Expand all Loading... |
37 | 37 |
38 void SaveStatusAndCall(ServiceWorkerStatusCode* out, | 38 void SaveStatusAndCall(ServiceWorkerStatusCode* out, |
39 const base::Closure& callback, | 39 const base::Closure& callback, |
40 ServiceWorkerStatusCode status) { | 40 ServiceWorkerStatusCode status) { |
41 *out = status; | 41 *out = status; |
42 callback.Run(); | 42 callback.Run(); |
43 } | 43 } |
44 | 44 |
45 } // namespace | 45 } // namespace |
46 | 46 |
| 47 class ProviderHostEndpoints : public mojom::ServiceWorkerProviderHost { |
| 48 public: |
| 49 ProviderHostEndpoints() : binding_(this) {} |
| 50 |
| 51 ~ProviderHostEndpoints() override {} |
| 52 |
| 53 mojom::ServiceWorkerProviderClientInfoPtr CreateProviderClientInfoPtr() { |
| 54 DCHECK(!binding_.is_bound()); |
| 55 DCHECK(!client_.is_bound()); |
| 56 // Just keep the endpoints. |
| 57 mojom::ServiceWorkerProviderClientInfoPtr provider_client_info = |
| 58 mojom::ServiceWorkerProviderClientInfo::New(); |
| 59 binding_.Bind(mojo::MakeRequest(&provider_client_info->host_ptr_info)); |
| 60 provider_client_info->client_request = mojo::MakeRequest(&client_); |
| 61 return provider_client_info; |
| 62 } |
| 63 |
| 64 private: |
| 65 mojom::ServiceWorkerProviderAssociatedPtr client_; |
| 66 mojo::AssociatedBinding<mojom::ServiceWorkerProviderHost> binding_; |
| 67 |
| 68 DISALLOW_COPY_AND_ASSIGN(ProviderHostEndpoints); |
| 69 }; |
| 70 |
47 class EmbeddedWorkerInstanceTest : public testing::Test, | 71 class EmbeddedWorkerInstanceTest : public testing::Test, |
48 public EmbeddedWorkerInstance::Listener { | 72 public EmbeddedWorkerInstance::Listener { |
49 protected: | 73 protected: |
50 EmbeddedWorkerInstanceTest() | 74 EmbeddedWorkerInstanceTest() |
51 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} | 75 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} |
52 | 76 |
53 enum EventType { | 77 enum EventType { |
54 PROCESS_ALLOCATED, | 78 PROCESS_ALLOCATED, |
55 START_WORKER_MESSAGE_SENT, | 79 START_WORKER_MESSAGE_SENT, |
56 STARTED, | 80 STARTED, |
(...skipping 18 matching lines...) Expand all Loading... |
75 RecordEvent(START_WORKER_MESSAGE_SENT); | 99 RecordEvent(START_WORKER_MESSAGE_SENT); |
76 } | 100 } |
77 void OnStarted() override { RecordEvent(STARTED); } | 101 void OnStarted() override { RecordEvent(STARTED); } |
78 void OnStopped(EmbeddedWorkerStatus old_status) override { | 102 void OnStopped(EmbeddedWorkerStatus old_status) override { |
79 RecordEvent(STOPPED, old_status); | 103 RecordEvent(STOPPED, old_status); |
80 } | 104 } |
81 void OnDetached(EmbeddedWorkerStatus old_status) override { | 105 void OnDetached(EmbeddedWorkerStatus old_status) override { |
82 RecordEvent(DETACHED, old_status); | 106 RecordEvent(DETACHED, old_status); |
83 } | 107 } |
84 | 108 |
85 bool OnMessageReceived(const IPC::Message& message) override { return false; } | 109 bool OnMessageReceived(const IPC::Message&) override { return false; } |
86 | 110 |
87 void SetUp() override { | 111 void SetUp() override { |
88 helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath())); | 112 helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath())); |
89 } | 113 } |
90 | 114 |
91 void TearDown() override { helper_.reset(); } | 115 void TearDown() override { helper_.reset(); } |
92 | 116 |
93 ServiceWorkerStatusCode StartWorker(EmbeddedWorkerInstance* worker, | 117 ServiceWorkerStatusCode StartWorker(EmbeddedWorkerInstance* worker, |
94 int id, const GURL& pattern, | 118 int id, const GURL& pattern, |
95 const GURL& url) { | 119 const GURL& url) { |
96 ServiceWorkerStatusCode status; | 120 ServiceWorkerStatusCode status; |
97 base::RunLoop run_loop; | 121 base::RunLoop run_loop; |
98 std::unique_ptr<EmbeddedWorkerStartParams> params = | 122 std::unique_ptr<EmbeddedWorkerStartParams> params = |
99 CreateStartParams(id, pattern, url); | 123 CreateStartParams(id, pattern, url); |
100 worker->Start( | 124 worker->Start( |
101 std::move(params), CreateEventDispatcher(), | 125 std::move(params), CreateProviderClientInfoGetter(), |
| 126 CreateEventDispatcher(), |
102 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 127 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
103 run_loop.Run(); | 128 run_loop.Run(); |
104 return status; | 129 return status; |
105 } | 130 } |
106 | 131 |
107 std::unique_ptr<EmbeddedWorkerStartParams> | 132 std::unique_ptr<EmbeddedWorkerStartParams> |
108 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) { | 133 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) { |
109 std::unique_ptr<EmbeddedWorkerStartParams> params = | 134 std::unique_ptr<EmbeddedWorkerStartParams> params = |
110 base::MakeUnique<EmbeddedWorkerStartParams>(); | 135 base::MakeUnique<EmbeddedWorkerStartParams>(); |
111 params->service_worker_version_id = version_id; | 136 params->service_worker_version_id = version_id; |
112 params->scope = scope; | 137 params->scope = scope; |
113 params->script_url = script_url; | 138 params->script_url = script_url; |
114 params->pause_after_download = false; | 139 params->pause_after_download = false; |
115 params->is_installed = false; | 140 params->is_installed = false; |
116 return params; | 141 return params; |
117 } | 142 } |
118 | 143 |
| 144 mojom::ServiceWorkerProviderClientInfoPtr CreateProviderClientInfo( |
| 145 int /* process_id */) { |
| 146 provider_host_endpoints_.emplace_back( |
| 147 base::MakeUnique<ProviderHostEndpoints>()); |
| 148 return provider_host_endpoints_.back()->CreateProviderClientInfoPtr(); |
| 149 } |
| 150 |
| 151 EmbeddedWorkerInstance::ProviderClientInfoGetter |
| 152 CreateProviderClientInfoGetter() { |
| 153 return base::BindOnce(&EmbeddedWorkerInstanceTest::CreateProviderClientInfo, |
| 154 base::Unretained(this)); |
| 155 } |
| 156 |
119 mojom::ServiceWorkerEventDispatcherRequest CreateEventDispatcher() { | 157 mojom::ServiceWorkerEventDispatcherRequest CreateEventDispatcher() { |
120 dispatchers_.emplace_back(); | 158 dispatchers_.emplace_back(); |
121 return mojo::MakeRequest(&dispatchers_.back()); | 159 return mojo::MakeRequest(&dispatchers_.back()); |
122 } | 160 } |
123 | 161 |
124 ServiceWorkerContextCore* context() { return helper_->context(); } | 162 ServiceWorkerContextCore* context() { return helper_->context(); } |
125 | 163 |
126 EmbeddedWorkerRegistry* embedded_worker_registry() { | 164 EmbeddedWorkerRegistry* embedded_worker_registry() { |
127 DCHECK(context()); | 165 DCHECK(context()); |
128 return context()->embedded_worker_registry(); | 166 return context()->embedded_worker_registry(); |
129 } | 167 } |
130 | 168 |
131 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } | 169 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } |
132 | 170 |
133 std::vector<std::unique_ptr< | 171 std::vector<std::unique_ptr< |
134 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>* | 172 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>* |
135 mock_instance_clients() { | 173 mock_instance_clients() { |
136 return helper_->mock_instance_clients(); | 174 return helper_->mock_instance_clients(); |
137 } | 175 } |
138 | 176 |
139 std::vector<mojom::ServiceWorkerEventDispatcherPtr> dispatchers_; | 177 std::vector<mojom::ServiceWorkerEventDispatcherPtr> dispatchers_; |
| 178 std::vector<std::unique_ptr<ProviderHostEndpoints>> provider_host_endpoints_; |
140 | 179 |
141 TestBrowserThreadBundle thread_bundle_; | 180 TestBrowserThreadBundle thread_bundle_; |
142 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; | 181 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
143 std::vector<EventLog> events_; | 182 std::vector<EventLog> events_; |
144 | 183 |
145 private: | 184 private: |
146 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); | 185 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); |
147 }; | 186 }; |
148 | 187 |
149 // A helper to simulate the start worker sequence is stalled in a worker | 188 // A helper to simulate the start worker sequence is stalled in a worker |
150 // process. | 189 // process. |
151 class StalledInStartWorkerHelper : public EmbeddedWorkerTestHelper { | 190 class StalledInStartWorkerHelper : public EmbeddedWorkerTestHelper { |
152 public: | 191 public: |
153 StalledInStartWorkerHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} | 192 StalledInStartWorkerHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} |
154 ~StalledInStartWorkerHelper() override {} | 193 ~StalledInStartWorkerHelper() override {} |
155 | 194 |
156 void OnStartWorker(int embedded_worker_id, | 195 void OnStartWorker( |
157 int64_t service_worker_version_id, | 196 int embedded_worker_id, |
158 const GURL& scope, | 197 int64_t service_worker_version_id, |
159 const GURL& script_url, | 198 const GURL& scope, |
160 bool pause_after_download, | 199 const GURL& script_url, |
161 mojom::ServiceWorkerEventDispatcherRequest request, | 200 bool pause_after_download, |
162 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo | 201 mojom::ServiceWorkerEventDispatcherRequest request, |
163 instance_host) override { | 202 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host, |
| 203 mojom::ServiceWorkerProviderClientInfoPtr provider_client_info) override { |
164 if (force_stall_in_start_) { | 204 if (force_stall_in_start_) { |
165 // Prepare for OnStopWorker(). | 205 // Prepare for OnStopWorker(). |
166 instance_host_ptr_map_[embedded_worker_id].Bind(std::move(instance_host)); | 206 instance_host_ptr_map_[embedded_worker_id].Bind(std::move(instance_host)); |
167 // Do nothing to simulate a stall in the worker process. | 207 // Do nothing to simulate a stall in the worker process. |
168 return; | 208 return; |
169 } | 209 } |
170 EmbeddedWorkerTestHelper::OnStartWorker( | 210 EmbeddedWorkerTestHelper::OnStartWorker( |
171 embedded_worker_id, service_worker_version_id, scope, script_url, | 211 embedded_worker_id, service_worker_version_id, scope, script_url, |
172 pause_after_download, std::move(request), std::move(instance_host)); | 212 pause_after_download, std::move(request), std::move(instance_host), |
| 213 std::move(provider_client_info)); |
173 } | 214 } |
174 | 215 |
175 void OnStopWorker(int embedded_worker_id) override { | 216 void OnStopWorker(int embedded_worker_id) override { |
176 if (instance_host_ptr_map_[embedded_worker_id]) { | 217 if (instance_host_ptr_map_[embedded_worker_id]) { |
177 instance_host_ptr_map_[embedded_worker_id]->OnStopped(); | 218 instance_host_ptr_map_[embedded_worker_id]->OnStopped(); |
178 base::RunLoop().RunUntilIdle(); | 219 base::RunLoop().RunUntilIdle(); |
179 return; | 220 return; |
180 } | 221 } |
181 EmbeddedWorkerTestHelper::OnStopWorker(embedded_worker_id); | 222 EmbeddedWorkerTestHelper::OnStopWorker(embedded_worker_id); |
182 } | 223 } |
(...skipping 24 matching lines...) Expand all Loading... |
207 // Simulate adding one process to the pattern. | 248 // Simulate adding one process to the pattern. |
208 helper_->SimulateAddProcessToPattern(pattern, | 249 helper_->SimulateAddProcessToPattern(pattern, |
209 helper_->mock_render_process_id()); | 250 helper_->mock_render_process_id()); |
210 | 251 |
211 // Start should succeed. | 252 // Start should succeed. |
212 ServiceWorkerStatusCode status; | 253 ServiceWorkerStatusCode status; |
213 base::RunLoop run_loop; | 254 base::RunLoop run_loop; |
214 std::unique_ptr<EmbeddedWorkerStartParams> params = | 255 std::unique_ptr<EmbeddedWorkerStartParams> params = |
215 CreateStartParams(service_worker_version_id, pattern, url); | 256 CreateStartParams(service_worker_version_id, pattern, url); |
216 worker->Start( | 257 worker->Start( |
217 std::move(params), CreateEventDispatcher(), | 258 std::move(params), CreateProviderClientInfoGetter(), |
| 259 CreateEventDispatcher(), |
218 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 260 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
219 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); | 261 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); |
220 run_loop.Run(); | 262 run_loop.Run(); |
221 EXPECT_EQ(SERVICE_WORKER_OK, status); | 263 EXPECT_EQ(SERVICE_WORKER_OK, status); |
222 | 264 |
223 // The 'WorkerStarted' message should have been sent by | 265 // The 'WorkerStarted' message should have been sent by |
224 // EmbeddedWorkerTestHelper. | 266 // EmbeddedWorkerTestHelper. |
225 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); | 267 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
226 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); | 268 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); |
227 | 269 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 helper_->SimulateAddProcessToPattern(pattern, | 306 helper_->SimulateAddProcessToPattern(pattern, |
265 helper_->new_render_process_id()); | 307 helper_->new_render_process_id()); |
266 | 308 |
267 { | 309 { |
268 // Start once normally. | 310 // Start once normally. |
269 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 311 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
270 base::RunLoop run_loop; | 312 base::RunLoop run_loop; |
271 std::unique_ptr<EmbeddedWorkerStartParams> params = | 313 std::unique_ptr<EmbeddedWorkerStartParams> params = |
272 CreateStartParams(service_worker_version_id, pattern, url); | 314 CreateStartParams(service_worker_version_id, pattern, url); |
273 worker->Start( | 315 worker->Start( |
274 std::move(params), CreateEventDispatcher(), | 316 std::move(params), CreateProviderClientInfoGetter(), |
| 317 CreateEventDispatcher(), |
275 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 318 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
276 run_loop.Run(); | 319 run_loop.Run(); |
277 EXPECT_EQ(SERVICE_WORKER_OK, status); | 320 EXPECT_EQ(SERVICE_WORKER_OK, status); |
278 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); | 321 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
279 // The worker should be using the default render process. | 322 // The worker should be using the default render process. |
280 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); | 323 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); |
281 | 324 |
282 EXPECT_TRUE(worker->Stop()); | 325 EXPECT_TRUE(worker->Stop()); |
283 base::RunLoop().RunUntilIdle(); | 326 base::RunLoop().RunUntilIdle(); |
284 } | 327 } |
285 | 328 |
286 // Fail twice. | 329 // Fail twice. |
287 context()->UpdateVersionFailureCount(service_worker_version_id, | 330 context()->UpdateVersionFailureCount(service_worker_version_id, |
288 SERVICE_WORKER_ERROR_FAILED); | 331 SERVICE_WORKER_ERROR_FAILED); |
289 context()->UpdateVersionFailureCount(service_worker_version_id, | 332 context()->UpdateVersionFailureCount(service_worker_version_id, |
290 SERVICE_WORKER_ERROR_FAILED); | 333 SERVICE_WORKER_ERROR_FAILED); |
291 | 334 |
292 { | 335 { |
293 // Start again. | 336 // Start again. |
294 ServiceWorkerStatusCode status; | 337 ServiceWorkerStatusCode status; |
295 base::RunLoop run_loop; | 338 base::RunLoop run_loop; |
296 std::unique_ptr<EmbeddedWorkerStartParams> params = | 339 std::unique_ptr<EmbeddedWorkerStartParams> params = |
297 CreateStartParams(service_worker_version_id, pattern, url); | 340 CreateStartParams(service_worker_version_id, pattern, url); |
298 worker->Start( | 341 worker->Start( |
299 std::move(params), CreateEventDispatcher(), | 342 std::move(params), CreateProviderClientInfoGetter(), |
| 343 CreateEventDispatcher(), |
300 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 344 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
301 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); | 345 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); |
302 run_loop.Run(); | 346 run_loop.Run(); |
303 EXPECT_EQ(SERVICE_WORKER_OK, status); | 347 EXPECT_EQ(SERVICE_WORKER_OK, status); |
304 | 348 |
305 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); | 349 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
306 // The worker should be using the new render process. | 350 // The worker should be using the new render process. |
307 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); | 351 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); |
308 EXPECT_TRUE(worker->Stop()); | 352 EXPECT_TRUE(worker->Stop()); |
309 base::RunLoop().RunUntilIdle(); | 353 base::RunLoop().RunUntilIdle(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 int process_id = helper_->mock_render_process_id(); | 414 int process_id = helper_->mock_render_process_id(); |
371 | 415 |
372 helper_->SimulateAddProcessToPattern(pattern, process_id); | 416 helper_->SimulateAddProcessToPattern(pattern, process_id); |
373 { | 417 { |
374 // Start worker1. | 418 // Start worker1. |
375 ServiceWorkerStatusCode status; | 419 ServiceWorkerStatusCode status; |
376 base::RunLoop run_loop; | 420 base::RunLoop run_loop; |
377 std::unique_ptr<EmbeddedWorkerStartParams> params = | 421 std::unique_ptr<EmbeddedWorkerStartParams> params = |
378 CreateStartParams(version_id1, pattern, url); | 422 CreateStartParams(version_id1, pattern, url); |
379 worker1->Start( | 423 worker1->Start( |
380 std::move(params), CreateEventDispatcher(), | 424 std::move(params), CreateProviderClientInfoGetter(), |
| 425 CreateEventDispatcher(), |
381 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 426 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
382 run_loop.Run(); | 427 run_loop.Run(); |
383 EXPECT_EQ(SERVICE_WORKER_OK, status); | 428 EXPECT_EQ(SERVICE_WORKER_OK, status); |
384 } | 429 } |
385 | 430 |
386 { | 431 { |
387 // Start worker2. | 432 // Start worker2. |
388 ServiceWorkerStatusCode status; | 433 ServiceWorkerStatusCode status; |
389 base::RunLoop run_loop; | 434 base::RunLoop run_loop; |
390 std::unique_ptr<EmbeddedWorkerStartParams> params = | 435 std::unique_ptr<EmbeddedWorkerStartParams> params = |
391 CreateStartParams(version_id2, pattern, url); | 436 CreateStartParams(version_id2, pattern, url); |
392 worker2->Start( | 437 worker2->Start( |
393 std::move(params), CreateEventDispatcher(), | 438 std::move(params), CreateProviderClientInfoGetter(), |
| 439 CreateEventDispatcher(), |
394 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 440 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
395 run_loop.Run(); | 441 run_loop.Run(); |
396 EXPECT_EQ(SERVICE_WORKER_OK, status); | 442 EXPECT_EQ(SERVICE_WORKER_OK, status); |
397 } | 443 } |
398 | 444 |
399 // The two workers share the same process. | 445 // The two workers share the same process. |
400 EXPECT_EQ(worker1->process_id(), worker2->process_id()); | 446 EXPECT_EQ(worker1->process_id(), worker2->process_id()); |
401 | 447 |
402 // Destroy worker1. It removes itself from the registry. | 448 // Destroy worker1. It removes itself from the registry. |
403 int worker1_id = worker1->embedded_worker_id(); | 449 int worker1_id = worker1->embedded_worker_id(); |
(...skipping 17 matching lines...) Expand all Loading... |
421 | 467 |
422 std::unique_ptr<EmbeddedWorkerInstance> worker = | 468 std::unique_ptr<EmbeddedWorkerInstance> worker = |
423 embedded_worker_registry()->CreateWorker(); | 469 embedded_worker_registry()->CreateWorker(); |
424 worker->AddListener(this); | 470 worker->AddListener(this); |
425 | 471 |
426 // Run the start worker sequence and detach during process allocation. | 472 // Run the start worker sequence and detach during process allocation. |
427 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 473 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
428 std::unique_ptr<EmbeddedWorkerStartParams> params = | 474 std::unique_ptr<EmbeddedWorkerStartParams> params = |
429 CreateStartParams(version_id, scope, url); | 475 CreateStartParams(version_id, scope, url); |
430 worker->Start( | 476 worker->Start( |
431 std::move(params), CreateEventDispatcher(), | 477 std::move(params), CreateProviderClientInfoGetter(), |
| 478 CreateEventDispatcher(), |
432 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); | 479 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); |
433 worker->Detach(); | 480 worker->Detach(); |
434 base::RunLoop().RunUntilIdle(); | 481 base::RunLoop().RunUntilIdle(); |
435 | 482 |
436 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 483 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
437 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); | 484 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); |
438 | 485 |
439 // The start callback should not be aborted by detach (see a comment on the | 486 // The start callback should not be aborted by detach (see a comment on the |
440 // dtor of EmbeddedWorkerInstance::StartTask). | 487 // dtor of EmbeddedWorkerInstance::StartTask). |
441 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); | 488 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); |
(...skipping 12 matching lines...) Expand all Loading... |
454 helper_.reset(new StalledInStartWorkerHelper()); | 501 helper_.reset(new StalledInStartWorkerHelper()); |
455 std::unique_ptr<EmbeddedWorkerInstance> worker = | 502 std::unique_ptr<EmbeddedWorkerInstance> worker = |
456 embedded_worker_registry()->CreateWorker(); | 503 embedded_worker_registry()->CreateWorker(); |
457 worker->AddListener(this); | 504 worker->AddListener(this); |
458 | 505 |
459 // Run the start worker sequence until a start worker message is sent. | 506 // Run the start worker sequence until a start worker message is sent. |
460 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 507 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
461 std::unique_ptr<EmbeddedWorkerStartParams> params = | 508 std::unique_ptr<EmbeddedWorkerStartParams> params = |
462 CreateStartParams(version_id, scope, url); | 509 CreateStartParams(version_id, scope, url); |
463 worker->Start( | 510 worker->Start( |
464 std::move(params), CreateEventDispatcher(), | 511 std::move(params), CreateProviderClientInfoGetter(), |
| 512 CreateEventDispatcher(), |
465 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); | 513 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); |
466 base::RunLoop().RunUntilIdle(); | 514 base::RunLoop().RunUntilIdle(); |
467 | 515 |
468 ASSERT_EQ(2u, events_.size()); | 516 ASSERT_EQ(2u, events_.size()); |
469 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 517 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
470 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 518 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
471 events_.clear(); | 519 events_.clear(); |
472 | 520 |
473 worker->Detach(); | 521 worker->Detach(); |
474 base::RunLoop().RunUntilIdle(); | 522 base::RunLoop().RunUntilIdle(); |
(...skipping 19 matching lines...) Expand all Loading... |
494 std::unique_ptr<EmbeddedWorkerInstance> worker = | 542 std::unique_ptr<EmbeddedWorkerInstance> worker = |
495 embedded_worker_registry()->CreateWorker(); | 543 embedded_worker_registry()->CreateWorker(); |
496 worker->AddListener(this); | 544 worker->AddListener(this); |
497 | 545 |
498 // Stop the start worker sequence before a process is allocated. | 546 // Stop the start worker sequence before a process is allocated. |
499 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 547 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
500 | 548 |
501 std::unique_ptr<EmbeddedWorkerStartParams> params = | 549 std::unique_ptr<EmbeddedWorkerStartParams> params = |
502 CreateStartParams(version_id, scope, url); | 550 CreateStartParams(version_id, scope, url); |
503 worker->Start( | 551 worker->Start( |
504 std::move(params), CreateEventDispatcher(), | 552 std::move(params), CreateProviderClientInfoGetter(), |
| 553 CreateEventDispatcher(), |
505 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); | 554 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); |
506 worker->Stop(); | 555 worker->Stop(); |
507 base::RunLoop().RunUntilIdle(); | 556 base::RunLoop().RunUntilIdle(); |
508 | 557 |
509 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 558 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
510 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); | 559 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); |
511 | 560 |
512 // The start callback should not be aborted by stop (see a comment on the dtor | 561 // The start callback should not be aborted by stop (see a comment on the dtor |
513 // of EmbeddedWorkerInstance::StartTask). | 562 // of EmbeddedWorkerInstance::StartTask). |
514 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); | 563 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); |
515 | 564 |
516 // "PROCESS_ALLOCATED" event should not be recorded. | 565 // "PROCESS_ALLOCATED" event should not be recorded. |
517 ASSERT_EQ(1u, events_.size()); | 566 ASSERT_EQ(1u, events_.size()); |
518 EXPECT_EQ(DETACHED, events_[0].type); | 567 EXPECT_EQ(DETACHED, events_[0].type); |
519 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status); | 568 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status); |
520 events_.clear(); | 569 events_.clear(); |
521 | 570 |
522 // Restart the worker. | 571 // Restart the worker. |
523 status = SERVICE_WORKER_ERROR_MAX_VALUE; | 572 status = SERVICE_WORKER_ERROR_MAX_VALUE; |
524 std::unique_ptr<base::RunLoop> run_loop(new base::RunLoop); | 573 std::unique_ptr<base::RunLoop> run_loop(new base::RunLoop); |
525 params = CreateStartParams(version_id, scope, url); | 574 params = CreateStartParams(version_id, scope, url); |
526 worker->Start( | 575 worker->Start( |
527 std::move(params), CreateEventDispatcher(), | 576 std::move(params), CreateProviderClientInfoGetter(), |
| 577 CreateEventDispatcher(), |
528 base::Bind(&SaveStatusAndCall, &status, run_loop->QuitClosure())); | 578 base::Bind(&SaveStatusAndCall, &status, run_loop->QuitClosure())); |
529 run_loop->Run(); | 579 run_loop->Run(); |
530 | 580 |
531 EXPECT_EQ(SERVICE_WORKER_OK, status); | 581 EXPECT_EQ(SERVICE_WORKER_OK, status); |
532 ASSERT_EQ(3u, events_.size()); | 582 ASSERT_EQ(3u, events_.size()); |
533 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 583 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
534 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 584 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
535 EXPECT_EQ(STARTED, events_[2].type); | 585 EXPECT_EQ(STARTED, events_[2].type); |
536 | 586 |
537 // Tear down the worker. | 587 // Tear down the worker. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 embedded_worker_registry()->CreateWorker(); | 619 embedded_worker_registry()->CreateWorker(); |
570 worker->AddListener(this); | 620 worker->AddListener(this); |
571 | 621 |
572 // Run the start worker sequence until pause after download. | 622 // Run the start worker sequence until pause after download. |
573 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 623 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
574 | 624 |
575 std::unique_ptr<EmbeddedWorkerStartParams> params = | 625 std::unique_ptr<EmbeddedWorkerStartParams> params = |
576 CreateStartParams(version_id, scope, url); | 626 CreateStartParams(version_id, scope, url); |
577 params->pause_after_download = true; | 627 params->pause_after_download = true; |
578 worker->Start( | 628 worker->Start( |
579 std::move(params), CreateEventDispatcher(), | 629 std::move(params), CreateProviderClientInfoGetter(), |
| 630 CreateEventDispatcher(), |
580 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); | 631 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); |
581 base::RunLoop().RunUntilIdle(); | 632 base::RunLoop().RunUntilIdle(); |
582 | 633 |
583 // Make the worker stopping and attempt to send a resume after download | 634 // Make the worker stopping and attempt to send a resume after download |
584 // message. | 635 // message. |
585 worker->Stop(); | 636 worker->Stop(); |
586 worker->ResumeAfterDownload(); | 637 worker->ResumeAfterDownload(); |
587 base::RunLoop().RunUntilIdle(); | 638 base::RunLoop().RunUntilIdle(); |
588 | 639 |
589 // The resume after download message should not have been sent. | 640 // The resume after download message should not have been sent. |
590 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 641 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
591 EXPECT_FALSE(was_resume_after_download_called); | 642 EXPECT_FALSE(was_resume_after_download_called); |
592 } | 643 } |
593 | 644 |
594 TEST_F(EmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) { | 645 TEST_F(EmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) { |
595 const int64_t version_id = 55L; | 646 const int64_t version_id = 55L; |
596 const GURL scope("http://example.com/"); | 647 const GURL scope("http://example.com/"); |
597 const GURL url("http://example.com/worker.js"); | 648 const GURL url("http://example.com/worker.js"); |
598 | 649 |
599 helper_.reset(new StalledInStartWorkerHelper); | 650 helper_.reset(new StalledInStartWorkerHelper); |
600 std::unique_ptr<EmbeddedWorkerInstance> worker = | 651 std::unique_ptr<EmbeddedWorkerInstance> worker = |
601 embedded_worker_registry()->CreateWorker(); | 652 embedded_worker_registry()->CreateWorker(); |
602 worker->AddListener(this); | 653 worker->AddListener(this); |
603 | 654 |
604 // Run the start worker sequence until a start worker message is sent. | 655 // Run the start worker sequence until a start worker message is sent. |
605 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 656 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
606 std::unique_ptr<EmbeddedWorkerStartParams> params = | 657 std::unique_ptr<EmbeddedWorkerStartParams> params = |
607 CreateStartParams(version_id, scope, url); | 658 CreateStartParams(version_id, scope, url); |
608 worker->Start( | 659 worker->Start( |
609 std::move(params), CreateEventDispatcher(), | 660 std::move(params), CreateProviderClientInfoGetter(), |
| 661 CreateEventDispatcher(), |
610 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); | 662 base::Bind(&SaveStatusAndCall, &status, base::Bind(&base::DoNothing))); |
611 base::RunLoop().RunUntilIdle(); | 663 base::RunLoop().RunUntilIdle(); |
612 | 664 |
613 ASSERT_EQ(2u, events_.size()); | 665 ASSERT_EQ(2u, events_.size()); |
614 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 666 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
615 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 667 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
616 events_.clear(); | 668 events_.clear(); |
617 | 669 |
618 worker->Stop(); | 670 worker->Stop(); |
619 base::RunLoop().RunUntilIdle(); | 671 base::RunLoop().RunUntilIdle(); |
(...skipping 12 matching lines...) Expand all Loading... |
632 events_.clear(); | 684 events_.clear(); |
633 | 685 |
634 // Restart the worker. | 686 // Restart the worker. |
635 static_cast<StalledInStartWorkerHelper*>(helper_.get()) | 687 static_cast<StalledInStartWorkerHelper*>(helper_.get()) |
636 ->set_force_stall_in_start(false); | 688 ->set_force_stall_in_start(false); |
637 status = SERVICE_WORKER_ERROR_MAX_VALUE; | 689 status = SERVICE_WORKER_ERROR_MAX_VALUE; |
638 std::unique_ptr<base::RunLoop> run_loop(new base::RunLoop); | 690 std::unique_ptr<base::RunLoop> run_loop(new base::RunLoop); |
639 | 691 |
640 params = CreateStartParams(version_id, scope, url); | 692 params = CreateStartParams(version_id, scope, url); |
641 worker->Start( | 693 worker->Start( |
642 std::move(params), CreateEventDispatcher(), | 694 std::move(params), CreateProviderClientInfoGetter(), |
| 695 CreateEventDispatcher(), |
643 base::Bind(&SaveStatusAndCall, &status, run_loop->QuitClosure())); | 696 base::Bind(&SaveStatusAndCall, &status, run_loop->QuitClosure())); |
644 run_loop->Run(); | 697 run_loop->Run(); |
645 | 698 |
646 // The worker should be started. | 699 // The worker should be started. |
647 EXPECT_EQ(SERVICE_WORKER_OK, status); | 700 EXPECT_EQ(SERVICE_WORKER_OK, status); |
648 ASSERT_EQ(3u, events_.size()); | 701 ASSERT_EQ(3u, events_.size()); |
649 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 702 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
650 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 703 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
651 EXPECT_EQ(STARTED, events_[2].type); | 704 EXPECT_EQ(STARTED, events_[2].type); |
652 | 705 |
(...skipping 10 matching lines...) Expand all Loading... |
663 helper_->SimulateAddProcessToPattern(pattern, | 716 helper_->SimulateAddProcessToPattern(pattern, |
664 helper_->mock_render_process_id()); | 717 helper_->mock_render_process_id()); |
665 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 718 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
666 worker->AddListener(this); | 719 worker->AddListener(this); |
667 | 720 |
668 // Start the worker. | 721 // Start the worker. |
669 base::RunLoop run_loop; | 722 base::RunLoop run_loop; |
670 std::unique_ptr<EmbeddedWorkerStartParams> params = | 723 std::unique_ptr<EmbeddedWorkerStartParams> params = |
671 CreateStartParams(version_id, pattern, url); | 724 CreateStartParams(version_id, pattern, url); |
672 worker->Start( | 725 worker->Start( |
673 std::move(params), CreateEventDispatcher(), | 726 std::move(params), CreateProviderClientInfoGetter(), |
| 727 CreateEventDispatcher(), |
674 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); | 728 base::Bind(&SaveStatusAndCall, &status, run_loop.QuitClosure())); |
675 run_loop.Run(); | 729 run_loop.Run(); |
676 | 730 |
677 // Detach. | 731 // Detach. |
678 int process_id = worker->process_id(); | 732 int process_id = worker->process_id(); |
679 worker->Detach(); | 733 worker->Detach(); |
680 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 734 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
681 | 735 |
682 // Send the registry a message from the detached worker. Nothing should | 736 // Send the registry a message from the detached worker. Nothing should |
683 // happen. | 737 // happen. |
(...skipping 13 matching lines...) Expand all Loading... |
697 | 751 |
698 std::unique_ptr<EmbeddedWorkerInstance> worker = | 752 std::unique_ptr<EmbeddedWorkerInstance> worker = |
699 embedded_worker_registry()->CreateWorker(); | 753 embedded_worker_registry()->CreateWorker(); |
700 helper_->SimulateAddProcessToPattern(pattern, | 754 helper_->SimulateAddProcessToPattern(pattern, |
701 helper_->mock_render_process_id()); | 755 helper_->mock_render_process_id()); |
702 worker->AddListener(this); | 756 worker->AddListener(this); |
703 | 757 |
704 // Attempt to start the worker. | 758 // Attempt to start the worker. |
705 std::unique_ptr<EmbeddedWorkerStartParams> params = | 759 std::unique_ptr<EmbeddedWorkerStartParams> params = |
706 CreateStartParams(version_id, pattern, url); | 760 CreateStartParams(version_id, pattern, url); |
707 worker->Start(std::move(params), CreateEventDispatcher(), | 761 worker->Start(std::move(params), CreateProviderClientInfoGetter(), |
| 762 CreateEventDispatcher(), |
708 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 763 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
709 base::RunLoop().RunUntilIdle(); | 764 base::RunLoop().RunUntilIdle(); |
710 | 765 |
711 // Worker should handle the failure of binding as detach. | 766 // Worker should handle the failure of binding as detach. |
712 ASSERT_EQ(2u, events_.size()); | 767 ASSERT_EQ(2u, events_.size()); |
713 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 768 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
714 EXPECT_EQ(DETACHED, events_[1].type); | 769 EXPECT_EQ(DETACHED, events_[1].type); |
715 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[1].status); | 770 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[1].status); |
716 } | 771 } |
717 | 772 |
718 class FailEmbeddedWorkerInstanceClientImpl | 773 class FailEmbeddedWorkerInstanceClientImpl |
719 : public EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient { | 774 : public EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient { |
720 public: | 775 public: |
721 explicit FailEmbeddedWorkerInstanceClientImpl( | 776 explicit FailEmbeddedWorkerInstanceClientImpl( |
722 base::WeakPtr<EmbeddedWorkerTestHelper> helper) | 777 base::WeakPtr<EmbeddedWorkerTestHelper> helper) |
723 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} | 778 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} |
724 | 779 |
725 private: | 780 private: |
726 void StartWorker( | 781 void StartWorker(const EmbeddedWorkerStartParams&, |
727 const EmbeddedWorkerStartParams& /* unused */, | 782 mojom::ServiceWorkerEventDispatcherRequest, |
728 mojom::ServiceWorkerEventDispatcherRequest /* unused */, | 783 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo, |
729 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo /* unused */) | 784 mojom::ServiceWorkerProviderClientInfoPtr) override { |
730 override { | |
731 helper_->mock_instance_clients()->clear(); | 785 helper_->mock_instance_clients()->clear(); |
732 } | 786 } |
733 }; | 787 }; |
734 | 788 |
735 TEST_F(EmbeddedWorkerInstanceTest, RemoveRemoteInterface) { | 789 TEST_F(EmbeddedWorkerInstanceTest, RemoveRemoteInterface) { |
736 const int64_t version_id = 55L; | 790 const int64_t version_id = 55L; |
737 const GURL pattern("http://example.com/"); | 791 const GURL pattern("http://example.com/"); |
738 const GURL url("http://example.com/worker.js"); | 792 const GURL url("http://example.com/worker.js"); |
739 | 793 |
740 // Let StartWorker fail; binding is discarded in the middle of IPC | 794 // Let StartWorker fail; binding is discarded in the middle of IPC |
741 helper_->RegisterMockInstanceClient( | 795 helper_->RegisterMockInstanceClient( |
742 base::MakeUnique<FailEmbeddedWorkerInstanceClientImpl>( | 796 base::MakeUnique<FailEmbeddedWorkerInstanceClientImpl>( |
743 helper_->AsWeakPtr())); | 797 helper_->AsWeakPtr())); |
744 ASSERT_EQ(mock_instance_clients()->size(), 1UL); | 798 ASSERT_EQ(mock_instance_clients()->size(), 1UL); |
745 | 799 |
746 std::unique_ptr<EmbeddedWorkerInstance> worker = | 800 std::unique_ptr<EmbeddedWorkerInstance> worker = |
747 embedded_worker_registry()->CreateWorker(); | 801 embedded_worker_registry()->CreateWorker(); |
748 helper_->SimulateAddProcessToPattern(pattern, | 802 helper_->SimulateAddProcessToPattern(pattern, |
749 helper_->mock_render_process_id()); | 803 helper_->mock_render_process_id()); |
750 worker->AddListener(this); | 804 worker->AddListener(this); |
751 | 805 |
752 // Attempt to start the worker. | 806 // Attempt to start the worker. |
753 std::unique_ptr<EmbeddedWorkerStartParams> params = | 807 std::unique_ptr<EmbeddedWorkerStartParams> params = |
754 CreateStartParams(version_id, pattern, url); | 808 CreateStartParams(version_id, pattern, url); |
755 worker->Start(std::move(params), CreateEventDispatcher(), | 809 worker->Start(std::move(params), CreateProviderClientInfoGetter(), |
| 810 CreateEventDispatcher(), |
756 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 811 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
757 base::RunLoop().RunUntilIdle(); | 812 base::RunLoop().RunUntilIdle(); |
758 | 813 |
759 // Worker should handle the sudden shutdown as detach. | 814 // Worker should handle the sudden shutdown as detach. |
760 ASSERT_EQ(3u, events_.size()); | 815 ASSERT_EQ(3u, events_.size()); |
761 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 816 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
762 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 817 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
763 EXPECT_EQ(DETACHED, events_[2].type); | 818 EXPECT_EQ(DETACHED, events_[2].type); |
764 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); | 819 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); |
765 } | 820 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 helper_->SimulateAddProcessToPattern(pattern, | 856 helper_->SimulateAddProcessToPattern(pattern, |
802 helper_->mock_render_process_id()); | 857 helper_->mock_render_process_id()); |
803 worker->AddListener(this); | 858 worker->AddListener(this); |
804 | 859 |
805 // Attempt to start the worker and immediate AddMessageToConsole should not | 860 // Attempt to start the worker and immediate AddMessageToConsole should not |
806 // cause a crash. | 861 // cause a crash. |
807 std::pair<blink::WebConsoleMessage::Level, std::string> test_message = | 862 std::pair<blink::WebConsoleMessage::Level, std::string> test_message = |
808 std::make_pair(blink::WebConsoleMessage::kLevelVerbose, ""); | 863 std::make_pair(blink::WebConsoleMessage::kLevelVerbose, ""); |
809 std::unique_ptr<EmbeddedWorkerStartParams> params = | 864 std::unique_ptr<EmbeddedWorkerStartParams> params = |
810 CreateStartParams(version_id, pattern, url); | 865 CreateStartParams(version_id, pattern, url); |
811 worker->Start(std::move(params), CreateEventDispatcher(), | 866 worker->Start(std::move(params), CreateProviderClientInfoGetter(), |
| 867 CreateEventDispatcher(), |
812 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 868 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
813 worker->AddMessageToConsole(test_message.first, test_message.second); | 869 worker->AddMessageToConsole(test_message.first, test_message.second); |
814 base::RunLoop().RunUntilIdle(); | 870 base::RunLoop().RunUntilIdle(); |
815 | 871 |
816 // Messages sent before sending StartWorker message won't be dispatched. | 872 // Messages sent before sending StartWorker message won't be dispatched. |
817 ASSERT_EQ(0UL, instance_client_rawptr->message().size()); | 873 ASSERT_EQ(0UL, instance_client_rawptr->message().size()); |
818 ASSERT_EQ(3UL, events_.size()); | 874 ASSERT_EQ(3UL, events_.size()); |
819 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 875 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
820 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 876 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
821 EXPECT_EQ(STARTED, events_[2].type); | 877 EXPECT_EQ(STARTED, events_[2].type); |
822 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); | 878 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
823 | 879 |
824 worker->AddMessageToConsole(test_message.first, test_message.second); | 880 worker->AddMessageToConsole(test_message.first, test_message.second); |
825 base::RunLoop().RunUntilIdle(); | 881 base::RunLoop().RunUntilIdle(); |
826 | 882 |
827 // Messages sent after sending StartWorker message should be reached to | 883 // Messages sent after sending StartWorker message should be reached to |
828 // the renderer. | 884 // the renderer. |
829 ASSERT_EQ(1UL, instance_client_rawptr->message().size()); | 885 ASSERT_EQ(1UL, instance_client_rawptr->message().size()); |
830 EXPECT_EQ(test_message, instance_client_rawptr->message()[0]); | 886 EXPECT_EQ(test_message, instance_client_rawptr->message()[0]); |
831 | 887 |
832 // Ensure the worker is stopped. | 888 // Ensure the worker is stopped. |
833 worker->Stop(); | 889 worker->Stop(); |
834 base::RunLoop().RunUntilIdle(); | 890 base::RunLoop().RunUntilIdle(); |
835 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 891 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
836 } | 892 } |
837 | 893 |
838 } // namespace content | 894 } // namespace content |
OLD | NEW |