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

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: remove the urls_to_id_map_, and follow consequences through. 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,
227 const content::Referrer& referrer) OVERRIDE { 228 const content::Referrer& referrer) OVERRIDE {
228 PrerenderContents::AddPendingPrerender(origin, url, referrer); 229 PrerenderContents::AddPendingPrerender(url, referrer);
229 if (expected_pending_prerenders_ > 0 && 230 if (expected_pending_prerenders_ > 0 &&
230 pending_prerender_list()->size() == expected_pending_prerenders_) { 231 pending_prerender_list()->size() == expected_pending_prerenders_) {
231 MessageLoop::current()->Quit(); 232 MessageLoop::current()->Quit();
232 } 233 }
233 } 234 }
234 235
235 virtual WebContents* CreateWebContents( 236 virtual WebContents* CreateWebContents(
236 content::SessionStorageNamespace* session_storage_namespace) OVERRIDE { 237 content::SessionStorageNamespace* session_storage_namespace) OVERRIDE {
237 WebContents* web_contents = PrerenderContents::CreateWebContents( 238 WebContents* web_contents = PrerenderContents::CreateWebContents(
238 session_storage_namespace); 239 session_storage_namespace);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 292 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) {
292 EXPECT_EQ(new_render_view_host_, 293 EXPECT_EQ(new_render_view_host_,
293 content::Source<RenderWidgetHost>(source).ptr()); 294 content::Source<RenderWidgetHost>(source).ptr());
294 bool is_visible = *content::Details<bool>(details).ptr(); 295 bool is_visible = *content::Details<bool>(details).ptr();
295 296
296 if (!is_visible) { 297 if (!is_visible) {
297 was_hidden_ = true; 298 was_hidden_ = true;
298 } else if (is_visible && was_hidden_) { 299 } else if (is_visible && was_hidden_) {
299 // Once hidden, a prerendered RenderViewHost should only be shown after 300 // Once hidden, a prerendered RenderViewHost should only be shown after
300 // being removed from the PrerenderContents for display. 301 // being removed from the PrerenderContents for display.
301 EXPECT_FALSE(GetRenderViewHost()); 302 EXPECT_FALSE(GetRenderViewHost());
gavinp 2012/04/29 00:35:44 This is here as a merge artifact. See http://code
302 was_shown_ = true; 303 was_shown_ = true;
303 } 304 }
304 return; 305 return;
305 } 306 }
306 PrerenderContents::Observe(type, source, details); 307 PrerenderContents::Observe(type, source, details);
307 } 308 }
308 309
309 int number_of_loads_; 310 int number_of_loads_;
310 int expected_number_of_loads_; 311 int expected_number_of_loads_;
311 FinalStatus expected_final_status_; 312 FinalStatus expected_final_status_;
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 OpenDestURLWithJSImpl("MetaClick()"); 618 OpenDestURLWithJSImpl("MetaClick()");
618 #else 619 #else
619 OpenDestURLWithJSImpl("CtrlClick()"); 620 OpenDestURLWithJSImpl("CtrlClick()");
620 #endif 621 #endif
621 } 622 }
622 623
623 void OpenDestURLViaWindowOpen() const { 624 void OpenDestURLViaWindowOpen() const {
624 OpenDestURLWithJSImpl("WindowOpen()"); 625 OpenDestURLWithJSImpl("WindowOpen()");
625 } 626 }
626 627
628 void RemoveLinkElementAndNavigate() const {
629 OpenDestURLWithJSImpl("RemoveLinkElementAndNavigate()");
630 }
631
627 void ClickToNextPageAfterPrerender(Browser* browser) { 632 void ClickToNextPageAfterPrerender(Browser* browser) {
628 ui_test_utils::WindowedNotificationObserver new_page_observer( 633 ui_test_utils::WindowedNotificationObserver new_page_observer(
629 content::NOTIFICATION_NAV_ENTRY_COMMITTED, 634 content::NOTIFICATION_NAV_ENTRY_COMMITTED,
630 content::NotificationService::AllSources()); 635 content::NotificationService::AllSources());
631 RenderViewHost* render_view_host = 636 RenderViewHost* render_view_host =
632 browser->GetSelectedWebContents()->GetRenderViewHost(); 637 browser->GetSelectedWebContents()->GetRenderViewHost();
633 render_view_host->ExecuteJavascriptInWebFrame( 638 render_view_host->ExecuteJavascriptInWebFrame(
634 string16(), 639 string16(),
635 ASCIIToUTF16("ClickOpenLink()")); 640 ASCIIToUTF16("ClickOpenLink()"));
636 new_page_observer.Wait(); 641 new_page_observer.Wait();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 } 717 }
713 718
714 void DisableJavascriptCalls() { 719 void DisableJavascriptCalls() {
715 call_javascript_ = false; 720 call_javascript_ = false;
716 } 721 }
717 722
718 TaskManagerModel* model() const { 723 TaskManagerModel* model() const {
719 return TaskManager::GetInstance()->model(); 724 return TaskManager::GetInstance()->model();
720 } 725 }
721 726
722 PrerenderManager* prerender_manager() const { 727 PrerenderManager* prerender_manager() const {
dominich 2012/04/29 18:52:55 nit: should this be GetPrerenderManager?
gavinp 2012/04/30 11:43:16 Yes. I'm uploading a separate CL for this, and ad
723 Profile* profile = 728 Profile* profile =
724 current_browser()->GetSelectedTabContentsWrapper()->profile(); 729 current_browser()->GetSelectedTabContentsWrapper()->profile();
725 PrerenderManager* prerender_manager = 730 PrerenderManager* prerender_manager =
726 PrerenderManagerFactory::GetForProfile(profile); 731 PrerenderManagerFactory::GetForProfile(profile);
727 return prerender_manager; 732 return prerender_manager;
728 } 733 }
729 734
735 PrerenderLinkManager* prerender_link_manager() const {
dominich 2012/04/29 18:52:55 nit: should this be GetPrerenderLinkManager?
gavinp 2012/04/30 11:43:16 Done.
736 Profile* profile =
737 current_browser()->GetSelectedTabContentsWrapper()->profile();
738 PrerenderLinkManager* prerender_link_manager =
739 PrerenderLinkManagerFactory::GetForProfile(profile);
740 return prerender_link_manager;
741 }
742
730 // Returns length of |prerender_manager_|'s history, or -1 on failure. 743 // Returns length of |prerender_manager_|'s history, or -1 on failure.
731 int GetHistoryLength() const { 744 int GetHistoryLength() const {
732 scoped_ptr<DictionaryValue> prerender_dict( 745 scoped_ptr<DictionaryValue> prerender_dict(
733 static_cast<DictionaryValue*>(prerender_manager()->GetAsValue())); 746 static_cast<DictionaryValue*>(prerender_manager()->GetAsValue()));
734 if (!prerender_dict.get()) 747 if (!prerender_dict.get())
735 return -1; 748 return -1;
736 ListValue* history_list; 749 ListValue* history_list;
737 if (!prerender_dict->GetList("history", &history_list)) 750 if (!prerender_dict->GetList("history", &history_list))
738 return -1; 751 return -1;
739 return static_cast<int>(history_list->GetSize()); 752 return static_cast<int>(history_list->GetSize());
740 } 753 }
741 754
742 #if defined(ENABLE_SAFE_BROWSING) 755 #if defined(ENABLE_SAFE_BROWSING)
743 FakeSafeBrowsingService* GetSafeBrowsingService() { 756 FakeSafeBrowsingService* GetSafeBrowsingService() {
744 return safe_browsing_factory_->most_recent_service(); 757 return safe_browsing_factory_->most_recent_service();
745 } 758 }
746 #endif 759 #endif
747 760
748 TestPrerenderContents* GetPrerenderContents() const { 761 TestPrerenderContents* GetPrerenderContents() const {
749 return static_cast<TestPrerenderContents*>( 762 return static_cast<TestPrerenderContents*>(
750 prerender_manager()->FindEntry(dest_url_)); 763 prerender_manager()->FindEntry(dest_url_));
751 } 764 }
752 765
753 void set_loader_path(const std::string& path) { 766 void set_loader_path(const std::string& path) {
754 loader_path_ = path; 767 loader_path_ = path;
755 } 768 }
756 769
770 void set_loader_query_and_fragment(const std::string& query_and_fragment) {
771 loader_query_and_fragment_ = query_and_fragment;
772 }
773
757 GURL GetCrossDomainTestUrl(const std::string& path) { 774 GURL GetCrossDomainTestUrl(const std::string& path) {
758 static const std::string secondary_domain = "www.foo.com"; 775 static const std::string secondary_domain = "www.foo.com";
759 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 776 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
760 std::string url_str(base::StringPrintf( 777 std::string url_str(base::StringPrintf(
761 "http://%s:%d/%s", 778 "http://%s:%d/%s",
762 secondary_domain.c_str(), 779 secondary_domain.c_str(),
763 test_server()->host_port_pair().port(), 780 test_server()->host_port_pair().port(),
764 path.c_str())); 781 path.c_str()));
765 return GURL(url_str); 782 return GURL(url_str);
766 } 783 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 net::TestServer* src_server = test_server(); 824 net::TestServer* src_server = test_server();
808 scoped_ptr<net::TestServer> https_src_server; 825 scoped_ptr<net::TestServer> https_src_server;
809 if (use_https_src_server_) { 826 if (use_https_src_server_) {
810 https_src_server.reset( 827 https_src_server.reset(
811 new net::TestServer(net::TestServer::TYPE_HTTPS, 828 new net::TestServer(net::TestServer::TYPE_HTTPS,
812 net::TestServer::kLocalhost, 829 net::TestServer::kLocalhost,
813 FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 830 FilePath(FILE_PATH_LITERAL("chrome/test/data"))));
814 ASSERT_TRUE(https_src_server->Start()); 831 ASSERT_TRUE(https_src_server->Start());
815 src_server = https_src_server.get(); 832 src_server = https_src_server.get();
816 } 833 }
817 GURL src_url = src_server->GetURL(replacement_path); 834 GURL loader_url = src_server->GetURL(replacement_path +
835 loader_query_and_fragment_);
818 836
819 ASSERT_TRUE(prerender_manager()); 837 ASSERT_TRUE(prerender_manager());
820 prerender_manager()->mutable_config().rate_limit_enabled = false; 838 prerender_manager()->mutable_config().rate_limit_enabled = false;
821 prerender_manager()->mutable_config().https_allowed = true; 839 prerender_manager()->mutable_config().https_allowed = true;
822 ASSERT_TRUE(prerender_contents_factory_ == NULL); 840 ASSERT_TRUE(prerender_contents_factory_ == NULL);
823 prerender_contents_factory_ = 841 prerender_contents_factory_ =
824 new WaitForLoadPrerenderContentsFactory( 842 new WaitForLoadPrerenderContentsFactory(
825 expected_number_of_loads, 843 expected_number_of_loads,
826 expected_final_status_queue, 844 expected_final_status_queue,
827 prerender_should_wait_for_ready_title); 845 prerender_should_wait_for_ready_title);
828 prerender_manager()->SetPrerenderContentsFactory( 846 prerender_manager()->SetPrerenderContentsFactory(
829 prerender_contents_factory_); 847 prerender_contents_factory_);
830 FinalStatus expected_final_status = expected_final_status_queue.front(); 848 FinalStatus expected_final_status = expected_final_status_queue.front();
831 849
832 // ui_test_utils::NavigateToURL uses its own observer and message loop. 850 // ui_test_utils::NavigateToURL uses its own observer and message loop.
833 // Since the test needs to wait until the prerendered page has stopped 851 // Since the test needs to wait until the prerendered page has stopped
834 // loading, rather than the page directly navigated to, need to 852 // loading, rather than the page directly navigated to, need to
835 // handle browser navigation directly. 853 // handle browser navigation directly.
836 current_browser()->OpenURL(OpenURLParams( 854 current_browser()->OpenURL(OpenURLParams(
837 src_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, 855 loader_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED,
838 false)); 856 false));
839 857
840 ui_test_utils::RunMessageLoop(); 858 ui_test_utils::RunMessageLoop();
841 859
842 TestPrerenderContents* prerender_contents = GetPrerenderContents(); 860 TestPrerenderContents* prerender_contents = GetPrerenderContents();
843 861
844 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { 862 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) {
845 ASSERT_TRUE(prerender_contents != NULL); 863 ASSERT_TRUE(prerender_contents != NULL);
846 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 864 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status());
847 865
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 } 955 }
938 956
939 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; 957 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_;
940 #if defined(ENABLE_SAFE_BROWSING) 958 #if defined(ENABLE_SAFE_BROWSING)
941 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 959 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_;
942 #endif 960 #endif
943 GURL dest_url_; 961 GURL dest_url_;
944 bool use_https_src_server_; 962 bool use_https_src_server_;
945 bool call_javascript_; 963 bool call_javascript_;
946 std::string loader_path_; 964 std::string loader_path_;
965 std::string loader_query_and_fragment_;
947 Browser* explicitly_set_browser_; 966 Browser* explicitly_set_browser_;
948 }; 967 };
949 968
950 // Checks that a page is correctly prerendered in the case of a 969 // Checks that a page is correctly prerendered in the case of a
951 // <link rel=prerender> tag and then loaded into a tab in response to a 970 // <link rel=prerender> tag and then loaded into a tab in response to a
952 // navigation. 971 // navigation.
953 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 972 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
954 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 973 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
955 NavigateToDestURL(); 974 NavigateToDestURL();
975 ASSERT_TRUE(prerender_link_manager()->IsEmpty());
976 }
977
978 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
979 // enable this test.
980 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
981 DISABLED_PrerenderPageRemovingLink) {
982 set_loader_path("files/prerender/prerender_loader_removing_links.html");
983 set_loader_query_and_fragment("?links_to_insert=1&links_to_remove=1");
984 PrerenderTestURL("files/prerender/prerender_page.html",
985 FINAL_STATUS_CANCELLED, 1);
986 RemoveLinkElementAndNavigate();
987 }
988
989 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
990 // enable this test.
991 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
992 DISABLED_PrerenderPageRemovingLinkWithTwoLinks) {
993 set_loader_path("files/prerender/prerender_loader_removing_links.html");
994 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=2");
995 PrerenderTestURL("files/prerender/prerender_page.html",
996 FINAL_STATUS_CANCELLED, 1);
997 RemoveLinkElementAndNavigate();
998 }
999
1000 // TODO(gavinp): After https://bugs.webkit.org/show_bug.cgi?id=85005 lands,
1001 // enable this test.
1002 IN_PROC_BROWSER_TEST_F(
1003 PrerenderBrowserTest,
1004 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) {
1005 set_loader_path("files/prerender/prerender_loader_removing_links.html");
1006 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=1");
1007 PrerenderTestURL("files/prerender/prerender_page.html",
1008 FINAL_STATUS_USED, 1);
1009 RemoveLinkElementAndNavigate();
956 } 1010 }
957 1011
958 // Checks that prerendering works in incognito mode. 1012 // Checks that prerendering works in incognito mode.
959 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { 1013 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) {
960 Profile* normal_profile = current_browser()->profile(); 1014 Profile* normal_profile = current_browser()->profile();
961 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank")); 1015 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"));
962 set_browser(BrowserList::FindBrowserWithProfile( 1016 set_browser(BrowserList::FindBrowserWithProfile(
963 normal_profile->GetOffTheRecordProfile())); 1017 normal_profile->GetOffTheRecordProfile()));
964 // Increase memory expectations on the incognito PrerenderManager. 1018 // Increase memory expectations on the incognito PrerenderManager.
965 IncreasePrerenderMemory(); 1019 IncreasePrerenderMemory();
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after
2147 WebContents* web_contents = browser()->GetSelectedWebContents(); 2201 WebContents* web_contents = browser()->GetSelectedWebContents();
2148 bool display_test_result = false; 2202 bool display_test_result = false;
2149 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 2203 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
2150 web_contents->GetRenderViewHost(), L"", 2204 web_contents->GetRenderViewHost(), L"",
2151 L"DidDisplayReallyPass()", 2205 L"DidDisplayReallyPass()",
2152 &display_test_result)); 2206 &display_test_result));
2153 ASSERT_TRUE(display_test_result); 2207 ASSERT_TRUE(display_test_result);
2154 } 2208 }
2155 2209
2156 } // namespace prerender 2210 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698