OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <map> |
| 6 #include <utility> |
| 7 |
5 #include "base/command_line.h" | 8 #include "base/command_line.h" |
6 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
7 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
8 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
9 #include "base/metrics/field_trial.h" | 12 #include "base/metrics/field_trial.h" |
10 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
11 #include "base/time/time.h" | 14 #include "base/time/time.h" |
12 #include "chrome/browser/prerender/prerender_contents.h" | 15 #include "chrome/browser/prerender/prerender_contents.h" |
13 #include "chrome/browser/prerender/prerender_handle.h" | 16 #include "chrome/browser/prerender/prerender_handle.h" |
14 #include "chrome/browser/prerender/prerender_link_manager.h" | 17 #include "chrome/browser/prerender/prerender_link_manager.h" |
(...skipping 21 matching lines...) Expand all Loading... |
36 namespace { | 39 namespace { |
37 | 40 |
38 class DummyPrerenderContents : public PrerenderContents { | 41 class DummyPrerenderContents : public PrerenderContents { |
39 public: | 42 public: |
40 DummyPrerenderContents(UnitTestPrerenderManager* test_prerender_manager, | 43 DummyPrerenderContents(UnitTestPrerenderManager* test_prerender_manager, |
41 PrerenderTracker* prerender_tracker, | 44 PrerenderTracker* prerender_tracker, |
42 const GURL& url, | 45 const GURL& url, |
43 Origin origin, | 46 Origin origin, |
44 FinalStatus expected_final_status); | 47 FinalStatus expected_final_status); |
45 | 48 |
46 virtual ~DummyPrerenderContents() { | 49 virtual ~DummyPrerenderContents(); |
47 EXPECT_EQ(expected_final_status_, final_status()); | |
48 } | |
49 | 50 |
50 virtual void StartPrerendering( | 51 virtual void StartPrerendering( |
51 int ALLOW_UNUSED creator_child_id, | 52 int ALLOW_UNUSED creator_child_id, |
52 const gfx::Size& ALLOW_UNUSED size, | 53 const gfx::Size& ALLOW_UNUSED size, |
53 content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace) | 54 content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace) |
54 OVERRIDE; | 55 OVERRIDE; |
55 | 56 |
56 virtual bool GetChildId(int* child_id) const OVERRIDE { | 57 virtual bool GetChildId(int* child_id) const OVERRIDE { |
57 // Having a default child_id of -1 forces pending prerenders not to fail | 58 // Having a default child_id of -1 forces pending prerenders not to fail |
58 // on session storage and cross domain checking. | 59 // on session storage and cross domain checking. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 PrerenderContents* FindAndUseEntry(const GURL& url) { | 129 PrerenderContents* FindAndUseEntry(const GURL& url) { |
129 PrerenderData* prerender_data = FindPrerenderData(url, NULL); | 130 PrerenderData* prerender_data = FindPrerenderData(url, NULL); |
130 if (!prerender_data) | 131 if (!prerender_data) |
131 return NULL; | 132 return NULL; |
132 ScopedVector<PrerenderData>::iterator to_erase = | 133 ScopedVector<PrerenderData>::iterator to_erase = |
133 FindIteratorForPrerenderContents(prerender_data->contents()); | 134 FindIteratorForPrerenderContents(prerender_data->contents()); |
134 CHECK(to_erase != active_prerenders_.end()); | 135 CHECK(to_erase != active_prerenders_.end()); |
135 PrerenderContents* prerender_contents = prerender_data->ReleaseContents(); | 136 PrerenderContents* prerender_contents = prerender_data->ReleaseContents(); |
136 active_prerenders_.erase(to_erase); | 137 active_prerenders_.erase(to_erase); |
137 | 138 |
138 prerender_contents->SetFinalStatus(FINAL_STATUS_USED); | |
139 prerender_contents->PrepareForUse(); | 139 prerender_contents->PrepareForUse(); |
140 return prerender_contents; | 140 return prerender_contents; |
141 } | 141 } |
142 | 142 |
143 void AdvanceTime(TimeDelta delta) { | 143 void AdvanceTime(TimeDelta delta) { |
144 time_ += delta; | 144 time_ += delta; |
145 } | 145 } |
146 | 146 |
147 void AdvanceTimeTicks(TimeDelta delta) { | 147 void AdvanceTimeTicks(TimeDelta delta) { |
148 time_ticks_ += delta; | 148 time_ticks_ += delta; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 | 197 |
198 // from PrerenderManager | 198 // from PrerenderManager |
199 virtual Time GetCurrentTime() const OVERRIDE { | 199 virtual Time GetCurrentTime() const OVERRIDE { |
200 return time_; | 200 return time_; |
201 } | 201 } |
202 | 202 |
203 virtual TimeTicks GetCurrentTimeTicks() const OVERRIDE { | 203 virtual TimeTicks GetCurrentTimeTicks() const OVERRIDE { |
204 return time_ticks_; | 204 return time_ticks_; |
205 } | 205 } |
206 | 206 |
| 207 virtual PrerenderContents* GetPrerenderContentsForRoute( |
| 208 int child_id, int route_id) const OVERRIDE { |
| 209 // Overridden for the PrerenderLinkManager's pending prerender logic. |
| 210 PrerenderContentsMap::const_iterator iter = prerender_contents_map_.find( |
| 211 std::make_pair(child_id, route_id)); |
| 212 if (iter == prerender_contents_map_.end()) |
| 213 return NULL; |
| 214 return iter->second; |
| 215 } |
| 216 |
| 217 void DummyPrerenderContentsStarted(int child_id, |
| 218 int route_id, |
| 219 PrerenderContents* prerender_contents) { |
| 220 prerender_contents_map_[std::make_pair(child_id, route_id)] = |
| 221 prerender_contents; |
| 222 } |
| 223 |
| 224 void DummyPrerenderContentsDestroyed(int child_id, |
| 225 int route_id) { |
| 226 prerender_contents_map_.erase(std::make_pair(child_id, route_id)); |
| 227 } |
| 228 |
207 private: | 229 private: |
208 void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) { | 230 void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) { |
209 CHECK(!next_prerender_contents_.get()); | 231 CHECK(!next_prerender_contents_.get()); |
210 next_prerender_contents_.reset(prerender_contents); | 232 next_prerender_contents_.reset(prerender_contents); |
211 if (prerender_contents->expected_final_status() == FINAL_STATUS_USED) | 233 if (prerender_contents->expected_final_status() == FINAL_STATUS_USED) |
212 used_prerender_contents_.push_back(prerender_contents); | 234 used_prerender_contents_.push_back(prerender_contents); |
213 } | 235 } |
214 | 236 |
215 | 237 |
216 virtual PrerenderContents* CreatePrerenderContents( | 238 virtual PrerenderContents* CreatePrerenderContents( |
217 const GURL& url, | 239 const GURL& url, |
218 const Referrer& referrer, | 240 const Referrer& referrer, |
219 Origin origin, | 241 Origin origin, |
220 uint8 experiment_id) OVERRIDE { | 242 uint8 experiment_id) OVERRIDE { |
221 CHECK(next_prerender_contents_.get()); | 243 CHECK(next_prerender_contents_.get()); |
222 EXPECT_EQ(url, next_prerender_contents_->prerender_url()); | 244 EXPECT_EQ(url, next_prerender_contents_->prerender_url()); |
223 EXPECT_EQ(origin, next_prerender_contents_->origin()); | 245 EXPECT_EQ(origin, next_prerender_contents_->origin()); |
224 return next_prerender_contents_.release(); | 246 return next_prerender_contents_.release(); |
225 } | 247 } |
226 | 248 |
| 249 // Maintain a map from route pairs to PrerenderContents for |
| 250 // GetPrerenderContentsForRoute. |
| 251 typedef std::map<std::pair<int,int>, PrerenderContents*> PrerenderContentsMap; |
| 252 PrerenderContentsMap prerender_contents_map_; |
| 253 |
227 Time time_; | 254 Time time_; |
228 TimeTicks time_ticks_; | 255 TimeTicks time_ticks_; |
229 scoped_ptr<PrerenderContents> next_prerender_contents_; | 256 scoped_ptr<PrerenderContents> next_prerender_contents_; |
230 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, | 257 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, |
231 // tracked so they will be automatically deleted. | 258 // tracked so they will be automatically deleted. |
232 ScopedVector<PrerenderContents> used_prerender_contents_; | 259 ScopedVector<PrerenderContents> used_prerender_contents_; |
233 | 260 |
234 PrerenderTracker* prerender_tracker_; | 261 PrerenderTracker* prerender_tracker_; |
235 }; | 262 }; |
236 | 263 |
(...skipping 14 matching lines...) Expand all Loading... |
251 Origin origin, | 278 Origin origin, |
252 FinalStatus expected_final_status) | 279 FinalStatus expected_final_status) |
253 : PrerenderContents(test_prerender_manager, | 280 : PrerenderContents(test_prerender_manager, |
254 NULL, url, Referrer(), origin, | 281 NULL, url, Referrer(), origin, |
255 PrerenderManager::kNoExperiment), | 282 PrerenderManager::kNoExperiment), |
256 route_id_(g_next_route_id_++), | 283 route_id_(g_next_route_id_++), |
257 test_prerender_manager_(test_prerender_manager), | 284 test_prerender_manager_(test_prerender_manager), |
258 expected_final_status_(expected_final_status) { | 285 expected_final_status_(expected_final_status) { |
259 } | 286 } |
260 | 287 |
| 288 DummyPrerenderContents::~DummyPrerenderContents() { |
| 289 EXPECT_EQ(expected_final_status_, final_status()); |
| 290 test_prerender_manager_->DummyPrerenderContentsDestroyed(-1, route_id_); |
| 291 } |
| 292 |
261 void DummyPrerenderContents::StartPrerendering( | 293 void DummyPrerenderContents::StartPrerendering( |
262 int ALLOW_UNUSED creator_child_id, | 294 int ALLOW_UNUSED creator_child_id, |
263 const gfx::Size& ALLOW_UNUSED size, | 295 const gfx::Size& ALLOW_UNUSED size, |
264 content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace) { | 296 content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace) { |
265 // In the base PrerenderContents implementation, StartPrerendering will | 297 // In the base PrerenderContents implementation, StartPrerendering will |
266 // be called even when the PrerenderManager is part of the control group, | 298 // be called even when the PrerenderManager is part of the control group, |
267 // but it will early exit before actually creating a new RenderView if | 299 // but it will early exit before actually creating a new RenderView if |
268 // |is_control_group| is true; | 300 // |is_control_group| is true; |
269 load_start_time_ = test_prerender_manager_->GetCurrentTimeTicks(); | 301 load_start_time_ = test_prerender_manager_->GetCurrentTimeTicks(); |
270 if (!test_prerender_manager_->IsControlGroup(experiment_id())) { | 302 if (!test_prerender_manager_->IsControlGroup(experiment_id())) { |
271 prerendering_has_started_ = true; | 303 prerendering_has_started_ = true; |
| 304 test_prerender_manager_->DummyPrerenderContentsStarted(-1, route_id_, this); |
272 NotifyPrerenderStart(); | 305 NotifyPrerenderStart(); |
273 } | 306 } |
274 } | 307 } |
275 | 308 |
276 class PrerenderTest : public testing::Test { | 309 class PrerenderTest : public testing::Test { |
277 public: | 310 public: |
278 static const int kDefaultChildId = -1; | 311 static const int kDefaultChildId = -1; |
279 static const int kDefaultRenderViewRouteId = -1; | 312 static const int kDefaultRenderViewRouteId = -1; |
280 | 313 |
281 PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_), | 314 PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_), |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 return ++last_prerender_id_; | 358 return ++last_prerender_id_; |
326 } | 359 } |
327 | 360 |
328 bool LauncherHasRunningPrerender(int child_id, int prerender_id) { | 361 bool LauncherHasRunningPrerender(int child_id, int prerender_id) { |
329 PrerenderLinkManager::LinkPrerender* prerender = | 362 PrerenderLinkManager::LinkPrerender* prerender = |
330 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( | 363 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
331 child_id, prerender_id); | 364 child_id, prerender_id); |
332 return prerender && prerender->handle; | 365 return prerender && prerender->handle; |
333 } | 366 } |
334 | 367 |
| 368 bool LauncherHasScheduledPrerender(int child_id, int prerender_id) { |
| 369 PrerenderLinkManager::LinkPrerender* prerender = |
| 370 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
| 371 child_id, prerender_id); |
| 372 return prerender != NULL; |
| 373 } |
| 374 |
335 // Shorthand to add a simple prerender with a reasonable source. Returns | 375 // Shorthand to add a simple prerender with a reasonable source. Returns |
336 // true iff the prerender has been added to the PrerenderManager by the | 376 // true iff the prerender has been added to the PrerenderManager by the |
337 // PrerenderLinkManager and the PrerenderManager returned a handle. | 377 // PrerenderLinkManager and the PrerenderManager returned a handle. |
338 bool AddSimplePrerender(const GURL& url) { | 378 bool AddSimplePrerender(const GURL& url) { |
339 prerender_link_manager()->OnAddPrerender(kDefaultChildId, | 379 prerender_link_manager()->OnAddPrerender(kDefaultChildId, |
340 GetNextPrerenderID(), | 380 GetNextPrerenderID(), |
341 url, content::Referrer(), | 381 url, content::Referrer(), |
342 kSize, kDefaultRenderViewRouteId); | 382 kSize, kDefaultRenderViewRouteId); |
343 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); | 383 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); |
344 } | 384 } |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 prerender_manager()->CreateNextPrerenderContents(urls.back(), | 620 prerender_manager()->CreateNextPrerenderContents(urls.back(), |
581 FINAL_STATUS_USED)); | 621 FINAL_STATUS_USED)); |
582 EXPECT_TRUE(AddSimplePrerender(urls.back())); | 622 EXPECT_TRUE(AddSimplePrerender(urls.back())); |
583 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 623 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
584 EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started()); | 624 EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started()); |
585 } | 625 } |
586 | 626 |
587 if (concurrencies_to_test[i].max_link_concurrency > | 627 if (concurrencies_to_test[i].max_link_concurrency > |
588 effective_max_link_concurrency) { | 628 effective_max_link_concurrency) { |
589 // We should be able to launch more prerenders on this system, but not for | 629 // We should be able to launch more prerenders on this system, but not for |
590 // our current launcher. | 630 // the default launcher. |
591 int child_id; | |
592 int route_id; | |
593 ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); | |
594 ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); | |
595 | |
596 GURL extra_url("http://google.com/extraurl"); | 631 GURL extra_url("http://google.com/extraurl"); |
597 prerender_link_manager()->OnAddPrerender(child_id, | 632 EXPECT_FALSE(AddSimplePrerender(extra_url)); |
598 GetNextPrerenderID(), | |
599 extra_url, content::Referrer(), | |
600 kSize, route_id); | |
601 const int prerender_id = last_prerender_id(); | 633 const int prerender_id = last_prerender_id(); |
602 EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); | 634 EXPECT_TRUE(LauncherHasScheduledPrerender(kDefaultChildId, |
603 prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); | 635 prerender_id)); |
604 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); | 636 prerender_link_manager()->OnCancelPrerender(kDefaultChildId, |
| 637 prerender_id); |
| 638 EXPECT_FALSE(LauncherHasScheduledPrerender(kDefaultChildId, |
| 639 prerender_id)); |
605 } | 640 } |
606 | 641 |
607 DummyPrerenderContents* prerender_contents_to_delay = | 642 DummyPrerenderContents* prerender_contents_to_delay = |
608 prerender_manager()->CreateNextPrerenderContents(url_to_delay, | 643 prerender_manager()->CreateNextPrerenderContents(url_to_delay, |
609 FINAL_STATUS_USED); | 644 FINAL_STATUS_USED); |
610 EXPECT_FALSE(AddSimplePrerender(url_to_delay)); | 645 EXPECT_FALSE(AddSimplePrerender(url_to_delay)); |
611 EXPECT_FALSE(prerender_contents_to_delay->prerendering_has_started()); | 646 EXPECT_FALSE(prerender_contents_to_delay->prerendering_has_started()); |
612 EXPECT_NE(null, prerender_manager()->next_prerender_contents()); | 647 EXPECT_NE(null, prerender_manager()->next_prerender_contents()); |
613 EXPECT_EQ(null, prerender_manager()->FindEntry(url_to_delay)); | 648 EXPECT_EQ(null, prerender_manager()->FindEntry(url_to_delay)); |
614 for (size_t j = 0; j < effective_max_link_concurrency; ++j) { | 649 for (size_t j = 0; j < effective_max_link_concurrency; ++j) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
670 FINAL_STATUS_USED); | 705 FINAL_STATUS_USED); |
671 EXPECT_TRUE(AddSimplePrerender(url)); | 706 EXPECT_TRUE(AddSimplePrerender(url)); |
672 | 707 |
673 int child_id; | 708 int child_id; |
674 int route_id; | 709 int route_id; |
675 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 710 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
676 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 711 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
677 | 712 |
678 GURL pending_url("http://news.google.com/"); | 713 GURL pending_url("http://news.google.com/"); |
679 | 714 |
| 715 // Schedule a pending prerender launched from the prerender. |
680 DummyPrerenderContents* pending_prerender_contents = | 716 DummyPrerenderContents* pending_prerender_contents = |
681 prerender_manager()->CreateNextPrerenderContents( | 717 prerender_manager()->CreateNextPrerenderContents( |
682 pending_url, | 718 pending_url, |
683 ORIGIN_GWS_PRERENDER, | 719 ORIGIN_GWS_PRERENDER, |
684 FINAL_STATUS_USED); | 720 FINAL_STATUS_USED); |
685 scoped_ptr<PrerenderHandle> pending_prerender_handle( | 721 prerender_link_manager()->OnAddPrerender( |
686 prerender_manager()->AddPrerenderFromLinkRelPrerender( | 722 child_id, GetNextPrerenderID(), pending_url, |
687 child_id, route_id, pending_url, | 723 Referrer(url, blink::WebReferrerPolicyDefault), |
688 Referrer(url, blink::WebReferrerPolicyDefault), kSize)); | 724 kSize, route_id); |
689 CHECK(pending_prerender_handle.get()); | 725 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
690 EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); | 726 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
691 | 727 |
| 728 // Use the referring prerender. |
692 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 729 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
693 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 730 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
694 | 731 |
695 EXPECT_TRUE(pending_prerender_handle->IsPrerendering()); | 732 // The pending prerender should start now. |
| 733 EXPECT_TRUE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| 734 EXPECT_TRUE(pending_prerender_contents->prerendering_has_started()); |
696 ASSERT_EQ(pending_prerender_contents, | 735 ASSERT_EQ(pending_prerender_contents, |
697 prerender_manager()->FindAndUseEntry(pending_url)); | 736 prerender_manager()->FindAndUseEntry(pending_url)); |
698 EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); | |
699 } | 737 } |
700 | 738 |
701 TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { | 739 TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { |
702 GURL url("http://www.google.com/"); | 740 GURL url("http://www.google.com/"); |
703 DummyPrerenderContents* prerender_contents = | 741 DummyPrerenderContents* prerender_contents = |
704 prerender_manager()->CreateNextPrerenderContents( | 742 prerender_manager()->CreateNextPrerenderContents( |
705 url, | 743 url, |
706 FINAL_STATUS_USED); | 744 FINAL_STATUS_USED); |
707 EXPECT_TRUE(AddSimplePrerender(url)); | 745 EXPECT_TRUE(AddSimplePrerender(url)); |
708 | 746 |
709 int child_id; | 747 int child_id; |
710 int route_id; | 748 int route_id; |
711 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 749 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
712 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 750 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
713 | 751 |
714 // This pending URL has an unsupported scheme, and won't be able | 752 // This pending URL has an unsupported scheme, and won't be able |
715 // to start. | 753 // to start. |
716 GURL pending_url("ftp://news.google.com/"); | 754 GURL pending_url("ftp://news.google.com/"); |
717 | 755 |
718 prerender_manager()->CreateNextPrerenderContents( | 756 // Schedule a pending prerender launched from the prerender. |
719 pending_url, | 757 DummyPrerenderContents* pending_prerender_contents = |
720 ORIGIN_GWS_PRERENDER, | 758 prerender_manager()->CreateNextPrerenderContents( |
721 FINAL_STATUS_UNSUPPORTED_SCHEME); | 759 pending_url, |
722 scoped_ptr<PrerenderHandle> pending_prerender_handle( | 760 ORIGIN_GWS_PRERENDER, |
723 prerender_manager()->AddPrerenderFromLinkRelPrerender( | 761 FINAL_STATUS_UNSUPPORTED_SCHEME); |
724 child_id, route_id, pending_url, | 762 prerender_link_manager()->OnAddPrerender( |
725 Referrer(url, blink::WebReferrerPolicyDefault), kSize)); | 763 child_id, GetNextPrerenderID(), pending_url, |
726 DCHECK(pending_prerender_handle.get()); | 764 Referrer(url, blink::WebReferrerPolicyDefault), |
727 EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); | 765 kSize, route_id); |
| 766 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| 767 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
728 | 768 |
| 769 // Use the referring prerender. |
729 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 770 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
730 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 771 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
731 | 772 |
732 EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); | 773 // The pending prerender still doesn't start. |
| 774 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| 775 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
733 } | 776 } |
734 | 777 |
735 TEST_F(PrerenderTest, CancelPendingPrerenderTest) { | 778 TEST_F(PrerenderTest, CancelPendingPrerenderTest) { |
736 GURL url("http://www.google.com/"); | 779 GURL url("http://www.google.com/"); |
737 DummyPrerenderContents* prerender_contents = | 780 DummyPrerenderContents* prerender_contents = |
738 prerender_manager()->CreateNextPrerenderContents( | 781 prerender_manager()->CreateNextPrerenderContents( |
739 url, | 782 url, |
740 FINAL_STATUS_USED); | 783 FINAL_STATUS_USED); |
741 EXPECT_TRUE(AddSimplePrerender(url)); | 784 EXPECT_TRUE(AddSimplePrerender(url)); |
742 | 785 |
743 int child_id; | 786 int child_id; |
744 int route_id; | 787 int route_id; |
745 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 788 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
746 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 789 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
747 | 790 |
748 GURL pending_url("http://news.google.com/"); | 791 GURL pending_url("http://news.google.com/"); |
749 | 792 |
750 scoped_ptr<PrerenderHandle> pending_prerender_handle( | 793 // Schedule a pending prerender launched from the prerender. |
751 prerender_manager()->AddPrerenderFromLinkRelPrerender( | 794 prerender_link_manager()->OnAddPrerender( |
752 child_id, route_id, pending_url, | 795 child_id, GetNextPrerenderID(), pending_url, |
753 Referrer(url, blink::WebReferrerPolicyDefault), kSize)); | 796 Referrer(url, blink::WebReferrerPolicyDefault), |
754 CHECK(pending_prerender_handle.get()); | 797 kSize, route_id); |
755 EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); | 798 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
756 | 799 |
| 800 // Cancel the pending prerender. |
| 801 prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id()); |
| 802 |
| 803 // Use the referring prerender. |
757 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 804 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| 805 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
758 | 806 |
759 pending_prerender_handle.reset(); | 807 // The pending prerender doesn't start. |
760 | 808 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
761 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | |
762 } | 809 } |
763 | 810 |
764 // Tests that a PrerenderManager created for a browser session in the control | 811 // Tests that a PrerenderManager created for a browser session in the control |
765 // group works as expected. | 812 // group works as expected. |
766 TEST_F(PrerenderTest, ControlGroup) { | 813 TEST_F(PrerenderTest, ControlGroup) { |
767 RestorePrerenderMode restore_prerender_mode; | 814 RestorePrerenderMode restore_prerender_mode; |
768 PrerenderManager::SetMode( | 815 PrerenderManager::SetMode( |
769 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); | 816 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); |
770 GURL url("http://www.google.com/"); | 817 GURL url("http://www.google.com/"); |
771 DummyPrerenderContents* prerender_contents = | 818 DummyPrerenderContents* prerender_contents = |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 CHECK(prerender_handle.get()); | 1524 CHECK(prerender_handle.get()); |
1478 EXPECT_TRUE(prerender_handle->IsPrerendering()); | 1525 EXPECT_TRUE(prerender_handle->IsPrerendering()); |
1479 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 1526 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
1480 EXPECT_EQ(prerender_contents, prerender_handle->contents()); | 1527 EXPECT_EQ(prerender_contents, prerender_handle->contents()); |
1481 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); | 1528 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); |
1482 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 1529 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
1483 EXPECT_FALSE(prerender_handle->IsPrerendering()); | 1530 EXPECT_FALSE(prerender_handle->IsPrerendering()); |
1484 } | 1531 } |
1485 | 1532 |
1486 } // namespace prerender | 1533 } // namespace prerender |
OLD | NEW |