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

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

Issue 6966017: Remove a chrome dependency by removing Prerender from ResourceDispatcherHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added generic resource_dispatcher_host_observer Created 9 years, 7 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/logging.h" 5 #include "base/logging.h"
6 #include "chrome/browser/browser_process.h"
6 #include "chrome/browser/prerender/prerender_manager.h" 7 #include "chrome/browser/prerender/prerender_manager.h"
7 #include "chrome/browser/prerender/prerender_tracker.h" 8 #include "chrome/browser/prerender/prerender_tracker.h"
8 #include "content/browser/browser_thread.h" 9 #include "content/browser/browser_thread.h"
10 #include "content/browser/resource_context.h"
11 #include "content/common/resource_messages.h"
12 #include "net/base/load_flags.h"
9 13
10 namespace prerender { 14 namespace prerender {
11 15
12 namespace { 16 PrerenderTracker::RenderViewInfo::RenderViewInfo(
13 17 PrerenderManager* prerender_manager)
14 void DestroyPreloadForRenderView( 18 : final_status(FINAL_STATUS_MAX),
15 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 19 prerender_manager(prerender_manager->AsWeakPtr()) {
16 int child_id,
17 int route_id,
18 FinalStatus final_status) {
19 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
20 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
21 if (!prerender_manager)
22 return;
23
24 prerender_manager->DestroyPreloadForChildRouteIdPair(
25 std::make_pair(child_id, route_id),
26 final_status);
27 } 20 }
28 21
29 } // namespace 22 PrerenderTracker::RenderViewInfo::~RenderViewInfo() {
23 }
30 24
31 struct RenderViewInfo { 25 PrerenderTracker::PrerenderTracker() {
32 explicit RenderViewInfo(PrerenderManager* prerender_manager) 26 }
33 : final_status(FINAL_STATUS_MAX),
34 prerender_manager(prerender_manager->AsWeakPtr()) {
35 }
36 27
37 FinalStatus final_status; 28 PrerenderTracker::~PrerenderTracker() {
38 base::WeakPtr<PrerenderManager> prerender_manager;
39 };
40
41 // static
42 PrerenderTracker* PrerenderTracker::GetInstance() {
43 return Singleton<PrerenderTracker>::get();
44 } 29 }
45 30
46 bool PrerenderTracker::TryUse(int child_id, int route_id) { 31 bool PrerenderTracker::TryUse(int child_id, int route_id) {
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 32 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
48 33
49 FinalStatus final_status = SetFinalStatus(child_id, route_id, 34 FinalStatus final_status = SetFinalStatus(child_id, route_id,
50 FINAL_STATUS_USED); 35 FINAL_STATUS_USED);
51 return final_status == FINAL_STATUS_USED; 36 return final_status == FINAL_STATUS_USED;
52 } 37 }
53 38
(...skipping 13 matching lines...) Expand all
67 int route_id, 52 int route_id,
68 FinalStatus final_status) { 53 FinalStatus final_status) {
69 DCHECK_NE(FINAL_STATUS_USED, final_status); 54 DCHECK_NE(FINAL_STATUS_USED, final_status);
70 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); 55 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX);
71 56
72 if (!IsPrerenderingOnIOThread(child_id, route_id)) 57 if (!IsPrerenderingOnIOThread(child_id, route_id))
73 return false; 58 return false;
74 return TryCancel(child_id, route_id, final_status); 59 return TryCancel(child_id, route_id, final_status);
75 } 60 }
76 61
77 bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id,
78 int route_id) const {
79 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
80
81 ChildRouteIdPair child_route_id_pair(child_id, route_id);
82 return possibly_prerendering_io_thread_set_.end() !=
83 possibly_prerendering_io_thread_set_.find(child_route_id_pair);
84 }
85
86 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id, 62 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id,
87 FinalStatus* final_status) const { 63 FinalStatus* final_status) const {
88 ChildRouteIdPair child_route_id_pair(child_id, route_id); 64 ChildRouteIdPair child_route_id_pair(child_id, route_id);
89 65
90 base::AutoLock lock(final_status_map_lock_); 66 base::AutoLock lock(final_status_map_lock_);
91 FinalStatusMap::const_iterator final_status_it = 67 FinalStatusMap::const_iterator final_status_it =
92 final_status_map_.find(child_route_id_pair); 68 final_status_map_.find(child_route_id_pair);
93 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair)) 69 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair))
94 return false; 70 return false;
95 *final_status = final_status_it->second.final_status; 71 *final_status = final_status_it->second.final_status;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 103
128 BrowserThread::PostTask( 104 BrowserThread::PostTask(
129 BrowserThread::IO, FROM_HERE, 105 BrowserThread::IO, FROM_HERE,
130 NewRunnableFunction(&RemovePrerenderOnIOThreadTask, child_route_id_pair)); 106 NewRunnableFunction(&RemovePrerenderOnIOThreadTask, child_route_id_pair));
131 107
132 base::AutoLock lock(final_status_map_lock_); 108 base::AutoLock lock(final_status_map_lock_);
133 size_t num_erased = final_status_map_.erase(child_route_id_pair); 109 size_t num_erased = final_status_map_.erase(child_route_id_pair);
134 DCHECK_EQ(1u, num_erased); 110 DCHECK_EQ(1u, num_erased);
135 } 111 }
136 112
137 PrerenderTracker::PrerenderTracker() {
138 }
139
140 PrerenderTracker::~PrerenderTracker() {
141 }
142
143 FinalStatus PrerenderTracker::SetFinalStatus(int child_id, int route_id, 113 FinalStatus PrerenderTracker::SetFinalStatus(int child_id, int route_id,
144 FinalStatus final_status) { 114 FinalStatus final_status) {
145 DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX); 115 DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX);
146 116
147 ChildRouteIdPair child_route_id_pair(child_id, route_id); 117 ChildRouteIdPair child_route_id_pair(child_id, route_id);
148 118
149 base::AutoLock lock(final_status_map_lock_); 119 base::AutoLock lock(final_status_map_lock_);
150 FinalStatusMap::iterator final_status_it = 120 FinalStatusMap::iterator final_status_it =
151 final_status_map_.find(child_route_id_pair); 121 final_status_map_.find(child_route_id_pair);
152 if (final_status_it == final_status_map_.end()) { 122 if (final_status_it == final_status_map_.end()) {
153 // The RenderView has already been either used or destroyed. 123 // The RenderView has already been either used or destroyed.
154 return FINAL_STATUS_MAX; 124 return FINAL_STATUS_MAX;
155 } 125 }
156 126
157 if (final_status_it->second.final_status == FINAL_STATUS_MAX) { 127 if (final_status_it->second.final_status == FINAL_STATUS_MAX) {
158 final_status_it->second.final_status = final_status; 128 final_status_it->second.final_status = final_status;
159 if (final_status != FINAL_STATUS_USED) { 129 if (final_status != FINAL_STATUS_USED) {
160 BrowserThread::PostTask( 130 BrowserThread::PostTask(
161 BrowserThread::UI, FROM_HERE, 131 BrowserThread::UI, FROM_HERE,
162 NewRunnableFunction(&DestroyPreloadForRenderView, 132 NewRunnableFunction(&DestroyPreloadForRenderView,
163 final_status_it->second.prerender_manager, 133 final_status_it->second.prerender_manager,
164 child_id, 134 child_id,
165 route_id, 135 route_id,
166 final_status)); 136 final_status));
167 } 137 }
168 } 138 }
169 return final_status_it->second.final_status; 139 return final_status_it->second.final_status;
170 } 140 }
171 141
142 bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id,
143 int route_id) const {
144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
145
146 ChildRouteIdPair child_route_id_pair(child_id, route_id);
147 return possibly_prerendering_io_thread_set_.end() !=
148 possibly_prerendering_io_thread_set_.find(child_route_id_pair);
149 }
150
172 void PrerenderTracker::AddPrerenderOnIOThread( 151 void PrerenderTracker::AddPrerenderOnIOThread(
173 const ChildRouteIdPair& child_route_id_pair) { 152 const ChildRouteIdPair& child_route_id_pair) {
174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
175 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first, 154 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first,
176 child_route_id_pair.second)); 155 child_route_id_pair.second));
177 156
178 possibly_prerendering_io_thread_set_.insert(child_route_id_pair); 157 possibly_prerendering_io_thread_set_.insert(child_route_id_pair);
179 } 158 }
180 159
181 void PrerenderTracker::RemovePrerenderOnIOThread( 160 void PrerenderTracker::RemovePrerenderOnIOThread(
182 const ChildRouteIdPair& child_route_id_pair) { 161 const ChildRouteIdPair& child_route_id_pair) {
183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 162 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
184 DCHECK(IsPrerenderingOnIOThread(child_route_id_pair.first, 163 DCHECK(IsPrerenderingOnIOThread(child_route_id_pair.first,
185 child_route_id_pair.second)); 164 child_route_id_pair.second));
186 165
187 possibly_prerendering_io_thread_set_.erase(child_route_id_pair); 166 possibly_prerendering_io_thread_set_.erase(child_route_id_pair);
188 } 167 }
189 168
190 // static 169 // static
191 void PrerenderTracker::AddPrerenderOnIOThreadTask( 170 void PrerenderTracker::AddPrerenderOnIOThreadTask(
192 const ChildRouteIdPair& child_route_id_pair) { 171 const ChildRouteIdPair& child_route_id_pair) {
193 GetInstance()->AddPrerenderOnIOThread(child_route_id_pair); 172 g_browser_process->prerender_tracker()->AddPrerenderOnIOThread(
173 child_route_id_pair);
194 } 174 }
195 175
196 // static 176 // static
197 void PrerenderTracker::RemovePrerenderOnIOThreadTask( 177 void PrerenderTracker::RemovePrerenderOnIOThreadTask(
198 const ChildRouteIdPair& child_route_id_pair) { 178 const ChildRouteIdPair& child_route_id_pair) {
199 GetInstance()->RemovePrerenderOnIOThread(child_route_id_pair); 179 g_browser_process->prerender_tracker()->RemovePrerenderOnIOThread(
180 child_route_id_pair);
200 } 181 }
201 182
202 } // namespace prerender 183 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698