15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utility> 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/metrics/field_trial.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/net/prediction_options.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_origin.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/prerender_types.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeTicks; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UnitTestPrerenderManager; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyPrerenderContents : public PrerenderContents { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents(UnitTestPrerenderManager* test_prerender_manager, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~DummyPrerenderContents(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartPrerendering( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ALLOW_UNUSED creator_child_id, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& ALLOW_UNUSED size, 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace, 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequestContextGetter* ALLOW_UNUSED request_context) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetChildId(int* child_id) const OVERRIDE { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Having a default child_id of -1 forces pending prerenders not to fail 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on session storage and cross domain checking. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *child_id = -1; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetRouteId(int* route_id) const OVERRIDE { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *route_id = route_id_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerendering_has_been_cancelled() const { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrerenderContents::prerendering_has_been_cancelled(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static int g_next_route_id_; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnitTestPrerenderManager* test_prerender_manager_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DummyPrerenderContents::g_next_route_id_ = 0; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Size kSize(640, 480); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kDefaultRelTypes = PrerenderRelTypePrerender; 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UnitTestPrerenderManager : public PrerenderManager { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using PrerenderManager::kMinTimeBetweenPrerendersMs; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using PrerenderManager::kNavigationRecordWindowMs; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit UnitTestPrerenderManager(Profile* profile, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PrerenderManager(profile, prerender_tracker), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_(Time::Now()), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_ticks_(TimeTicks::Now()), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_tracker_(prerender_tracker) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_rate_limit_enabled(false); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnCookieStoreLoaded(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UnitTestPrerenderManager() { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // From KeyedService, via PrererenderManager: 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Shutdown() OVERRIDE { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (next_prerender_contents()) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_prerender_contents_->Destroy(FINAL_STATUS_MANAGER_SHUTDOWN); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderManager::Shutdown(); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // From PrerenderManager: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void MoveEntryToPendingDelete(PrerenderContents* entry, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinalStatus final_status) OVERRIDE { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry == next_prerender_contents_.get()) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderManager::MoveEntryToPendingDelete(entry, final_status); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents* FindEntry(const GURL& url) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteOldEntries(); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_delete_prerenders_.clear(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PrerenderData* data = FindPrerenderData(url, NULL)) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data->contents(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents* FindAndUseEntry(const GURL& url) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderData* prerender_data = FindPrerenderData(url, NULL); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_data) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<PrerenderData>::iterator to_erase = 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindIteratorForPrerenderContents(prerender_data->contents()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(to_erase != active_prerenders_.end()); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* prerender_contents = prerender_data->ReleaseContents(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_prerenders_.erase(to_erase); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents->PrepareForUse(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_contents; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AdvanceTime(TimeDelta delta) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_ += delta; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AdvanceTimeTicks(TimeDelta delta) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_ticks_ += delta; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* CreateNextPrerenderContents( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DummyPrerenderContents(this, prerender_tracker_, url, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNextPrerenderContents(prerender_contents); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_contents; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* CreateNextPrerenderContents( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DummyPrerenderContents(this, prerender_tracker_, url, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, expected_final_status); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNextPrerenderContents(prerender_contents); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_contents; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* CreateNextPrerenderContents( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& alias_urls, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DummyPrerenderContents(this, prerender_tracker_, url, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<GURL>::const_iterator it = alias_urls.begin(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != alias_urls.end(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->AddAliasURL(*it)); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNextPrerenderContents(prerender_contents); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_contents; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_rate_limit_enabled(bool enabled) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable_config().rate_limit_enabled = enabled; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents* next_prerender_contents() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return next_prerender_contents_.get(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from PrerenderManager 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Time GetCurrentTime() const OVERRIDE { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return time_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual TimeTicks GetCurrentTimeTicks() const OVERRIDE { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return time_ticks_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual PrerenderContents* GetPrerenderContentsForRoute( 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int child_id, int route_id) const OVERRIDE { 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overridden for the PrerenderLinkManager's pending prerender logic. 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContentsMap::const_iterator iter = prerender_contents_map_.find( 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::make_pair(child_id, route_id)); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (iter == prerender_contents_map_.end()) 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return iter->second; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DummyPrerenderContentsStarted(int child_id, 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int route_id, 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContents* prerender_contents) { 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_map_[std::make_pair(child_id, route_id)] = 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents; 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DummyPrerenderContentsDestroyed(int child_id, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int route_id) { 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_map_.erase(std::make_pair(child_id, route_id)); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual net::URLRequestContextGetter* GetURLRequestContext() OVERRIDE { 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(!next_prerender_contents_.get()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_prerender_contents_.reset(prerender_contents); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_contents->expected_final_status() == FINAL_STATUS_USED) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) used_prerender_contents_.push_back(prerender_contents); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) OVERRIDE { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(next_prerender_contents_.get()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, next_prerender_contents_->prerender_url()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(origin, next_prerender_contents_->origin()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return next_prerender_contents_.release(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Maintain a map from route pairs to PrerenderContents for 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // GetPrerenderContentsForRoute. 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::map<std::pair<int,int>, PrerenderContents*> PrerenderContentsMap; 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContentsMap prerender_contents_map_; 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time time_; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks time_ticks_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PrerenderContents> next_prerender_contents_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tracked so they will be automatically deleted. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<PrerenderContents> used_prerender_contents_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DummyPrerenderContents::DummyPrerenderContents( 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnitTestPrerenderManager* test_prerender_manager, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PrerenderContents(test_prerender_manager, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, url, Referrer(), origin, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::kNoExperiment), 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) route_id_(g_next_route_id_++), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_prerender_manager_(test_prerender_manager), 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DummyPrerenderContents::~DummyPrerenderContents() { 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_prerender_manager_->DummyPrerenderContentsDestroyed(-1, route_id_); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DummyPrerenderContents::StartPrerendering( 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ALLOW_UNUSED creator_child_id, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& ALLOW_UNUSED size, 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace, 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequestContextGetter* ALLOW_UNUSED request_context) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the base PrerenderContents implementation, StartPrerendering will 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called even when the PrerenderManager is part of the control group, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but it will early exit before actually creating a new RenderView if 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |is_control_group| is true; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_start_time_ = test_prerender_manager_->GetCurrentTimeTicks(); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!test_prerender_manager_->IsControlGroup(experiment_id())) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerendering_has_started_ = true; 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_prerender_manager_->DummyPrerenderContentsStarted(-1, route_id_, this); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyPrerenderStart(); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderTest : public testing::Test { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDefaultChildId = -1; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDefaultRenderViewRouteId = -1; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_), 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager_(new UnitTestPrerenderManager( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_, prerender_tracker())), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager_( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PrerenderLinkManager(prerender_manager_.get())), 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_prerender_id_(0), 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) field_trial_list_(NULL) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable omnibox prerendering. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderFromOmnibox, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderFromOmniboxSwitchValueEnabled); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PrerenderTest() { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager_->OnChannelClosing(kDefaultChildId); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager_->Shutdown(); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager_->Shutdown(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnitTestPrerenderManager* prerender_manager() { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager_.get(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager() { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager_.get(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetConcurrency(size_t concurrency) { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->mutable_config().max_link_concurrency_per_launcher = 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) concurrency; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->mutable_config().max_link_concurrency = 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::max(prerender_manager()->mutable_config().max_link_concurrency, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) concurrency); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager_->IsEmpty(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_prerender_id() const { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_prerender_id_; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetNextPrerenderID() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ++last_prerender_id_; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool LauncherHasRunningPrerender(int child_id, int prerender_id) { 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderLinkManager::LinkPrerender* prerender = 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_id, prerender_id); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return prerender && prerender->handle; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool LauncherHasScheduledPrerender(int child_id, int prerender_id) { 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderLinkManager::LinkPrerender* prerender = 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_id, prerender_id); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender != NULL; 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shorthand to add a simple prerender with a reasonable source. Returns 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // true iff the prerender has been added to the PrerenderManager by the 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PrerenderLinkManager and the PrerenderManager returned a handle. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddSimplePrerender(const GURL& url) { 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultChildId, GetNextPrerenderID(), url, kDefaultRelTypes, 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Referrer(), kSize, kDefaultRenderViewRouteId); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DisablePrerender() { 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci profile_.GetPrefs()->SetInteger( 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kNetworkPredictionOptions, 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome_browser_net::NETWORK_PREDICTION_NEVER); 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTracker* prerender_tracker() { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->prerender_tracker(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needed to pass PrerenderManager's DCHECKs. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile profile_; 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<UnitTestPrerenderManager> prerender_manager_; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PrerenderLinkManager> prerender_link_manager_; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_prerender_id_; 417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FieldTrialList field_trial_list_; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, FoundTest) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that if queue a request, and a second prerender request for the 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// same URL comes in, that the second request attaches to the first prerender, 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and we don't use the second prerender contents. 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, DuplicateTest) { 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(2); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents1 = 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_MANAGER_SHUTDOWN); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prerender_contents1, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->next_prerender_contents()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents1->prerendering_has_started()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure that we expire a prerendered page after the max. permitted time. 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, ExpireTest) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_TIMED_OUT); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->config().time_to_live + TimeDelta::FromSeconds(1)); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensure that we don't launch prerenders of bad urls (in this case, a mailto: 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// url) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, BadURLTest) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url("mailto:test@gmail.com"); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_UNSUPPORTED_SCHEME); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(url)); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_started()); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the user navigates away from a page, the prerenders it launched should 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have their time to expiry shortened from the default time to live. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerNavigateAwayExpire) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta time_to_live = TimeDelta::FromSeconds(300); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta abandon_time_to_live = TimeDelta::FromSeconds(20); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta test_advance = TimeDelta::FromSeconds(22); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(test_advance, time_to_live); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(abandon_time_to_live, test_advance); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->mutable_config().time_to_live = time_to_live; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->mutable_config().abandon_time_to_live = 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abandon_time_to_live; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://example.com"); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_TIMED_OUT); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks(test_advance); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// But when we navigate away very close to the original expiry of a prerender, 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we shouldn't expect it to be extended. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerNavigateAwayNearExpiry) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta time_to_live = TimeDelta::FromSeconds(300); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta abandon_time_to_live = TimeDelta::FromSeconds(20); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We will expect the prerender to still be alive after advancing the clock 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by first_advance. But, after second_advance, we expect it to have timed 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out, demonstrating that you can't extend a prerender by navigating away 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from its launcher. 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta first_advance = TimeDelta::FromSeconds(298); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeDelta second_advance = TimeDelta::FromSeconds(4); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(first_advance, time_to_live); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(time_to_live - first_advance, abandon_time_to_live); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(time_to_live, first_advance + second_advance); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->mutable_config().time_to_live = time_to_live; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->mutable_config().abandon_time_to_live = 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abandon_time_to_live; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://example2.com"); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_TIMED_OUT); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks(first_advance); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks(second_advance); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// When the user navigates away from a page, and then launches a new prerender, 5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// the new prerender should preempt the abandoned prerender even if the 5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// abandoned prerender hasn't expired. 5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerNavigateAwayLaunchAnother) { 5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const TimeDelta time_to_live = TimeDelta::FromSeconds(300); 5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const TimeDelta abandon_time_to_live = TimeDelta::FromSeconds(20); 5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const TimeDelta test_advance = TimeDelta::FromSeconds(5); 5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_LT(test_advance, time_to_live); 5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_GT(abandon_time_to_live, test_advance); 5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_manager()->mutable_config().time_to_live = time_to_live; 5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_manager()->mutable_config().abandon_time_to_live = 5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) abandon_time_to_live; 5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GURL url("http://example.com"); 5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, FINAL_STATUS_CANCELLED); 5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_prerender_id()); 5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks(test_advance); 5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GURL second_url("http://example2.com"); 5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DummyPrerenderContents* second_prerender_contents = 5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) second_url, FINAL_STATUS_MANAGER_SHUTDOWN); 5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(second_url)); 5901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(second_prerender_contents, 5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerender_manager()->FindEntry(second_url)); 5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 5931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that if we prerender more requests than we support, that we launch 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// them in the order given up until we reach MaxConcurrency, at which point we 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// queue them and launch them in the order given. As well, insure that limits 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// are enforced for the system as a whole and on a per launcher basis. 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, MaxConcurrencyTest) { 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct TestConcurrency { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t max_link_concurrency; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t max_link_concurrency_per_launcher; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestConcurrency concurrencies_to_test[] = { 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { prerender_manager()->config().max_link_concurrency, 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().max_link_concurrency_per_launcher}, 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With the system limit higher than the per launcher limit, the per 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // launcher limit should be in effect. 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2, 1 }, 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With the per launcher limit higher than system limit, the system limit 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be in effect. 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2, 4 }, 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url_to_delay("http://www.google.com/delayme"); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(concurrencies_to_test); ++i) { 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->mutable_config().max_link_concurrency = 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) concurrencies_to_test[i].max_link_concurrency; 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->mutable_config().max_link_concurrency_per_launcher = 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) concurrencies_to_test[i].max_link_concurrency_per_launcher; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t effective_max_link_concurrency = 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::min(concurrencies_to_test[i].max_link_concurrency, 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) concurrencies_to_test[i].max_link_concurrency_per_launcher); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> urls; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PrerenderContents*> prerender_contentses; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Launch prerenders up to the maximum this launcher can support. 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < effective_max_link_concurrency; ++j) { 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) urls.push_back( 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(base::StringPrintf("http://google.com/use#%" PRIuS, j))); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contentses.push_back( 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(urls.back(), 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED)); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(urls.back())); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started()); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (concurrencies_to_test[i].max_link_concurrency > 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_max_link_concurrency) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We should be able to launch more prerenders on this system, but not for 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the default launcher. 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL extra_url("http://google.com/extraurl"); 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(extra_url)); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int prerender_id = last_prerender_id(); 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(LauncherHasScheduledPrerender(kDefaultChildId, 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_id)); 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_id); 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(LauncherHasScheduledPrerender(kDefaultChildId, 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_id)); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents_to_delay = 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url_to_delay, 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(url_to_delay)); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(prerender_contents_to_delay->prerendering_has_started()); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(null, prerender_manager()->next_prerender_contents()); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url_to_delay)); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < effective_max_link_concurrency; ++j) { 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contentses[j], 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(urls[j])); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prerender_contents_to_delay->prerendering_has_started()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents_to_delay, 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->FindAndUseEntry(url_to_delay)); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, AliasURLTest) { 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(7); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL alias_url1("http://www.google.com/index.html"); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL alias_url2("http://google.com/"); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL not_an_alias_url("http://google.com/index.html"); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> alias_urls; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alias_urls.push_back(alias_url1); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alias_urls.push_back(alias_url2); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that all of the aliases work, but not_an_alias_url does not. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, alias_urls, FINAL_STATUS_USED); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, prerender_manager()->FindEntry(not_an_alias_url)); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(alias_url1)); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents = prerender_manager()->CreateNextPrerenderContents( 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, alias_urls, FINAL_STATUS_USED); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(alias_url2)); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents = prerender_manager()->CreateNextPrerenderContents( 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, alias_urls, FINAL_STATUS_USED); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that alias URLs can not be added. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents = prerender_manager()->CreateNextPrerenderContents( 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, alias_urls, FINAL_STATUS_USED); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(alias_url1)); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(alias_url2)); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, PendingPrerenderTest) { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL pending_url("http://news.google.com/"); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Schedule a pending prerender launched from the prerender. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* pending_prerender_contents = 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_url, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ORIGIN_GWS_PRERENDER, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(url, blink::WebReferrerPolicyDefault), 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSize, route_id); 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use the referring prerender. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The pending prerender should start now. 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(LauncherHasRunningPrerender(child_id, last_prerender_id())); 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(pending_prerender_contents->prerendering_has_started()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(pending_prerender_contents, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(pending_url)); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This pending URL has an unsupported scheme, and won't be able 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to start. 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL pending_url("ftp://news.google.com/"); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Schedule a pending prerender launched from the prerender. 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DummyPrerenderContents* pending_prerender_contents = 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_url, 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ORIGIN_GWS_PRERENDER, 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_UNSUPPORTED_SCHEME); 7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(url, blink::WebReferrerPolicyDefault), 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSize, route_id); 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use the referring prerender. 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The pending prerender still doesn't start. 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, CancelPendingPrerenderTest) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL pending_url("http://news.google.com/"); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Schedule a pending prerender launched from the prerender. 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(url, blink::WebReferrerPolicyDefault), 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSize, route_id); 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cancel the pending prerender. 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id()); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use the referring prerender. 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The pending prerender doesn't start. 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a PrerenderManager created for a browser session in the control 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// group works as expected. 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, ControlGroup) { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_MANAGER_SHUTDOWN); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_started()); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that prerendering is cancelled when the source render view does not 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exist. On failure, the DCHECK in CreatePrerenderContents() above should be 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// triggered. 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, SourceRenderViewClosed) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_MANAGER_SHUTDOWN); 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 100, GetNextPrerenderID(), url, kDefaultRelTypes, Referrer(), kSize, 200); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that prerendering doesn't launch rel=next prerenders without the field 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// trial. 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrerenderTest, NoRelNextByDefault) { 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url("http://www.google.com/"); 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, FINAL_STATUS_MANAGER_SHUTDOWN); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DummyPrerenderContents* null = NULL; 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(), kSize, kDefaultRenderViewRouteId); 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that prerendering does launch rel=next prerenders with the field trial. 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrerenderTest, RelNextByFieldTrial) { 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("PrerenderRelNextTrial", 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Yes")); 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url("http://www.google.com/"); 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, ORIGIN_LINK_REL_NEXT, FINAL_STATUS_USED); 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(), kSize, kDefaultRenderViewRouteId); 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that prerendering is cancelled when we launch a second prerender of 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same target within a short time interval. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, RecentlyVisited) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->RecordNavigation(url); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_RECENTLY_VISITED); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(url)); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_started()); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, NotSoRecentlyVisited) { 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->RecordNavigation(url); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds( 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnitTestPrerenderManager::kNavigationRecordWindowMs + 500)); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_USED); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that our PPLT dummy prerender gets created properly. 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, PPLTDummy) { 9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RestorePrerenderMode restore_prerender_mode; 9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrerenderManager::SetMode( 9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); 9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_UNSUPPORTED_SCHEME); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* pplt_dummy_contents = 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL ftp_url("ftp://ftp.google.com/"); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding this ftp URL will force the expected unsupported scheme error. 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents->AddAliasURL(ftp_url); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(pplt_dummy_contents, prerender_manager()->FindAndUseEntry(url)); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that our PPLT dummy prerender gets created properly, even 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when navigating to a page that has been recently navigated to. 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, RecentlyVisitedPPLTDummy) { 9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RestorePrerenderMode restore_prerender_mode; 9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrerenderManager::SetMode( 9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); 9491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_UNSUPPORTED_SCHEME); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* pplt_dummy_contents = 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->RecordNavigation(url); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL ftp_url("ftp://ftp.google.com/"); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents->AddAliasURL(ftp_url); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(pplt_dummy_contents, prerender_manager()->FindAndUseEntry(url)); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, PPLTLateCancel) { 9681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RestorePrerenderMode restore_prerender_mode; 9691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrerenderManager::SetMode( 9701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); 9711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url("http://www.google.com"); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, FINAL_STATUS_JAVASCRIPT_ALERT); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force the creation of a match complete dummy. 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* duplicate_prerender_contents = 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CANCELLED); 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents->Destroy(FINAL_STATUS_JAVASCRIPT_ALERT); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(duplicate_prerender_contents, prerender_manager()->FindEntry(url)); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure that events on prerender handles propogate to the match 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // complete replacement. 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_prerender_id()); 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the prerender manager matches include the fragment. 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, FragmentMatchesTest) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL fragment_url("http://www.google.com/#test"); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(fragment_url, 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(fragment_url)); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(fragment_url)); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the prerender manager uses fragment references when matching 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender URLs in the case a different fragment is in both URLs. 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, FragmentsDifferTest) { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL fragment_url("http://www.google.com/#test"); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL other_fragment_url("http://www.google.com/#other_test"); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(fragment_url, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(fragment_url)); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(other_fragment_url)); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(fragment_url)); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that clearing works as expected. 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, ClearTest) { 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure canceling works as expected. 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, CancelAllTest) { 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CancelAllPrerenders(); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DummyPrerenderContents* null = NULL; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, OmniboxNotAllowedWhenDisabled) { 10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DisablePrerender(); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_manager()->AddPrerenderFromOmnibox( 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.example.com"), NULL, gfx::Size())); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkRelNotAllowedWhenDisabled) { 10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DisablePrerender(); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(AddSimplePrerender( 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.example.com"))); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancel) { 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancelThenAbandon) { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAbandon) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_USED); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAbandonThenCancel) { 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url("http://www.myexample.com"); 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, FINAL_STATUS_CANCELLED); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_prerender_id()); 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_prerender_id()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancelTwice) { 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwice) { 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(2); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int first_prerender_id = last_prerender_id(); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int second_prerender_id = last_prerender_id(); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_prerender_id); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_prerender_id); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwiceThenAbandonTwice) { 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(2); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int first_prerender_id = last_prerender_id(); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int second_prerender_id = last_prerender_id(); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_prerender_id); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_prerender_id); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_prerender_id); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_prerender_id); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): Update this test after abandon has an effect on Prerenders, 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// like shortening the timeouts. 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAddTwiceAbandonTwiceUseTwice) { 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(2); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_USED); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int first_prerender_id = last_prerender_id(); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int second_prerender_id = last_prerender_id(); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_prerender_id); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_prerender_id); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): After abandon shortens the expire time on a Prerender, 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// add a series of tests testing advancing the time by either the abandon 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or normal expire, and verifying the expected behaviour with groups 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of links. 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerExpireThenCancel) { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* prerender_contents = 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_TIMED_OUT); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->config().time_to_live + TimeDelta::FromSeconds(1)); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerExpireThenAddAgain) { 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* first_prerender_contents = 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_TIMED_OUT); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(first_prerender_contents->prerendering_has_started()); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(first_prerender_contents->prerendering_has_been_cancelled()); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(first_prerender_contents, 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindEntry(url)); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->config().time_to_live + TimeDelta::FromSeconds(1)); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* second_prerender_contents = 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_USED); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(second_prerender_contents, 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(url)); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancelThenAddAgain) { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.myexample.com"); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* first_prerender_contents = 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_CANCELLED); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(first_prerender_contents->prerendering_has_started()); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(first_prerender_contents->prerendering_has_been_cancelled()); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(first_prerender_contents, prerender_manager()->FindEntry(url)); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_prerender_id()); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(first_prerender_contents->prerendering_has_been_cancelled()); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* null = NULL; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyPrerenderContents* second_prerender_contents = 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, FINAL_STATUS_USED); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(second_prerender_contents, 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager()->FindAndUseEntry(url)); 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerChannelClosing) { 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url("http://www.myexample.com"); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, FINAL_STATUS_TIMED_OUT); 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(url)); 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnChannelClosing(kDefaultChildId); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().abandon_time_to_live + 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(1)); 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, one of which should be blocked by the 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// max_link_concurrency; abandons both of them and waits to make sure both 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// are cleared from the PrerenderLinkManager. 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAbandonInactivePrerender) { 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(1); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LT(prerender_manager()->config().abandon_time_to_live, 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().time_to_live); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL first_url("http://www.myexample.com"); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_url, FINAL_STATUS_TIMED_OUT); 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(first_url)); 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int first_prerender_id = last_prerender_id(); 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL second_url("http://www.neverlaunched.com"); 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(second_url)); 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int second_prerender_id = last_prerender_id(); 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_prerender_id); 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_prerender_id); 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().abandon_time_to_live + 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(1)); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(first_url)); 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, the second one started by the first, both of which 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should be blocked by max_concurrency; abandons both of them and waits to make 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sure both are cleared from the PrerenderLinkManager. 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerClearOnPendingAbandon) { 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(1); 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LT(prerender_manager()->config().abandon_time_to_live, 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().time_to_live); 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL first_url("http://www.myexample.com"); 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_url, FINAL_STATUS_TIMED_OUT); 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(first_url)); 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int first_prerender_id = last_prerender_id(); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int child_id; 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id; 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL pending_url("http://www.neverlaunched.com"); 14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_link_manager()->OnAddPrerender( 14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, 14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Referrer(), kSize, route_id); 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int second_prerender_id = last_prerender_id(); 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_prerender_id); 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_prerender_id); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().abandon_time_to_live + 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(1)); 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(first_url)); 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, one of which should be blocked by the 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// max_link_concurrency; uses one after the max wait to launch, and 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ensures the second prerender does not start. 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerWaitToLaunchNotLaunched) { 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(1); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LT(prerender_manager()->config().max_wait_to_launch, 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().time_to_live); 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL first_url("http://www.myexample.com"); 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_url, FINAL_STATUS_USED); 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(first_url)); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL second_url("http://www.neverlaunched.com"); 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(second_url)); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* null = NULL; 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->AdvanceTimeTicks( 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().max_wait_to_launch + 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(1)); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prerender_contents, 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->FindAndUseEntry(first_url)); 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(first_url)); 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, one of which should start when the first one expires. 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerExpireRevealingLaunch) { 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetConcurrency(1); 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LT(prerender_manager()->config().max_wait_to_launch, 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().time_to_live); 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL first_url("http://www.willexpire.com"); 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* first_prerender_contents = 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_url, FINAL_STATUS_TIMED_OUT); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(AddSimplePrerender(first_url)); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(first_prerender_contents, 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->FindEntry(first_url)); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insert the second prerender so it will be still be launchable when the 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first expires. 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TimeDelta wait_to_launch_second_prerender = 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().time_to_live - 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().max_wait_to_launch + 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(2); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TimeDelta wait_for_first_prerender_to_expire = 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->config().time_to_live - 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wait_to_launch_second_prerender + 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(1); 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LT(prerender_manager()->config().time_to_live, 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wait_to_launch_second_prerender + 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wait_for_first_prerender_to_expire); 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_GT(prerender_manager()->config().max_wait_to_launch.InSeconds(), 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wait_for_first_prerender_to_expire.InSeconds()); 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->AdvanceTimeTicks(wait_to_launch_second_prerender); 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL second_url("http://www.willlaunch.com"); 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DummyPrerenderContents* second_prerender_contents = 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents( 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_url, FINAL_STATUS_USED); 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(AddSimplePrerender(second_url)); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first prerender is still running, but the second has not yet launched. 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(first_prerender_contents, 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->FindEntry(first_url)); 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* null = NULL; 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first prerender should have died, giving life to the second one. 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->AdvanceTimeTicks(wait_for_first_prerender_to_expire); 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(null, prerender_manager()->FindEntry(first_url)); 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(second_prerender_contents, 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager()->FindAndUseEntry(second_url)); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PrerenderTest, InstantSearchNotAllowedWhenDisabled) { 1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( 1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "EmbeddedSearch", 1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "Group82 espv:8 use_cacheable_ntp:1 prefetch_results:1")); 15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DisablePrerender(); 1569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(prerender_manager()->AddPrerenderForInstant( 1570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://www.example.com/instant_search"), NULL, gfx::Size())); 1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PrerenderTest, PrerenderContentsForInstantSearch) { 1574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( 1575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "EmbeddedSearch", 1576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "Group82 espv:8 use_cacheable_ntp:1 prefetch_results:1")); 1577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL url("http://www.example.com/instant_search"); 1578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DummyPrerenderContents* prerender_contents = 1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prerender_manager()->CreateNextPrerenderContents(url, ORIGIN_INSTANT, 1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED); 1581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<PrerenderHandle> prerender_handle( 1582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prerender_manager()->AddPrerenderForInstant(url, NULL, kSize)); 1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(prerender_handle.get()); 1584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(prerender_handle->IsPrerendering()); 1585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(prerender_contents, prerender_handle->contents()); 1587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); 1588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 1589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(prerender_handle->IsPrerendering()); 1590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 1593