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

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

Issue 9875026: **NOTFORLANDING** New link rel=prerender API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: wdyt? Created 8 years, 8 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/prerender/prerender_link_manager.h"
6
7 #include <utility>
8
9 #include "chrome/browser/profiles/profile.h"
10 #include "chrome/browser/prerender/prerender_manager.h"
11 #include "chrome/browser/prerender/prerender_manager_factory.h"
12 #include "content/public/common/referrer.h"
13 #include "googleurl/src/gurl.h"
14 #include "googleurl/src/url_canon.h"
15 #include "ui/gfx/size.h"
16
17 namespace prerender {
18
19 PrerenderLinkManager::PrerenderLinkManager(
20 PrerenderManager* manager)
21 : manager_(manager) {
22 }
23
24 PrerenderLinkManager::~PrerenderLinkManager() {
25 }
26
27 void PrerenderLinkManager::OnNewLinkPrerenderImpl(
28 int prerender_id,
29 int child_id,
30 int render_view_route_id,
31 const GURL& orig_url,
32 const content::Referrer& referrer,
33 const gfx::Size& ALLOW_UNUSED size) {
gavinp 2012/03/28 19:51:31 I carried this size all the way up for two reasons
34 // TODO(gavinp): Add tests to insure fragments work.
35 url_canon::Replacements<char> replacements;
36 replacements.ClearRef();
37 const GURL url = orig_url.ReplaceComponents(replacements);
gavinp 2012/03/28 19:51:31 In the spirit of not changing too much as I add t
38
39 manager_->AddPrerenderFromLinkRelPrerender(
40 child_id, render_view_route_id, url, referrer);
41 const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
cbentzel 2012/03/29 00:13:37 Why don't you need to include route_id as well? Do
gavinp 2012/04/20 17:54:14 The prerender_id should be unique across the WebKi
42 DCHECK(id_map_.find(child_and_prerender_id) == id_map_.end());
43 id_map_.insert(std::make_pair(child_and_prerender_id, url));
44 url_map_.insert(std::make_pair(url, child_and_prerender_id));
cbentzel 2012/03/29 00:13:37 I recommend adding a CheckInvariant() function whi
gavinp 2012/04/20 17:54:15 Done.
45 }
46
47 void PrerenderLinkManager::OnRemovedLinkPrerenderImpl(const int prerender_id,
48 const int child_id) {
49 const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
50
51 PrerenderIdToUrlMap::iterator id_url_iter =
52 id_map_.find(child_and_prerender_id);
53 if (id_url_iter == id_map_.end())
54 return;
55 const GURL url = id_url_iter->second;
56 id_map_.erase(id_url_iter);
57
58 // Are any other link elements prerendering this URL?
59 UrlToPrerenderIdMap::iterator url_id_iter = url_map_.find(url);
cbentzel 2012/03/29 00:13:37 This doesn't guarantee to find the first entry in
gavinp 2012/04/20 17:54:15 _The C++ Programming Language_ claims otherwise in
60 int remaining_prerender_link_count = 0;
61 while (url_id_iter != url_map_.end() && url_id_iter->first == url) {
62 if (url_id_iter->second == child_and_prerender_id) {
63 UrlToPrerenderIdMap::iterator to_erase = url_id_iter;
64 ++url_id_iter;
65 url_map_.erase(to_erase);
cbentzel 2012/03/29 00:13:37 I always get nervous about erasing while iterating
mmenke 2012/03/29 01:15:39 I suggest that you only delete entries in one plac
gavinp 2012/04/20 17:54:15 Done.
66 continue;
67 }
68 ++remaining_prerender_link_count;
69 ++url_id_iter;
70 }
71 if (remaining_prerender_link_count)
72 return;
73
74 // TODO(gavinp): Track down the correct prerender and stop it, rather than
cbentzel 2012/03/29 00:13:37 Please fix this. Also, it doesn't look like you ha
gavinp 2012/04/20 17:54:15 Done, in a basic way using the existing PrerenderM
75 // this nuclear option, which assumes that only one prerender at a time
76 // runs.
77 if (manager_->IsPrerendering(url))
78 manager_->CancelAllPrerenders();
79 }
80
81 void PrerenderLinkManager::OnUnloadedLinkPrerenderImpl(
82 int prerender_id,
83 int child_id) {
84 // TODO(gavinp,cbentzel): Implement reasonable behaviour for
85 // navigation away from launcher.
86 const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
87 PrerenderIdToUrlMap::iterator id_url_iter =
88 id_map_.find(child_and_prerender_id);
89 if (id_url_iter == id_map_.end())
90 return;
91 const GURL& url = id_url_iter->second;
92 DCHECK(url_map_.find(url) != url_map_.end());
93 ignore_result(url_map_.erase(url));
94 id_map_.erase(id_url_iter);
95 }
96
97 // static
98 void PrerenderLinkManager::OnNewLinkPrerender(
99 Profile* profile,
100 int prerender_id,
101 int child_id,
102 int render_view_route_id,
103 const GURL& url,
104 const content::Referrer& referrer,
105 const gfx::Size& size) {
106 if (prerender::PrerenderManager* prerender_manager =
107 prerender::PrerenderManagerFactory::GetForProfile(profile)) {
108 prerender_manager->link_manager()->OnNewLinkPrerenderImpl(
cbentzel 2012/03/29 00:13:37 Not sure I like that this goes "Get the prerender
gavinp 2012/04/20 17:54:15 Done.
109 prerender_id, child_id, render_view_route_id,
110 url, referrer, size);
111 }
112 }
113
114 // static
115 void PrerenderLinkManager::OnRemovedLinkPrerender(Profile* profile,
116 int prerender_id,
117 int child_id) {
118 if (prerender::PrerenderManager* prerender_manager =
119 prerender::PrerenderManagerFactory::GetForProfile(profile))
120 prerender_manager->link_manager()->OnRemovedLinkPrerenderImpl(prerender_id,
121 child_id);
122 }
123
124 // static
125 void PrerenderLinkManager::OnUnloadedLinkPrerender(Profile* profile,
126 int prerender_id,
127 int child_id) {
128 if (prerender::PrerenderManager* prerender_manager =
129 prerender::PrerenderManagerFactory::GetForProfile(profile))
130 prerender_manager->link_manager()->OnUnloadedLinkPrerenderImpl(prerender_id,
131 child_id);
132 }
133
134 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698