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

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

Issue 1229933010: move file access permission logic to DownloadResourceThrottle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressing asanka's comments Created 5 years, 5 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/tab_specific_content_settings.h" 9 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
10 #include "chrome/browser/download/download_permission_request.h" 10 #include "chrome/browser/download/download_permission_request.h"
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 // removes from state_map_. As such, there should be no pending callbacks. 272 // removes from state_map_. As such, there should be no pending callbacks.
273 DCHECK(state_map_.empty()); 273 DCHECK(state_map_.empty());
274 } 274 }
275 275
276 DownloadRequestLimiter::DownloadStatus 276 DownloadRequestLimiter::DownloadStatus
277 DownloadRequestLimiter::GetDownloadStatus(content::WebContents* web_contents) { 277 DownloadRequestLimiter::GetDownloadStatus(content::WebContents* web_contents) {
278 TabDownloadState* state = GetDownloadState(web_contents, NULL, false); 278 TabDownloadState* state = GetDownloadState(web_contents, NULL, false);
279 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD; 279 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD;
280 } 280 }
281 281
282 void DownloadRequestLimiter::CanDownloadOnIOThread(
283 int render_process_host_id,
284 int render_view_id,
285 const GURL& url,
286 const std::string& request_method,
287 const Callback& callback) {
288 // This is invoked on the IO thread. Schedule the task to run on the UI
289 // thread so that we can query UI state.
290 DCHECK_CURRENTLY_ON(BrowserThread::IO);
291 BrowserThread::PostTask(
292 BrowserThread::UI, FROM_HERE,
293 base::Bind(&DownloadRequestLimiter::CanDownload, this,
294 render_process_host_id, render_view_id, url,
295 request_method, callback));
296 }
297
298 DownloadRequestLimiter::TabDownloadState* 282 DownloadRequestLimiter::TabDownloadState*
299 DownloadRequestLimiter::GetDownloadState( 283 DownloadRequestLimiter::GetDownloadState(
300 content::WebContents* web_contents, 284 content::WebContents* web_contents,
301 content::WebContents* originating_web_contents, 285 content::WebContents* originating_web_contents,
302 bool create) { 286 bool create) {
303 DCHECK(web_contents); 287 DCHECK(web_contents);
304 StateMap::iterator i = state_map_.find(web_contents); 288 StateMap::iterator i = state_map_.find(web_contents);
305 if (i != state_map_.end()) 289 if (i != state_map_.end())
306 return i->second; 290 return i->second;
307 291
(...skipping 10 matching lines...) Expand all
318 int render_view_id, 302 int render_view_id,
319 const GURL& url, 303 const GURL& url,
320 const std::string& request_method, 304 const std::string& request_method,
321 const Callback& callback) { 305 const Callback& callback) {
322 DCHECK_CURRENTLY_ON(BrowserThread::UI); 306 DCHECK_CURRENTLY_ON(BrowserThread::UI);
323 307
324 content::WebContents* originating_contents = 308 content::WebContents* originating_contents =
325 tab_util::GetWebContentsByID(render_process_host_id, render_view_id); 309 tab_util::GetWebContentsByID(render_process_host_id, render_view_id);
326 if (!originating_contents) { 310 if (!originating_contents) {
327 // The WebContents was closed, don't allow the download. 311 // The WebContents was closed, don't allow the download.
328 ScheduleNotification(callback, false); 312 callback.Run(false);
329 return; 313 return;
330 } 314 }
331 315
332 if (!originating_contents->GetDelegate()) { 316 if (!originating_contents->GetDelegate()) {
333 ScheduleNotification(callback, false); 317 callback.Run(false);
334 return; 318 return;
335 } 319 }
336 320
337 // Note that because |originating_contents| might go away before 321 // Note that because |originating_contents| might go away before
338 // OnCanDownloadDecided is invoked, we look it up by |render_process_host_id| 322 // OnCanDownloadDecided is invoked, we look it up by |render_process_host_id|
339 // and |render_view_id|. 323 // and |render_view_id|.
340 base::Callback<void(bool)> can_download_callback = base::Bind( 324 base::Callback<void(bool)> can_download_callback = base::Bind(
341 &DownloadRequestLimiter::OnCanDownloadDecided, 325 &DownloadRequestLimiter::OnCanDownloadDecided,
342 factory_.GetWeakPtr(), 326 factory_.GetWeakPtr(),
343 render_process_host_id, 327 render_process_host_id,
344 render_view_id, 328 render_view_id,
345 request_method, 329 request_method,
346 callback); 330 callback);
347 331
348 originating_contents->GetDelegate()->CanDownload( 332 originating_contents->GetDelegate()->CanDownload(
349 url, 333 url,
350 request_method, 334 request_method,
351 can_download_callback); 335 can_download_callback);
352 } 336 }
353 337
354 void DownloadRequestLimiter::OnCanDownloadDecided( 338 void DownloadRequestLimiter::OnCanDownloadDecided(
355 int render_process_host_id, 339 int render_process_host_id,
356 int render_view_id, 340 int render_view_id,
357 const std::string& request_method, 341 const std::string& request_method,
358 const Callback& orig_callback, bool allow) { 342 const Callback& orig_callback, bool allow) {
359 DCHECK_CURRENTLY_ON(BrowserThread::UI); 343 DCHECK_CURRENTLY_ON(BrowserThread::UI);
360 content::WebContents* originating_contents = 344 content::WebContents* originating_contents =
361 tab_util::GetWebContentsByID(render_process_host_id, render_view_id); 345 tab_util::GetWebContentsByID(render_process_host_id, render_view_id);
362 if (!originating_contents || !allow) { 346 if (!originating_contents || !allow) {
363 ScheduleNotification(orig_callback, false); 347 orig_callback.Run(false);
364 return; 348 return;
365 } 349 }
366 350
367 CanDownloadImpl(originating_contents, 351 CanDownloadImpl(originating_contents,
368 request_method, 352 request_method,
369 orig_callback); 353 orig_callback);
370 } 354 }
371 355
372 HostContentSettingsMap* DownloadRequestLimiter::GetContentSettings( 356 HostContentSettingsMap* DownloadRequestLimiter::GetContentSettings(
373 content::WebContents* contents) { 357 content::WebContents* contents) {
374 return content_settings_ ? content_settings_ : Profile::FromBrowserContext( 358 return content_settings_ ? content_settings_ : Profile::FromBrowserContext(
375 contents->GetBrowserContext())->GetHostContentSettingsMap(); 359 contents->GetBrowserContext())->GetHostContentSettingsMap();
376 } 360 }
377 361
378 void DownloadRequestLimiter::CanDownloadImpl( 362 void DownloadRequestLimiter::CanDownloadImpl(
379 content::WebContents* originating_contents, 363 content::WebContents* originating_contents,
380 const std::string& request_method, 364 const std::string& request_method,
381 const Callback& callback) { 365 const Callback& callback) {
382 DCHECK(originating_contents); 366 DCHECK(originating_contents);
383 367
384 TabDownloadState* state = GetDownloadState( 368 TabDownloadState* state = GetDownloadState(
385 originating_contents, originating_contents, true); 369 originating_contents, originating_contents, true);
386 switch (state->download_status()) { 370 switch (state->download_status()) {
387 case ALLOW_ALL_DOWNLOADS: 371 case ALLOW_ALL_DOWNLOADS:
388 if (state->download_count() && !(state->download_count() % 372 if (state->download_count() && !(state->download_count() %
389 DownloadRequestLimiter::kMaxDownloadsAtOnce)) 373 DownloadRequestLimiter::kMaxDownloadsAtOnce))
390 state->set_download_status(PROMPT_BEFORE_DOWNLOAD); 374 state->set_download_status(PROMPT_BEFORE_DOWNLOAD);
391 ScheduleNotification(callback, true); 375 callback.Run(true);
392 state->increment_download_count(); 376 state->increment_download_count();
393 break; 377 break;
394 378
395 case ALLOW_ONE_DOWNLOAD: 379 case ALLOW_ONE_DOWNLOAD:
396 state->set_download_status(PROMPT_BEFORE_DOWNLOAD); 380 state->set_download_status(PROMPT_BEFORE_DOWNLOAD);
397 ScheduleNotification(callback, true); 381 callback.Run(true);
398 state->increment_download_count(); 382 state->increment_download_count();
399 break; 383 break;
400 384
401 case DOWNLOADS_NOT_ALLOWED: 385 case DOWNLOADS_NOT_ALLOWED:
402 ScheduleNotification(callback, false); 386 callback.Run(false);
403 break; 387 break;
404 388
405 case PROMPT_BEFORE_DOWNLOAD: { 389 case PROMPT_BEFORE_DOWNLOAD: {
406 HostContentSettingsMap* content_settings = GetContentSettings( 390 HostContentSettingsMap* content_settings = GetContentSettings(
407 originating_contents); 391 originating_contents);
408 ContentSetting setting = CONTENT_SETTING_ASK; 392 ContentSetting setting = CONTENT_SETTING_ASK;
409 if (content_settings) 393 if (content_settings)
410 setting = content_settings->GetContentSetting( 394 setting = content_settings->GetContentSetting(
411 originating_contents->GetURL(), 395 originating_contents->GetURL(),
412 originating_contents->GetURL(), 396 originating_contents->GetURL(),
413 CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, 397 CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
414 std::string()); 398 std::string());
415 switch (setting) { 399 switch (setting) {
416 case CONTENT_SETTING_ALLOW: { 400 case CONTENT_SETTING_ALLOW: {
417 TabSpecificContentSettings* settings = 401 TabSpecificContentSettings* settings =
418 TabSpecificContentSettings::FromWebContents( 402 TabSpecificContentSettings::FromWebContents(
419 originating_contents); 403 originating_contents);
420 if (settings) 404 if (settings)
421 settings->SetDownloadsBlocked(false); 405 settings->SetDownloadsBlocked(false);
422 ScheduleNotification(callback, true); 406 callback.Run(true);
423 state->increment_download_count(); 407 state->increment_download_count();
424 return; 408 return;
425 } 409 }
426 case CONTENT_SETTING_BLOCK: { 410 case CONTENT_SETTING_BLOCK: {
427 TabSpecificContentSettings* settings = 411 TabSpecificContentSettings* settings =
428 TabSpecificContentSettings::FromWebContents( 412 TabSpecificContentSettings::FromWebContents(
429 originating_contents); 413 originating_contents);
430 if (settings) 414 if (settings)
431 settings->SetDownloadsBlocked(true); 415 settings->SetDownloadsBlocked(true);
432 ScheduleNotification(callback, false); 416 callback.Run(false);
433 return; 417 return;
434 } 418 }
435 case CONTENT_SETTING_DEFAULT: 419 case CONTENT_SETTING_DEFAULT:
436 case CONTENT_SETTING_ASK: 420 case CONTENT_SETTING_ASK:
437 case CONTENT_SETTING_SESSION_ONLY: 421 case CONTENT_SETTING_SESSION_ONLY:
438 state->PromptUserForDownload(callback); 422 state->PromptUserForDownload(callback);
439 state->increment_download_count(); 423 state->increment_download_count();
440 break; 424 break;
441 case CONTENT_SETTING_NUM_SETTINGS: 425 case CONTENT_SETTING_NUM_SETTINGS:
442 default: 426 default:
443 NOTREACHED(); 427 NOTREACHED();
444 return; 428 return;
445 } 429 }
446 break; 430 break;
447 } 431 }
448 432
449 default: 433 default:
450 NOTREACHED(); 434 NOTREACHED();
451 } 435 }
452 } 436 }
453 437
454 void DownloadRequestLimiter::ScheduleNotification(const Callback& callback, 438 void DownloadRequestLimiter::ScheduleNotification(const Callback& callback,
asanka 2015/07/15 20:23:00 Remove. The notification is now documented to be i
qinmin 2015/07/17 00:42:35 TabDownloadState still calls this method. But sinc
455 bool allow) { 439 bool allow) {
456 BrowserThread::PostTask( 440 BrowserThread::PostTask(
457 BrowserThread::IO, FROM_HERE, base::Bind(callback, allow)); 441 BrowserThread::IO, FROM_HERE, base::Bind(callback, allow));
458 } 442 }
459 443
460 void DownloadRequestLimiter::Remove(TabDownloadState* state, 444 void DownloadRequestLimiter::Remove(TabDownloadState* state,
461 content::WebContents* contents) { 445 content::WebContents* contents) {
462 DCHECK(ContainsKey(state_map_, contents)); 446 DCHECK(ContainsKey(state_map_, contents));
463 state_map_.erase(contents); 447 state_map_.erase(contents);
464 delete state; 448 delete state;
465 } 449 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698