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

Side by Side Diff: content/browser/download/download_item_impl.cc

Issue 14947007: [Downloads] Allow acquiring dangerous download file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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) 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 // File method ordering: Methods in this file are in the same order as 5 // File method ordering: Methods in this file are in the same order as
6 // in download_item_impl.h, with the following exception: The public 6 // in download_item_impl.h, with the following exception: The public
7 // interface Start is placed in chronological order with the other 7 // interface Start is placed in chronological order with the other
8 // (private) routines that together define a DownloadItem's state 8 // (private) routines that together define a DownloadItem's state
9 // transitions as the download progresses. See "Download progression 9 // transitions as the download progresses. See "Download progression
10 // cascade" later in this file. 10 // cascade" later in this file.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
62 62
63 // Make sure we only delete files. 63 // Make sure we only delete files.
64 if (!file_util::DirectoryExists(path)) 64 if (!file_util::DirectoryExists(path))
65 file_util::Delete(path, false); 65 file_util::Delete(path, false);
66 } 66 }
67 67
68 // Wrapper around DownloadFile::Detach and DownloadFile::Cancel that 68 // Wrapper around DownloadFile::Detach and DownloadFile::Cancel that
69 // takes ownership of the DownloadFile and hence implicitly destroys it 69 // takes ownership of the DownloadFile and hence implicitly destroys it
70 // at the end of the function. 70 // at the end of the function.
71 static void DownloadFileDetach(scoped_ptr<DownloadFile> download_file) { 71 static base::FilePath DownloadFileDetach(
72 scoped_ptr<DownloadFile> download_file) {
72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
74 base::FilePath full_path = download_file->FullPath();
73 download_file->Detach(); 75 download_file->Detach();
76 return full_path;
74 } 77 }
75 78
76 static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) { 79 static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) {
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
78 download_file->Cancel(); 81 download_file->Cancel();
79 } 82 }
80 83
81 } // namespace 84 } // namespace
82 85
83 const char DownloadItem::kEmptyFileHash[] = ""; 86 const char DownloadItem::kEmptyFileHash[] = "";
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 // Delete the file if it exists and is not owned by a DownloadFile object. 384 // Delete the file if it exists and is not owned by a DownloadFile object.
382 // (In the latter case the DownloadFile object will delete it on cancel.) 385 // (In the latter case the DownloadFile object will delete it on cancel.)
383 if (!current_path_.empty() && download_file_.get() == NULL) { 386 if (!current_path_.empty() && download_file_.get() == NULL) {
384 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 387 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
385 base::Bind(&DeleteDownloadedFile, current_path_)); 388 base::Bind(&DeleteDownloadedFile, current_path_));
386 } 389 }
387 Remove(); 390 Remove();
388 // We have now been deleted. 391 // We have now been deleted.
389 } 392 }
390 393
394 void DownloadItemImpl::AcquireFileAndDeleteDownload(
395 const AcquireFileCallback& callback) {
396 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
397
398 if (download_file_) {
399 BrowserThread::PostTaskAndReplyWithResult(
400 BrowserThread::FILE, FROM_HERE,
401 base::Bind(&DownloadFileDetach, base::Passed(&download_file_)),
402 callback);
403 } else {
404 callback.Run(current_path_);
405 }
406 current_path_.clear();
407 Delete(DELETE_DUE_TO_USER_DISCARD);
408 }
409
391 void DownloadItemImpl::Remove() { 410 void DownloadItemImpl::Remove() {
392 VLOG(20) << __FUNCTION__ << "() download = " << DebugString(true); 411 VLOG(20) << __FUNCTION__ << "() download = " << DebugString(true);
393 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 412 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
394 413
395 delegate_->AssertStateConsistent(this); 414 delegate_->AssertStateConsistent(this);
396 Cancel(true); 415 Cancel(true);
397 delegate_->AssertStateConsistent(this); 416 delegate_->AssertStateConsistent(this);
398 417
399 NotifyRemoved(); 418 NotifyRemoved();
400 delegate_->DownloadRemoved(this); 419 delegate_->DownloadRemoved(this);
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after
1434 1453
1435 if (destroy_file) { 1454 if (destroy_file) {
1436 BrowserThread::PostTask( 1455 BrowserThread::PostTask(
1437 BrowserThread::FILE, FROM_HERE, 1456 BrowserThread::FILE, FROM_HERE,
1438 // Will be deleted at end of task execution. 1457 // Will be deleted at end of task execution.
1439 base::Bind(&DownloadFileCancel, base::Passed(&download_file_))); 1458 base::Bind(&DownloadFileCancel, base::Passed(&download_file_)));
1440 } else { 1459 } else {
1441 BrowserThread::PostTask( 1460 BrowserThread::PostTask(
1442 BrowserThread::FILE, FROM_HERE, 1461 BrowserThread::FILE, FROM_HERE,
1443 // Will be deleted at end of task execution. 1462 // Will be deleted at end of task execution.
1444 base::Bind(&DownloadFileDetach, base::Passed(&download_file_))); 1463 base::Bind(base::IgnoreResult(&DownloadFileDetach),
1464 base::Passed(&download_file_)));
1445 } 1465 }
1446 // Don't accept any more messages from the DownloadFile, and null 1466 // Don't accept any more messages from the DownloadFile, and null
1447 // out any previous "all data received". This also breaks links to 1467 // out any previous "all data received". This also breaks links to
1448 // other entities we've given out weak pointers to. 1468 // other entities we've given out weak pointers to.
1449 weak_ptr_factory_.InvalidateWeakPtrs(); 1469 weak_ptr_factory_.InvalidateWeakPtrs();
1450 1470
1451 // TODO(rdsmith/benjhayden): Remove condition as part of 1471 // TODO(rdsmith/benjhayden): Remove condition as part of
1452 // |SavePackage| integration. 1472 // |SavePackage| integration.
1453 // |download_file_| can be NULL if Interrupt() is called after the 1473 // |download_file_| can be NULL if Interrupt() is called after the
1454 // download file has been released. 1474 // download file has been released.
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1673 case RESUME_MODE_USER_CONTINUE: 1693 case RESUME_MODE_USER_CONTINUE:
1674 return "USER_CONTINUE"; 1694 return "USER_CONTINUE";
1675 case RESUME_MODE_USER_RESTART: 1695 case RESUME_MODE_USER_RESTART:
1676 return "USER_RESTART"; 1696 return "USER_RESTART";
1677 } 1697 }
1678 NOTREACHED() << "Unknown resume mode " << mode; 1698 NOTREACHED() << "Unknown resume mode " << mode;
1679 return "unknown"; 1699 return "unknown";
1680 } 1700 }
1681 1701
1682 } // namespace content 1702 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698