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

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

Issue 6255005: Browser test for prerendering in general (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/time.h" 8 #include "base/time.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/browser_thread.h"
10 #include "chrome/browser/prerender/prerender_contents.h" 11 #include "chrome/browser/prerender/prerender_contents.h"
11 #include "chrome/browser/renderer_host/render_view_host.h" 12 #include "chrome/browser/renderer_host/render_view_host.h"
12 #include "chrome/browser/tab_contents/tab_contents.h" 13 #include "chrome/browser/tab_contents/tab_contents.h"
13 #include "chrome/browser/tab_contents/render_view_host_manager.h" 14 #include "chrome/browser/tab_contents/render_view_host_manager.h"
14 #include "chrome/common/render_messages.h" 15 #include "chrome/common/render_messages.h"
15 16
16 struct PrerenderManager::PrerenderContentsData { 17 struct PrerenderManager::PrerenderContentsData {
17 PrerenderContents* contents_; 18 PrerenderContents* contents_;
18 base::Time start_time_; 19 base::Time start_time_;
19 GURL url_; 20 GURL url_;
(...skipping 14 matching lines...) Expand all
34 } 35 }
35 36
36 PrerenderManager::~PrerenderManager() { 37 PrerenderManager::~PrerenderManager() {
37 while (prerender_list_.size() > 0) { 38 while (prerender_list_.size() > 0) {
38 PrerenderContentsData data = prerender_list_.front(); 39 PrerenderContentsData data = prerender_list_.front();
39 prerender_list_.pop_front(); 40 prerender_list_.pop_front();
40 delete data.contents_; 41 delete data.contents_;
41 } 42 }
42 } 43 }
43 44
45 void PrerenderManager::SetPrerenderContentsFactory(
46 PrerenderContents::Factory* prerender_contents_factory) {
47 prerender_contents_factory_.reset(prerender_contents_factory);
48 }
49
44 void PrerenderManager::AddPreload(const GURL& url, 50 void PrerenderManager::AddPreload(const GURL& url,
45 const std::vector<GURL>& alias_urls) { 51 const std::vector<GURL>& alias_urls) {
46 DCHECK(CalledOnValidThread()); 52 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
47 DeleteOldEntries(); 53 DeleteOldEntries();
48 // If the URL already exists in the set of preloaded URLs, don't do anything. 54 // If the URL already exists in the set of preloaded URLs, don't do anything.
49 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 55 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
50 it != prerender_list_.end(); 56 it != prerender_list_.end();
51 ++it) { 57 ++it) {
52 if (it->url_ == url) 58 if (it->url_ == url)
53 return; 59 return;
54 } 60 }
55 PrerenderContentsData data(CreatePrerenderContents(url, alias_urls), 61 PrerenderContentsData data(CreatePrerenderContents(url, alias_urls),
56 GetCurrentTime(), url); 62 GetCurrentTime(), url);
(...skipping 26 matching lines...) Expand all
83 PrerenderContents* pc = it->contents_; 89 PrerenderContents* pc = it->contents_;
84 prerender_list_.erase(it); 90 prerender_list_.erase(it);
85 return pc; 91 return pc;
86 } 92 }
87 } 93 }
88 // Entry not found. 94 // Entry not found.
89 return NULL; 95 return NULL;
90 } 96 }
91 97
92 bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tc, const GURL& url) { 98 bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tc, const GURL& url) {
93 DCHECK(CalledOnValidThread()); 99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
94 scoped_ptr<PrerenderContents> pc(GetEntry(url)); 100 scoped_ptr<PrerenderContents> pc(GetEntry(url));
95 if (pc.get() == NULL) 101 if (pc.get() == NULL)
96 return false; 102 return false;
97 103
98 RenderViewHost* rvh = pc->render_view_host(); 104 RenderViewHost* rvh = pc->render_view_host();
99 pc->set_render_view_host(NULL); 105 pc->set_render_view_host(NULL);
100 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id())); 106 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id()));
101 tc->SwapInRenderViewHost(rvh); 107 tc->SwapInRenderViewHost(rvh);
102 108
103 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params(); 109 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params();
104 if (p != NULL) 110 if (p != NULL)
105 tc->DidNavigate(rvh, *p); 111 tc->DidNavigate(rvh, *p);
106 112
107 string16 title = pc->title(); 113 string16 title = pc->title();
108 if (!title.empty()) 114 if (!title.empty())
109 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title)); 115 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title));
110 116
111 return true; 117 return true;
112 } 118 }
113 119
114 void PrerenderManager::RemoveEntry(PrerenderContents* entry) { 120 void PrerenderManager::RemoveEntry(PrerenderContents* entry) {
115 DCHECK(CalledOnValidThread()); 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
116 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 122 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
117 it != prerender_list_.end(); 123 it != prerender_list_.end();
118 ++it) { 124 ++it) {
119 if (it->contents_ == entry) { 125 if (it->contents_ == entry) {
120 prerender_list_.erase(it); 126 prerender_list_.erase(it);
121 break; 127 break;
122 } 128 }
123 } 129 }
124 delete entry; 130 delete entry;
125 DeleteOldEntries(); 131 DeleteOldEntries();
126 } 132 }
127 133
128 base::Time PrerenderManager::GetCurrentTime() const { 134 base::Time PrerenderManager::GetCurrentTime() const {
129 return base::Time::Now(); 135 return base::Time::Now();
130 } 136 }
131 137
132 bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const { 138 bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
133 base::Time now = GetCurrentTime(); 139 base::Time now = GetCurrentTime();
134 return (now - start < max_prerender_age_); 140 return (now - start < max_prerender_age_);
135 } 141 }
136 142
137 PrerenderContents* PrerenderManager::CreatePrerenderContents( 143 PrerenderContents* PrerenderManager::CreatePrerenderContents(
138 const GURL& url, 144 const GURL& url,
139 const std::vector<GURL>& alias_urls) { 145 const std::vector<GURL>& alias_urls) {
146 if (prerender_contents_factory_.get()) {
cbentzel 2011/01/21 18:37:02 Should you just have a default factory which is cr
mmenke 2011/01/21 20:12:20 Done. I've seen both done in the code, but think
147 return prerender_contents_factory_->CreatePrerenderContents(
148 this, profile_, url, alias_urls);
149 }
140 return new PrerenderContents(this, profile_, url, alias_urls); 150 return new PrerenderContents(this, profile_, url, alias_urls);
141 } 151 }
152
153 PrerenderContents* PrerenderManager::FindEntry(const GURL& url) {
154 DeleteOldEntries();
cbentzel 2011/01/21 18:37:02 I'm not sure if you need to do pruning here.
mmenke 2011/01/21 20:12:20 Removed. I was thinking it would be easier to deb
155 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
156 it != prerender_list_.end();
157 ++it) {
158 if (it->contents_->MatchesURL(url))
159 return it->contents_;
160 }
161 // Entry not found.
162 return NULL;
163 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698