Index: chrome/browser/prerender/prerender_unittest.cc |
diff --git a/chrome/browser/prerender/prerender_unittest.cc b/chrome/browser/prerender/prerender_unittest.cc |
index 59fbd4280ab42bb2c35cc335340b7313547bc1be..8ffb439667638213a7e500b324157cd80370132b 100644 |
--- a/chrome/browser/prerender/prerender_unittest.cc |
+++ b/chrome/browser/prerender/prerender_unittest.cc |
@@ -2,6 +2,9 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <map> |
+#include <utility> |
+ |
#include "base/command_line.h" |
#include "base/format_macros.h" |
#include "base/memory/scoped_vector.h" |
@@ -43,9 +46,7 @@ class DummyPrerenderContents : public PrerenderContents { |
Origin origin, |
FinalStatus expected_final_status); |
- virtual ~DummyPrerenderContents() { |
- EXPECT_EQ(expected_final_status_, final_status()); |
- } |
+ virtual ~DummyPrerenderContents(); |
virtual void StartPrerendering( |
int ALLOW_UNUSED creator_child_id, |
@@ -135,7 +136,6 @@ class UnitTestPrerenderManager : public PrerenderManager { |
PrerenderContents* prerender_contents = prerender_data->ReleaseContents(); |
active_prerenders_.erase(to_erase); |
- prerender_contents->SetFinalStatus(FINAL_STATUS_USED); |
prerender_contents->PrepareForUse(); |
return prerender_contents; |
} |
@@ -204,6 +204,28 @@ class UnitTestPrerenderManager : public PrerenderManager { |
return time_ticks_; |
} |
+ virtual PrerenderContents* GetPrerenderContentsForRoute( |
+ int child_id, int route_id) const OVERRIDE { |
+ // Overridden for the PrerenderLinkManager's pending prerender logic. |
+ PrerenderContentsMap::const_iterator iter = prerender_contents_map_.find( |
+ std::make_pair(child_id, route_id)); |
+ if (iter == prerender_contents_map_.end()) |
+ return NULL; |
+ return iter->second; |
+ } |
+ |
+ void DummyPrerenderContentsStarted(int child_id, |
+ int route_id, |
+ PrerenderContents* prerender_contents) { |
+ prerender_contents_map_[std::make_pair(child_id, route_id)] = |
+ prerender_contents; |
+ } |
+ |
+ void DummyPrerenderContentsDestroyed(int child_id, |
+ int route_id) { |
+ prerender_contents_map_.erase(std::make_pair(child_id, route_id)); |
+ } |
+ |
private: |
void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) { |
CHECK(!next_prerender_contents_.get()); |
@@ -224,6 +246,11 @@ class UnitTestPrerenderManager : public PrerenderManager { |
return next_prerender_contents_.release(); |
} |
+ // Maintain a map from route pairs to PrerenderContents for |
+ // GetPrerenderContentsForRoute. |
+ typedef std::map<std::pair<int,int>, PrerenderContents*> PrerenderContentsMap; |
+ PrerenderContentsMap prerender_contents_map_; |
+ |
Time time_; |
TimeTicks time_ticks_; |
scoped_ptr<PrerenderContents> next_prerender_contents_; |
@@ -258,6 +285,11 @@ DummyPrerenderContents::DummyPrerenderContents( |
expected_final_status_(expected_final_status) { |
} |
+DummyPrerenderContents::~DummyPrerenderContents() { |
+ EXPECT_EQ(expected_final_status_, final_status()); |
+ test_prerender_manager_->DummyPrerenderContentsDestroyed(-1, route_id_); |
+} |
+ |
void DummyPrerenderContents::StartPrerendering( |
int ALLOW_UNUSED creator_child_id, |
const gfx::Size& ALLOW_UNUSED size, |
@@ -269,6 +301,7 @@ void DummyPrerenderContents::StartPrerendering( |
load_start_time_ = test_prerender_manager_->GetCurrentTimeTicks(); |
if (!test_prerender_manager_->IsControlGroup(experiment_id())) { |
prerendering_has_started_ = true; |
+ test_prerender_manager_->DummyPrerenderContentsStarted(-1, route_id_, this); |
NotifyPrerenderStart(); |
} |
} |
@@ -332,6 +365,13 @@ class PrerenderTest : public testing::Test { |
return prerender && prerender->handle; |
} |
+ bool LauncherHasScheduledPrerender(int child_id, int prerender_id) { |
+ PrerenderLinkManager::LinkPrerender* prerender = |
+ prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
+ child_id, prerender_id); |
+ return prerender != NULL; |
+ } |
+ |
// Shorthand to add a simple prerender with a reasonable source. Returns |
// true iff the prerender has been added to the PrerenderManager by the |
// PrerenderLinkManager and the PrerenderManager returned a handle. |
@@ -587,21 +627,16 @@ TEST_F(PrerenderTest, MaxConcurrencyTest) { |
if (concurrencies_to_test[i].max_link_concurrency > |
effective_max_link_concurrency) { |
// We should be able to launch more prerenders on this system, but not for |
- // our current launcher. |
- int child_id; |
- int route_id; |
- ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); |
- ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); |
- |
+ // the default launcher. |
GURL extra_url("http://google.com/extraurl"); |
- prerender_link_manager()->OnAddPrerender(child_id, |
- GetNextPrerenderID(), |
- extra_url, content::Referrer(), |
- kSize, route_id); |
+ EXPECT_FALSE(AddSimplePrerender(extra_url)); |
const int prerender_id = last_prerender_id(); |
- EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); |
- prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); |
- EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); |
+ EXPECT_TRUE(LauncherHasScheduledPrerender(kDefaultChildId, |
+ prerender_id)); |
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId, |
+ prerender_id); |
+ EXPECT_FALSE(LauncherHasScheduledPrerender(kDefaultChildId, |
+ prerender_id)); |
} |
DummyPrerenderContents* prerender_contents_to_delay = |
@@ -677,25 +712,28 @@ TEST_F(PrerenderTest, PendingPrerenderTest) { |
GURL pending_url("http://news.google.com/"); |
+ // Schedule a pending prerender launched from the prerender. |
DummyPrerenderContents* pending_prerender_contents = |
prerender_manager()->CreateNextPrerenderContents( |
pending_url, |
ORIGIN_GWS_PRERENDER, |
FINAL_STATUS_USED); |
- scoped_ptr<PrerenderHandle> pending_prerender_handle( |
- prerender_manager()->AddPrerenderFromLinkRelPrerender( |
- child_id, route_id, pending_url, |
- Referrer(url, blink::WebReferrerPolicyDefault), kSize)); |
- CHECK(pending_prerender_handle.get()); |
- EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
- |
+ prerender_link_manager()->OnAddPrerender( |
+ child_id, GetNextPrerenderID(), pending_url, |
+ Referrer(url, blink::WebReferrerPolicyDefault), |
+ kSize, route_id); |
+ EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
+ EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
+ |
+ // Use the referring prerender. |
EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
- EXPECT_TRUE(pending_prerender_handle->IsPrerendering()); |
+ // The pending prerender should start now. |
+ EXPECT_TRUE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
+ EXPECT_TRUE(pending_prerender_contents->prerendering_has_started()); |
ASSERT_EQ(pending_prerender_contents, |
prerender_manager()->FindAndUseEntry(pending_url)); |
- EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
} |
TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { |
@@ -715,21 +753,26 @@ TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { |
// to start. |
GURL pending_url("ftp://news.google.com/"); |
- prerender_manager()->CreateNextPrerenderContents( |
- pending_url, |
- ORIGIN_GWS_PRERENDER, |
- FINAL_STATUS_UNSUPPORTED_SCHEME); |
- scoped_ptr<PrerenderHandle> pending_prerender_handle( |
- prerender_manager()->AddPrerenderFromLinkRelPrerender( |
- child_id, route_id, pending_url, |
- Referrer(url, blink::WebReferrerPolicyDefault), kSize)); |
- DCHECK(pending_prerender_handle.get()); |
- EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
- |
+ // Schedule a pending prerender launched from the prerender. |
+ DummyPrerenderContents* pending_prerender_contents = |
+ prerender_manager()->CreateNextPrerenderContents( |
+ pending_url, |
+ ORIGIN_GWS_PRERENDER, |
+ FINAL_STATUS_UNSUPPORTED_SCHEME); |
+ prerender_link_manager()->OnAddPrerender( |
+ child_id, GetNextPrerenderID(), pending_url, |
+ Referrer(url, blink::WebReferrerPolicyDefault), |
+ kSize, route_id); |
+ EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
+ EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
+ |
+ // Use the referring prerender. |
EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
- EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
+ // The pending prerender still doesn't start. |
+ EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
+ EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
} |
TEST_F(PrerenderTest, CancelPendingPrerenderTest) { |
@@ -747,18 +790,22 @@ TEST_F(PrerenderTest, CancelPendingPrerenderTest) { |
GURL pending_url("http://news.google.com/"); |
- scoped_ptr<PrerenderHandle> pending_prerender_handle( |
- prerender_manager()->AddPrerenderFromLinkRelPrerender( |
- child_id, route_id, pending_url, |
- Referrer(url, blink::WebReferrerPolicyDefault), kSize)); |
- CHECK(pending_prerender_handle.get()); |
- EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
+ // Schedule a pending prerender launched from the prerender. |
+ prerender_link_manager()->OnAddPrerender( |
+ child_id, GetNextPrerenderID(), pending_url, |
+ Referrer(url, blink::WebReferrerPolicyDefault), |
+ kSize, route_id); |
+ EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
- EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
- |
- pending_prerender_handle.reset(); |
+ // Cancel the pending prerender. |
+ prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id()); |
+ // Use the referring prerender. |
+ EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
+ |
+ // The pending prerender doesn't start. |
+ EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
} |
// Tests that a PrerenderManager created for a browser session in the control |