OLD | NEW |
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_render_view_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 |
(...skipping 24 matching lines...) Expand all Loading... |
40 explicit RenderViewInfo(PrerenderManager* prerender_manager) | 40 explicit RenderViewInfo(PrerenderManager* prerender_manager) |
41 : final_status(FINAL_STATUS_MAX), | 41 : final_status(FINAL_STATUS_MAX), |
42 prerender_manager(prerender_manager->AsWeakPtr()) { | 42 prerender_manager(prerender_manager->AsWeakPtr()) { |
43 } | 43 } |
44 ~RenderViewInfo() {} | 44 ~RenderViewInfo() {} |
45 | 45 |
46 FinalStatus final_status; | 46 FinalStatus final_status; |
47 base::WeakPtr<PrerenderManager> prerender_manager; | 47 base::WeakPtr<PrerenderManager> prerender_manager; |
48 }; | 48 }; |
49 | 49 |
50 PrerenderTracker::PrerenderTracker() { | 50 PrerenderRenderViewTracker::PrerenderRenderViewTracker() { |
51 } | 51 } |
52 | 52 |
53 PrerenderTracker::~PrerenderTracker() { | 53 PrerenderRenderViewTracker::~PrerenderRenderViewTracker() { |
54 } | 54 } |
55 | 55 |
56 bool PrerenderTracker::TryUse(int child_id, int route_id) { | 56 bool PrerenderRenderViewTracker::TryUse(int child_id, int route_id) { |
57 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 57 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
58 | 58 |
59 return SetFinalStatus(child_id, route_id, FINAL_STATUS_USED, NULL); | 59 return SetFinalStatus(child_id, route_id, FINAL_STATUS_USED, NULL); |
60 } | 60 } |
61 | 61 |
62 bool PrerenderTracker::TryCancel( | 62 bool PrerenderRenderViewTracker::TryCancel( |
63 int child_id, | 63 int child_id, int route_id, FinalStatus final_status) { |
64 int route_id, | |
65 FinalStatus final_status) { | |
66 DCHECK_NE(FINAL_STATUS_USED, final_status); | 64 DCHECK_NE(FINAL_STATUS_USED, final_status); |
67 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); | 65 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); |
68 | 66 |
69 FinalStatus actual_final_status; | 67 FinalStatus actual_final_status; |
70 SetFinalStatus(child_id, route_id, final_status, &actual_final_status); | 68 SetFinalStatus(child_id, route_id, final_status, &actual_final_status); |
71 return actual_final_status != FINAL_STATUS_USED && | 69 return actual_final_status != FINAL_STATUS_USED && |
72 actual_final_status != FINAL_STATUS_MAX; | 70 actual_final_status != FINAL_STATUS_MAX; |
73 } | 71 } |
74 | 72 |
75 bool PrerenderTracker::TryCancelOnIOThread( | 73 bool PrerenderRenderViewTracker::TryCancelOnIOThread( |
76 int child_id, | 74 int child_id, int route_id, FinalStatus final_status) { |
77 int route_id, | |
78 FinalStatus final_status) { | |
79 DCHECK_NE(FINAL_STATUS_USED, final_status); | 75 DCHECK_NE(FINAL_STATUS_USED, final_status); |
80 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); | 76 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); |
81 | 77 |
82 if (!IsPrerenderingOnIOThread(child_id, route_id)) | 78 if (!IsPrerenderingOnIOThread(child_id, route_id)) |
83 return false; | 79 return false; |
84 return TryCancel(child_id, route_id, final_status); | 80 return TryCancel(child_id, route_id, final_status); |
85 } | 81 } |
86 | 82 |
87 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id, | 83 bool PrerenderRenderViewTracker::GetFinalStatus( |
88 FinalStatus* final_status) const { | 84 int child_id, int route_id, FinalStatus* final_status) const { |
89 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 85 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
90 | 86 |
91 base::AutoLock lock(final_status_map_lock_); | 87 base::AutoLock lock(final_status_map_lock_); |
92 FinalStatusMap::const_iterator final_status_it = | 88 FinalStatusMap::const_iterator final_status_it = |
93 final_status_map_.find(child_route_id_pair); | 89 final_status_map_.find(child_route_id_pair); |
94 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair)) | 90 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair)) |
95 return false; | 91 return false; |
96 *final_status = final_status_it->second.final_status; | 92 *final_status = final_status_it->second.final_status; |
97 return true; | 93 return true; |
98 } | 94 } |
99 | 95 |
100 void PrerenderTracker::OnPrerenderingStarted( | 96 void PrerenderRenderViewTracker::OnPrerenderingStarted( |
101 int child_id, int route_id, PrerenderManager* prerender_manager) { | 97 int child_id, int route_id, PrerenderManager* prerender_manager) { |
102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 98 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
103 DCHECK_GE(child_id, 0); | 99 DCHECK_GE(child_id, 0); |
104 DCHECK_GE(route_id, 0); | 100 DCHECK_GE(route_id, 0); |
105 | 101 |
106 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 102 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
107 | 103 |
108 // The RenderView should not already be prerendering. | 104 // The RenderView should not already be prerendering. |
109 DCHECK(final_status_map_.end() == | 105 DCHECK(final_status_map_.end() == |
110 final_status_map_.find(child_route_id_pair)); | 106 final_status_map_.find(child_route_id_pair)); |
111 | 107 |
112 BrowserThread::PostTask( | 108 BrowserThread::PostTask( |
113 BrowserThread::IO, FROM_HERE, | 109 BrowserThread::IO, FROM_HERE, |
114 base::Bind(&AddPrerenderOnIOThreadTask, child_route_id_pair)); | 110 base::Bind(&AddPrerenderOnIOThreadTask, child_route_id_pair)); |
115 | 111 |
116 base::AutoLock lock(final_status_map_lock_); | 112 base::AutoLock lock(final_status_map_lock_); |
117 | 113 |
118 final_status_map_.insert( | 114 final_status_map_.insert( |
119 std::make_pair(child_route_id_pair, RenderViewInfo(prerender_manager))); | 115 std::make_pair(child_route_id_pair, RenderViewInfo(prerender_manager))); |
120 } | 116 } |
121 | 117 |
122 void PrerenderTracker::OnPrerenderingFinished(int child_id, int route_id) { | 118 void PrerenderRenderViewTracker::OnPrerenderingFinished(int child_id, |
| 119 int route_id) { |
123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 120 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
124 DCHECK_GE(child_id, 0); | 121 DCHECK_GE(child_id, 0); |
125 DCHECK_GE(route_id, 0); | 122 DCHECK_GE(route_id, 0); |
126 | 123 |
127 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 124 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
128 | 125 |
129 BrowserThread::PostTask( | 126 BrowserThread::PostTask( |
130 BrowserThread::IO, FROM_HERE, | 127 BrowserThread::IO, FROM_HERE, |
131 base::Bind(&RemovePrerenderOnIOThreadTask, child_route_id_pair)); | 128 base::Bind(&RemovePrerenderOnIOThreadTask, child_route_id_pair)); |
132 | 129 |
133 base::AutoLock lock(final_status_map_lock_); | 130 base::AutoLock lock(final_status_map_lock_); |
134 size_t num_erased = final_status_map_.erase(child_route_id_pair); | 131 size_t num_erased = final_status_map_.erase(child_route_id_pair); |
135 DCHECK_EQ(1u, num_erased); | 132 DCHECK_EQ(1u, num_erased); |
136 } | 133 } |
137 | 134 |
138 bool PrerenderTracker::SetFinalStatus(int child_id, int route_id, | 135 bool PrerenderRenderViewTracker::SetFinalStatus( |
139 FinalStatus desired_final_status, | 136 int child_id, int route_id, |
140 FinalStatus* actual_final_status) { | 137 FinalStatus desired_final_status, |
| 138 FinalStatus* actual_final_status) { |
141 DCHECK(desired_final_status >= FINAL_STATUS_USED && | 139 DCHECK(desired_final_status >= FINAL_STATUS_USED && |
142 desired_final_status < FINAL_STATUS_MAX); | 140 desired_final_status < FINAL_STATUS_MAX); |
143 | 141 |
144 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 142 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
145 | 143 |
146 base::AutoLock lock(final_status_map_lock_); | 144 base::AutoLock lock(final_status_map_lock_); |
147 FinalStatusMap::iterator final_status_it = | 145 FinalStatusMap::iterator final_status_it = |
148 final_status_map_.find(child_route_id_pair); | 146 final_status_map_.find(child_route_id_pair); |
149 if (final_status_it == final_status_map_.end()) { | 147 if (final_status_it == final_status_map_.end()) { |
150 // The RenderView has already been either used or destroyed. | 148 // The RenderView has already been either used or destroyed. |
(...skipping 15 matching lines...) Expand all Loading... |
166 if (actual_final_status) | 164 if (actual_final_status) |
167 *actual_final_status = desired_final_status; | 165 *actual_final_status = desired_final_status; |
168 return true; | 166 return true; |
169 } | 167 } |
170 | 168 |
171 if (actual_final_status) | 169 if (actual_final_status) |
172 *actual_final_status = final_status_it->second.final_status; | 170 *actual_final_status = final_status_it->second.final_status; |
173 return false; | 171 return false; |
174 } | 172 } |
175 | 173 |
176 bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id, | 174 bool PrerenderRenderViewTracker::IsPrerenderingOnIOThread(int child_id, |
177 int route_id) const { | 175 int route_id) const { |
178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
179 | 177 |
180 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 178 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
181 return possibly_prerendering_io_thread_set_.end() != | 179 return possibly_prerendering_io_thread_set_.end() != |
182 possibly_prerendering_io_thread_set_.find(child_route_id_pair); | 180 possibly_prerendering_io_thread_set_.find(child_route_id_pair); |
183 } | 181 } |
184 | 182 |
185 void PrerenderTracker::AddPrerenderOnIOThread( | 183 void PrerenderRenderViewTracker::AddPrerenderOnIOThread( |
186 const ChildRouteIdPair& child_route_id_pair) { | 184 const ChildRouteIdPair& child_route_id_pair) { |
187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 185 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
188 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first, | 186 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first, |
189 child_route_id_pair.second)); | 187 child_route_id_pair.second)); |
190 | 188 |
191 possibly_prerendering_io_thread_set_.insert(child_route_id_pair); | 189 possibly_prerendering_io_thread_set_.insert(child_route_id_pair); |
192 } | 190 } |
193 | 191 |
194 void PrerenderTracker::RemovePrerenderOnIOThread( | 192 void PrerenderRenderViewTracker::RemovePrerenderOnIOThread( |
195 const ChildRouteIdPair& child_route_id_pair) { | 193 const ChildRouteIdPair& child_route_id_pair) { |
196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
197 DCHECK(IsPrerenderingOnIOThread(child_route_id_pair.first, | 195 DCHECK(IsPrerenderingOnIOThread(child_route_id_pair.first, |
198 child_route_id_pair.second)); | 196 child_route_id_pair.second)); |
199 | 197 |
200 possibly_prerendering_io_thread_set_.erase(child_route_id_pair); | 198 possibly_prerendering_io_thread_set_.erase(child_route_id_pair); |
201 } | 199 } |
202 | 200 |
203 // static | 201 // static |
204 PrerenderTracker* PrerenderTracker::GetDefault() { | 202 PrerenderRenderViewTracker* PrerenderRenderViewTracker::GetDefault() { |
205 return g_browser_process->prerender_tracker(); | 203 return g_browser_process->prerender_render_view_tracker(); |
206 } | 204 } |
207 | 205 |
208 // static | 206 // static |
209 void PrerenderTracker::AddPrerenderOnIOThreadTask( | 207 void PrerenderRenderViewTracker::AddPrerenderOnIOThreadTask( |
210 const ChildRouteIdPair& child_route_id_pair) { | 208 const ChildRouteIdPair& child_route_id_pair) { |
211 GetDefault()->AddPrerenderOnIOThread(child_route_id_pair); | 209 GetDefault()->AddPrerenderOnIOThread(child_route_id_pair); |
212 } | 210 } |
213 | 211 |
214 // static | 212 // static |
215 void PrerenderTracker::RemovePrerenderOnIOThreadTask( | 213 void PrerenderRenderViewTracker::RemovePrerenderOnIOThreadTask( |
216 const ChildRouteIdPair& child_route_id_pair) { | 214 const ChildRouteIdPair& child_route_id_pair) { |
217 GetDefault()->RemovePrerenderOnIOThread(child_route_id_pair); | 215 GetDefault()->RemovePrerenderOnIOThread(child_route_id_pair); |
218 } | 216 } |
219 | 217 |
220 } // namespace prerender | 218 } // namespace prerender |
OLD | NEW |