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

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

Issue 113803003: Add <link rel=next> support to prerender. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: whitespace Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/prerender/prerender_link_manager.h" 5 #include "chrome/browser/prerender/prerender_link_manager.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <set> 8 #include <set>
9 #include <string>
9 #include <utility> 10 #include <utility>
10 11
11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/metrics/field_trial.h"
12 #include "chrome/browser/prerender/prerender_contents.h" 14 #include "chrome/browser/prerender/prerender_contents.h"
13 #include "chrome/browser/prerender/prerender_handle.h" 15 #include "chrome/browser/prerender/prerender_handle.h"
14 #include "chrome/browser/prerender/prerender_manager.h" 16 #include "chrome/browser/prerender/prerender_manager.h"
15 #include "chrome/browser/prerender/prerender_manager_factory.h" 17 #include "chrome/browser/prerender/prerender_manager_factory.h"
16 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/prerender_messages.h" 19 #include "chrome/common/prerender_messages.h"
20 #include "chrome/common/prerender_types.h"
18 #include "content/public/browser/render_process_host.h" 21 #include "content/public/browser/render_process_host.h"
19 #include "content/public/browser/render_view_host.h" 22 #include "content/public/browser/render_view_host.h"
20 #include "content/public/browser/session_storage_namespace.h" 23 #include "content/public/browser/session_storage_namespace.h"
21 #include "content/public/common/referrer.h" 24 #include "content/public/common/referrer.h"
22 #include "ui/gfx/size.h" 25 #include "ui/gfx/size.h"
23 #include "url/gurl.h" 26 #include "url/gurl.h"
24 27
25 using base::TimeDelta; 28 using base::TimeDelta;
26 using base::TimeTicks; 29 using base::TimeTicks;
27 using content::RenderViewHost; 30 using content::RenderViewHost;
28 using content::SessionStorageNamespace; 31 using content::SessionStorageNamespace;
29 32
30 namespace { 33 namespace {
31 34
35 bool ShouldStartRelNextPrerenders() {
36 const std::string experiment_name =
37 base::FieldTrialList::FindFullName("PrerenderRelNextTrial");
38 return experiment_name.find("Yes") != std::string::npos;
39 }
40
32 void Send(int child_id, IPC::Message* raw_message) { 41 void Send(int child_id, IPC::Message* raw_message) {
33 using content::RenderProcessHost; 42 using content::RenderProcessHost;
34 scoped_ptr<IPC::Message> own_message(raw_message); 43 scoped_ptr<IPC::Message> own_message(raw_message);
35 44
36 RenderProcessHost* render_process_host = RenderProcessHost::FromID(child_id); 45 RenderProcessHost* render_process_host = RenderProcessHost::FromID(child_id);
37 if (!render_process_host) 46 if (!render_process_host)
38 return; 47 return;
39 render_process_host->Send(own_message.release()); 48 render_process_host->Send(own_message.release());
40 } 49 }
41 50
42 } // namespace 51 } // namespace
43 52
44 namespace prerender { 53 namespace prerender {
45 54
46 PrerenderLinkManager::PrerenderLinkManager(PrerenderManager* manager) 55 PrerenderLinkManager::PrerenderLinkManager(PrerenderManager* manager)
47 : has_shutdown_(false), 56 : should_start_rel_next_prerenders_(ShouldStartRelNextPrerenders()),
57 has_shutdown_(false),
48 manager_(manager) { 58 manager_(manager) {
49 } 59 }
50 60
51 PrerenderLinkManager::~PrerenderLinkManager() { 61 PrerenderLinkManager::~PrerenderLinkManager() {
52 for (std::list<LinkPrerender>::iterator i = prerenders_.begin(); 62 for (std::list<LinkPrerender>::iterator i = prerenders_.begin();
53 i != prerenders_.end(); ++i) { 63 i != prerenders_.end(); ++i) {
54 if (i->handle) { 64 if (i->handle) {
55 DCHECK(!i->handle->IsPrerendering()) 65 DCHECK(!i->handle->IsPrerendering())
56 << "All running prerenders should stop at the same time as the " 66 << "All running prerenders should stop at the same time as the "
57 << "PrerenderManager."; 67 << "PrerenderManager.";
58 delete i->handle; 68 delete i->handle;
59 i->handle = 0; 69 i->handle = 0;
60 } 70 }
61 } 71 }
62 } 72 }
63 73
64 void PrerenderLinkManager::OnAddPrerender(int launcher_child_id, 74 void PrerenderLinkManager::OnAddPrerender(int launcher_child_id,
65 int prerender_id, 75 int prerender_id,
66 const GURL& url, 76 const GURL& url,
77 uint32 rel_types,
67 const content::Referrer& referrer, 78 const content::Referrer& referrer,
68 const gfx::Size& size, 79 const gfx::Size& size,
69 int render_view_route_id) { 80 int render_view_route_id) {
70 DCHECK_EQ(static_cast<LinkPrerender*>(NULL), 81 DCHECK_EQ(static_cast<LinkPrerender*>(NULL),
71 FindByLauncherChildIdAndPrerenderId(launcher_child_id, 82 FindByLauncherChildIdAndPrerenderId(launcher_child_id,
72 prerender_id)); 83 prerender_id));
73 content::RenderProcessHost* rph = 84 content::RenderProcessHost* rph =
74 content::RenderProcessHost::FromID(launcher_child_id); 85 content::RenderProcessHost::FromID(launcher_child_id);
75 // Guests inside <webview> do not support cross-process navigation and so we 86 // Guests inside <webview> do not support cross-process navigation and so we
76 // do not allow guests to prerender content. 87 // do not allow guests to prerender content.
77 if (rph && rph->IsGuest()) 88 if (rph && rph->IsGuest())
78 return; 89 return;
79 90
80 LinkPrerender 91 LinkPrerender
81 prerender(launcher_child_id, prerender_id, url, referrer, size, 92 prerender(launcher_child_id, prerender_id, url, rel_types, referrer, size,
82 render_view_route_id, manager_->GetCurrentTimeTicks()); 93 render_view_route_id, manager_->GetCurrentTimeTicks());
83 prerenders_.push_back(prerender); 94 prerenders_.push_back(prerender);
84 StartPrerenders(); 95 StartPrerenders();
85 } 96 }
86 97
87 void PrerenderLinkManager::OnCancelPrerender(int child_id, int prerender_id) { 98 void PrerenderLinkManager::OnCancelPrerender(int child_id, int prerender_id) {
88 LinkPrerender* prerender = FindByLauncherChildIdAndPrerenderId(child_id, 99 LinkPrerender* prerender = FindByLauncherChildIdAndPrerenderId(child_id,
89 prerender_id); 100 prerender_id);
90 if (!prerender) 101 if (!prerender)
91 return; 102 return;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 const size_t running_prerender_count = CountRunningPrerenders(); 139 const size_t running_prerender_count = CountRunningPrerenders();
129 OnAbandonPrerender(child_id, it->prerender_id); 140 OnAbandonPrerender(child_id, it->prerender_id);
130 DCHECK_EQ(running_prerender_count, CountRunningPrerenders()); 141 DCHECK_EQ(running_prerender_count, CountRunningPrerenders());
131 } 142 }
132 } 143 }
133 144
134 PrerenderLinkManager::LinkPrerender::LinkPrerender( 145 PrerenderLinkManager::LinkPrerender::LinkPrerender(
135 int launcher_child_id, 146 int launcher_child_id,
136 int prerender_id, 147 int prerender_id,
137 const GURL& url, 148 const GURL& url,
149 uint32 rel_types,
138 const content::Referrer& referrer, 150 const content::Referrer& referrer,
139 const gfx::Size& size, 151 const gfx::Size& size,
140 int render_view_route_id, 152 int render_view_route_id,
141 TimeTicks creation_time) : launcher_child_id(launcher_child_id), 153 TimeTicks creation_time) : launcher_child_id(launcher_child_id),
142 prerender_id(prerender_id), 154 prerender_id(prerender_id),
143 url(url), 155 url(url),
156 rel_types(rel_types),
144 referrer(referrer), 157 referrer(referrer),
145 size(size), 158 size(size),
146 render_view_route_id(render_view_route_id), 159 render_view_route_id(render_view_route_id),
147 creation_time(creation_time), 160 creation_time(creation_time),
148 handle(NULL), 161 handle(NULL),
149 is_match_complete_replacement(false), 162 is_match_complete_replacement(false),
150 has_been_abandoned(false) { 163 has_been_abandoned(false) {
151 } 164 }
152 165
153 PrerenderLinkManager::LinkPrerender::~LinkPrerender() { 166 PrerenderLinkManager::LinkPrerender::~LinkPrerender() {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 // an abandoned prerender to make room? 253 // an abandoned prerender to make room?
241 if (!abandoned_prerenders.empty()) { 254 if (!abandoned_prerenders.empty()) {
242 CancelPrerender(abandoned_prerenders.front()); 255 CancelPrerender(abandoned_prerenders.front());
243 --total_started_prerender_count; 256 --total_started_prerender_count;
244 abandoned_prerenders.pop_front(); 257 abandoned_prerenders.pop_front();
245 } else { 258 } else {
246 return; 259 return;
247 } 260 }
248 } 261 }
249 262
263 switch ((*i)->rel_types) {
264 case PrerenderRelTypePrerender:
265 case PrerenderRelTypePrerender | PrerenderRelTypeNext:
266 break;
267
268 case PrerenderRelTypeNext:
269 if (should_start_rel_next_prerenders_)
270 break;
271 else
272 continue;
273
274 case 0:
275 default:
276 NOTREACHED();
277 }
278
davidben 2013/12/19 20:30:03 Nit: Maybe split this off into a separate function
gavinp 2013/12/20 14:44:48 Done.
250 PrerenderHandle* handle = manager_->AddPrerenderFromLinkRelPrerender( 279 PrerenderHandle* handle = manager_->AddPrerenderFromLinkRelPrerender(
251 (*i)->launcher_child_id, (*i)->render_view_route_id, 280 (*i)->launcher_child_id, (*i)->render_view_route_id,
252 (*i)->url, (*i)->referrer, (*i)->size); 281 (*i)->url, (*i)->referrer, (*i)->size);
253 if (!handle) { 282 if (!handle) {
254 // This prerender couldn't be launched, it's gone. 283 // This prerender couldn't be launched, it's gone.
255 prerenders_.erase(*i); 284 prerenders_.erase(*i);
256 continue; 285 continue;
257 } 286 }
258 287
259 // We have successfully started a new prerender. 288 // We have successfully started a new prerender.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 DCHECK(!prerender->is_match_complete_replacement); 400 DCHECK(!prerender->is_match_complete_replacement);
372 prerender->is_match_complete_replacement = true; 401 prerender->is_match_complete_replacement = true;
373 Send(prerender->launcher_child_id, 402 Send(prerender->launcher_child_id,
374 new PrerenderMsg_OnPrerenderStop(prerender->prerender_id)); 403 new PrerenderMsg_OnPrerenderStop(prerender->prerender_id));
375 // Do not call RemovePrerender here. The replacement needs to stay connected 404 // Do not call RemovePrerender here. The replacement needs to stay connected
376 // to the HTMLLinkElement in the renderer so it notices renderer-triggered 405 // to the HTMLLinkElement in the renderer so it notices renderer-triggered
377 // cancelations. 406 // cancelations.
378 } 407 }
379 408
380 } // namespace prerender 409 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698