| 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/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "chrome/browser/ui/browser.h" | 10 #include "chrome/browser/ui/browser.h" |
| 11 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 11 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 12 #include "chrome/common/chrome_switches.h" | 12 #include "chrome/common/chrome_switches.h" |
| 13 #include "chrome/test/base/in_process_browser_test.h" | 13 #include "chrome/test/base/in_process_browser_test.h" |
| 14 #include "chrome/test/base/ui_test_utils.h" | 14 #include "chrome/test/base/ui_test_utils.h" |
| 15 #include "net/test/embedded_test_server/embedded_test_server.h" | 15 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 16 | 16 |
| 17 using IconPurpose = content::Manifest::Icon::IconPurpose; | 17 using IconPurpose = content::Manifest::Icon::IconPurpose; |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 const std::tuple<int, int, IconPurpose> kPrimaryIconParams{144, 144, | 21 const std::pair<int, IconPurpose> kPrimaryIconParams{144, IconPurpose::ANY}; |
| 22 IconPurpose::ANY}; | |
| 23 | 22 |
| 24 InstallableParams GetManifestParams() { | 23 InstallableParams GetManifestParams() { |
| 25 InstallableParams params; | 24 InstallableParams params; |
| 26 params.check_installable = false; | 25 params.check_installable = false; |
| 27 params.fetch_valid_primary_icon = false; | 26 params.fetch_valid_primary_icon = false; |
| 28 return params; | 27 return params; |
| 29 } | 28 } |
| 30 | 29 |
| 31 InstallableParams GetWebAppParams() { | 30 InstallableParams GetWebAppParams() { |
| 32 InstallableParams params = GetManifestParams(); | 31 InstallableParams params = GetManifestParams(); |
| 33 params.ideal_primary_icon_size_in_px = 144; | 32 params.ideal_primary_icon_size_in_px = 144; |
| 34 params.minimum_primary_icon_size_in_px = 144; | |
| 35 params.check_installable = true; | 33 params.check_installable = true; |
| 36 params.fetch_valid_primary_icon = true; | 34 params.fetch_valid_primary_icon = true; |
| 37 return params; | 35 return params; |
| 38 } | 36 } |
| 39 | 37 |
| 40 InstallableParams GetPrimaryIconParams() { | 38 InstallableParams GetPrimaryIconParams() { |
| 41 InstallableParams params = GetManifestParams(); | 39 InstallableParams params = GetManifestParams(); |
| 42 params.ideal_primary_icon_size_in_px = 144; | 40 params.ideal_primary_icon_size_in_px = 144; |
| 43 params.minimum_primary_icon_size_in_px = 144; | |
| 44 params.fetch_valid_primary_icon = true; | 41 params.fetch_valid_primary_icon = true; |
| 45 return params; | 42 return params; |
| 46 } | 43 } |
| 47 | 44 |
| 48 InstallableParams GetPrimaryIconAndBadgeIconParams() { | 45 InstallableParams GetPrimaryIconAndBadgeIconParams() { |
| 49 InstallableParams params = GetManifestParams(); | 46 InstallableParams params = GetManifestParams(); |
| 50 params.ideal_primary_icon_size_in_px = 144; | 47 params.ideal_primary_icon_size_in_px = 144; |
| 51 params.minimum_primary_icon_size_in_px = 144; | |
| 52 params.fetch_valid_primary_icon = true; | 48 params.fetch_valid_primary_icon = true; |
| 53 params.ideal_badge_icon_size_in_px = 72; | 49 params.ideal_badge_icon_size_in_px = 72; |
| 54 params.minimum_badge_icon_size_in_px = 72; | |
| 55 params.fetch_valid_badge_icon = true; | 50 params.fetch_valid_badge_icon = true; |
| 56 return params; | 51 return params; |
| 57 } | 52 } |
| 58 | 53 |
| 59 } // anonymous namespace | 54 } // anonymous namespace |
| 60 | 55 |
| 61 class CallbackTester { | 56 class CallbackTester { |
| 62 public: | 57 public: |
| 63 explicit CallbackTester(base::Closure quit_closure) | 58 explicit CallbackTester(base::Closure quit_closure) |
| 64 : quit_closure_(quit_closure) { } | 59 : quit_closure_(quit_closure) { } |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 | 374 |
| 380 // Ask for a different size primary icon. This should fail with | 375 // Ask for a different size primary icon. This should fail with |
| 381 // START_URL_NOT_VALID since we won't have a cached icon error. | 376 // START_URL_NOT_VALID since we won't have a cached icon error. |
| 382 { | 377 { |
| 383 base::RunLoop run_loop; | 378 base::RunLoop run_loop; |
| 384 std::unique_ptr<CallbackTester> tester( | 379 std::unique_ptr<CallbackTester> tester( |
| 385 new CallbackTester(run_loop.QuitClosure())); | 380 new CallbackTester(run_loop.QuitClosure())); |
| 386 | 381 |
| 387 InstallableParams params = GetWebAppParams(); | 382 InstallableParams params = GetWebAppParams(); |
| 388 params.ideal_primary_icon_size_in_px = 96; | 383 params.ideal_primary_icon_size_in_px = 96; |
| 389 params.minimum_primary_icon_size_in_px = 96; | |
| 390 RunInstallableManager(tester.get(), params); | 384 RunInstallableManager(tester.get(), params); |
| 391 run_loop.Run(); | 385 run_loop.Run(); |
| 392 | 386 |
| 393 EXPECT_FALSE(tester->manifest().IsEmpty()); | 387 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 394 EXPECT_FALSE(tester->manifest_url().is_empty()); | 388 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 395 EXPECT_TRUE(tester->manifest().prefer_related_applications); | 389 EXPECT_TRUE(tester->manifest().prefer_related_applications); |
| 396 | 390 |
| 397 EXPECT_TRUE(tester->primary_icon_url().is_empty()); | 391 EXPECT_TRUE(tester->primary_icon_url().is_empty()); |
| 398 EXPECT_EQ(nullptr, tester->primary_icon()); | 392 EXPECT_EQ(nullptr, tester->primary_icon()); |
| 399 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | 393 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 | 441 |
| 448 // Request an oversized badge icon. This should fetch only the manifest and | 442 // Request an oversized badge icon. This should fetch only the manifest and |
| 449 // the primary icon, and return no errors. | 443 // the primary icon, and return no errors. |
| 450 { | 444 { |
| 451 base::RunLoop run_loop; | 445 base::RunLoop run_loop; |
| 452 std::unique_ptr<CallbackTester> tester( | 446 std::unique_ptr<CallbackTester> tester( |
| 453 new CallbackTester(run_loop.QuitClosure())); | 447 new CallbackTester(run_loop.QuitClosure())); |
| 454 | 448 |
| 455 InstallableParams params = GetPrimaryIconAndBadgeIconParams(); | 449 InstallableParams params = GetPrimaryIconAndBadgeIconParams(); |
| 456 params.ideal_badge_icon_size_in_px = 2000; | 450 params.ideal_badge_icon_size_in_px = 2000; |
| 457 params.minimum_badge_icon_size_in_px = 2000; | |
| 458 RunInstallableManager(tester.get(), params); | 451 RunInstallableManager(tester.get(), params); |
| 459 run_loop.Run(); | 452 run_loop.Run(); |
| 460 | 453 |
| 461 EXPECT_FALSE(tester->manifest().IsEmpty()); | 454 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 462 EXPECT_FALSE(tester->manifest_url().is_empty()); | 455 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 463 | 456 |
| 464 EXPECT_FALSE(tester->primary_icon_url().is_empty()); | 457 EXPECT_FALSE(tester->primary_icon_url().is_empty()); |
| 465 EXPECT_NE(nullptr, tester->primary_icon()); | 458 EXPECT_NE(nullptr, tester->primary_icon()); |
| 466 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | 459 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 467 EXPECT_EQ(nullptr, tester->badge_icon()); | 460 EXPECT_EQ(nullptr, tester->badge_icon()); |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 std::unique_ptr<CallbackTester> tester( | 692 std::unique_ptr<CallbackTester> tester( |
| 700 new CallbackTester(run_loop.QuitClosure())); | 693 new CallbackTester(run_loop.QuitClosure())); |
| 701 | 694 |
| 702 NavigateAndRunInstallableManager(tester.get(), GetWebAppParams(), | 695 NavigateAndRunInstallableManager(tester.get(), GetWebAppParams(), |
| 703 "/banners/manifest_test_page.html"); | 696 "/banners/manifest_test_page.html"); |
| 704 run_loop.Run(); | 697 run_loop.Run(); |
| 705 | 698 |
| 706 EXPECT_FALSE(tester->manifest_url().is_empty()); | 699 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 707 EXPECT_FALSE(tester->manifest().IsEmpty()); | 700 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 708 EXPECT_TRUE(tester->is_installable()); | 701 EXPECT_TRUE(tester->is_installable()); |
| 709 EXPECT_FALSE(tester->primary_icon_url().is_empty()); | 702 EXPECT_EQ(embedded_test_server()->GetURL("/banners/launcher-icon-3x.png"), |
| 703 tester->primary_icon_url()); |
| 710 EXPECT_NE(nullptr, tester->primary_icon()); | 704 EXPECT_NE(nullptr, tester->primary_icon()); |
| 711 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | 705 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 712 EXPECT_EQ(nullptr, tester->badge_icon()); | 706 EXPECT_EQ(nullptr, tester->badge_icon()); |
| 713 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); | 707 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 714 } | 708 } |
| 715 | 709 |
| 716 { | 710 { |
| 717 base::RunLoop run_loop; | 711 base::RunLoop run_loop; |
| 718 std::unique_ptr<CallbackTester> tester( | 712 std::unique_ptr<CallbackTester> tester( |
| 719 new CallbackTester(run_loop.QuitClosure())); | 713 new CallbackTester(run_loop.QuitClosure())); |
| 720 | 714 |
| 721 // Dial up the primary icon size requirements to something that isn't | 715 // Change the requested primary icon size. A different primary icon should |
| 722 // available. This should now fail with NoIconMatchingRequirements. | 716 // be returned. |
| 723 InstallableParams params = GetWebAppParams(); | 717 InstallableParams params = GetWebAppParams(); |
| 724 params.ideal_primary_icon_size_in_px = 2000; | 718 params.ideal_primary_icon_size_in_px = 512; |
| 725 params.minimum_primary_icon_size_in_px = 2000; | |
| 726 RunInstallableManager(tester.get(), params); | 719 RunInstallableManager(tester.get(), params); |
| 727 run_loop.Run(); | 720 run_loop.Run(); |
| 728 | 721 |
| 729 EXPECT_FALSE(tester->manifest_url().is_empty()); | 722 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 730 EXPECT_FALSE(tester->manifest().IsEmpty()); | 723 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 731 EXPECT_TRUE(tester->is_installable()); | 724 EXPECT_TRUE(tester->is_installable()); |
| 732 EXPECT_TRUE(tester->primary_icon_url().is_empty()); | 725 EXPECT_EQ(embedded_test_server()->GetURL("/banners/image-512px.png"), |
| 733 EXPECT_EQ(nullptr, tester->primary_icon()); | 726 tester->primary_icon_url()); |
| 734 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | |
| 735 EXPECT_EQ(nullptr, tester->badge_icon()); | |
| 736 EXPECT_EQ(NO_ACCEPTABLE_ICON, tester->error_code()); | |
| 737 } | |
| 738 | |
| 739 // Navigate and verify the reverse: an overly large primary icon requested | |
| 740 // first fails, but a smaller primary icon requested second passes. | |
| 741 { | |
| 742 base::RunLoop run_loop; | |
| 743 std::unique_ptr<CallbackTester> tester( | |
| 744 new CallbackTester(run_loop.QuitClosure())); | |
| 745 | |
| 746 // This should fail with NoIconMatchingRequirements. | |
| 747 InstallableParams params = GetWebAppParams(); | |
| 748 params.ideal_primary_icon_size_in_px = 2000; | |
| 749 params.minimum_primary_icon_size_in_px = 2000; | |
| 750 NavigateAndRunInstallableManager(tester.get(), params, | |
| 751 "/banners/manifest_test_page.html"); | |
| 752 run_loop.Run(); | |
| 753 | |
| 754 EXPECT_FALSE(tester->manifest_url().is_empty()); | |
| 755 EXPECT_FALSE(tester->manifest().IsEmpty()); | |
| 756 EXPECT_TRUE(tester->is_installable()); | |
| 757 EXPECT_TRUE(tester->primary_icon_url().is_empty()); | |
| 758 EXPECT_EQ(nullptr, tester->primary_icon()); | |
| 759 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | |
| 760 EXPECT_EQ(nullptr, tester->badge_icon()); | |
| 761 EXPECT_EQ(NO_ACCEPTABLE_ICON, tester->error_code()); | |
| 762 } | |
| 763 | |
| 764 { | |
| 765 base::RunLoop run_loop; | |
| 766 std::unique_ptr<CallbackTester> tester( | |
| 767 new CallbackTester(run_loop.QuitClosure())); | |
| 768 RunInstallableManager(tester.get(), GetWebAppParams()); | |
| 769 | |
| 770 run_loop.Run(); | |
| 771 | |
| 772 // The smaller primary icon requirements should allow this to pass. | |
| 773 EXPECT_FALSE(tester->manifest_url().is_empty()); | |
| 774 EXPECT_FALSE(tester->manifest().IsEmpty()); | |
| 775 EXPECT_TRUE(tester->is_installable()); | |
| 776 EXPECT_FALSE(tester->primary_icon_url().is_empty()); | |
| 777 EXPECT_NE(nullptr, tester->primary_icon()); | 727 EXPECT_NE(nullptr, tester->primary_icon()); |
| 778 EXPECT_TRUE(tester->badge_icon_url().is_empty()); | 728 EXPECT_TRUE(tester->badge_icon_url().is_empty()); |
| 779 EXPECT_EQ(nullptr, tester->badge_icon()); | 729 EXPECT_EQ(nullptr, tester->badge_icon()); |
| 780 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); | 730 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 781 } | 731 } |
| 782 } | 732 } |
| 783 | 733 |
| 784 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, | 734 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, |
| 785 CheckNestedCallsToGetData) { | 735 CheckNestedCallsToGetData) { |
| 786 // Verify that we can call GetData while in a callback from GetData. | 736 // Verify that we can call GetData while in a callback from GetData. |
| 787 base::RunLoop run_loop; | 737 base::RunLoop run_loop; |
| 788 InstallableParams params = GetWebAppParams(); | 738 InstallableParams params = GetWebAppParams(); |
| 789 std::unique_ptr<NestedCallbackTester> tester( | 739 std::unique_ptr<NestedCallbackTester> tester( |
| 790 new NestedCallbackTester(GetManager(), params, run_loop.QuitClosure())); | 740 new NestedCallbackTester(GetManager(), params, run_loop.QuitClosure())); |
| 791 | 741 |
| 792 tester->Run(); | 742 tester->Run(); |
| 793 run_loop.Run(); | 743 run_loop.Run(); |
| 794 } | 744 } |
| OLD | NEW |