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

Side by Side Diff: chrome/browser/prerender/prerender_browsertest.cc

Issue 10198040: New link rel=prerender api, using WebKit::WebPrerenderingPlatform (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 80 columns Created 8 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <deque> 5 #include <deque>
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/stringprintf.h" 10 #include "base/stringprintf.h"
11 #include "base/test/test_timeouts.h" 11 #include "base/test/test_timeouts.h"
12 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
13 #include "base/values.h" 13 #include "base/values.h"
14 #include "chrome/browser/browsing_data_remover.h" 14 #include "chrome/browser/browsing_data_remover.h"
15 #include "chrome/browser/content_settings/host_content_settings_map.h" 15 #include "chrome/browser/content_settings/host_content_settings_map.h"
16 #include "chrome/browser/favicon/favicon_tab_helper.h" 16 #include "chrome/browser/favicon/favicon_tab_helper.h"
17 #include "chrome/browser/prefs/pref_service.h" 17 #include "chrome/browser/prefs/pref_service.h"
18 #include "chrome/browser/prerender/prerender_contents.h" 18 #include "chrome/browser/prerender/prerender_contents.h"
19 #include "chrome/browser/prerender/prerender_link_manager.h"
20 #include "chrome/browser/prerender/prerender_link_manager_factory.h"
19 #include "chrome/browser/prerender/prerender_manager.h" 21 #include "chrome/browser/prerender/prerender_manager.h"
20 #include "chrome/browser/prerender/prerender_manager_factory.h" 22 #include "chrome/browser/prerender/prerender_manager_factory.h"
21 #include "chrome/browser/profiles/profile.h" 23 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/safe_browsing/safe_browsing_service.h" 24 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
23 #include "chrome/browser/task_manager/task_manager.h" 25 #include "chrome/browser/task_manager/task_manager.h"
24 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" 26 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
25 #include "chrome/browser/ui/browser.h" 27 #include "chrome/browser/ui/browser.h"
26 #include "chrome/browser/ui/browser_list.h" 28 #include "chrome/browser/ui/browser_list.h"
27 #include "chrome/browser/ui/browser_window.h" 29 #include "chrome/browser/ui/browser_window.h"
28 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 30 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 217
216 virtual void DidStopLoading() OVERRIDE { 218 virtual void DidStopLoading() OVERRIDE {
217 PrerenderContents::DidStopLoading(); 219 PrerenderContents::DidStopLoading();
218 ++number_of_loads_; 220 ++number_of_loads_;
219 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status_) && 221 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status_) &&
220 number_of_loads_ == expected_number_of_loads_) { 222 number_of_loads_ == expected_number_of_loads_) {
221 MessageLoopForUI::current()->Quit(); 223 MessageLoopForUI::current()->Quit();
222 } 224 }
223 } 225 }
224 226
225 virtual void AddPendingPrerender(Origin origin, 227 virtual void AddPendingPrerender(const GURL& url,
226 const GURL& url, 228 const content::Referrer& referrer,
227 const content::Referrer& referrer) OVERRIDE { 229 const gfx::Size& size) OVERRIDE {
228 PrerenderContents::AddPendingPrerender(origin, url, referrer); 230 PrerenderContents::AddPendingPrerender(url, referrer, size);
229 if (expected_pending_prerenders_ > 0 && 231 if (expected_pending_prerenders_ > 0 &&
230 pending_prerender_list()->size() == expected_pending_prerenders_) { 232 pending_prerender_list()->size() == expected_pending_prerenders_) {
231 MessageLoop::current()->Quit(); 233 MessageLoop::current()->Quit();
232 } 234 }
233 } 235 }
234 236
235 virtual WebContents* CreateWebContents( 237 virtual WebContents* CreateWebContents(
236 content::SessionStorageNamespace* session_storage_namespace) OVERRIDE { 238 content::SessionStorageNamespace* session_storage_namespace) OVERRIDE {
237 WebContents* web_contents = PrerenderContents::CreateWebContents( 239 WebContents* web_contents = PrerenderContents::CreateWebContents(
238 session_storage_namespace); 240 session_storage_namespace);
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 OpenDestURLWithJSImpl("MetaClick()"); 619 OpenDestURLWithJSImpl("MetaClick()");
618 #else 620 #else
619 OpenDestURLWithJSImpl("CtrlClick()"); 621 OpenDestURLWithJSImpl("CtrlClick()");
620 #endif 622 #endif
621 } 623 }
622 624
623 void OpenDestURLViaWindowOpen() const { 625 void OpenDestURLViaWindowOpen() const {
624 OpenDestURLWithJSImpl("WindowOpen()"); 626 OpenDestURLWithJSImpl("WindowOpen()");
625 } 627 }
626 628
629 void RemoveLinkElementsAndNavigate() const {
630 OpenDestURLWithJSImpl("RemoveLinkElementsAndNavigate()");
631 }
632
627 void ClickToNextPageAfterPrerender(Browser* browser) { 633 void ClickToNextPageAfterPrerender(Browser* browser) {
628 ui_test_utils::WindowedNotificationObserver new_page_observer( 634 ui_test_utils::WindowedNotificationObserver new_page_observer(
629 content::NOTIFICATION_NAV_ENTRY_COMMITTED, 635 content::NOTIFICATION_NAV_ENTRY_COMMITTED,
630 content::NotificationService::AllSources()); 636 content::NotificationService::AllSources());
631 RenderViewHost* render_view_host = 637 RenderViewHost* render_view_host =
632 browser->GetSelectedWebContents()->GetRenderViewHost(); 638 browser->GetSelectedWebContents()->GetRenderViewHost();
633 render_view_host->ExecuteJavascriptInWebFrame( 639 render_view_host->ExecuteJavascriptInWebFrame(
634 string16(), 640 string16(),
635 ASCIIToUTF16("ClickOpenLink()")); 641 ASCIIToUTF16("ClickOpenLink()"));
636 new_page_observer.Wait(); 642 new_page_observer.Wait();
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 } 726 }
721 727
722 PrerenderManager* GetPrerenderManager() const { 728 PrerenderManager* GetPrerenderManager() const {
723 Profile* profile = 729 Profile* profile =
724 current_browser()->GetSelectedTabContentsWrapper()->profile(); 730 current_browser()->GetSelectedTabContentsWrapper()->profile();
725 PrerenderManager* prerender_manager = 731 PrerenderManager* prerender_manager =
726 PrerenderManagerFactory::GetForProfile(profile); 732 PrerenderManagerFactory::GetForProfile(profile);
727 return prerender_manager; 733 return prerender_manager;
728 } 734 }
729 735
736 const PrerenderLinkManager* GetPrerenderLinkManager() const {
737 Profile* profile =
738 current_browser()->GetSelectedTabContentsWrapper()->profile();
739 PrerenderLinkManager* prerender_link_manager =
740 PrerenderLinkManagerFactory::GetForProfile(profile);
741 return prerender_link_manager;
742 }
743
744 bool IsEmptyPrerenderLinkManager() const {
745 return GetPrerenderLinkManager()->IsEmpty();
746 }
747
730 // Returns length of |prerender_manager_|'s history, or -1 on failure. 748 // Returns length of |prerender_manager_|'s history, or -1 on failure.
731 int GetHistoryLength() const { 749 int GetHistoryLength() const {
732 scoped_ptr<DictionaryValue> prerender_dict( 750 scoped_ptr<DictionaryValue> prerender_dict(
733 static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue())); 751 static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue()));
734 if (!prerender_dict.get()) 752 if (!prerender_dict.get())
735 return -1; 753 return -1;
736 ListValue* history_list; 754 ListValue* history_list;
737 if (!prerender_dict->GetList("history", &history_list)) 755 if (!prerender_dict->GetList("history", &history_list))
738 return -1; 756 return -1;
739 return static_cast<int>(history_list->GetSize()); 757 return static_cast<int>(history_list->GetSize());
740 } 758 }
741 759
742 #if defined(ENABLE_SAFE_BROWSING) 760 #if defined(ENABLE_SAFE_BROWSING)
743 FakeSafeBrowsingService* GetSafeBrowsingService() { 761 FakeSafeBrowsingService* GetSafeBrowsingService() {
744 return safe_browsing_factory_->most_recent_service(); 762 return safe_browsing_factory_->most_recent_service();
745 } 763 }
746 #endif 764 #endif
747 765
748 TestPrerenderContents* GetPrerenderContents() const { 766 TestPrerenderContents* GetPrerenderContents() const {
749 return static_cast<TestPrerenderContents*>( 767 return static_cast<TestPrerenderContents*>(
750 GetPrerenderManager()->FindEntry(dest_url_)); 768 GetPrerenderManager()->FindEntry(dest_url_));
751 } 769 }
752 770
753 void set_loader_path(const std::string& path) { 771 void set_loader_path(const std::string& path) {
754 loader_path_ = path; 772 loader_path_ = path;
755 } 773 }
756 774
775 void set_loader_query_and_fragment(const std::string& query_and_fragment) {
776 loader_query_and_fragment_ = query_and_fragment;
777 }
778
757 GURL GetCrossDomainTestUrl(const std::string& path) { 779 GURL GetCrossDomainTestUrl(const std::string& path) {
758 static const std::string secondary_domain = "www.foo.com"; 780 static const std::string secondary_domain = "www.foo.com";
759 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 781 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
760 std::string url_str(base::StringPrintf( 782 std::string url_str(base::StringPrintf(
761 "http://%s:%d/%s", 783 "http://%s:%d/%s",
762 secondary_domain.c_str(), 784 secondary_domain.c_str(),
763 test_server()->host_port_pair().port(), 785 test_server()->host_port_pair().port(),
764 path.c_str())); 786 path.c_str()));
765 return GURL(url_str); 787 return GURL(url_str);
766 } 788 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 net::TestServer* src_server = test_server(); 829 net::TestServer* src_server = test_server();
808 scoped_ptr<net::TestServer> https_src_server; 830 scoped_ptr<net::TestServer> https_src_server;
809 if (use_https_src_server_) { 831 if (use_https_src_server_) {
810 https_src_server.reset( 832 https_src_server.reset(
811 new net::TestServer(net::TestServer::TYPE_HTTPS, 833 new net::TestServer(net::TestServer::TYPE_HTTPS,
812 net::TestServer::kLocalhost, 834 net::TestServer::kLocalhost,
813 FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 835 FilePath(FILE_PATH_LITERAL("chrome/test/data"))));
814 ASSERT_TRUE(https_src_server->Start()); 836 ASSERT_TRUE(https_src_server->Start());
815 src_server = https_src_server.get(); 837 src_server = https_src_server.get();
816 } 838 }
817 GURL src_url = src_server->GetURL(replacement_path); 839 GURL loader_url = src_server->GetURL(replacement_path +
840 loader_query_and_fragment_);
818 841
819 PrerenderManager* prerender_manager = GetPrerenderManager(); 842 PrerenderManager* prerender_manager = GetPrerenderManager();
820 ASSERT_TRUE(prerender_manager); 843 ASSERT_TRUE(prerender_manager);
821 prerender_manager->mutable_config().rate_limit_enabled = false; 844 prerender_manager->mutable_config().rate_limit_enabled = false;
822 prerender_manager->mutable_config().https_allowed = true; 845 prerender_manager->mutable_config().https_allowed = true;
823 ASSERT_TRUE(prerender_contents_factory_ == NULL); 846 ASSERT_TRUE(prerender_contents_factory_ == NULL);
824 prerender_contents_factory_ = 847 prerender_contents_factory_ =
825 new WaitForLoadPrerenderContentsFactory( 848 new WaitForLoadPrerenderContentsFactory(
826 expected_number_of_loads, 849 expected_number_of_loads,
827 expected_final_status_queue, 850 expected_final_status_queue,
828 prerender_should_wait_for_ready_title); 851 prerender_should_wait_for_ready_title);
829 prerender_manager->SetPrerenderContentsFactory( 852 prerender_manager->SetPrerenderContentsFactory(
830 prerender_contents_factory_); 853 prerender_contents_factory_);
831 FinalStatus expected_final_status = expected_final_status_queue.front(); 854 FinalStatus expected_final_status = expected_final_status_queue.front();
832 855
833 // ui_test_utils::NavigateToURL uses its own observer and message loop. 856 // ui_test_utils::NavigateToURL uses its own observer and message loop.
834 // Since the test needs to wait until the prerendered page has stopped 857 // Since the test needs to wait until the prerendered page has stopped
835 // loading, rather than the page directly navigated to, need to 858 // loading, rather than the page directly navigated to, need to
836 // handle browser navigation directly. 859 // handle browser navigation directly.
837 current_browser()->OpenURL(OpenURLParams( 860 current_browser()->OpenURL(OpenURLParams(
838 src_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, 861 loader_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED,
839 false)); 862 false));
840 863
841 ui_test_utils::RunMessageLoop(); 864 ui_test_utils::RunMessageLoop();
842 865
843 TestPrerenderContents* prerender_contents = GetPrerenderContents(); 866 TestPrerenderContents* prerender_contents = GetPrerenderContents();
844 867
845 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { 868 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) {
846 ASSERT_TRUE(prerender_contents != NULL); 869 ASSERT_TRUE(prerender_contents != NULL);
847 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 870 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status());
848 871
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 } 961 }
939 962
940 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; 963 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_;
941 #if defined(ENABLE_SAFE_BROWSING) 964 #if defined(ENABLE_SAFE_BROWSING)
942 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 965 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_;
943 #endif 966 #endif
944 GURL dest_url_; 967 GURL dest_url_;
945 bool use_https_src_server_; 968 bool use_https_src_server_;
946 bool call_javascript_; 969 bool call_javascript_;
947 std::string loader_path_; 970 std::string loader_path_;
971 std::string loader_query_and_fragment_;
948 Browser* explicitly_set_browser_; 972 Browser* explicitly_set_browser_;
949 }; 973 };
950 974
951 // Checks that a page is correctly prerendered in the case of a 975 // Checks that a page is correctly prerendered in the case of a
952 // <link rel=prerender> tag and then loaded into a tab in response to a 976 // <link rel=prerender> tag and then loaded into a tab in response to a
953 // navigation. 977 // navigation.
954 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 978 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
955 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 979 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
956 NavigateToDestURL(); 980 NavigateToDestURL();
981 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
982 }
983
984 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
985 // enable this test.
986 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
987 DISABLED_PrerenderPageRemovingLink) {
988 set_loader_path("files/prerender/prerender_loader_removing_links.html");
989 set_loader_query_and_fragment("?links_to_insert=1&links_to_remove=1");
990 PrerenderTestURL("files/prerender/prerender_page.html",
991 FINAL_STATUS_CANCELLED, 1);
992 RemoveLinkElementsAndNavigate();
993 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
994 }
995
996 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
997 // enable this test.
998 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
999 DISABLED_PrerenderPageRemovingLinkWithTwoLinks) {
1000 set_loader_path("files/prerender/prerender_loader_removing_links.html");
1001 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=2");
1002 PrerenderTestURL("files/prerender/prerender_page.html",
1003 FINAL_STATUS_CANCELLED, 1);
1004 RemoveLinkElementsAndNavigate();
1005 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
1006 }
1007
1008 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
1009 // enable this test.
1010 IN_PROC_BROWSER_TEST_F(
1011 PrerenderBrowserTest,
1012 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) {
1013 set_loader_path("files/prerender/prerender_loader_removing_links.html");
1014 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=1");
1015 PrerenderTestURL("files/prerender/prerender_page.html",
1016 FINAL_STATUS_USED, 1);
1017 RemoveLinkElementsAndNavigate();
957 } 1018 }
958 1019
959 // Checks that prerendering works in incognito mode. 1020 // Checks that prerendering works in incognito mode.
960 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { 1021 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) {
961 Profile* normal_profile = current_browser()->profile(); 1022 Profile* normal_profile = current_browser()->profile();
962 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank")); 1023 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"));
963 set_browser(BrowserList::FindBrowserWithProfile( 1024 set_browser(BrowserList::FindBrowserWithProfile(
964 normal_profile->GetOffTheRecordProfile())); 1025 normal_profile->GetOffTheRecordProfile()));
965 // Increase memory expectations on the incognito PrerenderManager. 1026 // Increase memory expectations on the incognito PrerenderManager.
966 IncreasePrerenderMemory(); 1027 IncreasePrerenderMemory();
(...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2149 WebContents* web_contents = browser()->GetSelectedWebContents(); 2210 WebContents* web_contents = browser()->GetSelectedWebContents();
2150 bool display_test_result = false; 2211 bool display_test_result = false;
2151 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 2212 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
2152 web_contents->GetRenderViewHost(), L"", 2213 web_contents->GetRenderViewHost(), L"",
2153 L"DidDisplayReallyPass()", 2214 L"DidDisplayReallyPass()",
2154 &display_test_result)); 2215 &display_test_result));
2155 ASSERT_TRUE(display_test_result); 2216 ASSERT_TRUE(display_test_result);
2156 } 2217 }
2157 2218
2158 } // namespace prerender 2219 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/chrome_content_browser_client.cc ('k') | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698