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

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

Issue 146983002: Move pending prerender logic into PrerenderLinkManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <deque> 5 #include <deque>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 const GURL& url, 317 const GURL& url,
318 const content::Referrer& referrer, 318 const content::Referrer& referrer,
319 Origin origin, 319 Origin origin,
320 FinalStatus expected_final_status) 320 FinalStatus expected_final_status)
321 : PrerenderContents(prerender_manager, profile, url, 321 : PrerenderContents(prerender_manager, profile, url,
322 referrer, origin, PrerenderManager::kNoExperiment), 322 referrer, origin, PrerenderManager::kNoExperiment),
323 expected_final_status_(expected_final_status), 323 expected_final_status_(expected_final_status),
324 new_render_view_host_(NULL), 324 new_render_view_host_(NULL),
325 was_hidden_(false), 325 was_hidden_(false),
326 was_shown_(false), 326 was_shown_(false),
327 should_be_shown_(expected_final_status == FINAL_STATUS_USED), 327 should_be_shown_(expected_final_status == FINAL_STATUS_USED) {
328 expected_pending_prerenders_(0) {
329 } 328 }
330 329
331 virtual ~TestPrerenderContents() { 330 virtual ~TestPrerenderContents() {
332 if (expected_final_status_ == FINAL_STATUS_MAX) { 331 if (expected_final_status_ == FINAL_STATUS_MAX) {
333 EXPECT_EQ(match_complete_status(), MATCH_COMPLETE_REPLACEMENT); 332 EXPECT_EQ(MATCH_COMPLETE_REPLACEMENT, match_complete_status());
334 } else { 333 } else {
335 EXPECT_EQ(expected_final_status_, final_status()) << 334 EXPECT_EQ(expected_final_status_, final_status()) <<
336 " when testing URL " << prerender_url().path() << 335 " when testing URL " << prerender_url().path() <<
337 " (Expected: " << NameFromFinalStatus(expected_final_status_) << 336 " (Expected: " << NameFromFinalStatus(expected_final_status_) <<
338 ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 337 ", Actual: " << NameFromFinalStatus(final_status()) << ")";
339 } 338 }
340 // Prerendering RenderViewHosts should be hidden before the first 339 // Prerendering RenderViewHosts should be hidden before the first
341 // navigation, so this should be happen for every PrerenderContents for 340 // navigation, so this should be happen for every PrerenderContents for
342 // which a RenderViewHost is created, regardless of whether or not it's 341 // which a RenderViewHost is created, regardless of whether or not it's
343 // used. 342 // used.
(...skipping 27 matching lines...) Expand all
371 } 370 }
372 371
373 virtual bool CheckURL(const GURL& url) OVERRIDE { 372 virtual bool CheckURL(const GURL& url) OVERRIDE {
374 // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 373 // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in
375 // the PrerenderRendererCrash test. 374 // the PrerenderRendererCrash test.
376 if (url.spec() != content::kChromeUICrashURL) 375 if (url.spec() != content::kChromeUICrashURL)
377 return PrerenderContents::CheckURL(url); 376 return PrerenderContents::CheckURL(url);
378 return true; 377 return true;
379 } 378 }
380 379
381 virtual void AddPendingPrerender(
382 scoped_ptr<PendingPrerenderInfo> pending_prerender_info) OVERRIDE {
383 PrerenderContents::AddPendingPrerender(pending_prerender_info.Pass());
384 if (expected_pending_prerenders_ > 0 &&
385 pending_prerender_count() == expected_pending_prerenders_) {
386 base::MessageLoop::current()->Quit();
387 }
388 }
389
390 // Waits until the prerender has |expected_pending_prerenders| pending
391 // prerenders.
392 void WaitForPendingPrerenders(size_t expected_pending_prerenders) {
393 if (pending_prerender_count() < expected_pending_prerenders) {
394 expected_pending_prerenders_ = expected_pending_prerenders;
395 content::RunMessageLoop();
396 expected_pending_prerenders_ = 0;
397 }
398
399 EXPECT_EQ(expected_pending_prerenders, pending_prerender_count());
400 }
401
402 // For tests that open the prerender in a new background tab, the RenderView 380 // For tests that open the prerender in a new background tab, the RenderView
403 // will not have been made visible when the PrerenderContents is destroyed 381 // will not have been made visible when the PrerenderContents is destroyed
404 // even though it is used. 382 // even though it is used.
405 void set_should_be_shown(bool value) { should_be_shown_ = value; } 383 void set_should_be_shown(bool value) { should_be_shown_ = value; }
406 384
407 FinalStatus expected_final_status() const { return expected_final_status_; } 385 FinalStatus expected_final_status() const { return expected_final_status_; }
408 386
409 private: 387 private:
410 virtual void OnRenderViewHostCreated( 388 virtual void OnRenderViewHostCreated(
411 RenderViewHost* new_render_view_host) OVERRIDE { 389 RenderViewHost* new_render_view_host) OVERRIDE {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 // The RenderViewHost created for the prerender, if any. 426 // The RenderViewHost created for the prerender, if any.
449 RenderViewHost* new_render_view_host_; 427 RenderViewHost* new_render_view_host_;
450 // Set to true when the prerendering RenderWidget is hidden. 428 // Set to true when the prerendering RenderWidget is hidden.
451 bool was_hidden_; 429 bool was_hidden_;
452 // Set to true when the prerendering RenderWidget is shown, after having been 430 // Set to true when the prerendering RenderWidget is shown, after having been
453 // hidden. 431 // hidden.
454 bool was_shown_; 432 bool was_shown_;
455 // Expected final value of was_shown_. Defaults to true for 433 // Expected final value of was_shown_. Defaults to true for
456 // FINAL_STATUS_USED, and false otherwise. 434 // FINAL_STATUS_USED, and false otherwise.
457 bool should_be_shown_; 435 bool should_be_shown_;
458
459 // Total number of pending prerenders we're currently waiting for. Zero
460 // indicates we currently aren't waiting for any.
461 size_t expected_pending_prerenders_;
462 }; 436 };
463 437
464 // A handle to a TestPrerenderContents whose lifetime is under the caller's 438 // A handle to a TestPrerenderContents whose lifetime is under the caller's
465 // control. A PrerenderContents may be destroyed at any point. This allows 439 // control. A PrerenderContents may be destroyed at any point. This allows
466 // tracking the final status, etc. 440 // tracking the final status, etc.
467 class TestPrerender : public PrerenderContents::Observer, 441 class TestPrerender : public PrerenderContents::Observer,
468 public base::SupportsWeakPtr<TestPrerender> { 442 public base::SupportsWeakPtr<TestPrerender> {
469 public: 443 public:
470 TestPrerender() 444 TestPrerender()
471 : contents_(NULL), 445 : contents_(NULL),
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 // removed from the PrerenderLinkManager when the prerender is canceled from 1264 // removed from the PrerenderLinkManager when the prerender is canceled from
1291 // the browser, when the prerenders are cancelled from the renderer process, 1265 // the browser, when the prerenders are cancelled from the renderer process,
1292 // or the channel for the renderer process is closed on the IO thread. In the 1266 // or the channel for the renderer process is closed on the IO thread. In the
1293 // last case, the code must be careful to wait for the channel to close, as it 1267 // last case, the code must be careful to wait for the channel to close, as it
1294 // is done asynchronously after swapping out the old process. See 1268 // is done asynchronously after swapping out the old process. See
1295 // ChannelDestructionWatcher. 1269 // ChannelDestructionWatcher.
1296 bool IsEmptyPrerenderLinkManager() const { 1270 bool IsEmptyPrerenderLinkManager() const {
1297 return GetPrerenderLinkManager()->IsEmpty(); 1271 return GetPrerenderLinkManager()->IsEmpty();
1298 } 1272 }
1299 1273
1274 size_t GetLinkPrerenderCount() const {
1275 return GetPrerenderLinkManager()->prerenders_.size();
1276 }
1277
1278 size_t GetRunningLinkPrerenderCount() const {
1279 return GetPrerenderLinkManager()->CountRunningPrerenders();
1280 }
1281
1300 // Returns length of |prerender_manager_|'s history, or -1 on failure. 1282 // Returns length of |prerender_manager_|'s history, or -1 on failure.
1301 int GetHistoryLength() const { 1283 int GetHistoryLength() const {
1302 scoped_ptr<base::DictionaryValue> prerender_dict( 1284 scoped_ptr<base::DictionaryValue> prerender_dict(
1303 static_cast<base::DictionaryValue*>( 1285 static_cast<base::DictionaryValue*>(
1304 GetPrerenderManager()->GetAsValue())); 1286 GetPrerenderManager()->GetAsValue()));
1305 if (!prerender_dict.get()) 1287 if (!prerender_dict.get())
1306 return -1; 1288 return -1;
1307 base::ListValue* history_list; 1289 base::ListValue* history_list;
1308 if (!prerender_dict->GetList("history", &history_list)) 1290 if (!prerender_dict->GetList("history", &history_list))
1309 return -1; 1291 return -1;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 bool DidDisplayPass(WebContents* web_contents) const { 1358 bool DidDisplayPass(WebContents* web_contents) const {
1377 bool display_test_result = false; 1359 bool display_test_result = false;
1378 if (!content::ExecuteScriptAndExtractBool( 1360 if (!content::ExecuteScriptAndExtractBool(
1379 web_contents, 1361 web_contents,
1380 "window.domAutomationController.send(DidDisplayPass())", 1362 "window.domAutomationController.send(DidDisplayPass())",
1381 &display_test_result)) 1363 &display_test_result))
1382 return false; 1364 return false;
1383 return display_test_result; 1365 return display_test_result;
1384 } 1366 }
1385 1367
1368 scoped_ptr<TestPrerender> ExpectPrerender(FinalStatus expected_final_status) {
1369 return prerender_contents_factory_->ExpectPrerenderContents(
1370 expected_final_status);
1371 }
1372
1386 protected: 1373 protected:
1387 bool autostart_test_server_; 1374 bool autostart_test_server_;
1388 1375
1389 private: 1376 private:
1390 // TODO(davidben): Remove this altogether so the tests don't globally assume 1377 // TODO(davidben): Remove this altogether so the tests don't globally assume
1391 // only one prerender. 1378 // only one prerender.
1392 TestPrerenderContents* GetPrerenderContents() const { 1379 TestPrerenderContents* GetPrerenderContents() const {
1393 return GetPrerenderContentsFor(dest_url_); 1380 return GetPrerenderContentsFor(dest_url_);
1394 } 1381 }
1395 1382
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1538 ChannelDestructionWatcher channel_close_watcher; 1525 ChannelDestructionWatcher channel_close_watcher;
1539 channel_close_watcher.WatchChannel( 1526 channel_close_watcher.WatchChannel(
1540 GetActiveWebContents()->GetRenderProcessHost()); 1527 GetActiveWebContents()->GetRenderProcessHost());
1541 NavigateToDestURL(); 1528 NavigateToDestURL();
1542 channel_close_watcher.WaitForChannelClose(); 1529 channel_close_watcher.WaitForChannelClose();
1543 1530
1544 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 1531 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
1545 } 1532 }
1546 1533
1547 // Checks that pending prerenders launch and receive proper event treatment. 1534 // Checks that pending prerenders launch and receive proper event treatment.
1548 // Disabled due to http://crbug.com/167792 1535 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) {
1549 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderPagePending) { 1536 scoped_ptr<TestPrerender> prerender =
1550 std::vector<FinalStatus> expected_final_status_queue; 1537 PrerenderTestURL("files/prerender/prerender_page_pending.html",
1551 expected_final_status_queue.push_back(FINAL_STATUS_USED); 1538 FINAL_STATUS_USED, 1);
1552 expected_final_status_queue.push_back(FINAL_STATUS_USED);
1553 PrerenderTestURL("files/prerender/prerender_page_pending.html",
1554 expected_final_status_queue, 1);
1555 1539
1556 ChannelDestructionWatcher first_channel_close_watcher; 1540 // Navigate to the prerender.
1541 scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED);
1542 NavigateToDestURL();
1543 // Abort early if the original prerender didn't swap, so as not to hang.
1544 ASSERT_FALSE(prerender->contents());
1557 1545
1558 first_channel_close_watcher.WatchChannel( 1546 // Wait for the new prerender to be ready.
1559 GetActiveWebContents()->GetRenderProcessHost()); 1547 prerender2->WaitForStart();
1560 NavigateToDestURL(); 1548 prerender2->WaitForLoads(1);
1561 // NavigateToDestURL doesn't run a message loop. Normally that's fine, but in
1562 // this case, we need the pending prerenders to start.
1563 content::RunMessageLoop();
1564 first_channel_close_watcher.WaitForChannelClose();
1565 1549
1566 const GURL prerender_page_url = 1550 const GURL prerender_page_url =
1567 test_server()->GetURL("files/prerender/prerender_page.html"); 1551 test_server()->GetURL("files/prerender/prerender_page.html");
1568 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 1552 EXPECT_FALSE(IsEmptyPrerenderLinkManager());
1569 EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 1553 EXPECT_NE(static_cast<TestPrerenderContents*>(NULL),
1570 GetPrerenderContentsFor(prerender_page_url)); 1554 GetPrerenderContentsFor(prerender_page_url));
1571 1555
1572 // Now navigate to our target page. 1556 // Now navigate to our target page.
1573 ChannelDestructionWatcher second_channel_close_watcher; 1557 NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(),
1574 second_channel_close_watcher.WatchChannel( 1558 GetActiveWebContents());
1575 GetActiveWebContents()->GetRenderProcessHost());
1576 ui_test_utils::NavigateToURLWithDisposition( 1559 ui_test_utils::NavigateToURLWithDisposition(
1577 current_browser(), prerender_page_url, CURRENT_TAB, 1560 current_browser(), prerender_page_url, CURRENT_TAB,
1578 ui_test_utils::BROWSER_TEST_NONE); 1561 ui_test_utils::BROWSER_TEST_NONE);
1579 second_channel_close_watcher.WaitForChannelClose(); 1562 swap_observer.Wait();
1580 1563
1581 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1564 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1582 } 1565 }
1583 1566
1584 // Checks that pending prerenders which are canceled before they are launched 1567 // Checks that pending prerenders which are canceled before they are launched
1585 // never get started. 1568 // never get started.
1586 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 1569 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) {
1587 PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 1570 PrerenderTestURL("files/prerender/prerender_page_removes_pending.html",
1588 FINAL_STATUS_USED, 1); 1571 FINAL_STATUS_USED, 1);
1589 1572
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
2164 2147
2165 // Checks shutdown code while a prerender is active. 2148 // Checks shutdown code while a prerender is active.
2166 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 2149 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) {
2167 DisableJavascriptCalls(); 2150 DisableJavascriptCalls();
2168 DisableLoadEventCheck(); 2151 DisableLoadEventCheck();
2169 PrerenderTestURL("files/prerender/prerender_page.html", 2152 PrerenderTestURL("files/prerender/prerender_page.html",
2170 FINAL_STATUS_APP_TERMINATING, 2153 FINAL_STATUS_APP_TERMINATING,
2171 0); 2154 0);
2172 } 2155 }
2173 2156
2174 // TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test.
2175 // Checks that we don't prerender in an infinite loop. 2157 // Checks that we don't prerender in an infinite loop.
2176 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { 2158 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) {
2177 const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 2159 const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html";
2178 const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 2160 const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html";
2179 2161
2180 std::vector<FinalStatus> expected_final_status_queue; 2162 std::vector<FinalStatus> expected_final_status_queue;
2181 expected_final_status_queue.push_back(FINAL_STATUS_USED); 2163 expected_final_status_queue.push_back(FINAL_STATUS_USED);
2182 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 2164 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING);
2183 2165
2184 ScopedVector<TestPrerender> prerenders = 2166 ScopedVector<TestPrerender> prerenders =
2185 PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 2167 PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1);
2186 ASSERT_TRUE(prerenders[0]->contents()); 2168 ASSERT_TRUE(prerenders[0]->contents());
2187 prerenders[0]->contents()->WaitForPendingPrerenders(1u); 2169 // Assert that the pending prerender is in there already. This relies on the
2170 // fact that the renderer sends out the AddLinkRelPrerender IPC before sending
2171 // the page load one.
davidben 2014/01/24 17:50:43 Not entirely thrilled by these "this relies on the
2172 EXPECT_EQ(2U, GetLinkPrerenderCount());
2173 EXPECT_EQ(1U, GetRunningLinkPrerenderCount());
2188 2174
2189 // Next url should be in pending list but not an active entry. 2175 // Next url should be in pending list but not an active entry.
2190 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 2176 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB));
2191 2177
2192 NavigateToDestURL(); 2178 NavigateToDestURL();
2193 2179
2194 // Make sure the PrerenderContents for the next url is now in the manager 2180 // Make sure the PrerenderContents for the next url is now in the manager and
2195 // and not pending. 2181 // not pending. This relies on pending prerenders being resolved in the same
2182 // event loop iteration as OnPrerenderStop.
2196 EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 2183 EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB));
2184 EXPECT_EQ(1U, GetLinkPrerenderCount());
2185 EXPECT_EQ(1U, GetRunningLinkPrerenderCount());
2197 } 2186 }
2198 2187
2199 // TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test.
2200 // Checks that we don't prerender in an infinite loop and multiple links are 2188 // Checks that we don't prerender in an infinite loop and multiple links are
2201 // handled correctly. 2189 // handled correctly.
2202 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2190 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
2203 DISABLED_PrerenderInfiniteLoopMultiple) { 2191 PrerenderInfiniteLoopMultiple) {
2204 const char* const kHtmlFileA = 2192 const char* const kHtmlFileA =
2205 "files/prerender/prerender_infinite_a_multiple.html"; 2193 "files/prerender/prerender_infinite_a_multiple.html";
2206 const char* const kHtmlFileB = 2194 const char* const kHtmlFileB =
2207 "files/prerender/prerender_infinite_b_multiple.html"; 2195 "files/prerender/prerender_infinite_b_multiple.html";
2208 const char* const kHtmlFileC = 2196 const char* const kHtmlFileC =
2209 "files/prerender/prerender_infinite_c_multiple.html"; 2197 "files/prerender/prerender_infinite_c_multiple.html";
2210 2198
2211 // This test is conceptually simplest if concurrency is at two, since we 2199 // This test is conceptually simplest if concurrency is at two, since we
2212 // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 2200 // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted.
2213 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 2201 GetPrerenderManager()->mutable_config().max_link_concurrency = 2;
2214 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 2202 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2;
2215 2203
2216 std::vector<FinalStatus> expected_final_status_queue; 2204 std::vector<FinalStatus> expected_final_status_queue;
2217 expected_final_status_queue.push_back(FINAL_STATUS_USED); 2205 expected_final_status_queue.push_back(FINAL_STATUS_USED);
2218 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 2206 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING);
2219 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 2207 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING);
2220 2208
2221 ScopedVector<TestPrerender> prerenders = 2209 ScopedVector<TestPrerender> prerenders =
2222 PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 2210 PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1);
2223 ASSERT_TRUE(prerenders[0]->contents()); 2211 ASSERT_TRUE(prerenders[0]->contents());
2224 prerenders[0]->contents()->WaitForPendingPrerenders(2u);
2225 2212
2226 // Next url should be in pending list but not an active entry. 2213 // Next url should be in pending list but not an active entry. This relies on
2214 // the fact that the renderer sends out the AddLinkRelPrerender IPC before
2215 // sending the page load one.
2216 EXPECT_EQ(3U, GetLinkPrerenderCount());
2217 EXPECT_EQ(1U, GetRunningLinkPrerenderCount());
2227 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 2218 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB));
2228 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 2219 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC));
2229 2220
2230 NavigateToDestURL(); 2221 NavigateToDestURL();
2231 2222
2232 // Make sure the PrerenderContents for the next urls are now in the manager 2223 // Make sure the PrerenderContents for the next urls are now in the manager
2233 // and not pending. One and only one of the URLs (the last seen) should be the 2224 // and not pending. One and only one of the URLs (the last seen) should be the
2234 // active entry. 2225 // active entry. This relies on pending prerenders being resolved in the same
2226 // event loop iteration as OnPrerenderStop.
2235 bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 2227 bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB);
2236 bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 2228 bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC);
2237 EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 2229 EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender);
2230 EXPECT_EQ(2U, GetLinkPrerenderCount());
2231 EXPECT_EQ(2U, GetRunningLinkPrerenderCount());
2232 }
2233
2234 // Checks that pending prerenders are aborted (and never launched) when launched
2235 // by a prerender that itself gets aborted.
2236 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAbortPendingOnCancel) {
2237 const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html";
2238 const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html";
2239
2240 scoped_ptr<TestPrerender> prerender =
2241 PrerenderTestURL(kHtmlFileA, FINAL_STATUS_CANCELLED, 1);
2242 ASSERT_TRUE(prerender->contents());
2243 // Assert that the pending prerender is in there already. This relies on the
2244 // fact that the renderer sends out the AddLinkRelPrerender IPC before sending
2245 // the page load one.
2246 EXPECT_EQ(2U, GetLinkPrerenderCount());
2247 EXPECT_EQ(1U, GetRunningLinkPrerenderCount());
2248
2249 // Next url should be in pending list but not an active entry.
2250 EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB));
2251
2252 // Cancel the prerender.
2253 GetPrerenderManager()->CancelAllPrerenders();
2254 prerender->WaitForStop();
2255
2256 // All prerenders are now gone.
2257 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
2238 } 2258 }
2239 2259
2240 // See crbug.com/131836. 2260 // See crbug.com/131836.
2241 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTaskManager) { 2261 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTaskManager) {
2242 // Show the task manager. This populates the model. 2262 // Show the task manager. This populates the model.
2243 chrome::OpenTaskManager(current_browser()); 2263 chrome::OpenTaskManager(current_browser());
2244 // Wait for the model of task manager to start. 2264 // Wait for the model of task manager to start.
2245 TaskManagerBrowserTestUtil::WaitForWebResourceChange(1); 2265 TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
2246 2266
2247 // Start with two resources. 2267 // Start with two resources.
(...skipping 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after
3716 } 3736 }
3717 }; 3737 };
3718 3738
3719 // Checks that prerendering works in incognito mode. 3739 // Checks that prerendering works in incognito mode.
3720 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { 3740 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) {
3721 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3741 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3722 NavigateToDestURL(); 3742 NavigateToDestURL();
3723 } 3743 }
3724 3744
3725 } // namespace prerender 3745 } // namespace prerender
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/prerender/prerender_contents.h » ('j') | chrome/browser/prerender/prerender_link_manager.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698