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

Side by Side Diff: chrome/browser/download/download_request_limiter.cc

Issue 286543002: Cleanup CanDownload WebContentsDelegate API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed Android build hopefully Created 6 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
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/download/download_request_limiter.h" 5 #include "chrome/browser/download/download_request_limiter.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "chrome/browser/content_settings/host_content_settings_map.h" 9 #include "chrome/browser/content_settings/host_content_settings_map.h"
10 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 10 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 274
275 DownloadRequestLimiter::DownloadStatus 275 DownloadRequestLimiter::DownloadStatus
276 DownloadRequestLimiter::GetDownloadStatus(content::WebContents* web_contents) { 276 DownloadRequestLimiter::GetDownloadStatus(content::WebContents* web_contents) {
277 TabDownloadState* state = GetDownloadState(web_contents, NULL, false); 277 TabDownloadState* state = GetDownloadState(web_contents, NULL, false);
278 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD; 278 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD;
279 } 279 }
280 280
281 void DownloadRequestLimiter::CanDownloadOnIOThread( 281 void DownloadRequestLimiter::CanDownloadOnIOThread(
282 int render_process_host_id, 282 int render_process_host_id,
283 int render_view_id, 283 int render_view_id,
284 int request_id, 284 const GURL& url,
285 const std::string& request_method, 285 const std::string& request_method,
286 const Callback& callback) { 286 const Callback& callback) {
287 // This is invoked on the IO thread. Schedule the task to run on the UI 287 // This is invoked on the IO thread. Schedule the task to run on the UI
288 // thread so that we can query UI state. 288 // thread so that we can query UI state.
289 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 289 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
290 BrowserThread::PostTask( 290 BrowserThread::PostTask(
291 BrowserThread::UI, FROM_HERE, 291 BrowserThread::UI, FROM_HERE,
292 base::Bind(&DownloadRequestLimiter::CanDownload, this, 292 base::Bind(&DownloadRequestLimiter::CanDownload, this,
293 render_process_host_id, render_view_id, request_id, 293 render_process_host_id, render_view_id, url,
294 request_method, callback)); 294 request_method, callback));
295 } 295 }
296 296
297 DownloadRequestLimiter::TabDownloadState* 297 DownloadRequestLimiter::TabDownloadState*
298 DownloadRequestLimiter::GetDownloadState( 298 DownloadRequestLimiter::GetDownloadState(
299 content::WebContents* web_contents, 299 content::WebContents* web_contents,
300 content::WebContents* originating_web_contents, 300 content::WebContents* originating_web_contents,
301 bool create) { 301 bool create) {
302 DCHECK(web_contents); 302 DCHECK(web_contents);
303 StateMap::iterator i = state_map_.find(web_contents); 303 StateMap::iterator i = state_map_.find(web_contents);
304 if (i != state_map_.end()) 304 if (i != state_map_.end())
305 return i->second; 305 return i->second;
306 306
307 if (!create) 307 if (!create)
308 return NULL; 308 return NULL;
309 309
310 TabDownloadState* state = 310 TabDownloadState* state =
311 new TabDownloadState(this, web_contents, originating_web_contents); 311 new TabDownloadState(this, web_contents, originating_web_contents);
312 state_map_[web_contents] = state; 312 state_map_[web_contents] = state;
313 return state; 313 return state;
314 } 314 }
315 315
316 void DownloadRequestLimiter::CanDownload(int render_process_host_id, 316 void DownloadRequestLimiter::CanDownload(int render_process_host_id,
317 int render_view_id, 317 int render_view_id,
318 int request_id, 318 const GURL& url,
319 const std::string& request_method, 319 const std::string& request_method,
320 const Callback& callback) { 320 const Callback& callback) {
321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
322 322
323 content::WebContents* originating_contents = 323 content::WebContents* originating_contents =
324 tab_util::GetWebContentsByID(render_process_host_id, render_view_id); 324 tab_util::GetWebContentsByID(render_process_host_id, render_view_id);
325 if (!originating_contents) { 325 if (!originating_contents) {
326 // The WebContents was closed, don't allow the download. 326 // The WebContents was closed, don't allow the download.
327 ScheduleNotification(callback, false); 327 ScheduleNotification(callback, false);
328 return; 328 return;
329 } 329 }
330 330
331 if (!originating_contents->GetDelegate()) { 331 if (!originating_contents->GetDelegate()) {
332 ScheduleNotification(callback, false); 332 ScheduleNotification(callback, false);
333 return; 333 return;
334 } 334 }
335 335
336 // Note that because |originating_contents| might go away before 336 // Note that because |originating_contents| might go away before
337 // OnCanDownloadDecided is invoked, we look it up by |render_process_host_id| 337 // OnCanDownloadDecided is invoked, we look it up by |render_process_host_id|
338 // and |render_view_id|. 338 // and |render_view_id|.
339 base::Callback<void(bool)> can_download_callback = base::Bind( 339 base::Callback<void(bool)> can_download_callback = base::Bind(
340 &DownloadRequestLimiter::OnCanDownloadDecided, 340 &DownloadRequestLimiter::OnCanDownloadDecided,
341 factory_.GetWeakPtr(), 341 factory_.GetWeakPtr(),
342 render_process_host_id, 342 render_process_host_id,
343 render_view_id, 343 render_view_id,
344 request_id,
345 request_method, 344 request_method,
346 callback); 345 callback);
347 346
348 originating_contents->GetDelegate()->CanDownload( 347 originating_contents->GetDelegate()->CanDownload(
349 originating_contents->GetRenderViewHost(), 348 originating_contents->GetRenderViewHost(),
350 request_id, 349 url,
351 request_method, 350 request_method,
352 can_download_callback); 351 can_download_callback);
353 } 352 }
354 353
355 void DownloadRequestLimiter::OnCanDownloadDecided( 354 void DownloadRequestLimiter::OnCanDownloadDecided(
356 int render_process_host_id, 355 int render_process_host_id,
357 int render_view_id, 356 int render_view_id,
358 int request_id,
359 const std::string& request_method, 357 const std::string& request_method,
360 const Callback& orig_callback, bool allow) { 358 const Callback& orig_callback, bool allow) {
361 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 359 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
362 content::WebContents* originating_contents = 360 content::WebContents* originating_contents =
363 tab_util::GetWebContentsByID(render_process_host_id, render_view_id); 361 tab_util::GetWebContentsByID(render_process_host_id, render_view_id);
364 if (!originating_contents || !allow) { 362 if (!originating_contents || !allow) {
365 ScheduleNotification(orig_callback, false); 363 ScheduleNotification(orig_callback, false);
366 return; 364 return;
367 } 365 }
368 366
369 CanDownloadImpl(originating_contents, 367 CanDownloadImpl(originating_contents,
370 request_id,
371 request_method, 368 request_method,
372 orig_callback); 369 orig_callback);
373 } 370 }
374 371
375 HostContentSettingsMap* DownloadRequestLimiter::GetContentSettings( 372 HostContentSettingsMap* DownloadRequestLimiter::GetContentSettings(
376 content::WebContents* contents) { 373 content::WebContents* contents) {
377 return content_settings_ ? content_settings_ : Profile::FromBrowserContext( 374 return content_settings_ ? content_settings_ : Profile::FromBrowserContext(
378 contents->GetBrowserContext())->GetHostContentSettingsMap(); 375 contents->GetBrowserContext())->GetHostContentSettingsMap();
379 } 376 }
380 377
381 void DownloadRequestLimiter::CanDownloadImpl( 378 void DownloadRequestLimiter::CanDownloadImpl(
382 content::WebContents* originating_contents, 379 content::WebContents* originating_contents,
383 int request_id,
384 const std::string& request_method, 380 const std::string& request_method,
385 const Callback& callback) { 381 const Callback& callback) {
386 DCHECK(originating_contents); 382 DCHECK(originating_contents);
387 383
388 TabDownloadState* state = GetDownloadState( 384 TabDownloadState* state = GetDownloadState(
389 originating_contents, originating_contents, true); 385 originating_contents, originating_contents, true);
390 switch (state->download_status()) { 386 switch (state->download_status()) {
391 case ALLOW_ALL_DOWNLOADS: 387 case ALLOW_ALL_DOWNLOADS:
392 if (state->download_count() && !(state->download_count() % 388 if (state->download_count() && !(state->download_count() %
393 DownloadRequestLimiter::kMaxDownloadsAtOnce)) 389 DownloadRequestLimiter::kMaxDownloadsAtOnce))
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 BrowserThread::PostTask( 456 BrowserThread::PostTask(
461 BrowserThread::IO, FROM_HERE, base::Bind(callback, allow)); 457 BrowserThread::IO, FROM_HERE, base::Bind(callback, allow));
462 } 458 }
463 459
464 void DownloadRequestLimiter::Remove(TabDownloadState* state, 460 void DownloadRequestLimiter::Remove(TabDownloadState* state,
465 content::WebContents* contents) { 461 content::WebContents* contents) {
466 DCHECK(ContainsKey(state_map_, contents)); 462 DCHECK(ContainsKey(state_map_, contents));
467 state_map_.erase(contents); 463 state_map_.erase(contents);
468 delete state; 464 delete state;
469 } 465 }
OLDNEW
« no previous file with comments | « chrome/browser/download/download_request_limiter.h ('k') | chrome/browser/download/download_request_limiter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698