Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1179)

Side by Side Diff: chrome/browser/installable/installable_manager_browsertest.cc

Issue 2963473003: Don't block InstallableManager::GetData calls when waiting for a service worker. (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/installable/installable_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/memory/ptr_util.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 CheckLazyServiceWorkerPassesWhenWaiting) { 701 CheckLazyServiceWorkerPassesWhenWaiting) {
702 base::RunLoop tester_run_loop, sw_run_loop; 702 base::RunLoop tester_run_loop, sw_run_loop;
703 std::unique_ptr<CallbackTester> tester( 703 std::unique_ptr<CallbackTester> tester(
704 new CallbackTester(tester_run_loop.QuitClosure())); 704 new CallbackTester(tester_run_loop.QuitClosure()));
705 705
706 content::WebContents* web_contents = 706 content::WebContents* web_contents =
707 browser()->tab_strip_model()->GetActiveWebContents(); 707 browser()->tab_strip_model()->GetActiveWebContents();
708 auto manager = base::MakeUnique<LazyWorkerInstallableManager>( 708 auto manager = base::MakeUnique<LazyWorkerInstallableManager>(
709 web_contents, sw_run_loop.QuitClosure()); 709 web_contents, sw_run_loop.QuitClosure());
710 710
711 // Load a URL with no service worker. 711 {
712 GURL test_url = embedded_test_server()->GetURL( 712 // Load a URL with no service worker.
713 "/banners/manifest_no_service_worker.html"); 713 GURL test_url = embedded_test_server()->GetURL(
714 ui_test_utils::NavigateToURL(browser(), test_url); 714 "/banners/manifest_no_service_worker.html");
715 ui_test_utils::NavigateToURL(browser(), test_url);
715 716
716 // Kick off fetching the data. This should block on waiting for a worker. 717 // Kick off fetching the data. This should block on waiting for a worker.
717 manager->GetData(GetWebAppParams(), 718 manager->GetData(GetWebAppParams(),
718 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, 719 base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
719 base::Unretained(tester.get()))); 720 base::Unretained(tester.get())));
720 sw_run_loop.Run(); 721 sw_run_loop.Run();
benwells 2017/06/27 07:20:59 Unrelated to this change - do you need so many run
dominickn 2017/06/27 07:32:49 base::RunLoop has no reset method, and it can only
benwells 2017/06/27 08:31:01 Right, the pattern I've seen is to have a unique_p
722 }
721 723
722 // We should now be waiting for the service worker. 724 // We should now be waiting for the service worker.
725 EXPECT_TRUE(tester->manifest().IsEmpty());
723 EXPECT_FALSE(manager->manifest().IsEmpty()); 726 EXPECT_FALSE(manager->manifest().IsEmpty());
724 EXPECT_FALSE(manager->manifest_url().is_empty()); 727 EXPECT_FALSE(manager->manifest_url().is_empty());
725 EXPECT_FALSE(manager->is_installable()); 728 EXPECT_FALSE(manager->is_installable());
726 EXPECT_EQ(1u, manager->icons_.size()); 729 EXPECT_EQ(1u, manager->icons_.size());
727 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); 730 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty()));
728 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); 731 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams)));
729 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); 732 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
730 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); 733 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
731 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); 734 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
732 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); 735 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams)));
733 EXPECT_TRUE(manager->worker_waiting()); 736 EXPECT_TRUE(manager->tasks_.empty());
734 EXPECT_FALSE(manager->tasks_.empty()); 737 EXPECT_FALSE(manager->paused_tasks_.empty());
738
739 {
740 // Fetching just the manifest and icons should not hang while the other call
741 // is waiting for a worker.
742 base::RunLoop run_loop;
743 std::unique_ptr<CallbackTester> nested_tester(
744 new CallbackTester(run_loop.QuitClosure()));
745 manager->GetData(GetPrimaryIconParams(),
746 base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
747 base::Unretained(nested_tester.get())));
748 run_loop.Run();
749
750 EXPECT_FALSE(nested_tester->manifest().IsEmpty());
751 EXPECT_FALSE(nested_tester->manifest_url().is_empty());
752 EXPECT_FALSE(nested_tester->primary_icon_url().is_empty());
753 EXPECT_NE(nullptr, nested_tester->primary_icon());
754 EXPECT_FALSE(nested_tester->is_installable());
755 EXPECT_TRUE(nested_tester->badge_icon_url().is_empty());
756 EXPECT_EQ(nullptr, nested_tester->badge_icon());
757 EXPECT_EQ(NO_ERROR_DETECTED, nested_tester->error_code());
758 }
735 759
736 // Load the service worker. 760 // Load the service worker.
737 EXPECT_TRUE(content::ExecuteScript( 761 EXPECT_TRUE(content::ExecuteScript(
738 web_contents, "navigator.serviceWorker.register('service_worker.js');")); 762 web_contents, "navigator.serviceWorker.register('service_worker.js');"));
739 tester_run_loop.Run(); 763 tester_run_loop.Run();
740 764
741 // We should have passed now. 765 // We should have passed now.
742 EXPECT_FALSE(tester->manifest().IsEmpty()); 766 EXPECT_FALSE(tester->manifest().IsEmpty());
743 EXPECT_FALSE(tester->manifest_url().is_empty()); 767 EXPECT_FALSE(tester->manifest_url().is_empty());
744 EXPECT_FALSE(tester->primary_icon_url().is_empty()); 768 EXPECT_FALSE(tester->primary_icon_url().is_empty());
745 EXPECT_NE(nullptr, tester->primary_icon()); 769 EXPECT_NE(nullptr, tester->primary_icon());
746 EXPECT_TRUE(tester->is_installable()); 770 EXPECT_TRUE(tester->is_installable());
747 EXPECT_TRUE(tester->badge_icon_url().is_empty()); 771 EXPECT_TRUE(tester->badge_icon_url().is_empty());
748 EXPECT_EQ(nullptr, tester->badge_icon()); 772 EXPECT_EQ(nullptr, tester->badge_icon());
749 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); 773 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code());
750 EXPECT_EQ(manager->page_status_, 774 EXPECT_EQ(manager->page_status_,
751 InstallabilityCheckStatus::COMPLETE_PROGRESSIVE_WEB_APP); 775 InstallabilityCheckStatus::COMPLETE_PROGRESSIVE_WEB_APP);
752 776
753 // Verify internal state. 777 // Verify internal state.
754 EXPECT_FALSE(manager->manifest().IsEmpty()); 778 EXPECT_FALSE(manager->manifest().IsEmpty());
755 EXPECT_FALSE(manager->manifest_url().is_empty()); 779 EXPECT_FALSE(manager->manifest_url().is_empty());
756 EXPECT_TRUE(manager->is_installable()); 780 EXPECT_TRUE(manager->is_installable());
757 EXPECT_EQ(1u, manager->icons_.size()); 781 EXPECT_EQ(1u, manager->icons_.size());
758 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); 782 EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty()));
759 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); 783 EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams)));
760 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); 784 EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
761 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); 785 EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
762 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); 786 EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
763 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); 787 EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams)));
764 EXPECT_FALSE(manager->worker_waiting());
765 EXPECT_TRUE(manager->tasks_.empty()); 788 EXPECT_TRUE(manager->tasks_.empty());
789 EXPECT_TRUE(manager->paused_tasks_.empty());
766 } 790 }
767 791
768 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, 792 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
769 CheckLazyServiceWorkerNoFetchHandlerFails) { 793 CheckLazyServiceWorkerNoFetchHandlerFails) {
770 base::RunLoop tester_run_loop, sw_run_loop; 794 base::RunLoop tester_run_loop, sw_run_loop;
771 std::unique_ptr<CallbackTester> tester( 795 std::unique_ptr<CallbackTester> tester(
772 new CallbackTester(tester_run_loop.QuitClosure())); 796 new CallbackTester(tester_run_loop.QuitClosure()));
773 797
774 content::WebContents* web_contents = 798 content::WebContents* web_contents =
775 browser()->tab_strip_model()->GetActiveWebContents(); 799 browser()->tab_strip_model()->GetActiveWebContents();
776 auto manager = base::MakeUnique<LazyWorkerInstallableManager>( 800 auto manager = base::MakeUnique<LazyWorkerInstallableManager>(
777 web_contents, sw_run_loop.QuitClosure()); 801 web_contents, sw_run_loop.QuitClosure());
778 802
779 // Load a URL with no service worker. 803 // Load a URL with no service worker.
780 GURL test_url = embedded_test_server()->GetURL( 804 GURL test_url = embedded_test_server()->GetURL(
781 "/banners/manifest_no_service_worker.html"); 805 "/banners/manifest_no_service_worker.html");
782 ui_test_utils::NavigateToURL(browser(), test_url); 806 ui_test_utils::NavigateToURL(browser(), test_url);
783 807
784 // Kick off fetching the data. This should block on waiting for a worker. 808 // Kick off fetching the data. This should block on waiting for a worker.
785 manager->GetData(GetWebAppParams(), 809 manager->GetData(GetWebAppParams(),
786 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, 810 base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
787 base::Unretained(tester.get()))); 811 base::Unretained(tester.get())));
788 sw_run_loop.Run(); 812 sw_run_loop.Run();
789 813
790 // We should now be waiting for the service worker. 814 // We should now be waiting for the service worker.
791 EXPECT_TRUE(manager->worker_waiting()); 815 EXPECT_TRUE(manager->tasks_.empty());
792 EXPECT_FALSE(manager->tasks_.empty()); 816 EXPECT_FALSE(manager->paused_tasks_.empty());
793 817
794 // Load the service worker with no fetch handler. 818 // Load the service worker with no fetch handler.
795 EXPECT_TRUE(content::ExecuteScript(web_contents, 819 EXPECT_TRUE(content::ExecuteScript(web_contents,
796 "navigator.serviceWorker.register('" 820 "navigator.serviceWorker.register('"
797 "service_worker_no_fetch_handler.js');")); 821 "service_worker_no_fetch_handler.js');"));
798 tester_run_loop.Run(); 822 tester_run_loop.Run();
799 823
800 // We should fail the check. 824 // We should fail the check.
801 EXPECT_FALSE(tester->manifest().IsEmpty()); 825 EXPECT_FALSE(tester->manifest().IsEmpty());
802 EXPECT_FALSE(tester->manifest_url().is_empty()); 826 EXPECT_FALSE(tester->manifest_url().is_empty());
803 EXPECT_FALSE(tester->primary_icon_url().is_empty()); 827 EXPECT_FALSE(tester->primary_icon_url().is_empty());
804 EXPECT_NE(nullptr, tester->primary_icon()); 828 EXPECT_NE(nullptr, tester->primary_icon());
805 EXPECT_FALSE(tester->is_installable()); 829 EXPECT_FALSE(tester->is_installable());
806 EXPECT_TRUE(tester->badge_icon_url().is_empty()); 830 EXPECT_TRUE(tester->badge_icon_url().is_empty());
807 EXPECT_EQ(nullptr, tester->badge_icon()); 831 EXPECT_EQ(nullptr, tester->badge_icon());
808 EXPECT_EQ(NOT_OFFLINE_CAPABLE, tester->error_code()); 832 EXPECT_EQ(NOT_OFFLINE_CAPABLE, tester->error_code());
809 EXPECT_FALSE(manager->worker_waiting());
810 EXPECT_EQ(manager->page_status_, 833 EXPECT_EQ(manager->page_status_,
811 InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP); 834 InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP);
812 } 835 }
813 836
814 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, 837 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
815 CheckServiceWorkerErrorIsNotCached) { 838 CheckServiceWorkerErrorIsNotCached) {
816 content::WebContents* web_contents = 839 content::WebContents* web_contents =
817 browser()->tab_strip_model()->GetActiveWebContents(); 840 browser()->tab_strip_model()->GetActiveWebContents();
818 base::RunLoop sw_run_loop; 841 base::RunLoop sw_run_loop;
819 auto manager = base::MakeUnique<LazyWorkerInstallableManager>( 842 auto manager = base::MakeUnique<LazyWorkerInstallableManager>(
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 CheckNestedCallsToGetData) { 1060 CheckNestedCallsToGetData) {
1038 // Verify that we can call GetData while in a callback from GetData. 1061 // Verify that we can call GetData while in a callback from GetData.
1039 base::RunLoop run_loop; 1062 base::RunLoop run_loop;
1040 InstallableParams params = GetWebAppParams(); 1063 InstallableParams params = GetWebAppParams();
1041 std::unique_ptr<NestedCallbackTester> tester( 1064 std::unique_ptr<NestedCallbackTester> tester(
1042 new NestedCallbackTester(GetManager(), params, run_loop.QuitClosure())); 1065 new NestedCallbackTester(GetManager(), params, run_loop.QuitClosure()));
1043 1066
1044 tester->Run(); 1067 tester->Run();
1045 run_loop.Run(); 1068 run_loop.Run();
1046 } 1069 }
OLDNEW
« no previous file with comments | « chrome/browser/installable/installable_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698