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

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

Issue 2807163002: [Prerender] Restore request priorities when swapped in (Closed)
Patch Set: Fix test: default image priority can be LOWEST or MEDIUM 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::CreateHangingFirstRequestInterceptorOnIO; 146 using prerender::test_utils::CreateHangingFirstRequestInterceptor;
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
169 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver { 171 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver {
170 public: 172 public:
171 explicit FaviconUpdateWatcher(content::WebContents* web_contents) 173 explicit FaviconUpdateWatcher(content::WebContents* web_contents)
172 : seen_(false), running_(false), scoped_observer_(this) { 174 : seen_(false), running_(false), scoped_observer_(this) {
173 scoped_observer_.Add( 175 scoped_observer_.Add(
174 favicon::ContentFaviconDriver::FromWebContents(web_contents)); 176 favicon::ContentFaviconDriver::FromWebContents(web_contents));
175 } 177 }
176 178
177 void Wait() { 179 void Wait() {
178 if (seen_) 180 if (seen_)
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 base::FilePath(FILE_PATH_LITERAL("prerender")), 534 base::FilePath(FILE_PATH_LITERAL("prerender")),
533 base::FilePath().AppendASCII(file_name)); 535 base::FilePath().AppendASCII(file_name));
534 } 536 }
535 537
536 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( 538 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo(
537 const GURL& dest_url) { 539 const GURL& dest_url) {
538 return page_load_metrics::PageLoadExtraInfo::CreateForTesting( 540 return page_load_metrics::PageLoadExtraInfo::CreateForTesting(
539 dest_url, false /* started_in_foreground */); 541 dest_url, false /* started_in_foreground */);
540 } 542 }
541 543
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
542 } // namespace 555 } // namespace
543 556
544 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { 557 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest {
545 public: 558 public:
546 PrerenderBrowserTest() 559 PrerenderBrowserTest()
547 : call_javascript_(true), 560 : call_javascript_(true),
548 check_load_events_(true), 561 check_load_events_(true),
549 loader_path_("/prerender/prerender_loader.html") {} 562 loader_path_("/prerender/prerender_loader.html") {}
550 563
551 ~PrerenderBrowserTest() override {} 564 ~PrerenderBrowserTest() override {}
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap 1308 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap
1296 #endif 1309 #endif
1297 // Checks that the prerendering of a page is canceled correctly if we try to 1310 // Checks that the prerendering of a page is canceled correctly if we try to
1298 // swap it in before it commits. 1311 // swap it in before it commits.
1299 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) { 1312 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) {
1300 // Navigate to a page that triggers a prerender for a URL that never commits. 1313 // Navigate to a page that triggers a prerender for a URL that never commits.
1301 const GURL kNoCommitUrl("http://never-respond.example.com"); 1314 const GURL kNoCommitUrl("http://never-respond.example.com");
1302 base::FilePath file(GetTestPath("prerender_page.html")); 1315 base::FilePath file(GetTestPath("prerender_page.html"));
1303 1316
1304 base::RunLoop prerender_start_loop; 1317 base::RunLoop prerender_start_loop;
1305 BrowserThread::PostTask( 1318 CreateHangingFirstRequestInterceptor(
1306 BrowserThread::IO, FROM_HERE, 1319 kNoCommitUrl, file,
1307 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, 1320 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
1308 prerender_start_loop.QuitClosure()));
1309 DisableJavascriptCalls(); 1321 DisableJavascriptCalls();
1310 PrerenderTestURL(kNoCommitUrl, 1322 PrerenderTestURL(kNoCommitUrl,
1311 FINAL_STATUS_NAVIGATION_UNCOMMITTED, 1323 FINAL_STATUS_NAVIGATION_UNCOMMITTED,
1312 0); 1324 0);
1313 // Wait for the hanging request to be scheduled. 1325 // Wait for the hanging request to be scheduled.
1314 prerender_start_loop.Run(); 1326 prerender_start_loop.Run();
1315 1327
1316 // Navigate to the URL, but assume the contents won't be swapped in. 1328 // Navigate to the URL, but assume the contents won't be swapped in.
1317 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); 1329 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
1318 } 1330 }
1319 1331
1320 // crbug.com/708158 1332 // crbug.com/708158
1321 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) 1333 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER)
1322 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2 1334 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2
1323 #else 1335 #else
1324 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2 1336 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2
1325 #endif 1337 #endif
1326 // Checks that client redirects don't add alias URLs until after they commit. 1338 // Checks that client redirects don't add alias URLs until after they commit.
1327 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) { 1339 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) {
1328 // Navigate to a page that then navigates to a URL that never commits. 1340 // Navigate to a page that then navigates to a URL that never commits.
1329 const GURL kNoCommitUrl("http://never-respond.example.com"); 1341 const GURL kNoCommitUrl("http://never-respond.example.com");
1330 base::FilePath file(GetTestPath("prerender_page.html")); 1342 base::FilePath file(GetTestPath("prerender_page.html"));
1331 1343
1332 base::RunLoop prerender_start_loop; 1344 base::RunLoop prerender_start_loop;
1333 BrowserThread::PostTask( 1345 CreateHangingFirstRequestInterceptor(
1334 BrowserThread::IO, FROM_HERE, 1346 kNoCommitUrl, file,
1335 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, 1347 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
1336 prerender_start_loop.QuitClosure()));
1337 DisableJavascriptCalls(); 1348 DisableJavascriptCalls();
1338 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), 1349 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()),
1339 FINAL_STATUS_APP_TERMINATING, 1); 1350 FINAL_STATUS_APP_TERMINATING, 1);
1340 // Wait for the hanging request to be scheduled. 1351 // Wait for the hanging request to be scheduled.
1341 prerender_start_loop.Run(); 1352 prerender_start_loop.Run();
1342 1353
1343 // Navigating to the second URL should not swap. 1354 // Navigating to the second URL should not swap.
1344 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB, 1355 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB,
1345 false); 1356 false);
1346 } 1357 }
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
2102 // Checks that prerendering a PNG works correctly. 2113 // Checks that prerendering a PNG works correctly.
2103 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 2114 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) {
2104 DisableJavascriptCalls(); 2115 DisableJavascriptCalls();
2105 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1); 2116 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1);
2106 NavigateToDestURL(); 2117 NavigateToDestURL();
2107 } 2118 }
2108 2119
2109 // Checks that prerendering a JPG works correctly. 2120 // Checks that prerendering a JPG works correctly.
2110 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 2121 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) {
2111 DisableJavascriptCalls(); 2122 DisableJavascriptCalls();
2112 PrerenderTestURL("/prerender/image.jpeg", FINAL_STATUS_USED, 1); 2123 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_USED, 1);
2113 NavigateToDestURL(); 2124 NavigateToDestURL();
2114 } 2125 }
2115 2126
2116 // Checks that a prerender of a CRX will result in a cancellation due to 2127 // Checks that a prerender of a CRX will result in a cancellation due to
2117 // download. 2128 // download.
2118 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 2129 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) {
2119 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 2130 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0);
2120 } 2131 }
2121 2132
2122 // Checks that xhr GET requests allow prerenders. 2133 // Checks that xhr GET requests allow prerenders.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2174 } 2185 }
2175 2186
2176 // Checks that an SSL error that comes from a subresource does not cancel 2187 // Checks that an SSL error that comes from a subresource does not cancel
2177 // the page. Non-main-frame requests are simply cancelled if they run into 2188 // the page. Non-main-frame requests are simply cancelled if they run into
2178 // an SSL problem. 2189 // an SSL problem.
2179 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2190 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) {
2180 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); 2191 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
2181 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); 2192 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
2182 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); 2193 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
2183 ASSERT_TRUE(https_server.Start()); 2194 ASSERT_TRUE(https_server.Start());
2184 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); 2195 GURL https_url = https_server.GetURL(kPrefetchJpeg);
2185 base::StringPairs replacement_text; 2196 base::StringPairs replacement_text;
2186 replacement_text.push_back( 2197 replacement_text.push_back(
2187 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 2198 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
2188 std::string replacement_path; 2199 std::string replacement_path;
2189 net::test_server::GetFilePathWithReplacements( 2200 net::test_server::GetFilePathWithReplacements(
2190 "/prerender/prerender_with_image.html", replacement_text, 2201 "/prerender/prerender_with_image.html", replacement_text,
2191 &replacement_path); 2202 &replacement_path);
2192 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 2203 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1);
2193 NavigateToDestURL(); 2204 NavigateToDestURL();
2194 } 2205 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
2286 ->set_client_cert_store_factory_for_testing(base::Bind( 2297 ->set_client_cert_store_factory_for_testing(base::Bind(
2287 &CreateCertStore, net::ImportCertFromFile( 2298 &CreateCertStore, net::ImportCertFromFile(
2288 net::GetTestCertsDirectory(), "ok_cert.pem"))); 2299 net::GetTestCertsDirectory(), "ok_cert.pem")));
2289 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); 2300 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
2290 net::SSLServerConfig ssl_config; 2301 net::SSLServerConfig ssl_config;
2291 ssl_config.client_cert_type = 2302 ssl_config.client_cert_type =
2292 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; 2303 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT;
2293 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); 2304 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config);
2294 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); 2305 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
2295 ASSERT_TRUE(https_server.Start()); 2306 ASSERT_TRUE(https_server.Start());
2296 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); 2307 GURL https_url = https_server.GetURL(kPrefetchJpeg);
2297 base::StringPairs replacement_text; 2308 base::StringPairs replacement_text;
2298 replacement_text.push_back( 2309 replacement_text.push_back(
2299 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 2310 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
2300 std::string replacement_path; 2311 std::string replacement_path;
2301 net::test_server::GetFilePathWithReplacements( 2312 net::test_server::GetFilePathWithReplacements(
2302 "/prerender/prerender_with_image.html", replacement_text, 2313 "/prerender/prerender_with_image.html", replacement_text,
2303 &replacement_path); 2314 &replacement_path);
2304 PrerenderTestURL(replacement_path, 2315 PrerenderTestURL(replacement_path,
2305 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 2316 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED,
2306 0); 2317 0);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2360 PrerenderSafeBrowsingClientRedirect) { 2371 PrerenderSafeBrowsingClientRedirect) {
2361 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 2372 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
2362 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 2373 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
2363 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); 2374 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
2364 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"), 2375 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"),
2365 FINAL_STATUS_SAFE_BROWSING, 1); 2376 FINAL_STATUS_SAFE_BROWSING, 1);
2366 } 2377 }
2367 2378
2368 // Ensures that we do not prerender pages which have a malware subresource. 2379 // Ensures that we do not prerender pages which have a malware subresource.
2369 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 2380 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) {
2370 GURL image_url = embedded_test_server()->GetURL("/prerender/image.jpeg"); 2381 GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg);
2371 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 2382 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
2372 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); 2383 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
2373 base::StringPairs replacement_text; 2384 base::StringPairs replacement_text;
2374 replacement_text.push_back( 2385 replacement_text.push_back(
2375 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 2386 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec()));
2376 std::string replacement_path; 2387 std::string replacement_path;
2377 net::test_server::GetFilePathWithReplacements( 2388 net::test_server::GetFilePathWithReplacements(
2378 "/prerender/prerender_with_image.html", replacement_text, 2389 "/prerender/prerender_with_image.html", replacement_text,
2379 &replacement_path); 2390 &replacement_path);
2380 PrerenderTestURL(replacement_path, 2391 PrerenderTestURL(replacement_path,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2484 destruction_observer.Wait(); 2495 destruction_observer.Wait();
2485 } 2496 }
2486 2497
2487 // Checks that a hanging unload on the referring page of a prerender swap does 2498 // Checks that a hanging unload on the referring page of a prerender swap does
2488 // not crash the browser on exit. 2499 // not crash the browser on exit.
2489 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { 2500 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) {
2490 // Matches URL in prerender_loader_with_unload.html. 2501 // Matches URL in prerender_loader_with_unload.html.
2491 const GURL hang_url("http://unload-url.test"); 2502 const GURL hang_url("http://unload-url.test");
2492 base::FilePath empty_file = ui_test_utils::GetTestFilePath( 2503 base::FilePath empty_file = ui_test_utils::GetTestFilePath(
2493 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 2504 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html")));
2494 BrowserThread::PostTask( 2505 CreateHangingFirstRequestInterceptor(
2495 BrowserThread::IO, FROM_HERE, 2506 hang_url, empty_file, base::Callback<void(net::URLRequest*)>());
2496 base::Bind(&CreateHangingFirstRequestInterceptorOnIO,
2497 hang_url, empty_file,
2498 base::Closure()));
2499 2507
2500 set_loader_path("/prerender/prerender_loader_with_unload.html"); 2508 set_loader_path("/prerender/prerender_loader_with_unload.html");
2501 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 2509 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
2502 NavigateToDestURL(); 2510 NavigateToDestURL();
2503 } 2511 }
2504 2512
2505 2513
2506 // Checks that when the history is cleared, prerendering is cancelled and 2514 // Checks that when the history is cleared, prerendering is cancelled and
2507 // prerendering history is cleared. 2515 // prerendering history is cleared.
2508 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 2516 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) {
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
3284 done_url, empty_file, done_counter.AsWeakPtr())); 3292 done_url, empty_file, done_counter.AsWeakPtr()));
3285 // Loading may finish or be interrupted. The final result is important only. 3293 // Loading may finish or be interrupted. The final result is important only.
3286 DisableLoadEventCheck(); 3294 DisableLoadEventCheck();
3287 // TestPrenderContents is always created before the Autosignin JS can run, so 3295 // TestPrenderContents is always created before the Autosignin JS can run, so
3288 // waiting for PrerenderContents to stop should be reliable. 3296 // waiting for PrerenderContents to stop should be reliable.
3289 PrerenderTestURL("/password/autosignin.html", 3297 PrerenderTestURL("/password/autosignin.html",
3290 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3298 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3291 EXPECT_EQ(0, done_counter.count()); 3299 EXPECT_EQ(0, done_counter.count());
3292 } 3300 }
3293 3301
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
3294 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { 3418 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3295 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3419 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3296 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3420 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3297 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3421 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3298 3422
3299 base::TimeTicks load_start = clock->NowTicks(); 3423 base::TimeTicks load_start = clock->NowTicks();
3300 clock->Advance(base::TimeDelta::FromSeconds(1)); 3424 clock->Advance(base::TimeDelta::FromSeconds(1));
3301 NavigateToDestURL(); 3425 NavigateToDestURL();
3302 3426
3303 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), 3427 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
(...skipping 13 matching lines...) Expand all
3317 histogram_tester().ExpectUniqueSample( 3441 histogram_tester().ExpectUniqueSample(
3318 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); 3442 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3319 } 3443 }
3320 3444
3321 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { 3445 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3322 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3446 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3323 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3447 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3324 3448
3325 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 3449 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3326 base::RunLoop hanging_request_waiter; 3450 base::RunLoop hanging_request_waiter;
3327 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 3451 CreateHangingFirstRequestInterceptor(
3328 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, 3452 url, GetTestPath("prerender_page.html"),
3329 url, GetTestPath("prerender_page.html"), 3453 GetIOCallbackFromUIClosure(hanging_request_waiter.QuitClosure()));
3330 hanging_request_waiter.QuitClosure()));
3331 // As this load will be canceled, it is not waited for, and hence no 3454 // As this load will be canceled, it is not waited for, and hence no
3332 // javascript is executed. 3455 // javascript is executed.
3333 DisableJavascriptCalls(); 3456 DisableJavascriptCalls();
3334 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); 3457 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3335 hanging_request_waiter.Run(); 3458 hanging_request_waiter.Run();
3336 3459
3337 // This prerender cancels and reuses the first. 3460 // This prerender cancels and reuses the first.
3338 clock->Advance(base::TimeDelta::FromSeconds(1)); 3461 clock->Advance(base::TimeDelta::FromSeconds(1));
3339 base::TimeTicks load_start = clock->NowTicks(); 3462 base::TimeTicks load_start = clock->NowTicks();
3340 EnableJavascriptCalls(); 3463 EnableJavascriptCalls();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3407 FirstContentfulPaintTimingNoCommit) { 3530 FirstContentfulPaintTimingNoCommit) {
3408 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3531 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3409 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3532 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3410 3533
3411 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 3534 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3412 base::FilePath url_file = ui_test_utils::GetTestFilePath( 3535 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3413 base::FilePath(), 3536 base::FilePath(),
3414 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); 3537 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3415 3538
3416 base::RunLoop prerender_start_loop; 3539 base::RunLoop prerender_start_loop;
3417 BrowserThread::PostTask( 3540 CreateHangingFirstRequestInterceptor(
3418 BrowserThread::IO, FROM_HERE, 3541 url, url_file,
3419 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, 3542 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
3420 prerender_start_loop.QuitClosure()));
3421 // As this load is uncommitted, it is not waited for, and hence no 3543 // As this load is uncommitted, it is not waited for, and hence no
3422 // javascript is executed. 3544 // javascript is executed.
3423 DisableJavascriptCalls(); 3545 DisableJavascriptCalls();
3424 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); 3546 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3425 prerender_start_loop.Run(); 3547 prerender_start_loop.Run();
3426 3548
3427 clock->Advance(base::TimeDelta::FromSeconds(1)); 3549 clock->Advance(base::TimeDelta::FromSeconds(1));
3428 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); 3550 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3429 3551
3430 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), 3552 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
3530 FirstContentfulPaintHiddenNoCommit) { 3652 FirstContentfulPaintHiddenNoCommit) {
3531 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); 3653 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3532 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); 3654 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3533 3655
3534 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); 3656 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3535 base::FilePath url_file = ui_test_utils::GetTestFilePath( 3657 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3536 base::FilePath(), 3658 base::FilePath(),
3537 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); 3659 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3538 3660
3539 base::RunLoop prerender_start_loop; 3661 base::RunLoop prerender_start_loop;
3540 BrowserThread::PostTask( 3662 CreateHangingFirstRequestInterceptor(
3541 BrowserThread::IO, FROM_HERE, 3663 url, url_file,
3542 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, 3664 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
3543 prerender_start_loop.QuitClosure()));
3544 // As this load is uncommitted, it is not waited for, and hence no 3665 // As this load is uncommitted, it is not waited for, and hence no
3545 // javascript is executed. 3666 // javascript is executed.
3546 DisableJavascriptCalls(); 3667 DisableJavascriptCalls();
3547 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); 3668 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3548 prerender_start_loop.Run(); 3669 prerender_start_loop.Run();
3549 3670
3550 clock->Advance(base::TimeDelta::FromSeconds(1)); 3671 clock->Advance(base::TimeDelta::FromSeconds(1));
3551 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); 3672 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3552 3673
3553 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), 3674 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
3794 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3915 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3795 "DidDisplayReallyPass()", 3916 "DidDisplayReallyPass()",
3796 &display_test_result)); 3917 &display_test_result));
3797 ASSERT_TRUE(display_test_result); 3918 ASSERT_TRUE(display_test_result);
3798 } 3919 }
3799 #endif // !defined(DISABLE_NACL) 3920 #endif // !defined(DISABLE_NACL)
3800 3921
3801 } // namespace prerender 3922 } // namespace prerender
3802 3923
3803 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) 3924 #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