OLD | NEW |
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 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #include "content/public/browser/web_contents.h" | 52 #include "content/public/browser/web_contents.h" |
53 #include "content/public/common/url_constants.h" | 53 #include "content/public/common/url_constants.h" |
54 #include "content/public/test/browser_test_utils.h" | 54 #include "content/public/test/browser_test_utils.h" |
55 #include "content/public/test/test_navigation_observer.h" | 55 #include "content/public/test/test_navigation_observer.h" |
56 #include "content/public/test/test_utils.h" | 56 #include "content/public/test/test_utils.h" |
57 #include "googleurl/src/gurl.h" | 57 #include "googleurl/src/gurl.h" |
58 #include "grit/generated_resources.h" | 58 #include "grit/generated_resources.h" |
59 #include "net/dns/mock_host_resolver.h" | 59 #include "net/dns/mock_host_resolver.h" |
60 #include "net/url_request/url_request_context.h" | 60 #include "net/url_request/url_request_context.h" |
61 #include "net/url_request/url_request_context_getter.h" | 61 #include "net/url_request/url_request_context_getter.h" |
| 62 #include "net/url_request/url_request_filter.h" |
| 63 #include "net/url_request/url_request_job.h" |
62 #include "ui/base/l10n/l10n_util.h" | 64 #include "ui/base/l10n/l10n_util.h" |
63 | 65 |
64 using content::BrowserThread; | 66 using content::BrowserThread; |
65 using content::DevToolsAgentHost; | 67 using content::DevToolsAgentHost; |
66 using content::DevToolsClientHost; | 68 using content::DevToolsClientHost; |
67 using content::DevToolsManager; | 69 using content::DevToolsManager; |
68 using content::NavigationController; | 70 using content::NavigationController; |
69 using content::OpenURLParams; | 71 using content::OpenURLParams; |
70 using content::Referrer; | 72 using content::Referrer; |
71 using content::RenderViewHost; | 73 using content::RenderViewHost; |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 class RestorePrerenderMode { | 574 class RestorePrerenderMode { |
573 public: | 575 public: |
574 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { | 576 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { |
575 } | 577 } |
576 | 578 |
577 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } | 579 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } |
578 private: | 580 private: |
579 PrerenderManager::PrerenderManagerMode prev_mode_; | 581 PrerenderManager::PrerenderManagerMode prev_mode_; |
580 }; | 582 }; |
581 | 583 |
| 584 // URLRequestJob (and associated handler) which never starts. |
| 585 class NeverStartURLRequestJob : public net::URLRequestJob { |
| 586 public: |
| 587 NeverStartURLRequestJob(net::URLRequest* request, |
| 588 net::NetworkDelegate* network_delegate) |
| 589 : net::URLRequestJob(request, network_delegate) { |
| 590 } |
| 591 |
| 592 virtual void Start() OVERRIDE {} |
| 593 |
| 594 private: |
| 595 virtual ~NeverStartURLRequestJob() {} |
| 596 }; |
| 597 |
| 598 class NeverStartProtocolHandler |
| 599 : public net::URLRequestJobFactory::ProtocolHandler { |
| 600 public: |
| 601 NeverStartProtocolHandler() {} |
| 602 virtual ~NeverStartProtocolHandler() {} |
| 603 |
| 604 virtual net::URLRequestJob* MaybeCreateJob( |
| 605 net::URLRequest* request, |
| 606 net::NetworkDelegate* network_delegate) const OVERRIDE { |
| 607 return new NeverStartURLRequestJob(request, network_delegate); |
| 608 } |
| 609 }; |
| 610 |
| 611 void CreateNeverStartProtocolHandlerOnIO(const GURL& url) { |
| 612 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 613 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( |
| 614 new NeverStartProtocolHandler()); |
| 615 net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( |
| 616 url, never_respond_handler.Pass()); |
| 617 } |
| 618 |
582 } // namespace | 619 } // namespace |
583 | 620 |
584 class PrerenderBrowserTest : virtual public InProcessBrowserTest { | 621 class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
585 public: | 622 public: |
586 PrerenderBrowserTest() | 623 PrerenderBrowserTest() |
587 : autostart_test_server_(true), | 624 : autostart_test_server_(true), |
588 prerender_contents_factory_(NULL), | 625 prerender_contents_factory_(NULL), |
589 #if defined(FULL_SAFE_BROWSING) | 626 #if defined(FULL_SAFE_BROWSING) |
590 safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), | 627 safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), |
591 #endif | 628 #endif |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 int expected_number_of_loads) { | 731 int expected_number_of_loads) { |
695 std::deque<FinalStatus> expected_final_status_queue(1, | 732 std::deque<FinalStatus> expected_final_status_queue(1, |
696 expected_final_status); | 733 expected_final_status); |
697 PrerenderTestURLImpl(prerender_url, destination_url, | 734 PrerenderTestURLImpl(prerender_url, destination_url, |
698 expected_final_status_queue, | 735 expected_final_status_queue, |
699 expected_number_of_loads, | 736 expected_number_of_loads, |
700 false); | 737 false); |
701 } | 738 } |
702 | 739 |
703 void NavigateToDestURL() const { | 740 void NavigateToDestURL() const { |
704 NavigateToDestURLWithDisposition(CURRENT_TAB); | 741 NavigateToDestURLWithDisposition(CURRENT_TAB, true); |
705 } | 742 } |
706 | 743 |
707 // Opens the url in a new tab, with no opener. | 744 // Opens the url in a new tab, with no opener. |
708 void NavigateToDestURLWithDisposition( | 745 void NavigateToDestURLWithDisposition( |
709 WindowOpenDisposition disposition) const { | 746 WindowOpenDisposition disposition, |
710 NavigateToURLImpl(dest_url_, disposition); | 747 bool expect_swap_to_succeed) const { |
| 748 NavigateToURLImpl(dest_url_, disposition, expect_swap_to_succeed); |
711 } | 749 } |
712 | 750 |
713 void OpenDestURLViaClick() const { | 751 void OpenDestURLViaClick() const { |
714 OpenDestURLWithJSImpl("Click()"); | 752 OpenDestURLWithJSImpl("Click()"); |
715 } | 753 } |
716 | 754 |
717 void OpenDestURLViaClickTarget() const { | 755 void OpenDestURLViaClickTarget() const { |
718 OpenDestURLWithJSImpl("ClickTarget()"); | 756 OpenDestURLWithJSImpl("ClickTarget()"); |
719 } | 757 } |
720 | 758 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 bool js_result; | 849 bool js_result; |
812 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | 850 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
813 tab, | 851 tab, |
814 "window.domAutomationController.send(DidBackToOriginalPagePass())", | 852 "window.domAutomationController.send(DidBackToOriginalPagePass())", |
815 &js_result)); | 853 &js_result)); |
816 EXPECT_TRUE(js_result); | 854 EXPECT_TRUE(js_result); |
817 } | 855 } |
818 | 856 |
819 void NavigateToURL(const std::string& dest_html_file) const { | 857 void NavigateToURL(const std::string& dest_html_file) const { |
820 GURL dest_url = test_server()->GetURL(dest_html_file); | 858 GURL dest_url = test_server()->GetURL(dest_html_file); |
821 NavigateToURLImpl(dest_url, CURRENT_TAB); | 859 NavigateToURLImpl(dest_url, CURRENT_TAB, true); |
822 } | 860 } |
823 | 861 |
824 bool UrlIsInPrerenderManager(const std::string& html_file) const { | 862 bool UrlIsInPrerenderManager(const std::string& html_file) const { |
825 return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); | 863 return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); |
826 } | 864 } |
827 | 865 |
828 bool UrlIsInPrerenderManager(const GURL& url) const { | 866 bool UrlIsInPrerenderManager(const GURL& url) const { |
829 return GetPrerenderManager()->FindPrerenderData( | 867 return GetPrerenderManager()->FindPrerenderData( |
830 url, GetSessionStorageNamespace()) != NULL; | 868 url, GetSessionStorageNamespace()) != NULL; |
831 } | 869 } |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 // In the failure case, we should have removed |dest_url_| from the | 1116 // In the failure case, we should have removed |dest_url_| from the |
1079 // prerender_manager. We ignore dummy PrerenderContents (as indicated | 1117 // prerender_manager. We ignore dummy PrerenderContents (as indicated |
1080 // by not having started), and PrerenderContents that are expected to | 1118 // by not having started), and PrerenderContents that are expected to |
1081 // be left in the manager until the test finishes. | 1119 // be left in the manager until the test finishes. |
1082 EXPECT_TRUE(prerender_contents == NULL || | 1120 EXPECT_TRUE(prerender_contents == NULL || |
1083 !prerender_contents->prerendering_has_started()); | 1121 !prerender_contents->prerendering_has_started()); |
1084 } | 1122 } |
1085 } | 1123 } |
1086 | 1124 |
1087 void NavigateToURLImpl(const GURL& dest_url, | 1125 void NavigateToURLImpl(const GURL& dest_url, |
1088 WindowOpenDisposition disposition) const { | 1126 WindowOpenDisposition disposition, |
| 1127 bool expect_swap_to_succeed) const { |
1089 ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); | 1128 ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); |
1090 // Make sure in navigating we have a URL to use in the PrerenderManager. | 1129 // Make sure in navigating we have a URL to use in the PrerenderManager. |
1091 ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); | 1130 ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); |
1092 | 1131 |
1093 // If opening the page in a background tab, it won't be shown when swapped | 1132 // If opening the page in a background tab, it won't be shown when swapped |
1094 // in. | 1133 // in. |
1095 if (disposition == NEW_BACKGROUND_TAB) | 1134 if (disposition == NEW_BACKGROUND_TAB) |
1096 GetPrerenderContents()->set_should_be_shown(false); | 1135 GetPrerenderContents()->set_should_be_shown(false); |
1097 | 1136 |
1098 scoped_ptr<content::WindowedNotificationObserver> page_load_observer; | 1137 scoped_ptr<content::WindowedNotificationObserver> page_load_observer; |
(...skipping 12 matching lines...) Expand all Loading... |
1111 } | 1150 } |
1112 } | 1151 } |
1113 | 1152 |
1114 // Navigate to the prerendered URL, but don't run the message loop. Browser | 1153 // Navigate to the prerendered URL, but don't run the message loop. Browser |
1115 // issued navigations to prerendered pages will synchronously swap in the | 1154 // issued navigations to prerendered pages will synchronously swap in the |
1116 // prerendered page. | 1155 // prerendered page. |
1117 ui_test_utils::NavigateToURLWithDisposition( | 1156 ui_test_utils::NavigateToURLWithDisposition( |
1118 current_browser(), dest_url, disposition, | 1157 current_browser(), dest_url, disposition, |
1119 ui_test_utils::BROWSER_TEST_NONE); | 1158 ui_test_utils::BROWSER_TEST_NONE); |
1120 | 1159 |
1121 // Make sure the PrerenderContents found earlier was used or removed. | 1160 // Make sure the PrerenderContents found earlier was used or removed, |
1122 EXPECT_EQ(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); | 1161 // unless we expect the swap in to fail. |
| 1162 EXPECT_EQ(expect_swap_to_succeed, !GetPrerenderContents()); |
1123 | 1163 |
1124 if (call_javascript_ && web_contents) { | 1164 if (call_javascript_ && web_contents && expect_swap_to_succeed) { |
1125 if (page_load_observer.get()) | 1165 if (page_load_observer.get()) |
1126 page_load_observer->Wait(); | 1166 page_load_observer->Wait(); |
1127 | 1167 |
1128 bool display_test_result = false; | 1168 bool display_test_result = false; |
1129 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | 1169 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
1130 web_contents, | 1170 web_contents, |
1131 "window.domAutomationController.send(DidDisplayPass())", | 1171 "window.domAutomationController.send(DidDisplayPass())", |
1132 &display_test_result)); | 1172 &display_test_result)); |
1133 EXPECT_TRUE(display_test_result); | 1173 EXPECT_TRUE(display_test_result); |
1134 } | 1174 } |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1358 } | 1398 } |
1359 | 1399 |
1360 // Checks that the visibility API works. | 1400 // Checks that the visibility API works. |
1361 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { | 1401 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { |
1362 PrerenderTestURL("files/prerender/prerender_visibility.html", | 1402 PrerenderTestURL("files/prerender/prerender_visibility.html", |
1363 FINAL_STATUS_USED, | 1403 FINAL_STATUS_USED, |
1364 1); | 1404 1); |
1365 NavigateToDestURL(); | 1405 NavigateToDestURL(); |
1366 } | 1406 } |
1367 | 1407 |
1368 // Checks that the visibility API works when the prerender is quickly opened | 1408 // Checks that the prerendering of a page is canceled correctly if we try to |
1369 // in a new tab before it stops loading. | 1409 // swap it in before it commits. |
1370 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityQuickSwitch) { | 1410 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { |
1371 PrerenderTestURL("files/prerender/prerender_visibility_quick.html", | 1411 // Navigate to a page that triggers a prerender for a URL that never commits. |
1372 FINAL_STATUS_USED, 0); | 1412 const GURL kNoCommitUrl("http://never-respond.example.com"); |
1373 NavigateToDestURL(); | 1413 BrowserThread::PostTask( |
| 1414 BrowserThread::IO, FROM_HERE, |
| 1415 base::Bind(&CreateNeverStartProtocolHandlerOnIO, kNoCommitUrl)); |
| 1416 PrerenderTestURL(kNoCommitUrl, |
| 1417 FINAL_STATUS_CANCELLED, |
| 1418 0); |
| 1419 |
| 1420 // Navigate to the URL, but assume the contents won't be swapped in. |
| 1421 NavigateToDestURLWithDisposition(CURRENT_TAB, false); |
| 1422 |
| 1423 // Confirm that the prerendered version of the URL is not swapped in, |
| 1424 // since it never committed. |
| 1425 EXPECT_TRUE(UrlIsInPrerenderManager(kNoCommitUrl)); |
| 1426 |
| 1427 // Post a task to cancel all the prerenders, so that we don't wait further. |
| 1428 base::MessageLoop::current()->PostTask( |
| 1429 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); |
| 1430 content::RunMessageLoop(); |
1374 } | 1431 } |
1375 | 1432 |
1376 // Checks that the prerendering of a page is canceled correctly when a | 1433 // Checks that the prerendering of a page is canceled correctly when a |
1377 // Javascript alert is called. | 1434 // Javascript alert is called. |
1378 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { | 1435 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { |
1379 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", | 1436 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", |
1380 FINAL_STATUS_JAVASCRIPT_ALERT, | 1437 FINAL_STATUS_JAVASCRIPT_ALERT, |
1381 1); | 1438 1); |
1382 } | 1439 } |
1383 | 1440 |
(...skipping 1404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2788 // Checks that non-http/https main page redirects cancel the prerender. | 2845 // Checks that non-http/https main page redirects cancel the prerender. |
2789 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 2846 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
2790 PrerenderCancelMainFrameRedirectUnsupportedScheme) { | 2847 PrerenderCancelMainFrameRedirectUnsupportedScheme) { |
2791 GURL url = test_server()->GetURL( | 2848 GURL url = test_server()->GetURL( |
2792 CreateServerRedirect("invalidscheme://www.google.com/test.html")); | 2849 CreateServerRedirect("invalidscheme://www.google.com/test.html")); |
2793 PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 1); | 2850 PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 1); |
2794 NavigateToDestURL(); | 2851 NavigateToDestURL(); |
2795 } | 2852 } |
2796 | 2853 |
2797 } // namespace prerender | 2854 } // namespace prerender |
OLD | NEW |