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 // 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 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
564 std::string DownloadItemImpl::GetOriginalMimeType() const { | 564 std::string DownloadItemImpl::GetOriginalMimeType() const { |
565 return original_mime_type_; | 565 return original_mime_type_; |
566 } | 566 } |
567 | 567 |
568 std::string DownloadItemImpl::GetRemoteAddress() const { | 568 std::string DownloadItemImpl::GetRemoteAddress() const { |
569 return remote_address_; | 569 return remote_address_; |
570 } | 570 } |
571 | 571 |
572 bool DownloadItemImpl::HasUserGesture() const { | 572 bool DownloadItemImpl::HasUserGesture() const { |
573 return has_user_gesture_; | 573 return has_user_gesture_; |
574 }; | 574 } |
575 | 575 |
576 ui::PageTransition DownloadItemImpl::GetTransitionType() const { | 576 ui::PageTransition DownloadItemImpl::GetTransitionType() const { |
577 return transition_type_; | 577 return transition_type_; |
578 }; | 578 } |
579 | 579 |
580 const std::string& DownloadItemImpl::GetLastModifiedTime() const { | 580 const std::string& DownloadItemImpl::GetLastModifiedTime() const { |
581 return last_modified_time_; | 581 return last_modified_time_; |
582 } | 582 } |
583 | 583 |
584 const std::string& DownloadItemImpl::GetETag() const { | 584 const std::string& DownloadItemImpl::GetETag() const { |
585 return etag_; | 585 return etag_; |
586 } | 586 } |
587 | 587 |
588 bool DownloadItemImpl::IsSavePackageDownload() const { | 588 bool DownloadItemImpl::IsSavePackageDownload() const { |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
849 // We also can't continue if we don't have some verifier to make sure | 849 // We also can't continue if we don't have some verifier to make sure |
850 // we're getting the same file. | 850 // we're getting the same file. |
851 bool restart_required = | 851 bool restart_required = |
852 (current_path_.empty() || (etag_.empty() && last_modified_time_.empty())); | 852 (current_path_.empty() || (etag_.empty() && last_modified_time_.empty())); |
853 | 853 |
854 // We won't auto-restart if we've used up our attempts or the | 854 // We won't auto-restart if we've used up our attempts or the |
855 // download has been paused by user action. | 855 // download has been paused by user action. |
856 bool user_action_required = | 856 bool user_action_required = |
857 (auto_resume_count_ >= kMaxAutoResumeAttempts || is_paused_); | 857 (auto_resume_count_ >= kMaxAutoResumeAttempts || is_paused_); |
858 | 858 |
859 switch(last_reason_) { | 859 switch (last_reason_) { |
860 case DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR: | 860 case DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR: |
861 case DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT: | 861 case DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT: |
862 break; | 862 break; |
863 | 863 |
864 case DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE: | 864 case DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE: |
865 // The server disagreed with the file offset that we sent. | 865 // The server disagreed with the file offset that we sent. |
866 | 866 |
867 case DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH: | 867 case DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH: |
868 // The file on disk was found to not match the expected hash. Discard and | 868 // The file on disk was found to not match the expected hash. Discard and |
869 // start from beginning. | 869 // start from beginning. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
910 case DOWNLOAD_INTERRUPT_REASON_NONE: | 910 case DOWNLOAD_INTERRUPT_REASON_NONE: |
911 case DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST: | 911 case DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST: |
912 case DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED: | 912 case DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED: |
913 case DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT: | 913 case DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT: |
914 case DOWNLOAD_INTERRUPT_REASON_USER_CANCELED: | 914 case DOWNLOAD_INTERRUPT_REASON_USER_CANCELED: |
915 case DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED: | 915 case DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED: |
916 case DOWNLOAD_INTERRUPT_REASON_FILE_SECURITY_CHECK_FAILED: | 916 case DOWNLOAD_INTERRUPT_REASON_FILE_SECURITY_CHECK_FAILED: |
917 case DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED: | 917 case DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED: |
918 case DOWNLOAD_INTERRUPT_REASON_SERVER_CERT_PROBLEM: | 918 case DOWNLOAD_INTERRUPT_REASON_SERVER_CERT_PROBLEM: |
919 case DOWNLOAD_INTERRUPT_REASON_SERVER_FORBIDDEN: | 919 case DOWNLOAD_INTERRUPT_REASON_SERVER_FORBIDDEN: |
920 // Unhandled. | |
921 return RESUME_MODE_INVALID; | 920 return RESUME_MODE_INVALID; |
922 } | 921 } |
923 | 922 |
924 if (user_action_required && restart_required) | 923 if (user_action_required && restart_required) |
925 return RESUME_MODE_USER_RESTART; | 924 return RESUME_MODE_USER_RESTART; |
926 | 925 |
927 if (restart_required) | 926 if (restart_required) |
928 return RESUME_MODE_IMMEDIATE_RESTART; | 927 return RESUME_MODE_IMMEDIATE_RESTART; |
929 | 928 |
930 if (user_action_required) | 929 if (user_action_required) |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1247 delegate_->DetermineDownloadTarget( | 1246 delegate_->DetermineDownloadTarget( |
1248 this, base::Bind(&DownloadItemImpl::OnDownloadTargetDetermined, | 1247 this, base::Bind(&DownloadItemImpl::OnDownloadTargetDetermined, |
1249 weak_ptr_factory_.GetWeakPtr())); | 1248 weak_ptr_factory_.GetWeakPtr())); |
1250 } | 1249 } |
1251 | 1250 |
1252 // Called by delegate_ when the download target path has been determined. | 1251 // Called by delegate_ when the download target path has been determined. |
1253 void DownloadItemImpl::OnDownloadTargetDetermined( | 1252 void DownloadItemImpl::OnDownloadTargetDetermined( |
1254 const base::FilePath& target_path, | 1253 const base::FilePath& target_path, |
1255 TargetDisposition disposition, | 1254 TargetDisposition disposition, |
1256 DownloadDangerType danger_type, | 1255 DownloadDangerType danger_type, |
1257 const base::FilePath& intermediate_path) { | 1256 const base::FilePath& intermediate_path, |
1257 DownloadInterruptReason interrupt_reason) { | |
1258 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1258 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1259 DCHECK(state_ == TARGET_PENDING_INTERNAL || | 1259 DCHECK(state_ == TARGET_PENDING_INTERNAL || |
1260 state_ == INTERRUPTED_TARGET_PENDING_INTERNAL); | 1260 state_ == INTERRUPTED_TARGET_PENDING_INTERNAL); |
1261 | 1261 |
1262 // If the |target_path| is empty, then we consider this download to be | 1262 if (interrupt_reason == DOWNLOAD_INTERRUPT_REASON_USER_CANCELED || |
1263 // canceled. | 1263 target_path.empty()) { |
1264 if (target_path.empty()) { | |
1265 Cancel(true); | 1264 Cancel(true); |
1266 return; | 1265 return; |
1267 } | 1266 } |
1268 | 1267 |
1268 if (interrupt_reason != DOWNLOAD_INTERRUPT_REASON_NONE) { | |
1269 InterruptAndDiscardPartialState(interrupt_reason); | |
1270 UpdateObservers(); | |
1271 return; | |
1272 } | |
1273 | |
1269 DVLOG(20) << __func__ << "() target_path:" << target_path.value() | 1274 DVLOG(20) << __func__ << "() target_path:" << target_path.value() |
svaldez
2016/10/28 17:29:36
Should be moved up since otherwise this will never
asanka
2016/11/07 19:50:15
Done.
| |
1270 << " disposition:" << disposition << " danger_type:" << danger_type | 1275 << " disposition:" << disposition << " danger_type:" << danger_type |
1276 << " interrupt_reason:" | |
1277 << DownloadInterruptReasonToString(interrupt_reason) | |
1271 << " this:" << DebugString(true); | 1278 << " this:" << DebugString(true); |
1272 | |
1273 target_path_ = target_path; | 1279 target_path_ = target_path; |
1274 target_disposition_ = disposition; | 1280 target_disposition_ = disposition; |
1275 SetDangerType(danger_type); | 1281 SetDangerType(danger_type); |
1276 | 1282 |
1277 // This was an interrupted download that was looking for a filename. Now that | 1283 // This was an interrupted download that was looking for a filename. Now that |
1278 // it has one, transition to interrupted. | 1284 // it has one, transition to interrupted. |
1279 if (state_ == INTERRUPTED_TARGET_PENDING_INTERNAL) { | 1285 if (state_ == INTERRUPTED_TARGET_PENDING_INTERNAL) { |
1280 InterruptWithPartialState( | 1286 InterruptWithPartialState( |
1281 received_bytes_, std::move(hash_state_), destination_error_); | 1287 received_bytes_, std::move(hash_state_), destination_error_); |
1282 destination_error_ = DOWNLOAD_INTERRUPT_REASON_NONE; | 1288 destination_error_ = DOWNLOAD_INTERRUPT_REASON_NONE; |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1553 | 1559 |
1554 case INTERRUPTED_TARGET_PENDING_INTERNAL: | 1560 case INTERRUPTED_TARGET_PENDING_INTERNAL: |
1555 case IN_PROGRESS_INTERNAL: | 1561 case IN_PROGRESS_INTERNAL: |
1556 case TARGET_PENDING_INTERNAL: | 1562 case TARGET_PENDING_INTERNAL: |
1557 case TARGET_RESOLVED_INTERNAL: | 1563 case TARGET_RESOLVED_INTERNAL: |
1558 // last_reason_ needs to be set for GetResumeMode() to work. | 1564 // last_reason_ needs to be set for GetResumeMode() to work. |
1559 last_reason_ = reason; | 1565 last_reason_ = reason; |
1560 | 1566 |
1561 if (download_file_) { | 1567 if (download_file_) { |
1562 ResumeMode resume_mode = GetResumeMode(); | 1568 ResumeMode resume_mode = GetResumeMode(); |
1563 ReleaseDownloadFile(resume_mode != RESUME_MODE_IMMEDIATE_CONTINUE && | 1569 bool destroy_file = bytes_so_far == 0 || |
1564 resume_mode != RESUME_MODE_USER_CONTINUE); | 1570 (resume_mode != RESUME_MODE_IMMEDIATE_CONTINUE && |
1571 resume_mode != RESUME_MODE_USER_CONTINUE); | |
1572 ReleaseDownloadFile(destroy_file); | |
1565 } | 1573 } |
1566 break; | 1574 break; |
1567 | 1575 |
1568 case RESUMING_INTERNAL: | 1576 case RESUMING_INTERNAL: |
1569 case INTERRUPTED_INTERNAL: | 1577 case INTERRUPTED_INTERNAL: |
1570 DCHECK(!download_file_); | 1578 DCHECK(!download_file_); |
1571 // The first non-cancel interrupt reason wins in cases where multiple | 1579 // The first non-cancel interrupt reason wins in cases where multiple |
1572 // things go wrong. | 1580 // things go wrong. |
1573 if (reason != DOWNLOAD_INTERRUPT_REASON_USER_CANCELED && | 1581 if (reason != DOWNLOAD_INTERRUPT_REASON_USER_CANCELED && |
1574 reason != DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN) | 1582 reason != DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN) |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1615 reason == DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN) { | 1623 reason == DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN) { |
1616 if (IsDangerous()) { | 1624 if (IsDangerous()) { |
1617 RecordDangerousDownloadDiscard( | 1625 RecordDangerousDownloadDiscard( |
1618 reason == DOWNLOAD_INTERRUPT_REASON_USER_CANCELED | 1626 reason == DOWNLOAD_INTERRUPT_REASON_USER_CANCELED |
1619 ? DOWNLOAD_DISCARD_DUE_TO_USER_ACTION | 1627 ? DOWNLOAD_DISCARD_DUE_TO_USER_ACTION |
1620 : DOWNLOAD_DISCARD_DUE_TO_SHUTDOWN, | 1628 : DOWNLOAD_DISCARD_DUE_TO_SHUTDOWN, |
1621 GetDangerType(), GetTargetFilePath()); | 1629 GetDangerType(), GetTargetFilePath()); |
1622 } | 1630 } |
1623 | 1631 |
1624 RecordDownloadCount(CANCELLED_COUNT); | 1632 RecordDownloadCount(CANCELLED_COUNT); |
1633 DCHECK_EQ(last_reason_, reason); | |
1625 TransitionTo(CANCELLED_INTERNAL); | 1634 TransitionTo(CANCELLED_INTERNAL); |
1626 return; | 1635 return; |
1627 } | 1636 } |
1628 | 1637 |
1629 RecordDownloadInterrupted(reason, received_bytes_, total_bytes_); | 1638 RecordDownloadInterrupted(reason, received_bytes_, total_bytes_); |
1630 if (!GetWebContents()) | 1639 if (!GetWebContents()) |
1631 RecordDownloadCount(INTERRUPTED_WITHOUT_WEBCONTENTS); | 1640 RecordDownloadCount(INTERRUPTED_WITHOUT_WEBCONTENTS); |
1632 | 1641 |
1642 // TODO(asanka): This is not good. We can transition to interrupted from | |
1643 // target-pending, which is something we don't want to do. Perhaps we should | |
1644 // explicitly transition to target-resolved prior to switching to interrupted. | |
1645 DCHECK_EQ(last_reason_, reason); | |
1633 TransitionTo(INTERRUPTED_INTERNAL); | 1646 TransitionTo(INTERRUPTED_INTERNAL); |
1634 AutoResumeIfValid(); | 1647 AutoResumeIfValid(); |
1635 } | 1648 } |
1636 | 1649 |
1637 void DownloadItemImpl::UpdateProgress(int64_t bytes_so_far, | 1650 void DownloadItemImpl::UpdateProgress(int64_t bytes_so_far, |
1638 int64_t bytes_per_sec) { | 1651 int64_t bytes_per_sec) { |
1639 received_bytes_ = bytes_so_far; | 1652 received_bytes_ = bytes_so_far; |
1640 bytes_per_sec_ = bytes_per_sec; | 1653 bytes_per_sec_ = bytes_per_sec; |
1641 | 1654 |
1642 // If we've received more data than we were expecting (bad server info?), | 1655 // If we've received more data than we were expecting (bad server info?), |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2070 case COMPLETE_INTERNAL: | 2083 case COMPLETE_INTERNAL: |
2071 return "COMPLETE"; | 2084 return "COMPLETE"; |
2072 case CANCELLED_INTERNAL: | 2085 case CANCELLED_INTERNAL: |
2073 return "CANCELLED"; | 2086 return "CANCELLED"; |
2074 case INTERRUPTED_INTERNAL: | 2087 case INTERRUPTED_INTERNAL: |
2075 return "INTERRUPTED"; | 2088 return "INTERRUPTED"; |
2076 case RESUMING_INTERNAL: | 2089 case RESUMING_INTERNAL: |
2077 return "RESUMING"; | 2090 return "RESUMING"; |
2078 case MAX_DOWNLOAD_INTERNAL_STATE: | 2091 case MAX_DOWNLOAD_INTERNAL_STATE: |
2079 break; | 2092 break; |
2080 }; | 2093 } |
2081 NOTREACHED() << "Unknown download state " << state; | 2094 NOTREACHED() << "Unknown download state " << state; |
2082 return "unknown"; | 2095 return "unknown"; |
2083 } | 2096 } |
2084 | 2097 |
2085 const char* DownloadItemImpl::DebugResumeModeString(ResumeMode mode) { | 2098 const char* DownloadItemImpl::DebugResumeModeString(ResumeMode mode) { |
2086 switch (mode) { | 2099 switch (mode) { |
2087 case RESUME_MODE_INVALID: | 2100 case RESUME_MODE_INVALID: |
2088 return "INVALID"; | 2101 return "INVALID"; |
2089 case RESUME_MODE_IMMEDIATE_CONTINUE: | 2102 case RESUME_MODE_IMMEDIATE_CONTINUE: |
2090 return "IMMEDIATE_CONTINUE"; | 2103 return "IMMEDIATE_CONTINUE"; |
2091 case RESUME_MODE_IMMEDIATE_RESTART: | 2104 case RESUME_MODE_IMMEDIATE_RESTART: |
2092 return "IMMEDIATE_RESTART"; | 2105 return "IMMEDIATE_RESTART"; |
2093 case RESUME_MODE_USER_CONTINUE: | 2106 case RESUME_MODE_USER_CONTINUE: |
2094 return "USER_CONTINUE"; | 2107 return "USER_CONTINUE"; |
2095 case RESUME_MODE_USER_RESTART: | 2108 case RESUME_MODE_USER_RESTART: |
2096 return "USER_RESTART"; | 2109 return "USER_RESTART"; |
2097 } | 2110 } |
2098 NOTREACHED() << "Unknown resume mode " << mode; | 2111 NOTREACHED() << "Unknown resume mode " << mode; |
2099 return "unknown"; | 2112 return "unknown"; |
2100 } | 2113 } |
2101 | 2114 |
2102 } // namespace content | 2115 } // namespace content |
OLD | NEW |