| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/callback.h" | 6 #include "base/callback.h" |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "content/browser/service_worker/embedded_worker_instance.h" | 9 #include "content/browser/service_worker/embedded_worker_instance.h" |
| 10 #include "content/browser/service_worker/embedded_worker_registry.h" | 10 #include "content/browser/service_worker/embedded_worker_registry.h" |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 public: | 543 public: |
| 544 typedef ServiceWorkerBlackBoxBrowserTest self; | 544 typedef ServiceWorkerBlackBoxBrowserTest self; |
| 545 | 545 |
| 546 static void ExpectResultAndRun(bool expected, | 546 static void ExpectResultAndRun(bool expected, |
| 547 const base::Closure& continuation, | 547 const base::Closure& continuation, |
| 548 bool actual) { | 548 bool actual) { |
| 549 EXPECT_EQ(expected, actual); | 549 EXPECT_EQ(expected, actual); |
| 550 continuation.Run(); | 550 continuation.Run(); |
| 551 } | 551 } |
| 552 | 552 |
| 553 int RenderProcessID() { |
| 554 return shell()->web_contents()->GetRenderProcessHost()->GetID(); |
| 555 } |
| 556 |
| 553 void FindRegistrationOnIO(const GURL& document_url, | 557 void FindRegistrationOnIO(const GURL& document_url, |
| 554 ServiceWorkerStatusCode* status, | 558 ServiceWorkerStatusCode* status, |
| 555 GURL* script_url, | 559 GURL* script_url, |
| 556 const base::Closure& continuation) { | 560 const base::Closure& continuation) { |
| 557 wrapper()->context()->storage()->FindRegistrationForDocument( | 561 wrapper()->context()->storage()->FindRegistrationForDocument( |
| 558 document_url, | 562 document_url, |
| 559 base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO2, | 563 base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO2, |
| 560 this, | 564 this, |
| 561 status, | 565 status, |
| 562 script_url, | 566 script_url, |
| 563 continuation)); | 567 continuation)); |
| 564 } | 568 } |
| 565 | 569 |
| 566 void FindRegistrationOnIO2( | 570 void FindRegistrationOnIO2( |
| 567 ServiceWorkerStatusCode* out_status, | 571 ServiceWorkerStatusCode* out_status, |
| 568 GURL* script_url, | 572 GURL* script_url, |
| 569 const base::Closure& continuation, | 573 const base::Closure& continuation, |
| 570 ServiceWorkerStatusCode status, | 574 ServiceWorkerStatusCode status, |
| 571 const scoped_refptr<ServiceWorkerRegistration>& registration) { | 575 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| 572 *out_status = status; | 576 *out_status = status; |
| 573 if (registration) { | 577 if (registration) { |
| 574 *script_url = registration->script_url(); | 578 *script_url = registration->script_url(); |
| 575 } else { | 579 } else { |
| 576 EXPECT_NE(SERVICE_WORKER_OK, status); | 580 EXPECT_NE(SERVICE_WORKER_OK, status); |
| 577 } | 581 } |
| 578 continuation.Run(); | 582 continuation.Run(); |
| 579 } | 583 } |
| 580 }; | 584 }; |
| 581 | 585 |
| 582 static int CountRenderProcessHosts() { | |
| 583 int result = 0; | |
| 584 for (RenderProcessHost::iterator iter(RenderProcessHost::AllHostsIterator()); | |
| 585 !iter.IsAtEnd(); | |
| 586 iter.Advance()) { | |
| 587 result++; | |
| 588 } | |
| 589 return result; | |
| 590 } | |
| 591 | |
| 592 IN_PROC_BROWSER_TEST_F(ServiceWorkerBlackBoxBrowserTest, Registration) { | 586 IN_PROC_BROWSER_TEST_F(ServiceWorkerBlackBoxBrowserTest, Registration) { |
| 593 // Close the only window to be sure we're not re-using its RenderProcessHost. | |
| 594 shell()->Close(); | |
| 595 EXPECT_EQ(0, CountRenderProcessHosts()); | |
| 596 | |
| 597 const std::string kWorkerUrl = "/service_worker/fetch_event.js"; | 587 const std::string kWorkerUrl = "/service_worker/fetch_event.js"; |
| 598 | 588 |
| 599 // Unregistering nothing should return true. | 589 // Unregistering nothing should return true. |
| 600 { | 590 { |
| 601 base::RunLoop run_loop; | 591 base::RunLoop run_loop; |
| 602 public_context()->UnregisterServiceWorker( | 592 public_context()->UnregisterServiceWorker( |
| 603 embedded_test_server()->GetURL("/*"), | 593 embedded_test_server()->GetURL("/*"), |
| 604 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, | 594 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, |
| 605 true, | 595 true, |
| 606 run_loop.QuitClosure())); | 596 run_loop.QuitClosure())); |
| 607 run_loop.Run(); | 597 run_loop.Run(); |
| 608 } | 598 } |
| 609 | 599 |
| 610 // If we use a worker URL that doesn't exist, registration fails. | |
| 611 { | |
| 612 base::RunLoop run_loop; | |
| 613 public_context()->RegisterServiceWorker( | |
| 614 embedded_test_server()->GetURL("/*"), | |
| 615 embedded_test_server()->GetURL("/does/not/exist"), | |
| 616 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, | |
| 617 false, | |
| 618 run_loop.QuitClosure())); | |
| 619 run_loop.Run(); | |
| 620 } | |
| 621 EXPECT_EQ(0, CountRenderProcessHosts()); | |
| 622 | |
| 623 // Register returns when the promise would be resolved. | 600 // Register returns when the promise would be resolved. |
| 624 { | 601 { |
| 625 base::RunLoop run_loop; | 602 base::RunLoop run_loop; |
| 626 public_context()->RegisterServiceWorker( | 603 public_context()->RegisterServiceWorker( |
| 627 embedded_test_server()->GetURL("/*"), | 604 embedded_test_server()->GetURL("/*"), |
| 628 embedded_test_server()->GetURL(kWorkerUrl), | 605 embedded_test_server()->GetURL(kWorkerUrl), |
| 629 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, | 606 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, |
| 630 true, | 607 true, |
| 631 run_loop.QuitClosure())); | 608 run_loop.QuitClosure())); |
| 632 run_loop.Run(); | 609 run_loop.Run(); |
| 633 } | 610 } |
| 634 EXPECT_EQ(1, CountRenderProcessHosts()); | |
| 635 | 611 |
| 636 // Registering again should succeed, although the algo still | 612 // Registering again should succeed, although the algo still |
| 637 // might not be complete. | 613 // might not be complete. |
| 638 { | 614 { |
| 639 base::RunLoop run_loop; | 615 base::RunLoop run_loop; |
| 640 public_context()->RegisterServiceWorker( | 616 public_context()->RegisterServiceWorker( |
| 641 embedded_test_server()->GetURL("/*"), | 617 embedded_test_server()->GetURL("/*"), |
| 642 embedded_test_server()->GetURL(kWorkerUrl), | 618 embedded_test_server()->GetURL(kWorkerUrl), |
| 643 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, | 619 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, |
| 644 true, | 620 true, |
| 645 run_loop.QuitClosure())); | 621 run_loop.QuitClosure())); |
| 646 run_loop.Run(); | 622 run_loop.Run(); |
| 647 } | 623 } |
| 648 | 624 |
| 649 // The registration algo might not be far enough along to have | 625 // The registration algo might not be far enough along to have |
| 650 // stored the registration data, so it may not be findable | 626 // stored the registration data, so it may not be findable |
| 651 // at this point. | 627 // at this point. |
| 652 | 628 |
| 653 // Unregistering something should return true. | 629 // Unregistering something should return true. |
| 654 { | 630 { |
| 655 base::RunLoop run_loop; | 631 base::RunLoop run_loop; |
| 656 public_context()->UnregisterServiceWorker( | 632 public_context()->UnregisterServiceWorker( |
| 657 embedded_test_server()->GetURL("/*"), | 633 embedded_test_server()->GetURL("/*"), |
| 658 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, | 634 base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectResultAndRun, |
| 659 true, | 635 true, |
| 660 run_loop.QuitClosure())); | 636 run_loop.QuitClosure())); |
| 661 run_loop.Run(); | 637 run_loop.Run(); |
| 662 } | 638 } |
| 663 EXPECT_GE(1, CountRenderProcessHosts()) << "Unregistering doesn't stop the " | |
| 664 "workers eagerly, so their RPHs " | |
| 665 "can still be running."; | |
| 666 | 639 |
| 667 // Should not be able to find it. | 640 // Should not be able to find it. |
| 668 { | 641 { |
| 669 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 642 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 670 GURL script_url; | 643 GURL script_url; |
| 671 RunOnIOThread( | 644 RunOnIOThread( |
| 672 base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO, | 645 base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO, |
| 673 this, | 646 this, |
| 674 embedded_test_server()->GetURL("/service_worker/empty.html"), | 647 embedded_test_server()->GetURL("/service_worker/empty.html"), |
| 675 &status, | 648 &status, |
| 676 &script_url)); | 649 &script_url)); |
| 677 EXPECT_EQ(SERVICE_WORKER_ERROR_NOT_FOUND, status); | 650 EXPECT_EQ(SERVICE_WORKER_ERROR_NOT_FOUND, status); |
| 678 } | 651 } |
| 679 } | 652 } |
| 680 | 653 |
| 681 } // namespace content | 654 } // namespace content |
| OLD | NEW |