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 // interfaces Start, MaybeCompleteDownload, and OnDownloadCompleting | 7 // interfaces Start, MaybeCompleteDownload, and OnDownloadCompleting |
8 // are placed in chronological order with the other (private) routines | 8 // are placed in chronological order with the other (private) routines |
9 // that together define a DownloadItem's state transitions | 9 // that together define a DownloadItem's state transitions |
10 // as the download progresses. See "Download progression cascade" later in | 10 // as the download progresses. See "Download progression cascade" later in |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "base/utf_string_conversions.h" | 37 #include "base/utf_string_conversions.h" |
38 #include "content/browser/download/download_create_info.h" | 38 #include "content/browser/download/download_create_info.h" |
39 #include "content/browser/download/download_file.h" | 39 #include "content/browser/download/download_file.h" |
40 #include "content/browser/download/download_interrupt_reasons_impl.h" | 40 #include "content/browser/download/download_interrupt_reasons_impl.h" |
41 #include "content/browser/download/download_item_impl_delegate.h" | 41 #include "content/browser/download/download_item_impl_delegate.h" |
42 #include "content/browser/download/download_request_handle.h" | 42 #include "content/browser/download/download_request_handle.h" |
43 #include "content/browser/download/download_stats.h" | 43 #include "content/browser/download/download_stats.h" |
44 #include "content/browser/web_contents/web_contents_impl.h" | 44 #include "content/browser/web_contents/web_contents_impl.h" |
45 #include "content/public/browser/browser_thread.h" | 45 #include "content/public/browser/browser_thread.h" |
46 #include "content/public/browser/content_browser_client.h" | 46 #include "content/public/browser/content_browser_client.h" |
47 #include "content/public/browser/download_persistent_store_info.h" | |
48 #include "net/base/net_util.h" | 47 #include "net/base/net_util.h" |
49 | 48 |
50 namespace content { | 49 namespace content { |
51 namespace { | 50 namespace { |
52 | 51 |
53 static void DeleteDownloadedFile(const FilePath& path) { | 52 static void DeleteDownloadedFile(const FilePath& path) { |
54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 53 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
55 | 54 |
56 // Make sure we only delete files. | 55 // Make sure we only delete files. |
57 if (!file_util::DirectoryExists(path)) | 56 if (!file_util::DirectoryExists(path)) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 download_file->Detach(); | 103 download_file->Detach(); |
105 } | 104 } |
106 | 105 |
107 static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) { | 106 static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) { |
108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
109 download_file->Cancel(); | 108 download_file->Cancel(); |
110 } | 109 } |
111 | 110 |
112 } // namespace | 111 } // namespace |
113 | 112 |
114 // Our download table ID starts at 1, so we use 0 to represent a download that | |
115 // has started, but has not yet had its data persisted in the table. We use fake | |
116 // database handles in incognito mode starting at -1 and progressively getting | |
117 // more negative. | |
118 // static | |
119 const int DownloadItem::kUninitializedHandle = 0; | |
120 | |
121 const char DownloadItem::kEmptyFileHash[] = ""; | 113 const char DownloadItem::kEmptyFileHash[] = ""; |
122 | 114 |
123 // Our download table ID starts at 1, so we use 0 to represent a download that | |
124 // has started, but has not yet had its data persisted in the table. We use fake | |
125 // database handles in incognito mode starting at -1 and progressively getting | |
126 // more negative. | |
127 | |
128 // Constructor for reading from the history service. | 115 // Constructor for reading from the history service. |
129 DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate, | 116 DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate, |
130 DownloadId download_id, | 117 DownloadId download_id, |
131 const DownloadPersistentStoreInfo& info, | 118 const FilePath& path, |
| 119 const GURL& url, |
| 120 const GURL& referrer_url, |
| 121 const base::Time& start_time, |
| 122 const base::Time& end_time, |
| 123 int64 received_bytes, |
| 124 int64 total_bytes, |
| 125 DownloadItem::DownloadState state, |
| 126 bool opened, |
132 const net::BoundNetLog& bound_net_log) | 127 const net::BoundNetLog& bound_net_log) |
133 : is_save_package_download_(false), | 128 : is_save_package_download_(false), |
134 download_id_(download_id), | 129 download_id_(download_id), |
135 current_path_(info.path), | 130 current_path_(path), |
136 target_path_(info.path), | 131 target_path_(path), |
137 target_disposition_(TARGET_DISPOSITION_OVERWRITE), | 132 target_disposition_(TARGET_DISPOSITION_OVERWRITE), |
138 url_chain_(1, info.url), | 133 url_chain_(1, url), |
139 referrer_url_(info.referrer_url), | 134 referrer_url_(referrer_url), |
140 transition_type_(PAGE_TRANSITION_LINK), | 135 transition_type_(PAGE_TRANSITION_LINK), |
141 has_user_gesture_(false), | 136 has_user_gesture_(false), |
142 total_bytes_(info.total_bytes), | 137 total_bytes_(total_bytes), |
143 received_bytes_(info.received_bytes), | 138 received_bytes_(received_bytes), |
144 bytes_per_sec_(0), | 139 bytes_per_sec_(0), |
145 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), | 140 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), |
146 start_tick_(base::TimeTicks()), | 141 start_tick_(base::TimeTicks()), |
147 state_(ExternalToInternalState(info.state)), | 142 state_(ExternalToInternalState(state)), |
148 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), | 143 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), |
149 start_time_(info.start_time), | 144 start_time_(start_time), |
150 end_time_(info.end_time), | 145 end_time_(end_time), |
151 db_handle_(info.db_handle), | |
152 delegate_(delegate), | 146 delegate_(delegate), |
153 is_paused_(false), | 147 is_paused_(false), |
154 open_when_complete_(false), | 148 open_when_complete_(false), |
155 file_externally_removed_(false), | 149 file_externally_removed_(false), |
156 safety_state_(SAFE), | 150 safety_state_(SAFE), |
157 auto_opened_(false), | 151 auto_opened_(false), |
158 is_persisted_(true), | |
159 is_temporary_(false), | 152 is_temporary_(false), |
160 all_data_saved_(false), | 153 all_data_saved_(false), |
161 opened_(info.opened), | 154 opened_(opened), |
162 open_enabled_(true), | 155 open_enabled_(true), |
163 delegate_delayed_complete_(false), | 156 delegate_delayed_complete_(false), |
164 bound_net_log_(bound_net_log), | 157 bound_net_log_(bound_net_log), |
165 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 158 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
166 delegate_->Attach(); | 159 delegate_->Attach(); |
167 if (state_ == IN_PROGRESS_INTERNAL) | 160 if (state_ == IN_PROGRESS_INTERNAL) |
168 state_ = CANCELLED_INTERNAL; | 161 state_ = CANCELLED_INTERNAL; |
169 if (state_ == COMPLETE_INTERNAL) | 162 if (state_ == COMPLETE_INTERNAL) |
170 all_data_saved_ = true; | 163 all_data_saved_ = true; |
171 Init(false /* not actively downloading */, SRC_HISTORY_IMPORT); | 164 Init(false /* not actively downloading */, SRC_HISTORY_IMPORT); |
(...skipping 22 matching lines...) Expand all Loading... |
194 original_mime_type_(info.original_mime_type), | 187 original_mime_type_(info.original_mime_type), |
195 remote_address_(info.remote_address), | 188 remote_address_(info.remote_address), |
196 total_bytes_(info.total_bytes), | 189 total_bytes_(info.total_bytes), |
197 received_bytes_(0), | 190 received_bytes_(0), |
198 bytes_per_sec_(0), | 191 bytes_per_sec_(0), |
199 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), | 192 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), |
200 start_tick_(base::TimeTicks::Now()), | 193 start_tick_(base::TimeTicks::Now()), |
201 state_(IN_PROGRESS_INTERNAL), | 194 state_(IN_PROGRESS_INTERNAL), |
202 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), | 195 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), |
203 start_time_(info.start_time), | 196 start_time_(info.start_time), |
204 db_handle_(DownloadItem::kUninitializedHandle), | |
205 delegate_(delegate), | 197 delegate_(delegate), |
206 is_paused_(false), | 198 is_paused_(false), |
207 open_when_complete_(false), | 199 open_when_complete_(false), |
208 file_externally_removed_(false), | 200 file_externally_removed_(false), |
209 safety_state_(SAFE), | 201 safety_state_(SAFE), |
210 auto_opened_(false), | 202 auto_opened_(false), |
211 is_persisted_(false), | |
212 is_temporary_(!info.save_info->file_path.empty()), | 203 is_temporary_(!info.save_info->file_path.empty()), |
213 all_data_saved_(false), | 204 all_data_saved_(false), |
214 opened_(false), | 205 opened_(false), |
215 open_enabled_(true), | 206 open_enabled_(true), |
216 delegate_delayed_complete_(false), | 207 delegate_delayed_complete_(false), |
217 bound_net_log_(bound_net_log), | 208 bound_net_log_(bound_net_log), |
218 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 209 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
219 delegate_->Attach(); | 210 delegate_->Attach(); |
220 Init(true /* actively downloading */, SRC_NEW_DOWNLOAD); | 211 Init(true /* actively downloading */, SRC_NEW_DOWNLOAD); |
221 | 212 |
(...skipping 27 matching lines...) Expand all Loading... |
249 mime_type_(mime_type), | 240 mime_type_(mime_type), |
250 original_mime_type_(mime_type), | 241 original_mime_type_(mime_type), |
251 total_bytes_(0), | 242 total_bytes_(0), |
252 received_bytes_(0), | 243 received_bytes_(0), |
253 bytes_per_sec_(0), | 244 bytes_per_sec_(0), |
254 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), | 245 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), |
255 start_tick_(base::TimeTicks::Now()), | 246 start_tick_(base::TimeTicks::Now()), |
256 state_(IN_PROGRESS_INTERNAL), | 247 state_(IN_PROGRESS_INTERNAL), |
257 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), | 248 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), |
258 start_time_(base::Time::Now()), | 249 start_time_(base::Time::Now()), |
259 db_handle_(DownloadItem::kUninitializedHandle), | |
260 delegate_(delegate), | 250 delegate_(delegate), |
261 is_paused_(false), | 251 is_paused_(false), |
262 open_when_complete_(false), | 252 open_when_complete_(false), |
263 file_externally_removed_(false), | 253 file_externally_removed_(false), |
264 safety_state_(SAFE), | 254 safety_state_(SAFE), |
265 auto_opened_(false), | 255 auto_opened_(false), |
266 is_persisted_(false), | |
267 is_temporary_(false), | 256 is_temporary_(false), |
268 all_data_saved_(false), | 257 all_data_saved_(false), |
269 opened_(false), | 258 opened_(false), |
270 open_enabled_(true), | 259 open_enabled_(true), |
271 delegate_delayed_complete_(false), | 260 delegate_delayed_complete_(false), |
272 bound_net_log_(bound_net_log), | 261 bound_net_log_(bound_net_log), |
273 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 262 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
274 delegate_->Attach(); | 263 delegate_->Attach(); |
275 Init(true /* actively downloading */, SRC_SAVE_PAGE_AS); | 264 Init(true /* actively downloading */, SRC_SAVE_PAGE_AS); |
276 } | 265 } |
(...skipping 26 matching lines...) Expand all Loading... |
303 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 292 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
304 | 293 |
305 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); | 294 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); |
306 } | 295 } |
307 | 296 |
308 void DownloadItemImpl::DangerousDownloadValidated() { | 297 void DownloadItemImpl::DangerousDownloadValidated() { |
309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 298 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
310 DCHECK_EQ(IN_PROGRESS, GetState()); | 299 DCHECK_EQ(IN_PROGRESS, GetState()); |
311 DCHECK_EQ(DANGEROUS, GetSafetyState()); | 300 DCHECK_EQ(DANGEROUS, GetSafetyState()); |
312 | 301 |
| 302 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
| 303 |
313 if (GetState() != IN_PROGRESS) | 304 if (GetState() != IN_PROGRESS) |
314 return; | 305 return; |
315 | 306 |
316 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", | 307 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", |
317 GetDangerType(), | 308 GetDangerType(), |
318 DOWNLOAD_DANGER_TYPE_MAX); | 309 DOWNLOAD_DANGER_TYPE_MAX); |
319 | 310 |
320 safety_state_ = DANGEROUS_BUT_VALIDATED; | 311 safety_state_ = DANGEROUS_BUT_VALIDATED; |
321 | 312 |
322 bound_net_log_.AddEvent( | 313 bound_net_log_.AddEvent( |
323 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, | 314 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, |
324 base::Bind(&ItemCheckedNetLogCallback, | 315 base::Bind(&ItemCheckedNetLogCallback, |
325 GetDangerType(), GetSafetyState())); | 316 GetDangerType(), GetSafetyState())); |
326 | 317 |
327 UpdateObservers(); | 318 UpdateObservers(); |
328 | 319 |
329 MaybeCompleteDownload(); | 320 MaybeCompleteDownload(); |
330 } | 321 } |
331 | 322 |
332 void DownloadItemImpl::TogglePause() { | 323 void DownloadItemImpl::TogglePause() { |
333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
334 | |
335 DCHECK(state_ == IN_PROGRESS_INTERNAL || state_ == COMPLETING_INTERNAL); | 325 DCHECK(state_ == IN_PROGRESS_INTERNAL || state_ == COMPLETING_INTERNAL); |
| 326 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
336 | 327 |
337 // Ignore pauses when we've passed the commit point. | 328 // Ignore pauses when we've passed the commit point. |
338 if (state_ == COMPLETING_INTERNAL) | 329 if (state_ == COMPLETING_INTERNAL) |
339 return; | 330 return; |
340 | 331 |
341 if (is_paused_) | 332 if (is_paused_) |
342 request_handle_->ResumeRequest(); | 333 request_handle_->ResumeRequest(); |
343 else | 334 else |
344 request_handle_->PauseRequest(); | 335 request_handle_->PauseRequest(); |
345 is_paused_ = !is_paused_; | 336 is_paused_ = !is_paused_; |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 } | 442 } |
452 | 443 |
453 int32 DownloadItemImpl::GetId() const { | 444 int32 DownloadItemImpl::GetId() const { |
454 return download_id_.local(); | 445 return download_id_.local(); |
455 } | 446 } |
456 | 447 |
457 DownloadId DownloadItemImpl::GetGlobalId() const { | 448 DownloadId DownloadItemImpl::GetGlobalId() const { |
458 return download_id_; | 449 return download_id_; |
459 } | 450 } |
460 | 451 |
461 int64 DownloadItemImpl::GetDbHandle() const { | |
462 return db_handle_; | |
463 } | |
464 | |
465 DownloadItem::DownloadState DownloadItemImpl::GetState() const { | 452 DownloadItem::DownloadState DownloadItemImpl::GetState() const { |
466 return InternalToExternalState(state_); | 453 return InternalToExternalState(state_); |
467 } | 454 } |
468 | 455 |
469 DownloadInterruptReason DownloadItemImpl::GetLastReason() const { | 456 DownloadInterruptReason DownloadItemImpl::GetLastReason() const { |
470 return last_reason_; | 457 return last_reason_; |
471 } | 458 } |
472 | 459 |
473 bool DownloadItemImpl::IsPaused() const { | 460 bool DownloadItemImpl::IsPaused() const { |
474 return is_paused_; | 461 return is_paused_; |
475 } | 462 } |
476 | 463 |
477 bool DownloadItemImpl::IsTemporary() const { | 464 bool DownloadItemImpl::IsTemporary() const { |
478 return is_temporary_; | 465 return is_temporary_; |
479 } | 466 } |
480 | 467 |
481 bool DownloadItemImpl::IsPersisted() const { | |
482 return is_persisted_; | |
483 } | |
484 | |
485 // TODO(ahendrickson) -- Move |INTERRUPTED| from |IsCancelled()| to | 468 // TODO(ahendrickson) -- Move |INTERRUPTED| from |IsCancelled()| to |
486 // |IsPartialDownload()|, when resuming interrupted downloads is implemented. | 469 // |IsPartialDownload()|, when resuming interrupted downloads is implemented. |
487 bool DownloadItemImpl::IsPartialDownload() const { | 470 bool DownloadItemImpl::IsPartialDownload() const { |
488 return InternalToExternalState(state_) == IN_PROGRESS; | 471 return InternalToExternalState(state_) == IN_PROGRESS; |
489 } | 472 } |
490 | 473 |
491 bool DownloadItemImpl::IsInProgress() const { | 474 bool DownloadItemImpl::IsInProgress() const { |
492 return InternalToExternalState(state_) == IN_PROGRESS; | 475 return InternalToExternalState(state_) == IN_PROGRESS; |
493 } | 476 } |
494 | 477 |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 } | 674 } |
692 | 675 |
693 bool DownloadItemImpl::GetAutoOpened() { | 676 bool DownloadItemImpl::GetAutoOpened() { |
694 return auto_opened_; | 677 return auto_opened_; |
695 } | 678 } |
696 | 679 |
697 bool DownloadItemImpl::GetOpened() const { | 680 bool DownloadItemImpl::GetOpened() const { |
698 return opened_; | 681 return opened_; |
699 } | 682 } |
700 | 683 |
701 DownloadPersistentStoreInfo DownloadItemImpl::GetPersistentStoreInfo() const { | |
702 // TODO(asanka): Persist GetTargetFilePath() as well. | |
703 return DownloadPersistentStoreInfo(GetFullPath(), | |
704 GetURL(), | |
705 GetReferrerUrl(), | |
706 GetStartTime(), | |
707 GetEndTime(), | |
708 GetReceivedBytes(), | |
709 GetTotalBytes(), | |
710 GetState(), | |
711 GetDbHandle(), | |
712 GetOpened()); | |
713 } | |
714 | |
715 BrowserContext* DownloadItemImpl::GetBrowserContext() const { | 684 BrowserContext* DownloadItemImpl::GetBrowserContext() const { |
716 return delegate_->GetBrowserContext(); | 685 return delegate_->GetBrowserContext(); |
717 } | 686 } |
718 | 687 |
719 WebContents* DownloadItemImpl::GetWebContents() const { | 688 WebContents* DownloadItemImpl::GetWebContents() const { |
720 // TODO(rdsmith): Remove null check after removing GetWebContents() from | 689 // TODO(rdsmith): Remove null check after removing GetWebContents() from |
721 // paths that might be used by DownloadItems created from history import. | 690 // paths that might be used by DownloadItems created from history import. |
722 // Currently such items have null request_handle_s, where other items | 691 // Currently such items have null request_handle_s, where other items |
723 // (regular and SavePackage downloads) have actual objects off the pointer. | 692 // (regular and SavePackage downloads) have actual objects off the pointer. |
724 if (request_handle_.get()) | 693 if (request_handle_.get()) |
725 return request_handle_->GetWebContents(); | 694 return request_handle_->GetWebContents(); |
726 return NULL; | 695 return NULL; |
727 } | 696 } |
728 | 697 |
729 void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) { | 698 void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) { |
730 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 699 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
731 DCHECK(AllDataSaved()); | 700 DCHECK(AllDataSaved()); |
| 701 VLOG(20) << __FUNCTION__ << " danger_type=" << danger_type |
| 702 << " download=" << DebugString(true); |
732 SetDangerType(danger_type); | 703 SetDangerType(danger_type); |
733 UpdateObservers(); | 704 UpdateObservers(); |
734 } | 705 } |
735 | 706 |
736 void DownloadItemImpl::SetOpenWhenComplete(bool open) { | 707 void DownloadItemImpl::SetOpenWhenComplete(bool open) { |
737 open_when_complete_ = open; | 708 open_when_complete_ = open; |
738 } | 709 } |
739 | 710 |
740 void DownloadItemImpl::SetIsTemporary(bool temporary) { | 711 void DownloadItemImpl::SetIsTemporary(bool temporary) { |
741 is_temporary_ = temporary; | 712 is_temporary_ = temporary; |
(...skipping 23 matching lines...) Expand all Loading... |
765 ++iter; | 736 ++iter; |
766 for ( ; verbose && (iter != last); ++iter) { | 737 for ( ; verbose && (iter != last); ++iter) { |
767 url_list += " ->\n\t"; | 738 url_list += " ->\n\t"; |
768 const GURL& next_url = *iter; | 739 const GURL& next_url = *iter; |
769 url_list += next_url.spec(); | 740 url_list += next_url.spec(); |
770 } | 741 } |
771 } | 742 } |
772 | 743 |
773 if (verbose) { | 744 if (verbose) { |
774 description += base::StringPrintf( | 745 description += base::StringPrintf( |
775 " db_handle = %" PRId64 | |
776 " total = %" PRId64 | 746 " total = %" PRId64 |
777 " received = %" PRId64 | 747 " received = %" PRId64 |
778 " reason = %s" | 748 " reason = %s" |
779 " paused = %c" | 749 " paused = %c" |
780 " safety = %s" | 750 " safety = %s" |
781 " last_modified = '%s'" | 751 " last_modified = '%s'" |
782 " etag = '%s'" | 752 " etag = '%s'" |
783 " url_chain = \n\t\"%s\"\n\t" | 753 " url_chain = \n\t\"%s\"\n\t" |
784 " full_path = \"%" PRFilePath "\"" | 754 " full_path = \"%" PRFilePath "\"" |
785 " target_path = \"%" PRFilePath "\"" | 755 " target_path = \"%" PRFilePath "\"" |
786 " has download file = %s", | 756 " has download file = %s", |
787 GetDbHandle(), | |
788 GetTotalBytes(), | 757 GetTotalBytes(), |
789 GetReceivedBytes(), | 758 GetReceivedBytes(), |
790 InterruptReasonDebugString(last_reason_).c_str(), | 759 InterruptReasonDebugString(last_reason_).c_str(), |
791 IsPaused() ? 'T' : 'F', | 760 IsPaused() ? 'T' : 'F', |
792 DebugSafetyStateString(GetSafetyState()), | 761 DebugSafetyStateString(GetSafetyState()), |
793 GetLastModifiedTime().c_str(), | 762 GetLastModifiedTime().c_str(), |
794 GetETag().c_str(), | 763 GetETag().c_str(), |
795 url_list.c_str(), | 764 url_list.c_str(), |
796 GetFullPath().value().c_str(), | 765 GetFullPath().value().c_str(), |
797 GetTargetFilePath().value().c_str(), | 766 GetTargetFilePath().value().c_str(), |
(...skipping 10 matching lines...) Expand all Loading... |
808 void DownloadItemImpl::MockDownloadOpenForTesting() { | 777 void DownloadItemImpl::MockDownloadOpenForTesting() { |
809 open_enabled_ = false; | 778 open_enabled_ = false; |
810 } | 779 } |
811 | 780 |
812 void DownloadItemImpl::NotifyRemoved() { | 781 void DownloadItemImpl::NotifyRemoved() { |
813 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadRemoved(this)); | 782 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadRemoved(this)); |
814 } | 783 } |
815 | 784 |
816 void DownloadItemImpl::OnDownloadedFileRemoved() { | 785 void DownloadItemImpl::OnDownloadedFileRemoved() { |
817 file_externally_removed_ = true; | 786 file_externally_removed_ = true; |
| 787 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
818 UpdateObservers(); | 788 UpdateObservers(); |
819 } | 789 } |
820 | 790 |
821 base::WeakPtr<DownloadDestinationObserver> | 791 base::WeakPtr<DownloadDestinationObserver> |
822 DownloadItemImpl::DestinationObserverAsWeakPtr() { | 792 DownloadItemImpl::DestinationObserverAsWeakPtr() { |
823 return weak_ptr_factory_.GetWeakPtr(); | 793 return weak_ptr_factory_.GetWeakPtr(); |
824 } | 794 } |
825 | 795 |
826 void DownloadItemImpl::SetTotalBytes(int64 total_bytes) { | 796 void DownloadItemImpl::SetTotalBytes(int64 total_bytes) { |
827 total_bytes_ = total_bytes; | 797 total_bytes_ = total_bytes; |
828 } | 798 } |
829 | 799 |
830 // Updates from the download thread may have been posted while this download | 800 // Updates from the download thread may have been posted while this download |
831 // was being cancelled in the UI thread, so we'll accept them unless we're | 801 // was being cancelled in the UI thread, so we'll accept them unless we're |
832 // complete. | 802 // complete. |
833 void DownloadItemImpl::UpdateProgress(int64 bytes_so_far, | 803 void DownloadItemImpl::UpdateProgress(int64 bytes_so_far, |
834 int64 bytes_per_sec, | 804 int64 bytes_per_sec, |
835 const std::string& hash_state) { | 805 const std::string& hash_state) { |
836 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 806 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 807 VLOG(20) << __FUNCTION__ << " so_far=" << bytes_so_far |
| 808 << " per_sec=" << bytes_per_sec << " download=" << DebugString(true); |
837 | 809 |
838 if (state_ != IN_PROGRESS_INTERNAL) { | 810 if (state_ != IN_PROGRESS_INTERNAL) { |
839 // Ignore if we're no longer in-progress. This can happen if we race a | 811 // Ignore if we're no longer in-progress. This can happen if we race a |
840 // Cancel on the UI thread with an update on the FILE thread. | 812 // Cancel on the UI thread with an update on the FILE thread. |
841 // | 813 // |
842 // TODO(rdsmith): Arguably we should let this go through, as this means | 814 // TODO(rdsmith): Arguably we should let this go through, as this means |
843 // the download really did get further than we know before it was | 815 // the download really did get further than we know before it was |
844 // cancelled. But the gain isn't very large, and the code is more | 816 // cancelled. But the gain isn't very large, and the code is more |
845 // fragile if it has to support in progress updates in a non-in-progress | 817 // fragile if it has to support in progress updates in a non-in-progress |
846 // state. This issue should be readdressed when we revamp performance | 818 // state. This issue should be readdressed when we revamp performance |
(...skipping 17 matching lines...) Expand all Loading... |
864 | 836 |
865 UpdateObservers(); | 837 UpdateObservers(); |
866 } | 838 } |
867 | 839 |
868 void DownloadItemImpl::OnAllDataSaved(const std::string& final_hash) { | 840 void DownloadItemImpl::OnAllDataSaved(const std::string& final_hash) { |
869 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 841 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
870 | 842 |
871 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_); | 843 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_); |
872 DCHECK(!all_data_saved_); | 844 DCHECK(!all_data_saved_); |
873 all_data_saved_ = true; | 845 all_data_saved_ = true; |
| 846 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
874 | 847 |
875 // Store final hash and null out intermediate serialized hash state. | 848 // Store final hash and null out intermediate serialized hash state. |
876 hash_ = final_hash; | 849 hash_ = final_hash; |
877 hash_state_ = ""; | 850 hash_state_ = ""; |
878 | 851 |
879 UpdateObservers(); | 852 UpdateObservers(); |
880 } | 853 } |
881 | 854 |
882 void DownloadItemImpl::MarkAsComplete() { | 855 void DownloadItemImpl::MarkAsComplete() { |
883 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 856 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
884 | 857 |
885 DCHECK(all_data_saved_); | 858 DCHECK(all_data_saved_); |
886 end_time_ = base::Time::Now(); | 859 end_time_ = base::Time::Now(); |
887 TransitionTo(COMPLETE_INTERNAL); | 860 TransitionTo(COMPLETE_INTERNAL); |
888 } | 861 } |
889 | |
890 void DownloadItemImpl::SetIsPersisted() { | |
891 is_persisted_ = true; | |
892 UpdateObservers(); | |
893 } | |
894 | |
895 void DownloadItemImpl::SetDbHandle(int64 handle) { | |
896 db_handle_ = handle; | |
897 | |
898 bound_net_log_.AddEvent( | |
899 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, | |
900 net::NetLog::Int64Callback("db_handle", db_handle_)); | |
901 } | |
902 | |
903 void DownloadItemImpl::DestinationUpdate(int64 bytes_so_far, | 862 void DownloadItemImpl::DestinationUpdate(int64 bytes_so_far, |
904 int64 bytes_per_sec, | 863 int64 bytes_per_sec, |
905 const std::string& hash_state) { | 864 const std::string& hash_state) { |
906 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 865 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 866 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
907 | 867 |
908 if (!IsInProgress()) { | 868 if (!IsInProgress()) { |
909 // Ignore if we're no longer in-progress. This can happen if we race a | 869 // Ignore if we're no longer in-progress. This can happen if we race a |
910 // Cancel on the UI thread with an update on the FILE thread. | 870 // Cancel on the UI thread with an update on the FILE thread. |
911 // | 871 // |
912 // TODO(rdsmith): Arguably we should let this go through, as this means | 872 // TODO(rdsmith): Arguably we should let this go through, as this means |
913 // the download really did get further than we know before it was | 873 // the download really did get further than we know before it was |
914 // cancelled. But the gain isn't very large, and the code is more | 874 // cancelled. But the gain isn't very large, and the code is more |
915 // fragile if it has to support in progress updates in a non-in-progress | 875 // fragile if it has to support in progress updates in a non-in-progress |
916 // state. This issue should be readdressed when we revamp performance | 876 // state. This issue should be readdressed when we revamp performance |
(...skipping 13 matching lines...) Expand all Loading... |
930 bound_net_log_.AddEvent( | 890 bound_net_log_.AddEvent( |
931 net::NetLog::TYPE_DOWNLOAD_ITEM_UPDATED, | 891 net::NetLog::TYPE_DOWNLOAD_ITEM_UPDATED, |
932 net::NetLog::Int64Callback("bytes_so_far", received_bytes_)); | 892 net::NetLog::Int64Callback("bytes_so_far", received_bytes_)); |
933 } | 893 } |
934 | 894 |
935 UpdateObservers(); | 895 UpdateObservers(); |
936 } | 896 } |
937 | 897 |
938 void DownloadItemImpl::DestinationError(DownloadInterruptReason reason) { | 898 void DownloadItemImpl::DestinationError(DownloadInterruptReason reason) { |
939 // The DestinationError and Interrupt routines are being kept separate | 899 // The DestinationError and Interrupt routines are being kept separate |
940 // to allow for a future merging of the Cancel and Interrupt routines.. | 900 // to allow for a future merging of the Cancel and Interrupt routines. |
941 Interrupt(reason); | 901 Interrupt(reason); |
942 } | 902 } |
943 | 903 |
944 void DownloadItemImpl::DestinationCompleted(const std::string& final_hash) { | 904 void DownloadItemImpl::DestinationCompleted(const std::string& final_hash) { |
| 905 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
945 if (!IsInProgress()) | 906 if (!IsInProgress()) |
946 return; | 907 return; |
947 OnAllDataSaved(final_hash); | 908 OnAllDataSaved(final_hash); |
948 MaybeCompleteDownload(); | 909 MaybeCompleteDownload(); |
949 } | 910 } |
950 | 911 |
951 // **** Download progression cascade | 912 // **** Download progression cascade |
952 | 913 |
953 void DownloadItemImpl::Init(bool active, | 914 void DownloadItemImpl::Init(bool active, |
954 DownloadType download_type) { | 915 DownloadType download_type) { |
(...skipping 12 matching lines...) Expand all Loading... |
967 // See if it's set programmatically. | 928 // See if it's set programmatically. |
968 file_name = forced_file_path_.AsUTF8Unsafe(); | 929 file_name = forced_file_path_.AsUTF8Unsafe(); |
969 // Possibly has a 'download' attribute for the anchor. | 930 // Possibly has a 'download' attribute for the anchor. |
970 if (file_name.empty()) | 931 if (file_name.empty()) |
971 file_name = suggested_filename_; | 932 file_name = suggested_filename_; |
972 // From the URL file name. | 933 // From the URL file name. |
973 if (file_name.empty()) | 934 if (file_name.empty()) |
974 file_name = GetURL().ExtractFileName(); | 935 file_name = GetURL().ExtractFileName(); |
975 } | 936 } |
976 | 937 |
977 bound_net_log_.BeginEvent( | 938 base::Callback<base::Value*(net::NetLog::LogLevel)> active_data = base::Bind( |
978 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, | 939 &ItemActivatedNetLogCallback, this, download_type, &file_name); |
979 base::Bind(&ItemActivatedNetLogCallback, | 940 if (active) { |
980 this, download_type, &file_name)); | 941 bound_net_log_.BeginEvent( |
981 | 942 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, active_data); |
982 // If this is not an active download, end the ACTIVE event now. | 943 } else { |
983 if (!active) { | |
984 bound_net_log_.AddEvent( | 944 bound_net_log_.AddEvent( |
985 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, | 945 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, active_data); |
986 net::NetLog::Int64Callback("db_handle", db_handle_)); | |
987 | |
988 bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE); | |
989 } | 946 } |
990 | 947 |
991 VLOG(20) << __FUNCTION__ << "() " << DebugString(true); | 948 VLOG(20) << __FUNCTION__ << "() " << DebugString(true); |
992 } | 949 } |
993 | 950 |
994 // We're starting the download. | 951 // We're starting the download. |
995 void DownloadItemImpl::Start(scoped_ptr<DownloadFile> file) { | 952 void DownloadItemImpl::Start(scoped_ptr<DownloadFile> file) { |
996 DCHECK(!download_file_.get()); | 953 DCHECK(!download_file_.get()); |
997 DCHECK(file.get()); | 954 DCHECK(file.get()); |
998 download_file_ = file.Pass(); | 955 download_file_ = file.Pass(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 const FilePath& intermediate_path) { | 990 const FilePath& intermediate_path) { |
1034 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 991 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1035 | 992 |
1036 // If the |target_path| is empty, then we consider this download to be | 993 // If the |target_path| is empty, then we consider this download to be |
1037 // canceled. | 994 // canceled. |
1038 if (target_path.empty()) { | 995 if (target_path.empty()) { |
1039 Cancel(true); | 996 Cancel(true); |
1040 return; | 997 return; |
1041 } | 998 } |
1042 | 999 |
| 1000 VLOG(20) << __FUNCTION__ << " " << target_path.value() << " " << disposition |
| 1001 << " " << danger_type << " " << DebugString(true); |
| 1002 |
1043 target_path_ = target_path; | 1003 target_path_ = target_path; |
1044 target_disposition_ = disposition; | 1004 target_disposition_ = disposition; |
1045 SetDangerType(danger_type); | 1005 SetDangerType(danger_type); |
1046 // TODO(asanka): SetDangerType() doesn't need to send a notification here. | 1006 // TODO(asanka): SetDangerType() doesn't need to send a notification here. |
1047 | 1007 |
1048 // We want the intermediate and target paths to refer to the same directory so | 1008 // We want the intermediate and target paths to refer to the same directory so |
1049 // that they are both on the same device and subject to same | 1009 // that they are both on the same device and subject to same |
1050 // space/permission/availability constraints. | 1010 // space/permission/availability constraints. |
1051 DCHECK(intermediate_path.DirName() == target_path.DirName()); | 1011 DCHECK(intermediate_path.DirName() == target_path.DirName()); |
1052 | 1012 |
(...skipping 22 matching lines...) Expand all Loading... |
1075 base::Bind(&DownloadFile::RenameAndUniquify, | 1035 base::Bind(&DownloadFile::RenameAndUniquify, |
1076 // Safe because we control download file lifetime. | 1036 // Safe because we control download file lifetime. |
1077 base::Unretained(download_file_.get()), | 1037 base::Unretained(download_file_.get()), |
1078 intermediate_path, callback)); | 1038 intermediate_path, callback)); |
1079 } | 1039 } |
1080 | 1040 |
1081 void DownloadItemImpl::OnDownloadRenamedToIntermediateName( | 1041 void DownloadItemImpl::OnDownloadRenamedToIntermediateName( |
1082 DownloadInterruptReason reason, | 1042 DownloadInterruptReason reason, |
1083 const FilePath& full_path) { | 1043 const FilePath& full_path) { |
1084 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1044 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1045 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true); |
1085 if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) { | 1046 if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) { |
1086 Interrupt(reason); | 1047 Interrupt(reason); |
1087 } else { | 1048 } else { |
1088 SetFullPath(full_path); | 1049 SetFullPath(full_path); |
1089 UpdateObservers(); | 1050 delegate_->ShowDownloadInBrowser(this); |
1090 } | 1051 } |
1091 | 1052 |
1092 delegate_->DownloadRenamedToIntermediateName(this); | 1053 MaybeCompleteDownload(); |
1093 } | 1054 } |
1094 | 1055 |
1095 // When SavePackage downloads MHTML to GData (see | 1056 // When SavePackage downloads MHTML to GData (see |
1096 // SavePackageFilePickerChromeOS), GData calls MaybeCompleteDownload() like it | 1057 // SavePackageFilePickerChromeOS), GData calls MaybeCompleteDownload() like it |
1097 // does for non-SavePackage downloads, but SavePackage downloads never satisfy | 1058 // does for non-SavePackage downloads, but SavePackage downloads never satisfy |
1098 // IsDownloadReadyForCompletion(). GDataDownloadObserver manually calls | 1059 // IsDownloadReadyForCompletion(). GDataDownloadObserver manually calls |
1099 // DownloadItem::UpdateObservers() when the upload completes so that SavePackage | 1060 // DownloadItem::UpdateObservers() when the upload completes so that SavePackage |
1100 // notices that the upload has completed and runs its normal Finish() pathway. | 1061 // notices that the upload has completed and runs its normal Finish() pathway. |
1101 // MaybeCompleteDownload() is never the mechanism by which SavePackage completes | 1062 // MaybeCompleteDownload() is never the mechanism by which SavePackage completes |
1102 // downloads. SavePackage always uses its own Finish() to mark downloads | 1063 // downloads. SavePackage always uses its own Finish() to mark downloads |
1103 // complete. | 1064 // complete. |
1104 void DownloadItemImpl::MaybeCompleteDownload() { | 1065 void DownloadItemImpl::MaybeCompleteDownload() { |
1105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1066 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1106 DCHECK(!is_save_package_download_); | 1067 DCHECK(!is_save_package_download_); |
1107 | 1068 |
1108 if (!IsDownloadReadyForCompletion()) | 1069 if (!IsDownloadReadyForCompletion()) |
1109 return; | 1070 return; |
1110 | 1071 |
1111 // TODO(rdsmith): DCHECK that we only pass through this point | 1072 // TODO(rdsmith): DCHECK that we only pass through this point |
1112 // once per download. The natural way to do this is by a state | 1073 // once per download. The natural way to do this is by a state |
1113 // transition on the DownloadItem. | 1074 // transition on the DownloadItem. |
1114 | 1075 |
1115 // Confirm we're in the proper set of states to be here; | 1076 // Confirm we're in the proper set of states to be here; |
1116 // have all data, have a history handle, (validated or safe). | 1077 // have all data, have a history handle, (validated or safe). |
1117 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_); | 1078 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_); |
1118 DCHECK_NE(DownloadItem::DANGEROUS, GetSafetyState()); | 1079 DCHECK_NE(DownloadItem::DANGEROUS, GetSafetyState()); |
1119 DCHECK(all_data_saved_); | 1080 DCHECK(all_data_saved_); |
1120 DCHECK(is_persisted_); | |
1121 | |
1122 delegate_->UpdatePersistence(this); | |
1123 | 1081 |
1124 OnDownloadCompleting(); | 1082 OnDownloadCompleting(); |
1125 } | 1083 } |
1126 | 1084 |
1127 // Called by MaybeCompleteDownload() when it has determined that the download | 1085 // Called by MaybeCompleteDownload() when it has determined that the download |
1128 // is ready for completion. | 1086 // is ready for completion. |
1129 void DownloadItemImpl::OnDownloadCompleting() { | 1087 void DownloadItemImpl::OnDownloadCompleting() { |
1130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1088 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1131 | 1089 |
1132 if (state_ != IN_PROGRESS_INTERNAL) | 1090 if (state_ != IN_PROGRESS_INTERNAL) |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 Interrupt(reason); | 1149 Interrupt(reason); |
1192 return; | 1150 return; |
1193 } | 1151 } |
1194 | 1152 |
1195 DCHECK(target_path_ == full_path); | 1153 DCHECK(target_path_ == full_path); |
1196 | 1154 |
1197 if (full_path != current_path_) { | 1155 if (full_path != current_path_) { |
1198 // full_path is now the current and target file path. | 1156 // full_path is now the current and target file path. |
1199 DCHECK(!full_path.empty()); | 1157 DCHECK(!full_path.empty()); |
1200 SetFullPath(full_path); | 1158 SetFullPath(full_path); |
1201 delegate_->DownloadRenamedToFinalName(this); | |
1202 } | 1159 } |
1203 | 1160 |
1204 // Complete the download and release the DownloadFile. | 1161 // Complete the download and release the DownloadFile. |
1205 DCHECK(download_file_.get()); | 1162 DCHECK(download_file_.get()); |
1206 BrowserThread::PostTask( | 1163 BrowserThread::PostTask( |
1207 BrowserThread::FILE, FROM_HERE, | 1164 BrowserThread::FILE, FROM_HERE, |
1208 base::Bind(&DownloadFileDetach, base::Passed(download_file_.Pass()))); | 1165 base::Bind(&DownloadFileDetach, base::Passed(download_file_.Pass()))); |
1209 | 1166 |
1210 // We're not completely done with the download item yet, but at this | 1167 // We're not completely done with the download item yet, but at this |
1211 // point we're committed to complete the download. Cancels (or Interrupts, | 1168 // point we're committed to complete the download. Cancels (or Interrupts, |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 // has been released. | 1247 // has been released. |
1291 if (!is_save_package_download_ && download_file_.get()) { | 1248 if (!is_save_package_download_ && download_file_.get()) { |
1292 BrowserThread::PostTask( | 1249 BrowserThread::PostTask( |
1293 BrowserThread::FILE, FROM_HERE, | 1250 BrowserThread::FILE, FROM_HERE, |
1294 // Will be deleted at end of task execution. | 1251 // Will be deleted at end of task execution. |
1295 base::Bind(&DownloadFileCancel, base::Passed(download_file_.Pass()))); | 1252 base::Bind(&DownloadFileCancel, base::Passed(download_file_.Pass()))); |
1296 } | 1253 } |
1297 } | 1254 } |
1298 | 1255 |
1299 bool DownloadItemImpl::IsDownloadReadyForCompletion() { | 1256 bool DownloadItemImpl::IsDownloadReadyForCompletion() { |
| 1257 VLOG(20) << __FUNCTION__ << " " << AllDataSaved() |
| 1258 << " " << (GetSafetyState() != DownloadItem::DANGEROUS) |
| 1259 << " " << (state_ == IN_PROGRESS_INTERNAL) |
| 1260 << " " << !GetTargetFilePath().empty() |
| 1261 << " " << (target_path_.DirName() == current_path_.DirName()); |
1300 // If we don't have all the data, the download is not ready for | 1262 // If we don't have all the data, the download is not ready for |
1301 // completion. | 1263 // completion. |
1302 if (!AllDataSaved()) | 1264 if (!AllDataSaved()) |
1303 return false; | 1265 return false; |
1304 | 1266 |
1305 // If the download is dangerous, but not yet validated, it's not ready for | 1267 // If the download is dangerous, but not yet validated, it's not ready for |
1306 // completion. | 1268 // completion. |
1307 if (GetSafetyState() == DownloadItem::DANGEROUS) | 1269 if (GetSafetyState() == DownloadItem::DANGEROUS) |
1308 return false; | 1270 return false; |
1309 | 1271 |
1310 // If the download isn't active (e.g. has been cancelled) it's not | 1272 // If the download isn't active (e.g. has been cancelled) it's not |
1311 // ready for completion. | 1273 // ready for completion. |
1312 if (state_ != IN_PROGRESS_INTERNAL) | 1274 if (state_ != IN_PROGRESS_INTERNAL) |
1313 return false; | 1275 return false; |
1314 | 1276 |
1315 // If the download hasn't been inserted into the history system | 1277 // If the target filename hasn't been determined, then it's not ready for |
1316 // (which occurs strictly after file name determination, intermediate | 1278 // completion. This is checked in ReadyForDownloadCompletionDone(). |
1317 // file rename, and UI display) then it's not ready for completion. | 1279 if (GetTargetFilePath().empty()) |
1318 if (!IsPersisted()) | 1280 return false; |
| 1281 |
| 1282 // This is checked in NeedsRename(). Without this conditional, |
| 1283 // browser_tests:DownloadTest.DownloadMimeType fails the DCHECK. |
| 1284 if (target_path_.DirName() != current_path_.DirName()) |
1319 return false; | 1285 return false; |
1320 | 1286 |
1321 return true; | 1287 return true; |
1322 } | 1288 } |
1323 | 1289 |
1324 void DownloadItemImpl::TransitionTo(DownloadInternalState new_state) { | 1290 void DownloadItemImpl::TransitionTo(DownloadInternalState new_state) { |
1325 if (state_ == new_state) | 1291 if (state_ == new_state) |
1326 return; | 1292 return; |
1327 | 1293 |
1328 DownloadInternalState old_state = state_; | 1294 DownloadInternalState old_state = state_; |
(...skipping 19 matching lines...) Expand all Loading... |
1348 case CANCELLED_INTERNAL: | 1314 case CANCELLED_INTERNAL: |
1349 bound_net_log_.AddEvent( | 1315 bound_net_log_.AddEvent( |
1350 net::NetLog::TYPE_DOWNLOAD_ITEM_CANCELED, | 1316 net::NetLog::TYPE_DOWNLOAD_ITEM_CANCELED, |
1351 base::Bind(&ItemCanceledNetLogCallback, received_bytes_, | 1317 base::Bind(&ItemCanceledNetLogCallback, received_bytes_, |
1352 &hash_state_)); | 1318 &hash_state_)); |
1353 break; | 1319 break; |
1354 default: | 1320 default: |
1355 break; | 1321 break; |
1356 } | 1322 } |
1357 | 1323 |
1358 VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true); | 1324 VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true) |
| 1325 << " " << InternalToExternalState(old_state) |
| 1326 << " " << InternalToExternalState(state_); |
1359 | 1327 |
1360 // Only update observers on user visible state changes. | 1328 // Only update observers on user visible state changes. |
1361 if (InternalToExternalState(old_state) != InternalToExternalState(state_)) | 1329 if (InternalToExternalState(old_state) != InternalToExternalState(state_)) |
1362 UpdateObservers(); | 1330 UpdateObservers(); |
1363 | 1331 |
1364 bool is_done = (state_ != IN_PROGRESS_INTERNAL && | 1332 bool is_done = (state_ != IN_PROGRESS_INTERNAL && |
1365 state_ != COMPLETING_INTERNAL); | 1333 state_ != COMPLETING_INTERNAL); |
1366 bool was_done = (old_state != IN_PROGRESS_INTERNAL && | 1334 bool was_done = (old_state != IN_PROGRESS_INTERNAL && |
1367 old_state != COMPLETING_INTERNAL); | 1335 old_state != COMPLETING_INTERNAL); |
1368 if (is_done && !was_done) | 1336 if (is_done && !was_done) |
(...skipping 15 matching lines...) Expand all Loading... |
1384 } | 1352 } |
1385 } | 1353 } |
1386 | 1354 |
1387 void DownloadItemImpl::SetFullPath(const FilePath& new_path) { | 1355 void DownloadItemImpl::SetFullPath(const FilePath& new_path) { |
1388 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1389 VLOG(20) << __FUNCTION__ << "()" | 1357 VLOG(20) << __FUNCTION__ << "()" |
1390 << " new_path = \"" << new_path.value() << "\"" | 1358 << " new_path = \"" << new_path.value() << "\"" |
1391 << " " << DebugString(true); | 1359 << " " << DebugString(true); |
1392 DCHECK(!new_path.empty()); | 1360 DCHECK(!new_path.empty()); |
1393 current_path_ = new_path; | 1361 current_path_ = new_path; |
| 1362 UpdateObservers(); |
1394 | 1363 |
1395 bound_net_log_.AddEvent( | 1364 bound_net_log_.AddEvent( |
1396 net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED, | 1365 net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED, |
1397 base::Bind(&ItemRenamedNetLogCallback, ¤t_path_, &new_path)); | 1366 base::Bind(&ItemRenamedNetLogCallback, ¤t_path_, &new_path)); |
1398 } | 1367 } |
1399 | 1368 |
1400 // static | 1369 // static |
1401 DownloadItem::DownloadState DownloadItemImpl::InternalToExternalState( | 1370 DownloadItem::DownloadState DownloadItemImpl::InternalToExternalState( |
1402 DownloadInternalState internal_state) { | 1371 DownloadInternalState internal_state) { |
1403 switch (internal_state) { | 1372 switch (internal_state) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1449 return "CANCELLED"; | 1418 return "CANCELLED"; |
1450 case INTERRUPTED_INTERNAL: | 1419 case INTERRUPTED_INTERNAL: |
1451 return "INTERRUPTED"; | 1420 return "INTERRUPTED"; |
1452 default: | 1421 default: |
1453 NOTREACHED() << "Unknown download state " << state; | 1422 NOTREACHED() << "Unknown download state " << state; |
1454 return "unknown"; | 1423 return "unknown"; |
1455 }; | 1424 }; |
1456 } | 1425 } |
1457 | 1426 |
1458 } // namespace content | 1427 } // namespace content |
OLD | NEW |