OLD | NEW |
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 "chrome/browser/download/download_request_limiter.h" | 5 #include "chrome/browser/download/download_request_limiter.h" |
6 | 6 |
7 #include "base/stl_util-inl.h" | 7 #include "base/stl_util-inl.h" |
8 #include "chrome/browser/download/download_request_infobar_delegate.h" | 8 #include "chrome/browser/download/download_request_infobar_delegate.h" |
9 #include "chrome/browser/tab_contents/tab_util.h" | 9 #include "chrome/browser/tab_contents/tab_util.h" |
10 #include "content/browser/browser_thread.h" | 10 #include "content/browser/browser_thread.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 183 } |
184 | 184 |
185 DownloadRequestLimiter::DownloadStatus | 185 DownloadRequestLimiter::DownloadStatus |
186 DownloadRequestLimiter::GetDownloadStatus(TabContents* tab) { | 186 DownloadRequestLimiter::GetDownloadStatus(TabContents* tab) { |
187 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); | 187 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); |
188 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD; | 188 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD; |
189 } | 189 } |
190 | 190 |
191 void DownloadRequestLimiter::CanDownloadOnIOThread(int render_process_host_id, | 191 void DownloadRequestLimiter::CanDownloadOnIOThread(int render_process_host_id, |
192 int render_view_id, | 192 int render_view_id, |
| 193 int request_id, |
193 Callback* callback) { | 194 Callback* callback) { |
194 // This is invoked on the IO thread. Schedule the task to run on the UI | 195 // This is invoked on the IO thread. Schedule the task to run on the UI |
195 // thread so that we can query UI state. | 196 // thread so that we can query UI state. |
196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 197 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
197 BrowserThread::PostTask( | 198 BrowserThread::PostTask( |
198 BrowserThread::UI, FROM_HERE, | 199 BrowserThread::UI, FROM_HERE, |
199 NewRunnableMethod(this, &DownloadRequestLimiter::CanDownload, | 200 NewRunnableMethod(this, &DownloadRequestLimiter::CanDownload, |
200 render_process_host_id, render_view_id, callback)); | 201 render_process_host_id, render_view_id, request_id, |
| 202 callback)); |
201 } | 203 } |
202 | 204 |
203 void DownloadRequestLimiter::OnUserGesture(TabContents* tab) { | 205 void DownloadRequestLimiter::OnUserGesture(TabContents* tab) { |
204 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); | 206 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); |
205 if (!state) | 207 if (!state) |
206 return; | 208 return; |
207 | 209 |
208 state->OnUserGesture(); | 210 state->OnUserGesture(); |
209 } | 211 } |
210 | 212 |
(...skipping 15 matching lines...) Expand all Loading... |
226 return NULL; | 228 return NULL; |
227 | 229 |
228 TabDownloadState* state = | 230 TabDownloadState* state = |
229 new TabDownloadState(this, controller, originating_controller); | 231 new TabDownloadState(this, controller, originating_controller); |
230 state_map_[controller] = state; | 232 state_map_[controller] = state; |
231 return state; | 233 return state; |
232 } | 234 } |
233 | 235 |
234 void DownloadRequestLimiter::CanDownload(int render_process_host_id, | 236 void DownloadRequestLimiter::CanDownload(int render_process_host_id, |
235 int render_view_id, | 237 int render_view_id, |
| 238 int request_id, |
236 Callback* callback) { | 239 Callback* callback) { |
237 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 240 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
238 | 241 |
239 TabContents* originating_tab = | 242 TabContents* originating_tab = |
240 tab_util::GetTabContentsByID(render_process_host_id, render_view_id); | 243 tab_util::GetTabContentsByID(render_process_host_id, render_view_id); |
241 if (!originating_tab) { | 244 if (!originating_tab) { |
242 // The tab was closed, don't allow the download. | 245 // The tab was closed, don't allow the download. |
243 ScheduleNotification(callback, false); | 246 ScheduleNotification(callback, false); |
244 return; | 247 return; |
245 } | 248 } |
246 CanDownloadImpl(originating_tab, callback); | 249 CanDownloadImpl(originating_tab, request_id, callback); |
247 } | 250 } |
248 | 251 |
249 void DownloadRequestLimiter::CanDownloadImpl( | 252 void DownloadRequestLimiter::CanDownloadImpl( |
250 TabContents* originating_tab, | 253 TabContents* originating_tab, |
| 254 int request_id, |
251 Callback* callback) { | 255 Callback* callback) { |
252 // FYI: Chrome Frame overrides CanDownload in ExternalTabContainer in order | 256 // FYI: Chrome Frame overrides CanDownload in ExternalTabContainer in order |
253 // to cancel the download operation in chrome and let the host browser | 257 // to cancel the download operation in chrome and let the host browser |
254 // take care of it. | 258 // take care of it. |
255 if (!originating_tab->CanDownload(callback->GetRequestId())) { | 259 if (!originating_tab->CanDownload(request_id)) { |
256 ScheduleNotification(callback, false); | 260 ScheduleNotification(callback, false); |
257 return; | 261 return; |
258 } | 262 } |
259 | 263 |
260 // If the tab requesting the download is a constrained popup that is not | 264 // If the tab requesting the download is a constrained popup that is not |
261 // shown, treat the request as if it came from the parent. | 265 // shown, treat the request as if it came from the parent. |
262 TabContents* effective_tab = originating_tab; | 266 TabContents* effective_tab = originating_tab; |
263 if (effective_tab->delegate()) { | 267 if (effective_tab->delegate()) { |
264 effective_tab = | 268 effective_tab = |
265 effective_tab->delegate()->GetConstrainingContents(effective_tab); | 269 effective_tab->delegate()->GetConstrainingContents(effective_tab); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 | 317 |
314 void DownloadRequestLimiter::Remove(TabDownloadState* state) { | 318 void DownloadRequestLimiter::Remove(TabDownloadState* state) { |
315 DCHECK(ContainsKey(state_map_, state->controller())); | 319 DCHECK(ContainsKey(state_map_, state->controller())); |
316 state_map_.erase(state->controller()); | 320 state_map_.erase(state->controller()); |
317 delete state; | 321 delete state; |
318 } | 322 } |
319 | 323 |
320 // static | 324 // static |
321 DownloadRequestLimiter::TestingDelegate* DownloadRequestLimiter::delegate_ = | 325 DownloadRequestLimiter::TestingDelegate* DownloadRequestLimiter::delegate_ = |
322 NULL; | 326 NULL; |
OLD | NEW |