| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "chrome/browser/installable/installable_manager.h" | 5 #include "chrome/browser/installable/installable_manager.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/memory/ptr_util.h" |
| 8 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "chrome/browser/ui/browser.h" | 11 #include "chrome/browser/ui/browser.h" |
| 11 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 12 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 12 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 13 #include "chrome/test/base/in_process_browser_test.h" | 14 #include "chrome/test/base/in_process_browser_test.h" |
| 14 #include "chrome/test/base/ui_test_utils.h" | 15 #include "chrome/test/base/ui_test_utils.h" |
| 16 #include "content/public/test/browser_test_utils.h" |
| 15 #include "net/test/embedded_test_server/embedded_test_server.h" | 17 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 16 | 18 |
| 17 using IconPurpose = content::Manifest::Icon::IconPurpose; | 19 using IconPurpose = content::Manifest::Icon::IconPurpose; |
| 18 | 20 |
| 19 namespace { | 21 namespace { |
| 20 | 22 |
| 21 const std::tuple<int, int, IconPurpose> kPrimaryIconParams{144, 144, | 23 const std::tuple<int, int, IconPurpose> kPrimaryIconParams{144, 144, |
| 22 IconPurpose::ANY}; | 24 IconPurpose::ANY}; |
| 23 | 25 |
| 24 InstallableParams GetManifestParams() { | 26 InstallableParams GetManifestParams() { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 51 params.minimum_primary_icon_size_in_px = 144; | 53 params.minimum_primary_icon_size_in_px = 144; |
| 52 params.fetch_valid_primary_icon = true; | 54 params.fetch_valid_primary_icon = true; |
| 53 params.ideal_badge_icon_size_in_px = 72; | 55 params.ideal_badge_icon_size_in_px = 72; |
| 54 params.minimum_badge_icon_size_in_px = 72; | 56 params.minimum_badge_icon_size_in_px = 72; |
| 55 params.fetch_valid_badge_icon = true; | 57 params.fetch_valid_badge_icon = true; |
| 56 return params; | 58 return params; |
| 57 } | 59 } |
| 58 | 60 |
| 59 } // anonymous namespace | 61 } // anonymous namespace |
| 60 | 62 |
| 63 // Used only for testing pages with no service workers. This class will dispatch |
| 64 // a RunLoop::QuitClosure when it begins waiting for a service worker to be |
| 65 // registered. |
| 66 class LazyWorkerInstallableManager : public InstallableManager { |
| 67 public: |
| 68 LazyWorkerInstallableManager(content::WebContents* web_contents, |
| 69 base::Closure quit_closure) |
| 70 : InstallableManager(web_contents), quit_closure_(quit_closure) {} |
| 71 ~LazyWorkerInstallableManager() override {} |
| 72 |
| 73 protected: |
| 74 void OnWaitingForServiceWorker() override { |
| 75 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_); |
| 76 }; |
| 77 |
| 78 private: |
| 79 base::Closure quit_closure_; |
| 80 }; |
| 81 |
| 61 class CallbackTester { | 82 class CallbackTester { |
| 62 public: | 83 public: |
| 63 explicit CallbackTester(base::Closure quit_closure) | 84 explicit CallbackTester(base::Closure quit_closure) |
| 64 : quit_closure_(quit_closure) {} | 85 : quit_closure_(quit_closure) {} |
| 65 | 86 |
| 66 void OnDidFinishInstallableCheck(const InstallableData& data) { | 87 void OnDidFinishInstallableCheck(const InstallableData& data) { |
| 67 error_code_ = data.error_code; | 88 error_code_ = data.error_code; |
| 68 manifest_url_ = data.manifest_url; | 89 manifest_url_ = data.manifest_url; |
| 69 manifest_ = data.manifest; | 90 manifest_ = data.manifest; |
| 70 primary_icon_url_ = data.primary_icon_url; | 91 primary_icon_url_ = data.primary_icon_url; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 ManagerBeginsInEmptyState) { | 228 ManagerBeginsInEmptyState) { |
| 208 // Ensure that the InstallableManager starts off with everything null. | 229 // Ensure that the InstallableManager starts off with everything null. |
| 209 InstallableManager* manager = GetManager(); | 230 InstallableManager* manager = GetManager(); |
| 210 | 231 |
| 211 EXPECT_TRUE(manager->manifest().IsEmpty()); | 232 EXPECT_TRUE(manager->manifest().IsEmpty()); |
| 212 EXPECT_TRUE(manager->manifest_url().is_empty()); | 233 EXPECT_TRUE(manager->manifest_url().is_empty()); |
| 213 EXPECT_TRUE(manager->icons_.empty()); | 234 EXPECT_TRUE(manager->icons_.empty()); |
| 214 EXPECT_FALSE(manager->is_installable()); | 235 EXPECT_FALSE(manager->is_installable()); |
| 215 | 236 |
| 216 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); | 237 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); |
| 217 EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); | 238 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); |
| 239 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); |
| 218 EXPECT_TRUE(manager->tasks_.empty()); | 240 EXPECT_TRUE(manager->tasks_.empty()); |
| 219 } | 241 } |
| 220 | 242 |
| 221 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckNoManifest) { | 243 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckNoManifest) { |
| 222 // Ensure that a page with no manifest returns the appropriate error and with | 244 // Ensure that a page with no manifest returns the appropriate error and with |
| 223 // null fields for everything. | 245 // null fields for everything. |
| 224 base::RunLoop run_loop; | 246 base::RunLoop run_loop; |
| 225 std::unique_ptr<CallbackTester> tester( | 247 std::unique_ptr<CallbackTester> tester( |
| 226 new CallbackTester(run_loop.QuitClosure())); | 248 new CallbackTester(run_loop.QuitClosure())); |
| 227 | 249 |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 // Verify that the returned state matches manager internal state. | 558 // Verify that the returned state matches manager internal state. |
| 537 InstallableManager* manager = GetManager(); | 559 InstallableManager* manager = GetManager(); |
| 538 | 560 |
| 539 EXPECT_FALSE(manager->manifest().IsEmpty()); | 561 EXPECT_FALSE(manager->manifest().IsEmpty()); |
| 540 EXPECT_FALSE(manager->manifest_url().is_empty()); | 562 EXPECT_FALSE(manager->manifest_url().is_empty()); |
| 541 EXPECT_TRUE(manager->is_installable()); | 563 EXPECT_TRUE(manager->is_installable()); |
| 542 EXPECT_EQ(1u, manager->icons_.size()); | 564 EXPECT_EQ(1u, manager->icons_.size()); |
| 543 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); | 565 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); |
| 544 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); | 566 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); |
| 545 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); | 567 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); |
| 546 EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); | 568 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); |
| 569 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); |
| 547 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); | 570 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); |
| 548 EXPECT_TRUE(manager->tasks_.empty()); | 571 EXPECT_TRUE(manager->tasks_.empty()); |
| 549 } | 572 } |
| 550 | 573 |
| 551 // Request everything except badge icon again without navigating away. This | 574 // Request everything except badge icon again without navigating away. This |
| 552 // should work fine. | 575 // should work fine. |
| 553 { | 576 { |
| 554 base::RunLoop run_loop; | 577 base::RunLoop run_loop; |
| 555 std::unique_ptr<CallbackTester> tester( | 578 std::unique_ptr<CallbackTester> tester( |
| 556 new CallbackTester(run_loop.QuitClosure())); | 579 new CallbackTester(run_loop.QuitClosure())); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 572 // Verify that the returned state matches manager internal state. | 595 // Verify that the returned state matches manager internal state. |
| 573 InstallableManager* manager = GetManager(); | 596 InstallableManager* manager = GetManager(); |
| 574 | 597 |
| 575 EXPECT_FALSE(manager->manifest().IsEmpty()); | 598 EXPECT_FALSE(manager->manifest().IsEmpty()); |
| 576 EXPECT_FALSE(manager->manifest_url().is_empty()); | 599 EXPECT_FALSE(manager->manifest_url().is_empty()); |
| 577 EXPECT_TRUE(manager->is_installable()); | 600 EXPECT_TRUE(manager->is_installable()); |
| 578 EXPECT_EQ(1u, manager->icons_.size()); | 601 EXPECT_EQ(1u, manager->icons_.size()); |
| 579 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); | 602 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); |
| 580 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); | 603 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); |
| 581 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); | 604 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); |
| 582 EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); | 605 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); |
| 606 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); |
| 583 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); | 607 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); |
| 584 EXPECT_TRUE(manager->tasks_.empty()); | 608 EXPECT_TRUE(manager->tasks_.empty()); |
| 585 } | 609 } |
| 586 | 610 |
| 587 { | 611 { |
| 588 // Check that a subsequent navigation resets state. | 612 // Check that a subsequent navigation resets state. |
| 589 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); | 613 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); |
| 590 InstallableManager* manager = GetManager(); | 614 InstallableManager* manager = GetManager(); |
| 591 | 615 |
| 592 EXPECT_TRUE(manager->manifest().IsEmpty()); | 616 EXPECT_TRUE(manager->manifest().IsEmpty()); |
| 593 EXPECT_TRUE(manager->manifest_url().is_empty()); | 617 EXPECT_TRUE(manager->manifest_url().is_empty()); |
| 594 EXPECT_FALSE(manager->is_installable()); | 618 EXPECT_FALSE(manager->is_installable()); |
| 595 EXPECT_TRUE(manager->icons_.empty()); | 619 EXPECT_TRUE(manager->icons_.empty()); |
| 596 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); | 620 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); |
| 597 EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); | 621 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); |
| 622 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); |
| 598 EXPECT_TRUE(manager->tasks_.empty()); | 623 EXPECT_TRUE(manager->tasks_.empty()); |
| 599 } | 624 } |
| 600 } | 625 } |
| 601 | 626 |
| 602 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckWebappInIframe) { | 627 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckWebappInIframe) { |
| 603 base::RunLoop run_loop; | 628 base::RunLoop run_loop; |
| 604 std::unique_ptr<CallbackTester> tester( | 629 std::unique_ptr<CallbackTester> tester( |
| 605 new CallbackTester(run_loop.QuitClosure())); | 630 new CallbackTester(run_loop.QuitClosure())); |
| 606 | 631 |
| 607 NavigateAndRunInstallableManager(tester.get(), GetWebAppParams(), | 632 NavigateAndRunInstallableManager(tester.get(), GetWebAppParams(), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 | 665 |
| 641 EXPECT_TRUE(tester->primary_icon_url().is_empty()); | 666 EXPECT_TRUE(tester->primary_icon_url().is_empty()); |
| 642 EXPECT_EQ(nullptr, tester->primary_icon()); | 667 EXPECT_EQ(nullptr, tester->primary_icon()); |
| 643 EXPECT_FALSE(tester->is_installable()); | 668 EXPECT_FALSE(tester->is_installable()); |
| 644 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | 669 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 645 EXPECT_EQ(nullptr, tester->badge_icon()); | 670 EXPECT_EQ(nullptr, tester->badge_icon()); |
| 646 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); | 671 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 647 EXPECT_EQ(GetStatus(), InstallabilityCheckStatus::NOT_COMPLETED); | 672 EXPECT_EQ(GetStatus(), InstallabilityCheckStatus::NOT_COMPLETED); |
| 648 } | 673 } |
| 649 | 674 |
| 650 // Fetch the full criteria should fail. | 675 // Fetching the full criteria should fail if we don't wait for the worker. |
| 651 { | 676 { |
| 652 base::RunLoop run_loop; | 677 base::RunLoop run_loop; |
| 653 std::unique_ptr<CallbackTester> tester( | 678 std::unique_ptr<CallbackTester> tester( |
| 654 new CallbackTester(run_loop.QuitClosure())); | 679 new CallbackTester(run_loop.QuitClosure())); |
| 655 | 680 |
| 656 RunInstallableManager(tester.get(), GetWebAppParams()); | 681 InstallableParams params = GetWebAppParams(); |
| 682 params.wait_for_worker = false; |
| 683 RunInstallableManager(tester.get(), params); |
| 657 run_loop.Run(); | 684 run_loop.Run(); |
| 658 | 685 |
| 659 EXPECT_FALSE(tester->manifest().IsEmpty()); | 686 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 660 EXPECT_FALSE(tester->manifest_url().is_empty()); | 687 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 661 | 688 |
| 662 EXPECT_FALSE(tester->primary_icon_url().is_empty()); | 689 EXPECT_FALSE(tester->primary_icon_url().is_empty()); |
| 663 EXPECT_NE(nullptr, tester->primary_icon()); | 690 EXPECT_NE(nullptr, tester->primary_icon()); |
| 664 EXPECT_FALSE(tester->is_installable()); | 691 EXPECT_FALSE(tester->is_installable()); |
| 665 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | 692 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 666 EXPECT_EQ(nullptr, tester->badge_icon()); | 693 EXPECT_EQ(nullptr, tester->badge_icon()); |
| 667 EXPECT_EQ(NO_MATCHING_SERVICE_WORKER, tester->error_code()); | 694 EXPECT_EQ(NO_MATCHING_SERVICE_WORKER, tester->error_code()); |
| 668 EXPECT_EQ(GetStatus(), | 695 EXPECT_EQ(GetStatus(), |
| 669 InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP); | 696 InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP); |
| 670 } | 697 } |
| 671 } | 698 } |
| 672 | 699 |
| 673 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, | 700 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, |
| 701 CheckLazyServiceWorkerPassesWhenWaiting) { |
| 702 base::RunLoop tester_run_loop, sw_run_loop; |
| 703 std::unique_ptr<CallbackTester> tester( |
| 704 new CallbackTester(tester_run_loop.QuitClosure())); |
| 705 |
| 706 content::WebContents* web_contents = |
| 707 browser()->tab_strip_model()->GetActiveWebContents(); |
| 708 auto manager = base::MakeUnique<LazyWorkerInstallableManager>( |
| 709 web_contents, sw_run_loop.QuitClosure()); |
| 710 |
| 711 // Load a URL with no service worker. |
| 712 GURL test_url = embedded_test_server()->GetURL( |
| 713 "/banners/manifest_no_service_worker.html"); |
| 714 ui_test_utils::NavigateToURL(browser(), test_url); |
| 715 |
| 716 // Kick off fetching the data. This should block on waiting for a worker. |
| 717 manager->GetData(GetWebAppParams(), |
| 718 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, |
| 719 base::Unretained(tester.get()))); |
| 720 sw_run_loop.Run(); |
| 721 |
| 722 // We should now be waiting for the service worker. |
| 723 EXPECT_FALSE(manager->manifest().IsEmpty()); |
| 724 EXPECT_FALSE(manager->manifest_url().is_empty()); |
| 725 EXPECT_FALSE(manager->is_installable()); |
| 726 EXPECT_EQ(1u, manager->icons_.size()); |
| 727 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); |
| 728 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); |
| 729 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); |
| 730 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); |
| 731 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); |
| 732 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); |
| 733 EXPECT_TRUE(manager->worker_waiting()); |
| 734 EXPECT_FALSE(manager->tasks_.empty()); |
| 735 |
| 736 // Load the service worker. |
| 737 EXPECT_TRUE(content::ExecuteScript( |
| 738 web_contents, "navigator.serviceWorker.register('service_worker.js');")); |
| 739 tester_run_loop.Run(); |
| 740 |
| 741 // We should have passed now. |
| 742 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 743 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 744 EXPECT_FALSE(tester->primary_icon_url().is_empty()); |
| 745 EXPECT_NE(nullptr, tester->primary_icon()); |
| 746 EXPECT_TRUE(tester->is_installable()); |
| 747 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 748 EXPECT_EQ(nullptr, tester->badge_icon()); |
| 749 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 750 EXPECT_EQ(manager->page_status_, |
| 751 InstallabilityCheckStatus::COMPLETE_PROGRESSIVE_WEB_APP); |
| 752 |
| 753 // Verify internal state. |
| 754 EXPECT_FALSE(manager->manifest().IsEmpty()); |
| 755 EXPECT_FALSE(manager->manifest_url().is_empty()); |
| 756 EXPECT_TRUE(manager->is_installable()); |
| 757 EXPECT_EQ(1u, manager->icons_.size()); |
| 758 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); |
| 759 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); |
| 760 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); |
| 761 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); |
| 762 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); |
| 763 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); |
| 764 EXPECT_FALSE(manager->worker_waiting()); |
| 765 EXPECT_TRUE(manager->tasks_.empty()); |
| 766 } |
| 767 |
| 768 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, |
| 769 CheckLazyServiceWorkerNoFetchHandlerFails) { |
| 770 base::RunLoop tester_run_loop, sw_run_loop; |
| 771 std::unique_ptr<CallbackTester> tester( |
| 772 new CallbackTester(tester_run_loop.QuitClosure())); |
| 773 |
| 774 content::WebContents* web_contents = |
| 775 browser()->tab_strip_model()->GetActiveWebContents(); |
| 776 auto manager = base::MakeUnique<LazyWorkerInstallableManager>( |
| 777 web_contents, sw_run_loop.QuitClosure()); |
| 778 |
| 779 // Load a URL with no service worker. |
| 780 GURL test_url = embedded_test_server()->GetURL( |
| 781 "/banners/manifest_no_service_worker.html"); |
| 782 ui_test_utils::NavigateToURL(browser(), test_url); |
| 783 |
| 784 // Kick off fetching the data. This should block on waiting for a worker. |
| 785 manager->GetData(GetWebAppParams(), |
| 786 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, |
| 787 base::Unretained(tester.get()))); |
| 788 sw_run_loop.Run(); |
| 789 |
| 790 // We should now be waiting for the service worker. |
| 791 EXPECT_TRUE(manager->worker_waiting()); |
| 792 EXPECT_FALSE(manager->tasks_.empty()); |
| 793 |
| 794 // Load the service worker with no fetch handler. |
| 795 EXPECT_TRUE(content::ExecuteScript(web_contents, |
| 796 "navigator.serviceWorker.register('" |
| 797 "service_worker_no_fetch_handler.js');")); |
| 798 tester_run_loop.Run(); |
| 799 |
| 800 // We should fail the check. |
| 801 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 802 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 803 EXPECT_FALSE(tester->primary_icon_url().is_empty()); |
| 804 EXPECT_NE(nullptr, tester->primary_icon()); |
| 805 EXPECT_FALSE(tester->is_installable()); |
| 806 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 807 EXPECT_EQ(nullptr, tester->badge_icon()); |
| 808 EXPECT_EQ(NOT_OFFLINE_CAPABLE, tester->error_code()); |
| 809 EXPECT_FALSE(manager->worker_waiting()); |
| 810 EXPECT_EQ(manager->page_status_, |
| 811 InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP); |
| 812 } |
| 813 |
| 814 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, |
| 815 CheckServiceWorkerErrorIsNotCached) { |
| 816 content::WebContents* web_contents = |
| 817 browser()->tab_strip_model()->GetActiveWebContents(); |
| 818 base::RunLoop sw_run_loop; |
| 819 auto manager = base::MakeUnique<LazyWorkerInstallableManager>( |
| 820 web_contents, sw_run_loop.QuitClosure()); |
| 821 |
| 822 // Load a URL with no service worker. |
| 823 GURL test_url = embedded_test_server()->GetURL( |
| 824 "/banners/manifest_no_service_worker.html"); |
| 825 ui_test_utils::NavigateToURL(browser(), test_url); |
| 826 |
| 827 { |
| 828 base::RunLoop tester_run_loop; |
| 829 std::unique_ptr<CallbackTester> tester( |
| 830 new CallbackTester(tester_run_loop.QuitClosure())); |
| 831 |
| 832 InstallableParams params = GetWebAppParams(); |
| 833 params.wait_for_worker = false; |
| 834 manager->GetData(params, |
| 835 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, |
| 836 base::Unretained(tester.get()))); |
| 837 tester_run_loop.Run(); |
| 838 |
| 839 // We should have returned with an error. |
| 840 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 841 EXPECT_FALSE(tester->is_installable()); |
| 842 EXPECT_EQ(NO_MATCHING_SERVICE_WORKER, tester->error_code()); |
| 843 } |
| 844 |
| 845 { |
| 846 base::RunLoop tester_run_loop; |
| 847 std::unique_ptr<CallbackTester> tester( |
| 848 new CallbackTester(tester_run_loop.QuitClosure())); |
| 849 |
| 850 InstallableParams params = GetWebAppParams(); |
| 851 params.wait_for_worker = true; |
| 852 manager->GetData(params, |
| 853 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, |
| 854 base::Unretained(tester.get()))); |
| 855 sw_run_loop.Run(); |
| 856 |
| 857 EXPECT_TRUE(content::ExecuteScript( |
| 858 web_contents, |
| 859 "navigator.serviceWorker.register('service_worker.js');")); |
| 860 tester_run_loop.Run(); |
| 861 |
| 862 // The callback should tell us that the page is installable |
| 863 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 864 EXPECT_TRUE(tester->is_installable()); |
| 865 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 866 } |
| 867 } |
| 868 |
| 869 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, |
| 674 CheckPageWithNoServiceWorkerFetchHandler) { | 870 CheckPageWithNoServiceWorkerFetchHandler) { |
| 675 base::RunLoop run_loop; | 871 base::RunLoop run_loop; |
| 676 std::unique_ptr<CallbackTester> tester( | 872 std::unique_ptr<CallbackTester> tester( |
| 677 new CallbackTester(run_loop.QuitClosure())); | 873 new CallbackTester(run_loop.QuitClosure())); |
| 678 | 874 |
| 679 NavigateAndRunInstallableManager( | 875 NavigateAndRunInstallableManager( |
| 680 tester.get(), GetWebAppParams(), | 876 tester.get(), GetWebAppParams(), |
| 681 "/banners/no_sw_fetch_handler_test_page.html"); | 877 "/banners/no_sw_fetch_handler_test_page.html"); |
| 682 | 878 |
| 683 RunInstallableManager(tester.get(), GetWebAppParams()); | 879 RunInstallableManager(tester.get(), GetWebAppParams()); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 CheckNestedCallsToGetData) { | 1037 CheckNestedCallsToGetData) { |
| 842 // Verify that we can call GetData while in a callback from GetData. | 1038 // Verify that we can call GetData while in a callback from GetData. |
| 843 base::RunLoop run_loop; | 1039 base::RunLoop run_loop; |
| 844 InstallableParams params = GetWebAppParams(); | 1040 InstallableParams params = GetWebAppParams(); |
| 845 std::unique_ptr<NestedCallbackTester> tester( | 1041 std::unique_ptr<NestedCallbackTester> tester( |
| 846 new NestedCallbackTester(GetManager(), params, run_loop.QuitClosure())); | 1042 new NestedCallbackTester(GetManager(), params, run_loop.QuitClosure())); |
| 847 | 1043 |
| 848 tester->Run(); | 1044 tester->Run(); |
| 849 run_loop.Run(); | 1045 run_loop.Run(); |
| 850 } | 1046 } |
| OLD | NEW |