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 |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "content/browser/service_worker/embedded_worker_registry.h" | 15 #include "content/browser/service_worker/embedded_worker_registry.h" |
16 #include "content/browser/service_worker/embedded_worker_status.h" | 16 #include "content/browser/service_worker/embedded_worker_status.h" |
17 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 17 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
18 #include "content/browser/service_worker/service_worker_context_core.h" | 18 #include "content/browser/service_worker/service_worker_context_core.h" |
19 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 19 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
20 #include "content/browser/service_worker/service_worker_test_utils.h" | 20 #include "content/browser/service_worker/service_worker_test_utils.h" |
21 #include "content/common/service_worker/embedded_worker.mojom.h" | 21 #include "content/common/service_worker/embedded_worker.mojom.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_start_params.h" | 23 #include "content/common/service_worker/embedded_worker_start_params.h" |
| 24 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h" |
24 #include "content/common/service_worker/service_worker_utils.h" | 25 #include "content/common/service_worker/service_worker_utils.h" |
25 #include "content/public/common/child_process_host.h" | 26 #include "content/public/common/child_process_host.h" |
26 #include "content/public/common/content_switches.h" | 27 #include "content/public/common/content_switches.h" |
27 #include "content/public/test/test_browser_thread_bundle.h" | 28 #include "content/public/test/test_browser_thread_bundle.h" |
28 #include "mojo/public/cpp/bindings/strong_binding.h" | 29 #include "mojo/public/cpp/bindings/strong_binding.h" |
29 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
30 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
31 | 32 |
32 namespace content { | 33 namespace content { |
33 | 34 |
34 namespace { | 35 namespace { |
35 | 36 |
36 void SaveStatusAndCall(ServiceWorkerStatusCode* out, | 37 void SaveStatusAndCall(ServiceWorkerStatusCode* out, |
37 const base::Closure& callback, | 38 const base::Closure& callback, |
38 ServiceWorkerStatusCode status) { | 39 ServiceWorkerStatusCode status) { |
39 *out = status; | 40 *out = status; |
40 callback.Run(); | 41 callback.Run(); |
41 } | 42 } |
42 | 43 |
43 std::unique_ptr<EmbeddedWorkerStartParams> | |
44 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) { | |
45 std::unique_ptr<EmbeddedWorkerStartParams> params( | |
46 new EmbeddedWorkerStartParams); | |
47 params->service_worker_version_id = version_id; | |
48 params->scope = scope; | |
49 params->script_url = script_url; | |
50 params->pause_after_download = false; | |
51 params->is_installed = false; | |
52 return params; | |
53 } | |
54 | |
55 } // namespace | 44 } // namespace |
56 | 45 |
57 class EmbeddedWorkerInstanceTest : public testing::Test, | 46 class EmbeddedWorkerInstanceTest : public testing::Test, |
58 public EmbeddedWorkerInstance::Listener { | 47 public EmbeddedWorkerInstance::Listener { |
59 protected: | 48 protected: |
60 EmbeddedWorkerInstanceTest() | 49 EmbeddedWorkerInstanceTest() |
61 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} | 50 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} |
62 | 51 |
63 enum EventType { | 52 enum EventType { |
64 PROCESS_ALLOCATED, | 53 PROCESS_ALLOCATED, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 ServiceWorkerStatusCode status; | 95 ServiceWorkerStatusCode status; |
107 base::RunLoop run_loop; | 96 base::RunLoop run_loop; |
108 std::unique_ptr<EmbeddedWorkerStartParams> params = | 97 std::unique_ptr<EmbeddedWorkerStartParams> params = |
109 CreateStartParams(id, pattern, url); | 98 CreateStartParams(id, pattern, url); |
110 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 99 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
111 run_loop.QuitClosure())); | 100 run_loop.QuitClosure())); |
112 run_loop.Run(); | 101 run_loop.Run(); |
113 return status; | 102 return status; |
114 } | 103 } |
115 | 104 |
| 105 std::unique_ptr<EmbeddedWorkerStartParams> |
| 106 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) { |
| 107 std::unique_ptr<EmbeddedWorkerStartParams> params( |
| 108 new EmbeddedWorkerStartParams); |
| 109 params->internal.service_worker_version_id = version_id; |
| 110 params->internal.scope = scope; |
| 111 params->internal.script_url = script_url; |
| 112 params->internal.pause_after_download = false; |
| 113 params->internal.is_installed = false; |
| 114 params->dispatcher_request = CreateEventDispatcher(); |
| 115 return params; |
| 116 } |
| 117 |
| 118 mojom::ServiceWorkerEventDispatcherRequest CreateEventDispatcher() { |
| 119 dispatchers_.emplace_back(); |
| 120 return mojo::GetProxy(&dispatchers_.back()); |
| 121 } |
| 122 |
116 ServiceWorkerContextCore* context() { return helper_->context(); } | 123 ServiceWorkerContextCore* context() { return helper_->context(); } |
117 | 124 |
118 EmbeddedWorkerRegistry* embedded_worker_registry() { | 125 EmbeddedWorkerRegistry* embedded_worker_registry() { |
119 DCHECK(context()); | 126 DCHECK(context()); |
120 return context()->embedded_worker_registry(); | 127 return context()->embedded_worker_registry(); |
121 } | 128 } |
122 | 129 |
123 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } | 130 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } |
124 | 131 |
125 std::vector<std::unique_ptr< | 132 std::vector<std::unique_ptr< |
126 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>* | 133 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>* |
127 mock_instance_clients() { | 134 mock_instance_clients() { |
128 return helper_->mock_instance_clients(); | 135 return helper_->mock_instance_clients(); |
129 } | 136 } |
130 | 137 |
| 138 std::vector<mojom::ServiceWorkerEventDispatcherPtr> dispatchers_; |
| 139 |
131 TestBrowserThreadBundle thread_bundle_; | 140 TestBrowserThreadBundle thread_bundle_; |
132 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; | 141 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
133 std::vector<EventLog> events_; | 142 std::vector<EventLog> events_; |
134 | 143 |
135 private: | 144 private: |
136 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); | 145 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); |
137 }; | 146 }; |
138 | 147 |
139 class EmbeddedWorkerInstanceTestP | 148 class EmbeddedWorkerInstanceTestP |
140 : public MojoServiceWorkerTestP<EmbeddedWorkerInstanceTest> {}; | 149 : public MojoServiceWorkerTestP<EmbeddedWorkerInstanceTest> {}; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 // unittests can't actually create a new process itself. | 263 // unittests can't actually create a new process itself. |
255 // ServiceWorkerProcessManager only chooses this process id in unittests if | 264 // ServiceWorkerProcessManager only chooses this process id in unittests if |
256 // can_use_existing_process is false. | 265 // can_use_existing_process is false. |
257 helper_->SimulateAddProcessToPattern(pattern, | 266 helper_->SimulateAddProcessToPattern(pattern, |
258 helper_->new_render_process_id()); | 267 helper_->new_render_process_id()); |
259 | 268 |
260 { | 269 { |
261 // Start once normally. | 270 // Start once normally. |
262 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 271 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
263 base::RunLoop run_loop; | 272 base::RunLoop run_loop; |
264 std::unique_ptr<EmbeddedWorkerStartParams> params( | 273 std::unique_ptr<EmbeddedWorkerStartParams> params = |
265 CreateStartParams(service_worker_version_id, pattern, url)); | 274 CreateStartParams(service_worker_version_id, pattern, url); |
266 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 275 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
267 run_loop.QuitClosure())); | 276 run_loop.QuitClosure())); |
268 run_loop.Run(); | 277 run_loop.Run(); |
269 EXPECT_EQ(SERVICE_WORKER_OK, status); | 278 EXPECT_EQ(SERVICE_WORKER_OK, status); |
270 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); | 279 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
271 // The worker should be using the default render process. | 280 // The worker should be using the default render process. |
272 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); | 281 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); |
273 | 282 |
274 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); | 283 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); |
275 base::RunLoop().RunUntilIdle(); | 284 base::RunLoop().RunUntilIdle(); |
276 } | 285 } |
277 | 286 |
278 // Fail twice. | 287 // Fail twice. |
279 context()->UpdateVersionFailureCount(service_worker_version_id, | 288 context()->UpdateVersionFailureCount(service_worker_version_id, |
280 SERVICE_WORKER_ERROR_FAILED); | 289 SERVICE_WORKER_ERROR_FAILED); |
281 context()->UpdateVersionFailureCount(service_worker_version_id, | 290 context()->UpdateVersionFailureCount(service_worker_version_id, |
282 SERVICE_WORKER_ERROR_FAILED); | 291 SERVICE_WORKER_ERROR_FAILED); |
283 | 292 |
284 { | 293 { |
285 // Start again. | 294 // Start again. |
286 ServiceWorkerStatusCode status; | 295 ServiceWorkerStatusCode status; |
287 base::RunLoop run_loop; | 296 base::RunLoop run_loop; |
288 std::unique_ptr<EmbeddedWorkerStartParams> params( | 297 std::unique_ptr<EmbeddedWorkerStartParams> params = |
289 CreateStartParams(service_worker_version_id, pattern, url)); | 298 CreateStartParams(service_worker_version_id, pattern, url); |
290 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 299 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
291 run_loop.QuitClosure())); | 300 run_loop.QuitClosure())); |
292 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); | 301 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); |
293 run_loop.Run(); | 302 run_loop.Run(); |
294 EXPECT_EQ(SERVICE_WORKER_OK, status); | 303 EXPECT_EQ(SERVICE_WORKER_OK, status); |
295 | 304 |
296 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); | 305 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
297 // The worker should be using the new render process. | 306 // The worker should be using the new render process. |
298 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); | 307 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); |
299 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); | 308 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 const int64_t version_id2 = 56L; | 367 const int64_t version_id2 = 56L; |
359 const GURL pattern("http://example.com/"); | 368 const GURL pattern("http://example.com/"); |
360 const GURL url("http://example.com/worker.js"); | 369 const GURL url("http://example.com/worker.js"); |
361 int process_id = helper_->mock_render_process_id(); | 370 int process_id = helper_->mock_render_process_id(); |
362 | 371 |
363 helper_->SimulateAddProcessToPattern(pattern, process_id); | 372 helper_->SimulateAddProcessToPattern(pattern, process_id); |
364 { | 373 { |
365 // Start worker1. | 374 // Start worker1. |
366 ServiceWorkerStatusCode status; | 375 ServiceWorkerStatusCode status; |
367 base::RunLoop run_loop; | 376 base::RunLoop run_loop; |
368 std::unique_ptr<EmbeddedWorkerStartParams> params( | 377 std::unique_ptr<EmbeddedWorkerStartParams> params = |
369 CreateStartParams(version_id1, pattern, url)); | 378 CreateStartParams(version_id1, pattern, url); |
370 worker1->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 379 worker1->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
371 run_loop.QuitClosure())); | 380 run_loop.QuitClosure())); |
372 run_loop.Run(); | 381 run_loop.Run(); |
373 EXPECT_EQ(SERVICE_WORKER_OK, status); | 382 EXPECT_EQ(SERVICE_WORKER_OK, status); |
374 } | 383 } |
375 | 384 |
376 { | 385 { |
377 // Start worker2. | 386 // Start worker2. |
378 ServiceWorkerStatusCode status; | 387 ServiceWorkerStatusCode status; |
379 base::RunLoop run_loop; | 388 base::RunLoop run_loop; |
380 std::unique_ptr<EmbeddedWorkerStartParams> params( | 389 std::unique_ptr<EmbeddedWorkerStartParams> params = |
381 CreateStartParams(version_id2, pattern, url)); | 390 CreateStartParams(version_id2, pattern, url); |
382 worker2->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 391 worker2->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
383 run_loop.QuitClosure())); | 392 run_loop.QuitClosure())); |
384 run_loop.Run(); | 393 run_loop.Run(); |
385 EXPECT_EQ(SERVICE_WORKER_OK, status); | 394 EXPECT_EQ(SERVICE_WORKER_OK, status); |
386 } | 395 } |
387 | 396 |
388 // The two workers share the same process. | 397 // The two workers share the same process. |
389 EXPECT_EQ(worker1->process_id(), worker2->process_id()); | 398 EXPECT_EQ(worker1->process_id(), worker2->process_id()); |
390 | 399 |
391 // Destroy worker1. It removes itself from the registry. | 400 // Destroy worker1. It removes itself from the registry. |
(...skipping 15 matching lines...) Expand all Loading... |
407 const int64_t version_id = 55L; | 416 const int64_t version_id = 55L; |
408 const GURL scope("http://example.com/"); | 417 const GURL scope("http://example.com/"); |
409 const GURL url("http://example.com/worker.js"); | 418 const GURL url("http://example.com/worker.js"); |
410 | 419 |
411 std::unique_ptr<EmbeddedWorkerInstance> worker = | 420 std::unique_ptr<EmbeddedWorkerInstance> worker = |
412 embedded_worker_registry()->CreateWorker(); | 421 embedded_worker_registry()->CreateWorker(); |
413 worker->AddListener(this); | 422 worker->AddListener(this); |
414 | 423 |
415 // Run the start worker sequence and detach during process allocation. | 424 // Run the start worker sequence and detach during process allocation. |
416 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 425 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
417 std::unique_ptr<EmbeddedWorkerStartParams> params( | 426 std::unique_ptr<EmbeddedWorkerStartParams> params = |
418 CreateStartParams(version_id, scope, url)); | 427 CreateStartParams(version_id, scope, url); |
419 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 428 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
420 base::Bind(&base::DoNothing))); | 429 base::Bind(&base::DoNothing))); |
421 worker->Detach(); | 430 worker->Detach(); |
422 base::RunLoop().RunUntilIdle(); | 431 base::RunLoop().RunUntilIdle(); |
423 | 432 |
424 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 433 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
425 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); | 434 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); |
426 | 435 |
427 // The start callback should not be aborted by detach (see a comment on the | 436 // The start callback should not be aborted by detach (see a comment on the |
428 // dtor of EmbeddedWorkerInstance::StartTask). | 437 // dtor of EmbeddedWorkerInstance::StartTask). |
(...skipping 10 matching lines...) Expand all Loading... |
439 const GURL scope("http://example.com/"); | 448 const GURL scope("http://example.com/"); |
440 const GURL url("http://example.com/worker.js"); | 449 const GURL url("http://example.com/worker.js"); |
441 | 450 |
442 helper_.reset(new StalledInStartWorkerHelper()); | 451 helper_.reset(new StalledInStartWorkerHelper()); |
443 std::unique_ptr<EmbeddedWorkerInstance> worker = | 452 std::unique_ptr<EmbeddedWorkerInstance> worker = |
444 embedded_worker_registry()->CreateWorker(); | 453 embedded_worker_registry()->CreateWorker(); |
445 worker->AddListener(this); | 454 worker->AddListener(this); |
446 | 455 |
447 // Run the start worker sequence until a start worker message is sent. | 456 // Run the start worker sequence until a start worker message is sent. |
448 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 457 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
449 std::unique_ptr<EmbeddedWorkerStartParams> params( | 458 std::unique_ptr<EmbeddedWorkerStartParams> params = |
450 CreateStartParams(version_id, scope, url)); | 459 CreateStartParams(version_id, scope, url); |
451 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 460 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
452 base::Bind(&base::DoNothing))); | 461 base::Bind(&base::DoNothing))); |
453 base::RunLoop().RunUntilIdle(); | 462 base::RunLoop().RunUntilIdle(); |
454 | 463 |
455 ASSERT_EQ(2u, events_.size()); | 464 ASSERT_EQ(2u, events_.size()); |
456 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 465 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
457 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 466 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
458 events_.clear(); | 467 events_.clear(); |
459 | 468 |
460 worker->Detach(); | 469 worker->Detach(); |
(...skipping 17 matching lines...) Expand all Loading... |
478 const GURL scope("http://example.com/"); | 487 const GURL scope("http://example.com/"); |
479 const GURL url("http://example.com/worker.js"); | 488 const GURL url("http://example.com/worker.js"); |
480 | 489 |
481 std::unique_ptr<EmbeddedWorkerInstance> worker = | 490 std::unique_ptr<EmbeddedWorkerInstance> worker = |
482 embedded_worker_registry()->CreateWorker(); | 491 embedded_worker_registry()->CreateWorker(); |
483 worker->AddListener(this); | 492 worker->AddListener(this); |
484 | 493 |
485 // Stop the start worker sequence before a process is allocated. | 494 // Stop the start worker sequence before a process is allocated. |
486 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 495 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
487 | 496 |
488 std::unique_ptr<EmbeddedWorkerStartParams> params( | 497 std::unique_ptr<EmbeddedWorkerStartParams> params = |
489 CreateStartParams(version_id, scope, url)); | 498 CreateStartParams(version_id, scope, url); |
490 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 499 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
491 base::Bind(&base::DoNothing))); | 500 base::Bind(&base::DoNothing))); |
492 worker->Stop(); | 501 worker->Stop(); |
493 base::RunLoop().RunUntilIdle(); | 502 base::RunLoop().RunUntilIdle(); |
494 | 503 |
495 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 504 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
496 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); | 505 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); |
497 | 506 |
498 // The start callback should not be aborted by stop (see a comment on the dtor | 507 // The start callback should not be aborted by stop (see a comment on the dtor |
499 // of EmbeddedWorkerInstance::StartTask). | 508 // of EmbeddedWorkerInstance::StartTask). |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 const GURL scope("http://example.com/"); | 543 const GURL scope("http://example.com/"); |
535 const GURL url("http://example.com/worker.js"); | 544 const GURL url("http://example.com/worker.js"); |
536 | 545 |
537 std::unique_ptr<EmbeddedWorkerInstance> worker = | 546 std::unique_ptr<EmbeddedWorkerInstance> worker = |
538 embedded_worker_registry()->CreateWorker(); | 547 embedded_worker_registry()->CreateWorker(); |
539 worker->AddListener(this); | 548 worker->AddListener(this); |
540 | 549 |
541 // Run the start worker sequence until pause after download. | 550 // Run the start worker sequence until pause after download. |
542 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 551 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
543 | 552 |
544 std::unique_ptr<EmbeddedWorkerStartParams> params( | 553 std::unique_ptr<EmbeddedWorkerStartParams> params = |
545 CreateStartParams(version_id, scope, url)); | 554 CreateStartParams(version_id, scope, url); |
546 params->pause_after_download = true; | 555 params->internal.pause_after_download = true; |
547 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 556 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
548 base::Bind(&base::DoNothing))); | 557 base::Bind(&base::DoNothing))); |
549 base::RunLoop().RunUntilIdle(); | 558 base::RunLoop().RunUntilIdle(); |
550 | 559 |
551 // Make the worker stopping and attempt to send a resume after download | 560 // Make the worker stopping and attempt to send a resume after download |
552 // message. | 561 // message. |
553 worker->Stop(); | 562 worker->Stop(); |
554 worker->ResumeAfterDownload(); | 563 worker->ResumeAfterDownload(); |
555 base::RunLoop().RunUntilIdle(); | 564 base::RunLoop().RunUntilIdle(); |
556 | 565 |
557 // The resume after download message should not have been sent. | 566 // The resume after download message should not have been sent. |
558 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 567 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
559 EXPECT_FALSE(ipc_sink()->GetFirstMessageMatching( | 568 EXPECT_FALSE(ipc_sink()->GetFirstMessageMatching( |
560 EmbeddedWorkerMsg_ResumeAfterDownload::ID)); | 569 EmbeddedWorkerMsg_ResumeAfterDownload::ID)); |
561 } | 570 } |
562 | 571 |
563 TEST_P(EmbeddedWorkerInstanceTestP, StopAfterSendingStartWorkerMessage) { | 572 TEST_P(EmbeddedWorkerInstanceTestP, StopAfterSendingStartWorkerMessage) { |
564 const int64_t version_id = 55L; | 573 const int64_t version_id = 55L; |
565 const GURL scope("http://example.com/"); | 574 const GURL scope("http://example.com/"); |
566 const GURL url("http://example.com/worker.js"); | 575 const GURL url("http://example.com/worker.js"); |
567 | 576 |
568 helper_.reset(new StalledInStartWorkerHelper); | 577 helper_.reset(new StalledInStartWorkerHelper); |
569 std::unique_ptr<EmbeddedWorkerInstance> worker = | 578 std::unique_ptr<EmbeddedWorkerInstance> worker = |
570 embedded_worker_registry()->CreateWorker(); | 579 embedded_worker_registry()->CreateWorker(); |
571 worker->AddListener(this); | 580 worker->AddListener(this); |
572 | 581 |
573 // Run the start worker sequence until a start worker message is sent. | 582 // Run the start worker sequence until a start worker message is sent. |
574 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 583 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
575 std::unique_ptr<EmbeddedWorkerStartParams> params( | 584 std::unique_ptr<EmbeddedWorkerStartParams> params = |
576 CreateStartParams(version_id, scope, url)); | 585 CreateStartParams(version_id, scope, url); |
577 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 586 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
578 base::Bind(&base::DoNothing))); | 587 base::Bind(&base::DoNothing))); |
579 base::RunLoop().RunUntilIdle(); | 588 base::RunLoop().RunUntilIdle(); |
580 | 589 |
581 ASSERT_EQ(2u, events_.size()); | 590 ASSERT_EQ(2u, events_.size()); |
582 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 591 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
583 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 592 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
584 events_.clear(); | 593 events_.clear(); |
585 | 594 |
586 worker->Stop(); | 595 worker->Stop(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 const GURL url("http://example.com/worker.js"); | 636 const GURL url("http://example.com/worker.js"); |
628 std::unique_ptr<EmbeddedWorkerInstance> worker = | 637 std::unique_ptr<EmbeddedWorkerInstance> worker = |
629 embedded_worker_registry()->CreateWorker(); | 638 embedded_worker_registry()->CreateWorker(); |
630 helper_->SimulateAddProcessToPattern(pattern, | 639 helper_->SimulateAddProcessToPattern(pattern, |
631 helper_->mock_render_process_id()); | 640 helper_->mock_render_process_id()); |
632 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 641 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
633 worker->AddListener(this); | 642 worker->AddListener(this); |
634 | 643 |
635 // Start the worker. | 644 // Start the worker. |
636 base::RunLoop run_loop; | 645 base::RunLoop run_loop; |
637 std::unique_ptr<EmbeddedWorkerStartParams> params( | 646 std::unique_ptr<EmbeddedWorkerStartParams> params = |
638 CreateStartParams(version_id, pattern, url)); | 647 CreateStartParams(version_id, pattern, url); |
639 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 648 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
640 run_loop.QuitClosure())); | 649 run_loop.QuitClosure())); |
641 run_loop.Run(); | 650 run_loop.Run(); |
642 | 651 |
643 // Detach. | 652 // Detach. |
644 int process_id = worker->process_id(); | 653 int process_id = worker->process_id(); |
645 worker->Detach(); | 654 worker->Detach(); |
646 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); | 655 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
647 | 656 |
648 // Send the registry a message from the detached worker. Nothing should | 657 // Send the registry a message from the detached worker. Nothing should |
(...skipping 17 matching lines...) Expand all Loading... |
666 } | 675 } |
667 | 676 |
668 std::unique_ptr<EmbeddedWorkerInstance> worker = | 677 std::unique_ptr<EmbeddedWorkerInstance> worker = |
669 embedded_worker_registry()->CreateWorker(); | 678 embedded_worker_registry()->CreateWorker(); |
670 helper_->SimulateAddProcessToPattern(pattern, | 679 helper_->SimulateAddProcessToPattern(pattern, |
671 helper_->mock_render_process_id()); | 680 helper_->mock_render_process_id()); |
672 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 681 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
673 worker->AddListener(this); | 682 worker->AddListener(this); |
674 | 683 |
675 // Attempt to start the worker. | 684 // Attempt to start the worker. |
676 std::unique_ptr<EmbeddedWorkerStartParams> params( | 685 std::unique_ptr<EmbeddedWorkerStartParams> params = |
677 CreateStartParams(version_id, pattern, url)); | 686 CreateStartParams(version_id, pattern, url); |
678 if (is_mojo_enabled()) { | 687 if (is_mojo_enabled()) { |
679 worker->Start(std::move(params), | 688 worker->Start(std::move(params), |
680 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 689 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
681 base::RunLoop().RunUntilIdle(); | 690 base::RunLoop().RunUntilIdle(); |
682 } else { | 691 } else { |
683 base::RunLoop run_loop; | 692 base::RunLoop run_loop; |
684 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, | 693 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
685 run_loop.QuitClosure())); | 694 run_loop.QuitClosure())); |
686 run_loop.Run(); | 695 run_loop.Run(); |
687 } | 696 } |
(...skipping 18 matching lines...) Expand all Loading... |
706 | 715 |
707 class FailEmbeddedWorkerInstanceClientImpl | 716 class FailEmbeddedWorkerInstanceClientImpl |
708 : public EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient { | 717 : public EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient { |
709 public: | 718 public: |
710 explicit FailEmbeddedWorkerInstanceClientImpl( | 719 explicit FailEmbeddedWorkerInstanceClientImpl( |
711 base::WeakPtr<EmbeddedWorkerTestHelper> helper) | 720 base::WeakPtr<EmbeddedWorkerTestHelper> helper) |
712 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} | 721 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} |
713 | 722 |
714 private: | 723 private: |
715 void StartWorker( | 724 void StartWorker( |
716 const EmbeddedWorkerStartParams& /* unused */, | 725 const EmbeddedWorkerStartParamsInternal& /* unused */, |
717 service_manager::mojom::InterfaceProviderPtr /* unused */, | 726 mojom::ServiceWorkerEventDispatcherRequest /* unused */) override { |
718 service_manager::mojom::InterfaceProviderRequest /* unused */) override { | |
719 helper_->mock_instance_clients()->clear(); | 727 helper_->mock_instance_clients()->clear(); |
720 } | 728 } |
721 }; | 729 }; |
722 | 730 |
723 TEST_P(EmbeddedWorkerInstanceTestP, RemoveRemoteInterface) { | 731 TEST_P(EmbeddedWorkerInstanceTestP, RemoveRemoteInterface) { |
724 if (!is_mojo_enabled()) | 732 if (!is_mojo_enabled()) |
725 return; | 733 return; |
726 | 734 |
727 const int64_t version_id = 55L; | 735 const int64_t version_id = 55L; |
728 const GURL pattern("http://example.com/"); | 736 const GURL pattern("http://example.com/"); |
729 const GURL url("http://example.com/worker.js"); | 737 const GURL url("http://example.com/worker.js"); |
730 | 738 |
731 // Let StartWorker fail; binding is discarded in the middle of IPC | 739 // Let StartWorker fail; binding is discarded in the middle of IPC |
732 helper_->RegisterMockInstanceClient( | 740 helper_->RegisterMockInstanceClient( |
733 base::MakeUnique<FailEmbeddedWorkerInstanceClientImpl>( | 741 base::MakeUnique<FailEmbeddedWorkerInstanceClientImpl>( |
734 helper_->AsWeakPtr())); | 742 helper_->AsWeakPtr())); |
735 ASSERT_EQ(mock_instance_clients()->size(), 1UL); | 743 ASSERT_EQ(mock_instance_clients()->size(), 1UL); |
736 | 744 |
737 std::unique_ptr<EmbeddedWorkerInstance> worker = | 745 std::unique_ptr<EmbeddedWorkerInstance> worker = |
738 embedded_worker_registry()->CreateWorker(); | 746 embedded_worker_registry()->CreateWorker(); |
739 helper_->SimulateAddProcessToPattern(pattern, | 747 helper_->SimulateAddProcessToPattern(pattern, |
740 helper_->mock_render_process_id()); | 748 helper_->mock_render_process_id()); |
741 worker->AddListener(this); | 749 worker->AddListener(this); |
742 | 750 |
743 // Attempt to start the worker. | 751 // Attempt to start the worker. |
744 std::unique_ptr<EmbeddedWorkerStartParams> params( | 752 std::unique_ptr<EmbeddedWorkerStartParams> params = |
745 CreateStartParams(version_id, pattern, url)); | 753 CreateStartParams(version_id, pattern, url); |
746 worker->Start(std::move(params), | 754 worker->Start(std::move(params), |
747 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 755 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
748 base::RunLoop().RunUntilIdle(); | 756 base::RunLoop().RunUntilIdle(); |
749 | 757 |
750 // Worker should handle the sudden shutdown as detach. | 758 // Worker should handle the sudden shutdown as detach. |
751 ASSERT_EQ(3u, events_.size()); | 759 ASSERT_EQ(3u, events_.size()); |
752 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); | 760 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
753 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); | 761 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
754 EXPECT_EQ(DETACHED, events_[2].type); | 762 EXPECT_EQ(DETACHED, events_[2].type); |
755 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); | 763 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); |
756 } | 764 } |
757 | 765 |
758 INSTANTIATE_TEST_CASE_P(EmbeddedWorkerInstanceTest, | 766 INSTANTIATE_TEST_CASE_P(EmbeddedWorkerInstanceTest, |
759 EmbeddedWorkerInstanceTestP, | 767 EmbeddedWorkerInstanceTestP, |
760 ::testing::Values(false, true)); | 768 ::testing::Values(false, true)); |
761 | 769 |
762 } // namespace content | 770 } // namespace content |
OLD | NEW |