OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 switch (status) { | 88 switch (status) { |
89 case FINAL_STATUS_USED: | 89 case FINAL_STATUS_USED: |
90 case FINAL_STATUS_WINDOW_OPENER: | 90 case FINAL_STATUS_WINDOW_OPENER: |
91 case FINAL_STATUS_APP_TERMINATING: | 91 case FINAL_STATUS_APP_TERMINATING: |
92 case FINAL_STATUS_FRAGMENT_MISMATCH: | 92 case FINAL_STATUS_FRAGMENT_MISMATCH: |
93 case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: | 93 case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: |
94 // We'll crash the renderer after it's loaded. | 94 // We'll crash the renderer after it's loaded. |
95 case FINAL_STATUS_RENDERER_CRASHED: | 95 case FINAL_STATUS_RENDERER_CRASHED: |
96 case FINAL_STATUS_CANCELLED: | 96 case FINAL_STATUS_CANCELLED: |
97 case FINAL_STATUS_DEVTOOLS_ATTACHED: | 97 case FINAL_STATUS_DEVTOOLS_ATTACHED: |
| 98 case FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH: |
98 return true; | 99 return true; |
99 default: | 100 default: |
100 return false; | 101 return false; |
101 } | 102 } |
102 } | 103 } |
103 | 104 |
104 // PrerenderContents that stops the UI message loop on DidStopLoading(). | 105 // PrerenderContents that stops the UI message loop on DidStopLoading(). |
105 class TestPrerenderContents : public PrerenderContents { | 106 class TestPrerenderContents : public PrerenderContents { |
106 public: | 107 public: |
107 TestPrerenderContents( | 108 TestPrerenderContents( |
108 PrerenderManager* prerender_manager, | 109 PrerenderManager* prerender_manager, |
109 PrerenderTracker* prerender_tracker, | 110 PrerenderTracker* prerender_tracker, |
110 Profile* profile, | 111 Profile* profile, |
111 const GURL& url, | 112 const GURL& url, |
112 const GURL& referrer, | 113 const GURL& referrer, |
113 int expected_number_of_loads, | 114 int expected_number_of_loads, |
114 FinalStatus expected_final_status) | 115 FinalStatus expected_final_status) |
115 : PrerenderContents(prerender_manager, prerender_tracker, profile, | 116 : PrerenderContents(prerender_manager, prerender_tracker, |
116 url, referrer, ORIGIN_LINK_REL_PRERENDER, | 117 profile, url, referrer, ORIGIN_LINK_REL_PRERENDER, |
117 PrerenderManager::kNoExperiment), | 118 PrerenderManager::kNoExperiment), |
118 number_of_loads_(0), | 119 number_of_loads_(0), |
119 expected_number_of_loads_(expected_number_of_loads), | 120 expected_number_of_loads_(expected_number_of_loads), |
120 expected_final_status_(expected_final_status), | 121 expected_final_status_(expected_final_status), |
121 new_render_view_host_(NULL), | 122 new_render_view_host_(NULL), |
122 was_hidden_(false), | 123 was_hidden_(false), |
123 was_shown_(false), | 124 was_shown_(false), |
124 should_be_shown_(expected_final_status == FINAL_STATUS_USED), | 125 should_be_shown_(expected_final_status == FINAL_STATUS_USED), |
125 quit_message_loop_on_destruction_( | 126 quit_message_loop_on_destruction_( |
126 expected_final_status != FINAL_STATUS_EVICTED && | 127 expected_final_status != FINAL_STATUS_EVICTED && |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 browser->GoBack(CURRENT_TAB); | 553 browser->GoBack(CURRENT_TAB); |
553 back_nav_observer.Wait(); | 554 back_nav_observer.Wait(); |
554 bool original_prerender_page = false; | 555 bool original_prerender_page = false; |
555 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 556 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
556 browser->GetSelectedTabContents()->render_view_host(), L"", | 557 browser->GetSelectedTabContents()->render_view_host(), L"", |
557 L"window.domAutomationController.send(IsOriginalPrerenderPage())", | 558 L"window.domAutomationController.send(IsOriginalPrerenderPage())", |
558 &original_prerender_page)); | 559 &original_prerender_page)); |
559 EXPECT_TRUE(original_prerender_page); | 560 EXPECT_TRUE(original_prerender_page); |
560 } | 561 } |
561 | 562 |
| 563 // Goes back to the page that was active before the prerender was swapped |
| 564 // in. This must be called when the prerendered page is the current page |
| 565 // in the active tab. |
| 566 void GoBackToPageBeforePrerender(Browser* browser) { |
| 567 ui_test_utils::WindowedNotificationObserver back_nav_observer( |
| 568 content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 569 content::NotificationService::AllSources()); |
| 570 browser->GoBack(CURRENT_TAB); |
| 571 back_nav_observer.Wait(); |
| 572 bool js_result; |
| 573 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| 574 browser->GetSelectedTabContents()->render_view_host(), L"", |
| 575 L"window.domAutomationController.send(DidBackToOriginalPagePass())", |
| 576 &js_result)); |
| 577 EXPECT_TRUE(js_result); |
| 578 } |
| 579 |
562 // Should be const but test_server()->GetURL(...) is not const. | 580 // Should be const but test_server()->GetURL(...) is not const. |
563 void NavigateToURL(const std::string& dest_html_file) { | 581 void NavigateToURL(const std::string& dest_html_file) { |
564 GURL dest_url = test_server()->GetURL(dest_html_file); | 582 GURL dest_url = test_server()->GetURL(dest_html_file); |
565 NavigateToURLImpl(dest_url, CURRENT_TAB); | 583 NavigateToURLImpl(dest_url, CURRENT_TAB); |
566 } | 584 } |
567 | 585 |
568 bool UrlIsInPrerenderManager(const std::string& html_file) { | 586 bool UrlIsInPrerenderManager(const std::string& html_file) { |
569 GURL dest_url = test_server()->GetURL(html_file); | 587 GURL dest_url = test_server()->GetURL(html_file); |
570 return (prerender_manager()->FindEntry(dest_url) != NULL); | 588 return (prerender_manager()->FindEntry(dest_url) != NULL); |
571 } | 589 } |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 } | 819 } |
802 | 820 |
803 // Checks that the visibility API works when the prerender is quickly opened | 821 // Checks that the visibility API works when the prerender is quickly opened |
804 // in a new tab before it stops loading. | 822 // in a new tab before it stops loading. |
805 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityQuickSwitch) { | 823 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityQuickSwitch) { |
806 PrerenderTestURL("files/prerender/prerender_visibility_quick.html", | 824 PrerenderTestURL("files/prerender/prerender_visibility_quick.html", |
807 FINAL_STATUS_USED, 0); | 825 FINAL_STATUS_USED, 0); |
808 NavigateToDestURL(); | 826 NavigateToDestURL(); |
809 } | 827 } |
810 | 828 |
811 // Checks that the visibility API works when opening a page in a new hidden | |
812 // tab. | |
813 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityBackgroundTab) { | |
814 PrerenderTestURL("files/prerender/prerender_visibility_hidden.html", | |
815 FINAL_STATUS_USED, | |
816 1); | |
817 NavigateToDestURLWithDisposition(NEW_BACKGROUND_TAB); | |
818 } | |
819 | |
820 // Checks that the visibility API works when opening a page in a new hidden | |
821 // tab, which is switched to before it stops loading. | |
822 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
823 PrerenderVisibilityBackgroundTabQuickSwitch) { | |
824 PrerenderTestURL("files/prerender/prerender_visibility_hidden_quick.html", | |
825 FINAL_STATUS_USED, 0); | |
826 NavigateToDestURLWithDisposition(NEW_BACKGROUND_TAB); | |
827 } | |
828 | |
829 // Checks that the visibility API works when opening a page in a new foreground | |
830 // tab. | |
831 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityForegroundTab) { | |
832 PrerenderTestURL("files/prerender/prerender_visibility.html", | |
833 FINAL_STATUS_USED, | |
834 1); | |
835 NavigateToDestURLWithDisposition(NEW_FOREGROUND_TAB); | |
836 } | |
837 | |
838 // Checks that the visibility API works when the prerender is quickly opened | |
839 // in a new tab foreground before it stops loading. | |
840 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
841 PrerenderVisibilityForegroundTabQuickSwitch) { | |
842 PrerenderTestURL("files/prerender/prerender_visibility_quick.html", | |
843 FINAL_STATUS_USED, 0); | |
844 NavigateToDestURL(); | |
845 } | |
846 | |
847 // Checks that the prerendering of a page is canceled correctly when a | 829 // Checks that the prerendering of a page is canceled correctly when a |
848 // Javascript alert is called. | 830 // Javascript alert is called. |
849 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { | 831 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { |
850 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", | 832 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", |
851 FINAL_STATUS_JAVASCRIPT_ALERT, | 833 FINAL_STATUS_JAVASCRIPT_ALERT, |
852 1); | 834 1); |
853 } | 835 } |
854 | 836 |
855 // Checks that the prerendering of a page is canceled correctly when a | 837 // Checks that the prerendering of a page is canceled correctly when a |
856 // Javascript alert is called. | 838 // Javascript alert is called. |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1541 // Checks that if a page is opened due to click on a href with target="_blank" | 1523 // Checks that if a page is opened due to click on a href with target="_blank" |
1542 // and both pages are in the same domain the prerendered page is not used. | 1524 // and both pages are in the same domain the prerendered page is not used. |
1543 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1525 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1544 PrerenderSameDomainWindowOpenerClickTarget) { | 1526 PrerenderSameDomainWindowOpenerClickTarget) { |
1545 PrerenderTestURL("files/prerender/prerender_page.html", | 1527 PrerenderTestURL("files/prerender/prerender_page.html", |
1546 FINAL_STATUS_WINDOW_OPENER, | 1528 FINAL_STATUS_WINDOW_OPENER, |
1547 1); | 1529 1); |
1548 OpenDestURLViaClickTarget(); | 1530 OpenDestURLViaClickTarget(); |
1549 } | 1531 } |
1550 | 1532 |
1551 // Checks that if a page is opened in a new window by javascript and both the | |
1552 // pages are in different domains, the prerendered page is used. | |
1553 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1554 PrerenderCrossDomainWindowOpenerWindowOpen) { | |
1555 PrerenderTestURL( | |
1556 GetCrossDomainTestUrl("files/prerender/prerender_page.html"), | |
1557 FINAL_STATUS_USED, | |
1558 1); | |
1559 OpenDestURLViaWindowOpen(); | |
1560 } | |
1561 | |
1562 // Checks that if a page is opened due to click on a href with target="_blank" | |
1563 // and both pages are in different domains, the prerendered page is used. | |
1564 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1565 PrerenderCrossDomainWindowOpenerClickTarget) { | |
1566 PrerenderTestURL( | |
1567 GetCrossDomainTestUrl("files/prerender/prerender_page.html"), | |
1568 FINAL_STATUS_USED, | |
1569 1); | |
1570 OpenDestURLViaClickTarget(); | |
1571 } | |
1572 | |
1573 // TODO(shishir): Add a test for the case when the page having the | |
1574 // prerendering link already has an opener set. | |
1575 | |
1576 // Checks that a top-level page which would normally request an SSL client | 1533 // Checks that a top-level page which would normally request an SSL client |
1577 // certificate will never be seen since it's an https top-level resource. | 1534 // certificate will never be seen since it's an https top-level resource. |
1578 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertTopLevel) { | 1535 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertTopLevel) { |
1579 net::TestServer::HTTPSOptions https_options; | 1536 net::TestServer::HTTPSOptions https_options; |
1580 https_options.request_client_certificate = true; | 1537 https_options.request_client_certificate = true; |
1581 net::TestServer https_server(https_options, | 1538 net::TestServer https_server(https_options, |
1582 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 1539 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
1583 ASSERT_TRUE(https_server.Start()); | 1540 ASSERT_TRUE(https_server.Start()); |
1584 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); | 1541 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
1585 PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 1); | 1542 PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 1); |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1832 | 1789 |
1833 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { | 1790 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { |
1834 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 1791 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
1835 FINAL_STATUS_USED, | 1792 FINAL_STATUS_USED, |
1836 1); | 1793 1); |
1837 OpenDestURLViaClick(); | 1794 OpenDestURLViaClick(); |
1838 NavigateToNextPageAfterPrerender(browser()); | 1795 NavigateToNextPageAfterPrerender(browser()); |
1839 GoBackToPrerender(browser()); | 1796 GoBackToPrerender(browser()); |
1840 } | 1797 } |
1841 | 1798 |
1842 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1799 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { |
1843 PrerenderClickNewWindowClickGoBack) { | |
1844 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 1800 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
1845 FINAL_STATUS_USED, | 1801 FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH, |
1846 1); | 1802 1); |
1847 OpenDestURLViaClickNewWindow(); | 1803 OpenDestURLViaClickNewWindow(); |
1848 Browser* new_browser = BrowserList::GetLastActive(); | 1804 } |
1849 NavigateToNextPageAfterPrerender(new_browser); | 1805 |
1850 GoBackToPrerender(new_browser); | 1806 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { |
| 1807 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| 1808 FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH, |
| 1809 1); |
| 1810 OpenDestURLViaClickNewForegroundTab(); |
| 1811 } |
| 1812 |
| 1813 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewBackgroundTab) { |
| 1814 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| 1815 FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH, |
| 1816 1); |
| 1817 OpenDestURLViaClickNewBackgroundTab(); |
1851 } | 1818 } |
1852 | 1819 |
1853 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1820 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1854 PrerenderClickNewWindowNavigateGoBack) { | |
1855 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | |
1856 FINAL_STATUS_USED, | |
1857 1); | |
1858 OpenDestURLViaClickNewWindow(); | |
1859 Browser* new_browser = BrowserList::GetLastActive(); | |
1860 ClickToNextPageAfterPrerender(new_browser); | |
1861 GoBackToPrerender(new_browser); | |
1862 } | |
1863 | |
1864 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1865 PrerenderClickNewForegroundTabClickGoBack) { | |
1866 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | |
1867 FINAL_STATUS_USED, | |
1868 1); | |
1869 OpenDestURLViaClickNewForegroundTab(); | |
1870 NavigateToNextPageAfterPrerender(browser()); | |
1871 GoBackToPrerender(browser()); | |
1872 } | |
1873 | |
1874 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1875 PrerenderClickNewForegroundTabNavigateGoBack) { | |
1876 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | |
1877 FINAL_STATUS_USED, | |
1878 1); | |
1879 OpenDestURLViaClickNewForegroundTab(); | |
1880 ClickToNextPageAfterPrerender(browser()); | |
1881 GoBackToPrerender(browser()); | |
1882 } | |
1883 | |
1884 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1885 PrerenderClickNewBackgroundTabClickGoBack) { | |
1886 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | |
1887 FINAL_STATUS_USED, | |
1888 1); | |
1889 OpenDestURLViaClickNewBackgroundTab(); | |
1890 // SelectNextTab completes synchronously, in terms of | |
1891 // updating the active index. | |
1892 browser()->SelectNextTab(); | |
1893 NavigateToNextPageAfterPrerender(browser()); | |
1894 GoBackToPrerender(browser()); | |
1895 } | |
1896 | |
1897 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1898 PrerenderClickNewBackgroundTabNavigateGoBack) { | |
1899 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | |
1900 FINAL_STATUS_USED, | |
1901 1); | |
1902 OpenDestURLViaClickNewBackgroundTab(); | |
1903 // SelectNextTab completes synchronously, in terms of | |
1904 // updating the active index. | |
1905 browser()->SelectNextTab(); | |
1906 ClickToNextPageAfterPrerender(browser()); | |
1907 GoBackToPrerender(browser()); | |
1908 } | |
1909 | |
1910 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
1911 NavigateToPrerenderedPageWhenDevToolsAttached) { | 1821 NavigateToPrerenderedPageWhenDevToolsAttached) { |
1912 DisableJavascriptCalls(); | 1822 DisableJavascriptCalls(); |
1913 TabContents* tab_contents = browser()->GetSelectedTabContents(); | 1823 TabContents* tab_contents = browser()->GetSelectedTabContents(); |
1914 RenderViewHost* inspected_rvh = tab_contents->render_view_host(); | 1824 RenderViewHost* inspected_rvh = tab_contents->render_view_host(); |
1915 DevToolsManager* manager = DevToolsManager::GetInstance(); | 1825 DevToolsManager* manager = DevToolsManager::GetInstance(); |
1916 FakeDevToolsClientHost client_host; | 1826 FakeDevToolsClientHost client_host; |
1917 manager->RegisterDevToolsClientHostFor(inspected_rvh, &client_host); | 1827 manager->RegisterDevToolsClientHostFor(inspected_rvh, &client_host); |
1918 const char* url = "files/prerender/prerender_page.html"; | 1828 const char* url = "files/prerender/prerender_page.html"; |
1919 PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); | 1829 PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); |
1920 NavigateToURL(url); | 1830 NavigateToURL(url); |
1921 } | 1831 } |
1922 | 1832 |
| 1833 // Validate that the sessionStorage namespace remains the same when swapping |
| 1834 // in a prerendered page. |
| 1835 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorage) { |
| 1836 set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); |
| 1837 PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), |
| 1838 FINAL_STATUS_USED, |
| 1839 1); |
| 1840 NavigateToDestURL(); |
| 1841 GoBackToPageBeforePrerender(browser()); |
| 1842 } |
| 1843 |
1923 } // namespace prerender | 1844 } // namespace prerender |
OLD | NEW |