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

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

Issue 2833553002: Revert of [Prerender] Restore request priorities when swapped in (Closed)
Patch Set: Created 3 years, 8 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
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 <stddef.h> 5 #include <stddef.h>
6 #include <deque> 6 #include <deque>
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <unordered_map> 9 #include <unordered_map>
10 #include <utility> 10 #include <utility>
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 using content::Referrer; 136 using content::Referrer;
137 using content::RenderFrameHost; 137 using content::RenderFrameHost;
138 using content::RenderViewHost; 138 using content::RenderViewHost;
139 using content::RenderWidgetHost; 139 using content::RenderWidgetHost;
140 using content::TestNavigationObserver; 140 using content::TestNavigationObserver;
141 using content::WebContents; 141 using content::WebContents;
142 using content::WebContentsObserver; 142 using content::WebContentsObserver;
143 using net::NetworkChangeNotifier; 143 using net::NetworkChangeNotifier;
144 using prerender::test_utils::RequestCounter; 144 using prerender::test_utils::RequestCounter;
145 using prerender::test_utils::CreateCountingInterceptorOnIO; 145 using prerender::test_utils::CreateCountingInterceptorOnIO;
146 using prerender::test_utils::CreateHangingFirstRequestInterceptor; 146 using prerender::test_utils::CreateHangingFirstRequestInterceptorOnIO;
147 using prerender::test_utils::CreateMockInterceptorOnIO; 147 using prerender::test_utils::CreateMockInterceptorOnIO;
148 using prerender::test_utils::TestPrerender; 148 using prerender::test_utils::TestPrerender;
149 using prerender::test_utils::TestPrerenderContents; 149 using prerender::test_utils::TestPrerenderContents;
150 using task_manager::browsertest_util::WaitForTaskManagerRows; 150 using task_manager::browsertest_util::WaitForTaskManagerRows;
151 151
152 // crbug.com/708158 152 // crbug.com/708158
153 #if !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) 153 #if !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER)
154 154
155 // Prerender tests work as follows: 155 // Prerender tests work as follows:
156 // 156 //
157 // A page with a prefetch link to the test page is loaded. Once prerendered, 157 // A page with a prefetch link to the test page is loaded. Once prerendered,
158 // its Javascript function DidPrerenderPass() is called, which returns true if 158 // its Javascript function DidPrerenderPass() is called, which returns true if
159 // the page behaves as expected when prerendered. 159 // the page behaves as expected when prerendered.
160 // 160 //
161 // The prerendered page is then displayed on a tab. The Javascript function 161 // The prerendered page is then displayed on a tab. The Javascript function
162 // DidDisplayPass() is called, and returns true if the page behaved as it 162 // DidDisplayPass() is called, and returns true if the page behaved as it
163 // should while being displayed. 163 // should while being displayed.
164 164
165 namespace prerender { 165 namespace prerender {
166 166
167 namespace { 167 namespace {
168 168
169 const char kPrefetchJpeg[] = "/prerender/image.jpeg";
170
171 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver { 169 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver {
172 public: 170 public:
173 explicit FaviconUpdateWatcher(content::WebContents* web_contents) 171 explicit FaviconUpdateWatcher(content::WebContents* web_contents)
174 : seen_(false), running_(false), scoped_observer_(this) { 172 : seen_(false), running_(false), scoped_observer_(this) {
175 scoped_observer_.Add( 173 scoped_observer_.Add(
176 favicon::ContentFaviconDriver::FromWebContents(web_contents)); 174 favicon::ContentFaviconDriver::FromWebContents(web_contents));
177 } 175 }
178 176
179 void Wait() { 177 void Wait() {
180 if (seen_) 178 if (seen_)
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 base::FilePath(FILE_PATH_LITERAL("prerender")), 532 base::FilePath(FILE_PATH_LITERAL("prerender")),
535 base::FilePath().AppendASCII(file_name)); 533 base::FilePath().AppendASCII(file_name));
536 } 534 }
537 535
538 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( 536 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo(
539 const GURL& dest_url) { 537 const GURL& dest_url) {
540 return page_load_metrics::PageLoadExtraInfo::CreateForTesting( 538 return page_load_metrics::PageLoadExtraInfo::CreateForTesting(
541 dest_url, false /* started_in_foreground */); 539 dest_url, false /* started_in_foreground */);
542 } 540 }
543 541
544 // Helper function, to allow passing a UI closure to
545 // CreateHangingFirstRequestInterceptor() instead of a IO callback.
546 base::Callback<void(net::URLRequest*)> GetIOCallbackFromUIClosure(
547 base::Closure ui_closure) {
548 auto lambda = [](base::Closure closure, net::URLRequest*) {
549 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
550 closure);
551 };
552 return base::Bind(lambda, ui_closure);
553 }
554
555 } // namespace 542 } // namespace
556 543
557 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { 544 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest {
558 public: 545 public:
559 PrerenderBrowserTest() 546 PrerenderBrowserTest()
560 : call_javascript_(true), 547 : call_javascript_(true),
561 check_load_events_(true), 548 check_load_events_(true),
562 loader_path_("/prerender/prerender_loader.html") {} 549 loader_path_("/prerender/prerender_loader.html") {}
563 550
564 ~PrerenderBrowserTest() override {} 551 ~PrerenderBrowserTest() override {}
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1308 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap 1295 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap
1309 #endif 1296 #endif
1310 // Checks that the prerendering of a page is canceled correctly if we try to 1297 // Checks that the prerendering of a page is canceled correctly if we try to
1311 // swap it in before it commits. 1298 // swap it in before it commits.
1312 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) { 1299 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) {
1313 // Navigate to a page that triggers a prerender for a URL that never commits. 1300 // Navigate to a page that triggers a prerender for a URL that never commits.
1314 const GURL kNoCommitUrl("http://never-respond.example.com"); 1301 const GURL kNoCommitUrl("http://never-respond.example.com");
1315 base::FilePath file(GetTestPath("prerender_page.html")); 1302 base::FilePath file(GetTestPath("prerender_page.html"));
1316 1303
1317 base::RunLoop prerender_start_loop; 1304 base::RunLoop prerender_start_loop;
1318 CreateHangingFirstRequestInterceptor( 1305 BrowserThread::PostTask(
1319 kNoCommitUrl, file, 1306 BrowserThread::IO, FROM_HERE,
1320 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); 1307 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file,
1308 prerender_start_loop.QuitClosure()));
1321 DisableJavascriptCalls(); 1309 DisableJavascriptCalls();
1322 PrerenderTestURL(kNoCommitUrl, 1310 PrerenderTestURL(kNoCommitUrl,
1323 FINAL_STATUS_NAVIGATION_UNCOMMITTED, 1311 FINAL_STATUS_NAVIGATION_UNCOMMITTED,
1324 0); 1312 0);
1325 // Wait for the hanging request to be scheduled. 1313 // Wait for the hanging request to be scheduled.
1326 prerender_start_loop.Run(); 1314 prerender_start_loop.Run();
1327 1315
1328 // Navigate to the URL, but assume the contents won't be swapped in. 1316 // Navigate to the URL, but assume the contents won't be swapped in.
1329 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); 1317 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
1330 } 1318 }
1331 1319
1332 // crbug.com/708158 1320 // crbug.com/708158
1333 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) 1321 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER)
1334 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2 1322 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2
1335 #else 1323 #else
1336 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2 1324 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2
1337 #endif 1325 #endif
1338 // Checks that client redirects don't add alias URLs until after they commit. 1326 // Checks that client redirects don't add alias URLs until after they commit.
1339 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) { 1327 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) {
1340 // Navigate to a page that then navigates to a URL that never commits. 1328 // Navigate to a page that then navigates to a URL that never commits.
1341 const GURL kNoCommitUrl("http://never-respond.example.com"); 1329 const GURL kNoCommitUrl("http://never-respond.example.com");
1342 base::FilePath file(GetTestPath("prerender_page.html")); 1330 base::FilePath file(GetTestPath("prerender_page.html"));
1343 1331
1344 base::RunLoop prerender_start_loop; 1332 base::RunLoop prerender_start_loop;
1345 CreateHangingFirstRequestInterceptor( 1333 BrowserThread::PostTask(
1346 kNoCommitUrl, file, 1334 BrowserThread::IO, FROM_HERE,
1347 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); 1335 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file,
1336 prerender_start_loop.QuitClosure()));
1348 DisableJavascriptCalls(); 1337 DisableJavascriptCalls();
1349 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), 1338 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()),
1350 FINAL_STATUS_APP_TERMINATING, 1); 1339 FINAL_STATUS_APP_TERMINATING, 1);
1351 // Wait for the hanging request to be scheduled. 1340 // Wait for the hanging request to be scheduled.
1352 prerender_start_loop.Run(); 1341 prerender_start_loop.Run();
1353 1342
1354 // Navigating to the second URL should not swap. 1343 // Navigating to the second URL should not swap.
1355 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB, 1344 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB,
1356 false); 1345 false);
1357 } 1346 }
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
2113 // Checks that prerendering a PNG works correctly. 2102 // Checks that prerendering a PNG works correctly.
2114 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 2103 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) {
2115 DisableJavascriptCalls(); 2104 DisableJavascriptCalls();
2116 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1); 2105 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1);
2117 NavigateToDestURL(); 2106 NavigateToDestURL();
2118 } 2107 }
2119 2108
2120 // Checks that prerendering a JPG works correctly. 2109 // Checks that prerendering a JPG works correctly.
2121 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 2110 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) {
2122 DisableJavascriptCalls(); 2111 DisableJavascriptCalls();
2123 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_USED, 1); 2112 PrerenderTestURL("/prerender/image.jpeg", FINAL_STATUS_USED, 1);
2124 NavigateToDestURL(); 2113 NavigateToDestURL();
2125 } 2114 }
2126 2115
2127 // Checks that a prerender of a CRX will result in a cancellation due to 2116 // Checks that a prerender of a CRX will result in a cancellation due to
2128 // download. 2117 // download.
2129 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 2118 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) {
2130 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 2119 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0);
2131 } 2120 }
2132 2121
2133 // Checks that xhr GET requests allow prerenders. 2122 // Checks that xhr GET requests allow prerenders.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2185 } 2174 }
2186 2175
2187 // Checks that an SSL error that comes from a subresource does not cancel 2176 // Checks that an SSL error that comes from a subresource does not cancel
2188 // the page. Non-main-frame requests are simply cancelled if they run into 2177 // the page. Non-main-frame requests are simply cancelled if they run into
2189 // an SSL problem. 2178 // an SSL problem.
2190 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2179 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) {
2191 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); 2180 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
2192 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); 2181 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
2193 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); 2182 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
2194 ASSERT_TRUE(https_server.Start()); 2183 ASSERT_TRUE(https_server.Start());
2195 GURL https_url = https_server.GetURL(kPrefetchJpeg); 2184 GURL https_url = https_server.GetURL("/prerender/image.jpeg");
2196 base::StringPairs replacement_text; 2185 base::StringPairs replacement_text;
2197 replacement_text.push_back( 2186 replacement_text.push_back(
2198 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 2187 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
2199 std::string replacement_path; 2188 std::string replacement_path;
2200 net::test_server::GetFilePathWithReplacements( 2189 net::test_server::GetFilePathWithReplacements(
2201 "/prerender/prerender_with_image.html", replacement_text, 2190 "/prerender/prerender_with_image.html", replacement_text,
2202 &replacement_path); 2191 &replacement_path);
2203 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 2192 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1);
2204 NavigateToDestURL(); 2193 NavigateToDestURL();
2205 } 2194 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
2297 ->set_client_cert_store_factory_for_testing(base::Bind( 2286 ->set_client_cert_store_factory_for_testing(base::Bind(
2298 &CreateCertStore, net::ImportCertFromFile( 2287 &CreateCertStore, net::ImportCertFromFile(
2299 net::GetTestCertsDirectory(), "ok_cert.pem"))); 2288 net::GetTestCertsDirectory(), "ok_cert.pem")));
2300 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); 2289 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
2301 net::SSLServerConfig ssl_config; 2290 net::SSLServerConfig ssl_config;
2302 ssl_config.client_cert_type = 2291 ssl_config.client_cert_type =
2303 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; 2292 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT;
2304 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); 2293 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config);
2305 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); 2294 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
2306 ASSERT_TRUE(https_server.Start()); 2295 ASSERT_TRUE(https_server.Start());
2307 GURL https_url = https_server.GetURL(kPrefetchJpeg); 2296 GURL https_url = https_server.GetURL("/prerender/image.jpeg");
2308 base::StringPairs replacement_text; 2297 base::StringPairs replacement_text;
2309 replacement_text.push_back( 2298 replacement_text.push_back(
2310 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 2299 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
2311 std::string replacement_path; 2300 std::string replacement_path;
2312 net::test_server::GetFilePathWithReplacements( 2301 net::test_server::GetFilePathWithReplacements(
2313 "/prerender/prerender_with_image.html", replacement_text, 2302 "/prerender/prerender_with_image.html", replacement_text,
2314 &replacement_path); 2303 &replacement_path);
2315 PrerenderTestURL(replacement_path, 2304 PrerenderTestURL(replacement_path,
2316 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 2305 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED,
2317 0); 2306 0);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2371 PrerenderSafeBrowsingClientRedirect) { 2360 PrerenderSafeBrowsingClientRedirect) {
2372 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 2361 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
2373 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 2362 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
2374 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); 2363 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
2375 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"), 2364 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"),
2376 FINAL_STATUS_SAFE_BROWSING, 1); 2365 FINAL_STATUS_SAFE_BROWSING, 1);
2377 } 2366 }
2378 2367
2379 // Ensures that we do not prerender pages which have a malware subresource. 2368 // Ensures that we do not prerender pages which have a malware subresource.
2380 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 2369 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) {
2381 GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg); 2370 GURL image_url = embedded_test_server()->GetURL("/prerender/image.jpeg");
2382 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 2371 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
2383 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); 2372 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
2384 base::StringPairs replacement_text; 2373 base::StringPairs replacement_text;
2385 replacement_text.push_back( 2374 replacement_text.push_back(
2386 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 2375 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec()));
2387 std::string replacement_path; 2376 std::string replacement_path;
2388 net::test_server::GetFilePathWithReplacements( 2377 net::test_server::GetFilePathWithReplacements(
2389 "/prerender/prerender_with_image.html", replacement_text, 2378 "/prerender/prerender_with_image.html", replacement_text,
2390 &replacement_path); 2379 &replacement_path);
2391 PrerenderTestURL(replacement_path, 2380 PrerenderTestURL(replacement_path,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2495 destruction_observer.Wait(); 2484 destruction_observer.Wait();
2496 } 2485 }
2497 2486
2498 // Checks that a hanging unload on the referring page of a prerender swap does 2487 // Checks that a hanging unload on the referring page of a prerender swap does
2499 // not crash the browser on exit. 2488 // not crash the browser on exit.
2500 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { 2489 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) {
2501 // Matches URL in prerender_loader_with_unload.html. 2490 // Matches URL in prerender_loader_with_unload.html.
2502 const GURL hang_url("http://unload-url.test"); 2491 const GURL hang_url("http://unload-url.test");
2503 base::FilePath empty_file = ui_test_utils::GetTestFilePath( 2492 base::FilePath empty_file = ui_test_utils::GetTestFilePath(
2504 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 2493 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html")));
2505 CreateHangingFirstRequestInterceptor( 2494 BrowserThread::PostTask(
2506 hang_url, empty_file, base::Callback<void(net::URLRequest*)>()); 2495 BrowserThread::IO, FROM_HERE,
2496 base::Bind(&CreateHangingFirstRequestInterceptorOnIO,
2497 hang_url, empty_file,
2498 base::Closure()));
2507 2499
2508 set_loader_path("/prerender/prerender_loader_with_unload.html"); 2500 set_loader_path("/prerender/prerender_loader_with_unload.html");
2509 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 2501 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
2510 NavigateToDestURL(); 2502 NavigateToDestURL();
2511 } 2503 }
2512 2504
2513 2505
2514 // Checks that when the history is cleared, prerendering is cancelled and 2506 // Checks that when the history is cleared, prerendering is cancelled and
2515 // prerendering history is cleared. 2507 // prerendering history is cleared.
2516 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 2508 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) {
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
3292 done_url, empty_file, done_counter.AsWeakPtr())); 3284 done_url, empty_file, done_counter.AsWeakPtr()));
3293 // Loading may finish or be interrupted. The final result is important only. 3285 // Loading may finish or be interrupted. The final result is important only.
3294 DisableLoadEventCheck(); 3286 DisableLoadEventCheck();
3295 // TestPrenderContents is always created before the Autosignin JS can run, so 3287 // TestPrenderContents is always created before the Autosignin JS can run, so
3296 // waiting for PrerenderContents to stop should be reliable. 3288 // waiting for PrerenderContents to stop should be reliable.
3297 PrerenderTestURL("/password/autosignin.html", 3289 PrerenderTestURL("/password/autosignin.html",
3298 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3290 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3299 EXPECT_EQ(0, done_counter.count()); 3291 EXPECT_EQ(0, done_counter.count());
3300 } 3292 }
3301 3293
3302 // Checks that the requests from a prerender are IDLE priority before the swap
3303 // (except on Android), but normal priority after the swap.
3304 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourcePriority) {
3305 GURL before_swap_url = embedded_test_server()->GetURL(kPrefetchJpeg);
3306 GURL after_swap_url = embedded_test_server()->GetURL("/prerender/image.png");
3307 GURL main_page_url =
3308 GetURLWithReplacement("/prerender/prerender_with_image.html",
3309 "REPLACE_WITH_IMAGE_URL", kPrefetchJpeg);
3310
3311 // Setup request interceptors for subresources.
3312 auto get_priority_lambda = [](net::RequestPriority* out_priority,
3313 net::URLRequest* request) {
3314 *out_priority = request->priority();
3315 };
3316 RequestCounter before_swap_counter;
3317 net::RequestPriority before_swap_priority = net::THROTTLED;
3318 InterceptRequestAndCount(
3319 before_swap_url, &before_swap_counter,
3320 base::Bind(get_priority_lambda, base::Unretained(&before_swap_priority)));
3321 RequestCounter after_swap_counter;
3322 net::RequestPriority after_swap_priority = net::THROTTLED;
3323 InterceptRequestAndCount(
3324 after_swap_url, &after_swap_counter,
3325 base::Bind(get_priority_lambda, base::Unretained(&after_swap_priority)));
3326
3327 // Start the prerender.
3328 PrerenderTestURL(main_page_url, FINAL_STATUS_USED, 1);
3329
3330 // Check priority before swap.
3331 before_swap_counter.WaitForCount(1);
3332 #if defined(OS_ANDROID)
3333 EXPECT_GT(before_swap_priority, net::IDLE);
3334 #else
3335 EXPECT_EQ(net::IDLE, before_swap_priority);
3336 #endif
3337
3338 // Swap.
3339 NavigateToDestURL();
3340
3341 // Check priority after swap.
3342 GetActiveWebContents()->GetMainFrame()->ExecuteJavaScriptForTests(
3343 base::ASCIIToUTF16(
3344 "var img=new Image(); img.src='/prerender/image.png'"));
3345 after_swap_counter.WaitForCount(1);
3346 EXPECT_NE(net::IDLE, after_swap_priority);
3347 }
3348
3349 // Checks that a request started before the swap gets its original priority back
3350 // after the swap.
3351 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourcePriorityOverlappingSwap) {
3352 GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg);
3353 GURL main_page_url =
3354 GetURLWithReplacement("/prerender/prerender_with_image.html",
3355 "REPLACE_WITH_IMAGE_URL", kPrefetchJpeg);
3356
3357 // Setup request interceptors for subresources.
3358 net::URLRequest* url_request = nullptr;
3359 net::RequestPriority priority = net::THROTTLED;
3360 base::RunLoop wait_loop;
3361 auto io_lambda = [](net::URLRequest** out_request,
3362 net::RequestPriority* out_priority, base::Closure closure,
3363 net::URLRequest* request) {
3364 if (out_request)
3365 *out_request = request;
3366 content::BrowserThread::PostTask(
3367 content::BrowserThread::UI, FROM_HERE,
3368 base::Bind(
3369 [](net::RequestPriority priority,
3370 net::RequestPriority* out_priority, base::Closure closure) {
3371 *out_priority = priority;
3372 closure.Run();
3373 },
3374 request->priority(), base::Unretained(out_priority), closure));
3375 };
3376
3377 CreateHangingFirstRequestInterceptor(
3378 image_url, base::FilePath(),
3379 base::Bind(io_lambda, base::Unretained(&url_request),
3380 base::Unretained(&priority), wait_loop.QuitClosure()));
3381
3382 // The prerender will hang on the image resource, can't run the usual checks.
3383 DisableLoadEventCheck();
3384 DisableJavascriptCalls();
3385 // Start the prerender.
3386 PrerenderTestURL(main_page_url, FINAL_STATUS_USED, 0);
3387
3388 // Check priority before swap.
3389 #if defined(OS_ANDROID)
3390 if (priority <= net::IDLE)
3391 wait_loop.Run();
3392 EXPECT_GT(priority, net::IDLE);
3393 #else
3394 if (priority != net::IDLE)
3395 wait_loop.Run();
3396 EXPECT_EQ(net::IDLE, priority);
3397 #endif
3398
3399 // Swap. Cannot use NavigateToDestURL, because it waits for the load to
3400 // complete, but the resource is still hung.
3401 current_browser()->OpenURL(content::OpenURLParams(
3402 dest_url(), Referrer(), WindowOpenDisposition::CURRENT_TAB,
3403 ui::PAGE_TRANSITION_TYPED, false));
3404
3405 // Check priority after swap. The test may timeout in case of failure.
3406 priority = net::THROTTLED;
3407 do {
3408 base::RunLoop loop;
3409 content::BrowserThread::PostTask(
3410 content::BrowserThread::IO, FROM_HERE,
3411 base::Bind(io_lambda, nullptr, base::Unretained(&priority),
3412 loop.QuitClosure(), base::Unretained(url_request)));
3413 loop.Run();
3414 } while (priority <= net::IDLE);
3415 EXPECT_GT(priority, net::IDLE);
3416 }
3417
3418 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { 3294 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3419 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3295 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3420 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3296 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3421 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3297 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3422 3298
3423 base::TimeTicks load_start = clock->NowTicks(); 3299 base::TimeTicks load_start = clock->NowTicks();
3424 clock->Advance(base::TimeDelta::FromSeconds(1)); 3300 clock->Advance(base::TimeDelta::FromSeconds(1));
3425 NavigateToDestURL(); 3301 NavigateToDestURL();
3426 3302
3427 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), 3303 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
(...skipping 12 matching lines...) Expand all
3440 histogram_tester().ExpectUniqueSample( 3316 histogram_tester().ExpectUniqueSample(
3441 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); 3317 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3442 } 3318 }
3443 3319
3444 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { 3320 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3445 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3321 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3446 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3322 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3447 3323
3448 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 3324 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3449 base::RunLoop hanging_request_waiter; 3325 base::RunLoop hanging_request_waiter;
3450 CreateHangingFirstRequestInterceptor( 3326 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
3451 url, GetTestPath("prerender_page.html"), 3327 base::Bind(&CreateHangingFirstRequestInterceptorOnIO,
3452 GetIOCallbackFromUIClosure(hanging_request_waiter.QuitClosure())); 3328 url, GetTestPath("prerender_page.html"),
3329 hanging_request_waiter.QuitClosure()));
3453 // As this load will be canceled, it is not waited for, and hence no 3330 // As this load will be canceled, it is not waited for, and hence no
3454 // javascript is executed. 3331 // javascript is executed.
3455 DisableJavascriptCalls(); 3332 DisableJavascriptCalls();
3456 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); 3333 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3457 hanging_request_waiter.Run(); 3334 hanging_request_waiter.Run();
3458 3335
3459 // This prerender cancels and reuses the first. 3336 // This prerender cancels and reuses the first.
3460 clock->Advance(base::TimeDelta::FromSeconds(1)); 3337 clock->Advance(base::TimeDelta::FromSeconds(1));
3461 base::TimeTicks load_start = clock->NowTicks(); 3338 base::TimeTicks load_start = clock->NowTicks();
3462 EnableJavascriptCalls(); 3339 EnableJavascriptCalls();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
3527 FirstContentfulPaintTimingNoCommit) { 3404 FirstContentfulPaintTimingNoCommit) {
3528 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3405 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3529 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3406 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3530 3407
3531 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 3408 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3532 base::FilePath url_file = ui_test_utils::GetTestFilePath( 3409 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3533 base::FilePath(), 3410 base::FilePath(),
3534 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); 3411 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3535 3412
3536 base::RunLoop prerender_start_loop; 3413 base::RunLoop prerender_start_loop;
3537 CreateHangingFirstRequestInterceptor( 3414 BrowserThread::PostTask(
3538 url, url_file, 3415 BrowserThread::IO, FROM_HERE,
3539 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); 3416 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3417 prerender_start_loop.QuitClosure()));
3540 // As this load is uncommitted, it is not waited for, and hence no 3418 // As this load is uncommitted, it is not waited for, and hence no
3541 // javascript is executed. 3419 // javascript is executed.
3542 DisableJavascriptCalls(); 3420 DisableJavascriptCalls();
3543 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); 3421 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3544 prerender_start_loop.Run(); 3422 prerender_start_loop.Run();
3545 3423
3546 clock->Advance(base::TimeDelta::FromSeconds(1)); 3424 clock->Advance(base::TimeDelta::FromSeconds(1));
3547 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); 3425 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3548 3426
3549 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), 3427 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3646 FirstContentfulPaintHiddenNoCommit) { 3524 FirstContentfulPaintHiddenNoCommit) {
3647 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3525 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3648 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3526 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3649 3527
3650 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 3528 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3651 base::FilePath url_file = ui_test_utils::GetTestFilePath( 3529 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3652 base::FilePath(), 3530 base::FilePath(),
3653 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); 3531 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3654 3532
3655 base::RunLoop prerender_start_loop; 3533 base::RunLoop prerender_start_loop;
3656 CreateHangingFirstRequestInterceptor( 3534 BrowserThread::PostTask(
3657 url, url_file, 3535 BrowserThread::IO, FROM_HERE,
3658 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); 3536 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3537 prerender_start_loop.QuitClosure()));
3659 // As this load is uncommitted, it is not waited for, and hence no 3538 // As this load is uncommitted, it is not waited for, and hence no
3660 // javascript is executed. 3539 // javascript is executed.
3661 DisableJavascriptCalls(); 3540 DisableJavascriptCalls();
3662 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); 3541 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3663 prerender_start_loop.Run(); 3542 prerender_start_loop.Run();
3664 3543
3665 clock->Advance(base::TimeDelta::FromSeconds(1)); 3544 clock->Advance(base::TimeDelta::FromSeconds(1));
3666 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); 3545 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3667 3546
3668 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), 3547 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
3908 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3787 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3909 "DidDisplayReallyPass()", 3788 "DidDisplayReallyPass()",
3910 &display_test_result)); 3789 &display_test_result));
3911 ASSERT_TRUE(display_test_result); 3790 ASSERT_TRUE(display_test_result);
3912 } 3791 }
3913 #endif // !defined(DISABLE_NACL) 3792 #endif // !defined(DISABLE_NACL)
3914 3793
3915 } // namespace prerender 3794 } // namespace prerender
3916 3795
3917 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) 3796 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER)
OLDNEW
« no previous file with comments | « chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc ('k') | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698