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

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: continued remediation 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 PrerenderLinkManager* GetPrerenderLinkManager() const {
dominich 2012/05/01 19:57:48 nit: It looks like this is only used for IsEmpty.
gavinp 2012/05/01 20:24:11 Good point. I implemented IsEmptyPrerenderLinkMan
737 Profile* profile =
738 current_browser()->GetSelectedTabContentsWrapper()->profile();
739 PrerenderLinkManager* prerender_link_manager =
740 PrerenderLinkManagerFactory::GetForProfile(profile);
741 return prerender_link_manager;
742 }
743
730 // Returns length of |prerender_manager_|'s history, or -1 on failure. 744 // Returns length of |prerender_manager_|'s history, or -1 on failure.
731 int GetHistoryLength() const { 745 int GetHistoryLength() const {
732 scoped_ptr<DictionaryValue> prerender_dict( 746 scoped_ptr<DictionaryValue> prerender_dict(
733 static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue())); 747 static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue()));
734 if (!prerender_dict.get()) 748 if (!prerender_dict.get())
735 return -1; 749 return -1;
736 ListValue* history_list; 750 ListValue* history_list;
737 if (!prerender_dict->GetList("history", &history_list)) 751 if (!prerender_dict->GetList("history", &history_list))
738 return -1; 752 return -1;
739 return static_cast<int>(history_list->GetSize()); 753 return static_cast<int>(history_list->GetSize());
740 } 754 }
741 755
742 #if defined(ENABLE_SAFE_BROWSING) 756 #if defined(ENABLE_SAFE_BROWSING)
743 FakeSafeBrowsingService* GetSafeBrowsingService() { 757 FakeSafeBrowsingService* GetSafeBrowsingService() {
744 return safe_browsing_factory_->most_recent_service(); 758 return safe_browsing_factory_->most_recent_service();
745 } 759 }
746 #endif 760 #endif
747 761
748 TestPrerenderContents* GetPrerenderContents() const { 762 TestPrerenderContents* GetPrerenderContents() const {
749 return static_cast<TestPrerenderContents*>( 763 return static_cast<TestPrerenderContents*>(
750 GetPrerenderManager()->FindEntry(dest_url_)); 764 GetPrerenderManager()->FindEntry(dest_url_));
751 } 765 }
752 766
753 void set_loader_path(const std::string& path) { 767 void set_loader_path(const std::string& path) {
754 loader_path_ = path; 768 loader_path_ = path;
755 } 769 }
756 770
771 void set_loader_query_and_fragment(const std::string& query_and_fragment) {
772 loader_query_and_fragment_ = query_and_fragment;
773 }
774
757 GURL GetCrossDomainTestUrl(const std::string& path) { 775 GURL GetCrossDomainTestUrl(const std::string& path) {
758 static const std::string secondary_domain = "www.foo.com"; 776 static const std::string secondary_domain = "www.foo.com";
759 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 777 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
760 std::string url_str(base::StringPrintf( 778 std::string url_str(base::StringPrintf(
761 "http://%s:%d/%s", 779 "http://%s:%d/%s",
762 secondary_domain.c_str(), 780 secondary_domain.c_str(),
763 test_server()->host_port_pair().port(), 781 test_server()->host_port_pair().port(),
764 path.c_str())); 782 path.c_str()));
765 return GURL(url_str); 783 return GURL(url_str);
766 } 784 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 net::TestServer* src_server = test_server(); 825 net::TestServer* src_server = test_server();
808 scoped_ptr<net::TestServer> https_src_server; 826 scoped_ptr<net::TestServer> https_src_server;
809 if (use_https_src_server_) { 827 if (use_https_src_server_) {
810 https_src_server.reset( 828 https_src_server.reset(
811 new net::TestServer(net::TestServer::TYPE_HTTPS, 829 new net::TestServer(net::TestServer::TYPE_HTTPS,
812 net::TestServer::kLocalhost, 830 net::TestServer::kLocalhost,
813 FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 831 FilePath(FILE_PATH_LITERAL("chrome/test/data"))));
814 ASSERT_TRUE(https_src_server->Start()); 832 ASSERT_TRUE(https_src_server->Start());
815 src_server = https_src_server.get(); 833 src_server = https_src_server.get();
816 } 834 }
817 GURL src_url = src_server->GetURL(replacement_path); 835 GURL loader_url = src_server->GetURL(replacement_path +
836 loader_query_and_fragment_);
818 837
819 PrerenderManager* prerender_manager = GetPrerenderManager(); 838 PrerenderManager* prerender_manager = GetPrerenderManager();
820 ASSERT_TRUE(prerender_manager); 839 ASSERT_TRUE(prerender_manager);
821 prerender_manager->mutable_config().rate_limit_enabled = false; 840 prerender_manager->mutable_config().rate_limit_enabled = false;
822 prerender_manager->mutable_config().https_allowed = true; 841 prerender_manager->mutable_config().https_allowed = true;
823 ASSERT_TRUE(prerender_contents_factory_ == NULL); 842 ASSERT_TRUE(prerender_contents_factory_ == NULL);
824 prerender_contents_factory_ = 843 prerender_contents_factory_ =
825 new WaitForLoadPrerenderContentsFactory( 844 new WaitForLoadPrerenderContentsFactory(
826 expected_number_of_loads, 845 expected_number_of_loads,
827 expected_final_status_queue, 846 expected_final_status_queue,
828 prerender_should_wait_for_ready_title); 847 prerender_should_wait_for_ready_title);
829 prerender_manager->SetPrerenderContentsFactory( 848 prerender_manager->SetPrerenderContentsFactory(
830 prerender_contents_factory_); 849 prerender_contents_factory_);
831 FinalStatus expected_final_status = expected_final_status_queue.front(); 850 FinalStatus expected_final_status = expected_final_status_queue.front();
832 851
833 // ui_test_utils::NavigateToURL uses its own observer and message loop. 852 // ui_test_utils::NavigateToURL uses its own observer and message loop.
834 // Since the test needs to wait until the prerendered page has stopped 853 // Since the test needs to wait until the prerendered page has stopped
835 // loading, rather than the page directly navigated to, need to 854 // loading, rather than the page directly navigated to, need to
836 // handle browser navigation directly. 855 // handle browser navigation directly.
837 current_browser()->OpenURL(OpenURLParams( 856 current_browser()->OpenURL(OpenURLParams(
838 src_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, 857 loader_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED,
839 false)); 858 false));
840 859
841 ui_test_utils::RunMessageLoop(); 860 ui_test_utils::RunMessageLoop();
842 861
843 TestPrerenderContents* prerender_contents = GetPrerenderContents(); 862 TestPrerenderContents* prerender_contents = GetPrerenderContents();
844 863
845 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { 864 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) {
846 ASSERT_TRUE(prerender_contents != NULL); 865 ASSERT_TRUE(prerender_contents != NULL);
847 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 866 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status());
848 867
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 } 957 }
939 958
940 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; 959 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_;
941 #if defined(ENABLE_SAFE_BROWSING) 960 #if defined(ENABLE_SAFE_BROWSING)
942 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 961 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_;
943 #endif 962 #endif
944 GURL dest_url_; 963 GURL dest_url_;
945 bool use_https_src_server_; 964 bool use_https_src_server_;
946 bool call_javascript_; 965 bool call_javascript_;
947 std::string loader_path_; 966 std::string loader_path_;
967 std::string loader_query_and_fragment_;
948 Browser* explicitly_set_browser_; 968 Browser* explicitly_set_browser_;
949 }; 969 };
950 970
951 // Checks that a page is correctly prerendered in the case of a 971 // 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 972 // <link rel=prerender> tag and then loaded into a tab in response to a
953 // navigation. 973 // navigation.
954 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 974 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
955 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 975 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
956 NavigateToDestURL(); 976 NavigateToDestURL();
977 ASSERT_TRUE(GetPrerenderLinkManager()->IsEmpty());
978 }
979
980 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
981 // enable this test.
982 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
983 DISABLED_PrerenderPageRemovingLink) {
984 set_loader_path("files/prerender/prerender_loader_removing_links.html");
985 set_loader_query_and_fragment("?links_to_insert=1&links_to_remove=1");
986 PrerenderTestURL("files/prerender/prerender_page.html",
987 FINAL_STATUS_CANCELLED, 1);
988 RemoveLinkElementsAndNavigate();
989 ASSERT_TRUE(GetPrerenderLinkManager()->IsEmpty());
990 }
991
992 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
993 // enable this test.
994 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
995 DISABLED_PrerenderPageRemovingLinkWithTwoLinks) {
996 set_loader_path("files/prerender/prerender_loader_removing_links.html");
997 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=2");
998 PrerenderTestURL("files/prerender/prerender_page.html",
999 FINAL_STATUS_CANCELLED, 1);
1000 RemoveLinkElementsAndNavigate();
1001 ASSERT_TRUE(GetPrerenderLinkManager()->IsEmpty());
1002 }
1003
1004 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
1005 // enable this test.
1006 IN_PROC_BROWSER_TEST_F(
1007 PrerenderBrowserTest,
1008 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) {
1009 set_loader_path("files/prerender/prerender_loader_removing_links.html");
1010 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=1");
1011 PrerenderTestURL("files/prerender/prerender_page.html",
1012 FINAL_STATUS_USED, 1);
1013 RemoveLinkElementsAndNavigate();
957 } 1014 }
958 1015
959 // Checks that prerendering works in incognito mode. 1016 // Checks that prerendering works in incognito mode.
960 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { 1017 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) {
961 Profile* normal_profile = current_browser()->profile(); 1018 Profile* normal_profile = current_browser()->profile();
962 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank")); 1019 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"));
963 set_browser(BrowserList::FindBrowserWithProfile( 1020 set_browser(BrowserList::FindBrowserWithProfile(
964 normal_profile->GetOffTheRecordProfile())); 1021 normal_profile->GetOffTheRecordProfile()));
965 // Increase memory expectations on the incognito PrerenderManager. 1022 // Increase memory expectations on the incognito PrerenderManager.
966 IncreasePrerenderMemory(); 1023 IncreasePrerenderMemory();
(...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2149 WebContents* web_contents = browser()->GetSelectedWebContents(); 2206 WebContents* web_contents = browser()->GetSelectedWebContents();
2150 bool display_test_result = false; 2207 bool display_test_result = false;
2151 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 2208 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
2152 web_contents->GetRenderViewHost(), L"", 2209 web_contents->GetRenderViewHost(), L"",
2153 L"DidDisplayReallyPass()", 2210 L"DidDisplayReallyPass()",
2154 &display_test_result)); 2211 &display_test_result));
2155 ASSERT_TRUE(display_test_result); 2212 ASSERT_TRUE(display_test_result);
2156 } 2213 }
2157 2214
2158 } // namespace prerender 2215 } // 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