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

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

Issue 10006041: Remove PrerenderResourceThrottle and related infrastructure. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More uprooting 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
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_tracker.h" 5 #include "chrome/browser/prerender/prerender_tracker.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/prerender/prerender_manager.h" 10 #include "chrome/browser/prerender/prerender_manager.h"
11 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_view_host.h" 12 #include "content/public/browser/render_view_host.h"
13 #include "content/public/browser/resource_context.h" 13 #include "content/public/browser/resource_context.h"
14 #include "net/base/load_flags.h" 14 #include "net/base/load_flags.h"
15 15
16 using content::BrowserThread; 16 using content::BrowserThread;
17 using content::RenderViewHost; 17 using content::RenderViewHost;
18 18
19 namespace prerender { 19 namespace prerender {
20 20
21 namespace { 21 namespace {
22 22
23 bool ShouldCancelRequest(
24 int child_id,
25 int route_id) {
26 // Check if the RenderViewHost associated with (child_id, route_id) no
27 // longer exists, or has already been swapped out for a prerendered page.
28 // If that happens, then we do not want to issue the request which originated
29 // from it. Otherwise, keep it going.
30 // The RenderViewHost may exist for a couple of different reasons: such as
31 // being an XHR from the originating page, being included as an iframe,
32 // being requested as a favicon or stylesheet, and many other corner cases.
33 RenderViewHost* render_view_host =
34 RenderViewHost::FromID(child_id, route_id);
35 if (!render_view_host)
36 return true;
37 PrerenderManager* prerender_manager =
38 FindPrerenderManagerUsingRenderProcessId(child_id);
39 return (prerender_manager &&
40 prerender_manager->IsOldRenderViewHost(render_view_host));
41 }
42
43 void HandleDelayedRequestOnUIThread(
44 int child_id,
45 int route_id,
46 const PrerenderTracker::CheckURLCallback& callback) {
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
48 bool should_cancel = ShouldCancelRequest(child_id, route_id);
49 BrowserThread::PostTask(
50 BrowserThread::IO, FROM_HERE, base::Bind(callback, !should_cancel));
51 }
52
53 void DestroyPrerenderForRenderViewOnUI( 23 void DestroyPrerenderForRenderViewOnUI(
54 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 24 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
55 int render_process_id, 25 int render_process_id,
56 int render_view_id, 26 int render_view_id,
57 FinalStatus final_status) { 27 FinalStatus final_status) {
58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
59 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 29 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
60 if (!prerender_manager) 30 if (!prerender_manager)
61 return; 31 return;
62 32
63 prerender_manager->DestroyPrerenderForRenderView( 33 prerender_manager->DestroyPrerenderForRenderView(
64 render_process_id, render_view_id, final_status); 34 render_process_id, render_view_id, final_status);
65 } 35 }
66 36
67
68 void AddURL(const GURL& url, URLCounter* counter) {
69 DCHECK(counter);
70 counter->AddURL(url);
71 }
72
73 void RemoveURLs(const std::vector<GURL>& urls, URLCounter* counter) {
74 DCHECK(counter);
75 counter->RemoveURLs(urls);
76 }
77
78 } // namespace 37 } // namespace
79 38
80 URLCounter::URLCounter() {
81 // URLCounter is currently constructed on the UI thread but
82 // accessed on the IO thread.
83 DetachFromThread();
84 }
85
86 URLCounter::~URLCounter() {
87 // URLCounter is currently destructed on the UI thread but
88 // accessed on the IO thread.
89 DetachFromThread();
90 }
91
92 bool URLCounter::MatchesURL(const GURL& url) const {
93 DCHECK(CalledOnValidThread());
94 URLCountMap::const_iterator it = url_count_map_.find(url);
95 if (it == url_count_map_.end())
96 return false;
97 DCHECK(it->second > 0);
98 return true;
99 }
100
101 void URLCounter::AddURL(const GURL& url) {
102 DCHECK(CalledOnValidThread());
103 URLCountMap::iterator it = url_count_map_.find(url);
104 if (it == url_count_map_.end())
105 url_count_map_[url] = 1;
106 else
107 it->second++;
108 }
109
110 void URLCounter::RemoveURLs(const std::vector<GURL>& urls) {
111 DCHECK(CalledOnValidThread());
112 for (std::vector<GURL>::const_iterator it = urls.begin();
113 it != urls.end();
114 ++it) {
115 URLCountMap::iterator map_entry = url_count_map_.find(*it);
116 DCHECK(url_count_map_.end() != map_entry);
117 DCHECK(map_entry->second > 0);
118 --map_entry->second;
119 if (map_entry->second == 0)
120 url_count_map_.erase(map_entry);
121 }
122 }
123
124 struct RenderViewInfo { 39 struct RenderViewInfo {
125 explicit RenderViewInfo(PrerenderManager* prerender_manager) 40 explicit RenderViewInfo(PrerenderManager* prerender_manager)
126 : final_status(FINAL_STATUS_MAX), 41 : final_status(FINAL_STATUS_MAX),
127 prerender_manager(prerender_manager->AsWeakPtr()) { 42 prerender_manager(prerender_manager->AsWeakPtr()) {
128 } 43 }
129 ~RenderViewInfo() {} 44 ~RenderViewInfo() {}
130 45
131 FinalStatus final_status; 46 FinalStatus final_status;
132 base::WeakPtr<PrerenderManager> prerender_manager; 47 base::WeakPtr<PrerenderManager> prerender_manager;
133 }; 48 };
(...skipping 28 matching lines...) Expand all
162 int route_id, 77 int route_id,
163 FinalStatus final_status) { 78 FinalStatus final_status) {
164 DCHECK_NE(FINAL_STATUS_USED, final_status); 79 DCHECK_NE(FINAL_STATUS_USED, final_status);
165 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); 80 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX);
166 81
167 if (!IsPrerenderingOnIOThread(child_id, route_id)) 82 if (!IsPrerenderingOnIOThread(child_id, route_id))
168 return false; 83 return false;
169 return TryCancel(child_id, route_id, final_status); 84 return TryCancel(child_id, route_id, final_status);
170 } 85 }
171 86
172 bool PrerenderTracker::PotentiallyDelayRequestOnIOThread(
173 const GURL& gurl,
174 int process_id,
175 int route_id,
176 const CheckURLCallback& callback) {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
178 if (!url_counter_.MatchesURL(gurl))
179 return false;
180 BrowserThread::PostTask(
181 BrowserThread::UI,
182 FROM_HERE,
183 base::Bind(&HandleDelayedRequestOnUIThread, process_id, route_id,
184 callback));
185 return true;
186 }
187
188 void PrerenderTracker::AddPrerenderURLOnUIThread(const GURL& url) {
189 BrowserThread::PostTask(
190 BrowserThread::IO, FROM_HERE, base::Bind(&AddURL, url, &url_counter_));
191 }
192
193 void PrerenderTracker::RemovePrerenderURLsOnUIThread(
194 const std::vector<GURL>& urls) {
195 BrowserThread::PostTask(
196 BrowserThread::IO, FROM_HERE,
197 base::Bind(&RemoveURLs, urls, &url_counter_));
198 }
199
200 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id, 87 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id,
201 FinalStatus* final_status) const { 88 FinalStatus* final_status) const {
202 ChildRouteIdPair child_route_id_pair(child_id, route_id); 89 ChildRouteIdPair child_route_id_pair(child_id, route_id);
203 90
204 base::AutoLock lock(final_status_map_lock_); 91 base::AutoLock lock(final_status_map_lock_);
205 FinalStatusMap::const_iterator final_status_it = 92 FinalStatusMap::const_iterator final_status_it =
206 final_status_map_.find(child_route_id_pair); 93 final_status_map_.find(child_route_id_pair);
207 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair)) 94 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair))
208 return false; 95 return false;
209 *final_status = final_status_it->second.final_status; 96 *final_status = final_status_it->second.final_status;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 GetDefault()->AddPrerenderOnIOThread(child_route_id_pair); 211 GetDefault()->AddPrerenderOnIOThread(child_route_id_pair);
325 } 212 }
326 213
327 // static 214 // static
328 void PrerenderTracker::RemovePrerenderOnIOThreadTask( 215 void PrerenderTracker::RemovePrerenderOnIOThreadTask(
329 const ChildRouteIdPair& child_route_id_pair) { 216 const ChildRouteIdPair& child_route_id_pair) {
330 GetDefault()->RemovePrerenderOnIOThread(child_route_id_pair); 217 GetDefault()->RemovePrerenderOnIOThread(child_route_id_pair);
331 } 218 }
332 219
333 } // namespace prerender 220 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_tracker.h ('k') | chrome/browser/prerender/prerender_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698