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

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

Issue 10915180: Make DownloadHistory observe manager, items (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: @r166680 Created 8 years, 1 month 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 // interfaces Start, DelayedDownloadOpened, MaybeCompleteDownload, and 7 // interfaces Start, DelayedDownloadOpened, MaybeCompleteDownload, and
8 // OnDownloadCompleting are placed in chronological order with the other 8 // OnDownloadCompleting are placed in chronological order with the other
9 // (private) routines that together define a DownloadItem's state transitions 9 // (private) routines 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
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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 download_file->Detach(callback); 105 download_file->Detach(callback);
107 } 106 }
108 107
109 static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) { 108 static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) {
110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
111 download_file->Cancel(); 110 download_file->Cancel();
112 } 111 }
113 112
114 } // namespace 113 } // namespace
115 114
116 // Our download table ID starts at 1, so we use 0 to represent a download that
117 // has started, but has not yet had its data persisted in the table. We use fake
118 // database handles in incognito mode starting at -1 and progressively getting
119 // more negative.
120 // static
121 const int DownloadItem::kUninitializedHandle = 0;
122
123 const char DownloadItem::kEmptyFileHash[] = ""; 115 const char DownloadItem::kEmptyFileHash[] = "";
124 116
125 // Our download table ID starts at 1, so we use 0 to represent a download that
126 // has started, but has not yet had its data persisted in the table. We use fake
127 // database handles in incognito mode starting at -1 and progressively getting
128 // more negative.
129
130 // Constructor for reading from the history service. 117 // Constructor for reading from the history service.
131 DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate, 118 DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate,
132 DownloadId download_id, 119 DownloadId download_id,
133 const DownloadPersistentStoreInfo& info, 120 const FilePath& path,
121 const GURL& url,
122 const GURL& referrer_url,
123 const base::Time& start_time,
124 const base::Time& end_time,
125 int64 received_bytes,
126 int64 total_bytes,
127 DownloadItem::DownloadState state,
128 bool opened,
134 const net::BoundNetLog& bound_net_log) 129 const net::BoundNetLog& bound_net_log)
135 : is_save_package_download_(false), 130 : is_save_package_download_(false),
136 download_id_(download_id), 131 download_id_(download_id),
137 current_path_(info.path), 132 current_path_(path),
138 target_path_(info.path), 133 target_path_(path),
139 target_disposition_(TARGET_DISPOSITION_OVERWRITE), 134 target_disposition_(TARGET_DISPOSITION_OVERWRITE),
140 url_chain_(1, info.url), 135 url_chain_(1, url),
141 referrer_url_(info.referrer_url), 136 referrer_url_(referrer_url),
142 transition_type_(PAGE_TRANSITION_LINK), 137 transition_type_(PAGE_TRANSITION_LINK),
143 has_user_gesture_(false), 138 has_user_gesture_(false),
144 total_bytes_(info.total_bytes), 139 total_bytes_(total_bytes),
145 received_bytes_(info.received_bytes), 140 received_bytes_(received_bytes),
146 bytes_per_sec_(0), 141 bytes_per_sec_(0),
147 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), 142 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE),
148 start_tick_(base::TimeTicks()), 143 start_tick_(base::TimeTicks()),
149 state_(ExternalToInternalState(info.state)), 144 state_(ExternalToInternalState(state)),
150 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), 145 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
151 start_time_(info.start_time), 146 start_time_(start_time),
152 end_time_(info.end_time), 147 end_time_(end_time),
153 db_handle_(info.db_handle),
154 delegate_(delegate), 148 delegate_(delegate),
155 is_paused_(false), 149 is_paused_(false),
156 open_when_complete_(false), 150 open_when_complete_(false),
157 file_externally_removed_(false), 151 file_externally_removed_(false),
158 safety_state_(SAFE), 152 safety_state_(SAFE),
159 auto_opened_(false), 153 auto_opened_(false),
160 is_persisted_(true),
161 is_temporary_(false), 154 is_temporary_(false),
162 all_data_saved_(false), 155 all_data_saved_(false),
163 opened_(info.opened), 156 opened_(opened),
164 open_enabled_(true), 157 open_enabled_(true),
165 delegate_delayed_complete_(false), 158 delegate_delayed_complete_(false),
166 bound_net_log_(bound_net_log), 159 bound_net_log_(bound_net_log),
167 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 160 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
168 delegate_->Attach(); 161 delegate_->Attach();
169 if (state_ == IN_PROGRESS_INTERNAL) 162 if (state_ == IN_PROGRESS_INTERNAL)
170 state_ = CANCELLED_INTERNAL; 163 state_ = CANCELLED_INTERNAL;
171 if (state_ == COMPLETE_INTERNAL) 164 if (state_ == COMPLETE_INTERNAL)
172 all_data_saved_ = true; 165 all_data_saved_ = true;
173 Init(false /* not actively downloading */, SRC_HISTORY_IMPORT); 166 Init(false /* not actively downloading */, SRC_HISTORY_IMPORT);
(...skipping 22 matching lines...) Expand all
196 original_mime_type_(info.original_mime_type), 189 original_mime_type_(info.original_mime_type),
197 remote_address_(info.remote_address), 190 remote_address_(info.remote_address),
198 total_bytes_(info.total_bytes), 191 total_bytes_(info.total_bytes),
199 received_bytes_(0), 192 received_bytes_(0),
200 bytes_per_sec_(0), 193 bytes_per_sec_(0),
201 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), 194 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE),
202 start_tick_(base::TimeTicks::Now()), 195 start_tick_(base::TimeTicks::Now()),
203 state_(IN_PROGRESS_INTERNAL), 196 state_(IN_PROGRESS_INTERNAL),
204 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), 197 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
205 start_time_(info.start_time), 198 start_time_(info.start_time),
206 db_handle_(DownloadItem::kUninitializedHandle),
207 delegate_(delegate), 199 delegate_(delegate),
208 is_paused_(false), 200 is_paused_(false),
209 open_when_complete_(false), 201 open_when_complete_(false),
210 file_externally_removed_(false), 202 file_externally_removed_(false),
211 safety_state_(SAFE), 203 safety_state_(SAFE),
212 auto_opened_(false), 204 auto_opened_(false),
213 is_persisted_(false),
214 is_temporary_(!info.save_info->file_path.empty()), 205 is_temporary_(!info.save_info->file_path.empty()),
215 all_data_saved_(false), 206 all_data_saved_(false),
216 opened_(false), 207 opened_(false),
217 open_enabled_(true), 208 open_enabled_(true),
218 delegate_delayed_complete_(false), 209 delegate_delayed_complete_(false),
219 bound_net_log_(bound_net_log), 210 bound_net_log_(bound_net_log),
220 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 211 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
221 delegate_->Attach(); 212 delegate_->Attach();
222 Init(true /* actively downloading */, SRC_NEW_DOWNLOAD); 213 Init(true /* actively downloading */, SRC_NEW_DOWNLOAD);
223 214
(...skipping 27 matching lines...) Expand all
251 mime_type_(mime_type), 242 mime_type_(mime_type),
252 original_mime_type_(mime_type), 243 original_mime_type_(mime_type),
253 total_bytes_(0), 244 total_bytes_(0),
254 received_bytes_(0), 245 received_bytes_(0),
255 bytes_per_sec_(0), 246 bytes_per_sec_(0),
256 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), 247 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE),
257 start_tick_(base::TimeTicks::Now()), 248 start_tick_(base::TimeTicks::Now()),
258 state_(IN_PROGRESS_INTERNAL), 249 state_(IN_PROGRESS_INTERNAL),
259 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), 250 danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
260 start_time_(base::Time::Now()), 251 start_time_(base::Time::Now()),
261 db_handle_(DownloadItem::kUninitializedHandle),
262 delegate_(delegate), 252 delegate_(delegate),
263 is_paused_(false), 253 is_paused_(false),
264 open_when_complete_(false), 254 open_when_complete_(false),
265 file_externally_removed_(false), 255 file_externally_removed_(false),
266 safety_state_(SAFE), 256 safety_state_(SAFE),
267 auto_opened_(false), 257 auto_opened_(false),
268 is_persisted_(false),
269 is_temporary_(false), 258 is_temporary_(false),
270 all_data_saved_(false), 259 all_data_saved_(false),
271 opened_(false), 260 opened_(false),
272 open_enabled_(true), 261 open_enabled_(true),
273 delegate_delayed_complete_(false), 262 delegate_delayed_complete_(false),
274 bound_net_log_(bound_net_log), 263 bound_net_log_(bound_net_log),
275 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 264 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
276 delegate_->Attach(); 265 delegate_->Attach();
277 Init(true /* actively downloading */, SRC_SAVE_PAGE_AS); 266 Init(true /* actively downloading */, SRC_SAVE_PAGE_AS);
278 } 267 }
(...skipping 26 matching lines...) Expand all
305 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 294 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
306 295
307 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); 296 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this));
308 } 297 }
309 298
310 void DownloadItemImpl::DangerousDownloadValidated() { 299 void DownloadItemImpl::DangerousDownloadValidated() {
311 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 300 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
312 DCHECK_EQ(IN_PROGRESS, GetState()); 301 DCHECK_EQ(IN_PROGRESS, GetState());
313 DCHECK_EQ(DANGEROUS, GetSafetyState()); 302 DCHECK_EQ(DANGEROUS, GetSafetyState());
314 303
304 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
305
315 if (GetState() != IN_PROGRESS) 306 if (GetState() != IN_PROGRESS)
316 return; 307 return;
317 308
318 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", 309 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated",
319 GetDangerType(), 310 GetDangerType(),
320 DOWNLOAD_DANGER_TYPE_MAX); 311 DOWNLOAD_DANGER_TYPE_MAX);
321 312
322 safety_state_ = DANGEROUS_BUT_VALIDATED; 313 safety_state_ = DANGEROUS_BUT_VALIDATED;
323 314
324 bound_net_log_.AddEvent( 315 bound_net_log_.AddEvent(
325 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, 316 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED,
326 base::Bind(&ItemCheckedNetLogCallback, 317 base::Bind(&ItemCheckedNetLogCallback,
327 GetDangerType(), GetSafetyState())); 318 GetDangerType(), GetSafetyState()));
328 319
329 UpdateObservers(); 320 UpdateObservers();
330 321
331 MaybeCompleteDownload(); 322 MaybeCompleteDownload();
332 } 323 }
333 324
334 void DownloadItemImpl::TogglePause() { 325 void DownloadItemImpl::TogglePause() {
335 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 326 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
336
337 DCHECK(state_ == IN_PROGRESS_INTERNAL || state_ == COMPLETING_INTERNAL); 327 DCHECK(state_ == IN_PROGRESS_INTERNAL || state_ == COMPLETING_INTERNAL);
328 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
338 329
339 // Ignore pauses when we've passed the commit point. 330 // Ignore pauses when we've passed the commit point.
340 if (state_ == COMPLETING_INTERNAL) 331 if (state_ == COMPLETING_INTERNAL)
341 return; 332 return;
342 333
343 if (is_paused_) 334 if (is_paused_)
344 request_handle_->ResumeRequest(); 335 request_handle_->ResumeRequest();
345 else 336 else
346 request_handle_->PauseRequest(); 337 request_handle_->PauseRequest();
347 is_paused_ = !is_paused_; 338 is_paused_ = !is_paused_;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 } 444 }
454 445
455 int32 DownloadItemImpl::GetId() const { 446 int32 DownloadItemImpl::GetId() const {
456 return download_id_.local(); 447 return download_id_.local();
457 } 448 }
458 449
459 DownloadId DownloadItemImpl::GetGlobalId() const { 450 DownloadId DownloadItemImpl::GetGlobalId() const {
460 return download_id_; 451 return download_id_;
461 } 452 }
462 453
463 int64 DownloadItemImpl::GetDbHandle() const {
464 return db_handle_;
465 }
466
467 DownloadItem::DownloadState DownloadItemImpl::GetState() const { 454 DownloadItem::DownloadState DownloadItemImpl::GetState() const {
468 return InternalToExternalState(state_); 455 return InternalToExternalState(state_);
469 } 456 }
470 457
471 DownloadInterruptReason DownloadItemImpl::GetLastReason() const { 458 DownloadInterruptReason DownloadItemImpl::GetLastReason() const {
472 return last_reason_; 459 return last_reason_;
473 } 460 }
474 461
475 bool DownloadItemImpl::IsPaused() const { 462 bool DownloadItemImpl::IsPaused() const {
476 return is_paused_; 463 return is_paused_;
477 } 464 }
478 465
479 bool DownloadItemImpl::IsTemporary() const { 466 bool DownloadItemImpl::IsTemporary() const {
480 return is_temporary_; 467 return is_temporary_;
481 } 468 }
482 469
483 bool DownloadItemImpl::IsPersisted() const {
484 return is_persisted_;
485 }
486
487 // TODO(ahendrickson) -- Move |INTERRUPTED| from |IsCancelled()| to 470 // TODO(ahendrickson) -- Move |INTERRUPTED| from |IsCancelled()| to
488 // |IsPartialDownload()|, when resuming interrupted downloads is implemented. 471 // |IsPartialDownload()|, when resuming interrupted downloads is implemented.
489 bool DownloadItemImpl::IsPartialDownload() const { 472 bool DownloadItemImpl::IsPartialDownload() const {
490 return InternalToExternalState(state_) == IN_PROGRESS; 473 return InternalToExternalState(state_) == IN_PROGRESS;
491 } 474 }
492 475
493 bool DownloadItemImpl::IsInProgress() const { 476 bool DownloadItemImpl::IsInProgress() const {
494 return InternalToExternalState(state_) == IN_PROGRESS; 477 return InternalToExternalState(state_) == IN_PROGRESS;
495 } 478 }
496 479
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } 676 }
694 677
695 bool DownloadItemImpl::GetAutoOpened() { 678 bool DownloadItemImpl::GetAutoOpened() {
696 return auto_opened_; 679 return auto_opened_;
697 } 680 }
698 681
699 bool DownloadItemImpl::GetOpened() const { 682 bool DownloadItemImpl::GetOpened() const {
700 return opened_; 683 return opened_;
701 } 684 }
702 685
703 DownloadPersistentStoreInfo DownloadItemImpl::GetPersistentStoreInfo() const {
704 // TODO(asanka): Persist GetTargetFilePath() as well.
705 return DownloadPersistentStoreInfo(GetFullPath(),
706 GetURL(),
707 GetReferrerUrl(),
708 GetStartTime(),
709 GetEndTime(),
710 GetReceivedBytes(),
711 GetTotalBytes(),
712 GetState(),
713 GetDbHandle(),
714 GetOpened());
715 }
716
717 BrowserContext* DownloadItemImpl::GetBrowserContext() const { 686 BrowserContext* DownloadItemImpl::GetBrowserContext() const {
718 return delegate_->GetBrowserContext(); 687 return delegate_->GetBrowserContext();
719 } 688 }
720 689
721 WebContents* DownloadItemImpl::GetWebContents() const { 690 WebContents* DownloadItemImpl::GetWebContents() const {
722 // TODO(rdsmith): Remove null check after removing GetWebContents() from 691 // TODO(rdsmith): Remove null check after removing GetWebContents() from
723 // paths that might be used by DownloadItems created from history import. 692 // paths that might be used by DownloadItems created from history import.
724 // Currently such items have null request_handle_s, where other items 693 // Currently such items have null request_handle_s, where other items
725 // (regular and SavePackage downloads) have actual objects off the pointer. 694 // (regular and SavePackage downloads) have actual objects off the pointer.
726 if (request_handle_.get()) 695 if (request_handle_.get())
727 return request_handle_->GetWebContents(); 696 return request_handle_->GetWebContents();
728 return NULL; 697 return NULL;
729 } 698 }
730 699
731 void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) { 700 void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) {
732 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 701 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
733 DCHECK(AllDataSaved()); 702 DCHECK(AllDataSaved());
703 VLOG(20) << __FUNCTION__ << " danger_type=" << danger_type
704 << " download=" << DebugString(true);
734 SetDangerType(danger_type); 705 SetDangerType(danger_type);
735 UpdateObservers(); 706 UpdateObservers();
736 } 707 }
737 708
738 void DownloadItemImpl::SetOpenWhenComplete(bool open) { 709 void DownloadItemImpl::SetOpenWhenComplete(bool open) {
739 open_when_complete_ = open; 710 open_when_complete_ = open;
740 } 711 }
741 712
742 void DownloadItemImpl::SetIsTemporary(bool temporary) { 713 void DownloadItemImpl::SetIsTemporary(bool temporary) {
743 is_temporary_ = temporary; 714 is_temporary_ = temporary;
(...skipping 23 matching lines...) Expand all
767 ++iter; 738 ++iter;
768 for ( ; verbose && (iter != last); ++iter) { 739 for ( ; verbose && (iter != last); ++iter) {
769 url_list += " ->\n\t"; 740 url_list += " ->\n\t";
770 const GURL& next_url = *iter; 741 const GURL& next_url = *iter;
771 url_list += next_url.spec(); 742 url_list += next_url.spec();
772 } 743 }
773 } 744 }
774 745
775 if (verbose) { 746 if (verbose) {
776 description += base::StringPrintf( 747 description += base::StringPrintf(
777 " db_handle = %" PRId64
778 " total = %" PRId64 748 " total = %" PRId64
779 " received = %" PRId64 749 " received = %" PRId64
780 " reason = %s" 750 " reason = %s"
781 " paused = %c" 751 " paused = %c"
782 " safety = %s" 752 " safety = %s"
783 " last_modified = '%s'" 753 " last_modified = '%s'"
784 " etag = '%s'" 754 " etag = '%s'"
785 " url_chain = \n\t\"%s\"\n\t" 755 " url_chain = \n\t\"%s\"\n\t"
786 " full_path = \"%" PRFilePath "\"" 756 " full_path = \"%" PRFilePath "\""
787 " target_path = \"%" PRFilePath "\"" 757 " target_path = \"%" PRFilePath "\""
788 " has download file = %s", 758 " has download file = %s",
789 GetDbHandle(),
790 GetTotalBytes(), 759 GetTotalBytes(),
791 GetReceivedBytes(), 760 GetReceivedBytes(),
792 InterruptReasonDebugString(last_reason_).c_str(), 761 InterruptReasonDebugString(last_reason_).c_str(),
793 IsPaused() ? 'T' : 'F', 762 IsPaused() ? 'T' : 'F',
794 DebugSafetyStateString(GetSafetyState()), 763 DebugSafetyStateString(GetSafetyState()),
795 GetLastModifiedTime().c_str(), 764 GetLastModifiedTime().c_str(),
796 GetETag().c_str(), 765 GetETag().c_str(),
797 url_list.c_str(), 766 url_list.c_str(),
798 GetFullPath().value().c_str(), 767 GetFullPath().value().c_str(),
799 GetTargetFilePath().value().c_str(), 768 GetTargetFilePath().value().c_str(),
(...skipping 10 matching lines...) Expand all
810 void DownloadItemImpl::MockDownloadOpenForTesting() { 779 void DownloadItemImpl::MockDownloadOpenForTesting() {
811 open_enabled_ = false; 780 open_enabled_ = false;
812 } 781 }
813 782
814 void DownloadItemImpl::NotifyRemoved() { 783 void DownloadItemImpl::NotifyRemoved() {
815 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadRemoved(this)); 784 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadRemoved(this));
816 } 785 }
817 786
818 void DownloadItemImpl::OnDownloadedFileRemoved() { 787 void DownloadItemImpl::OnDownloadedFileRemoved() {
819 file_externally_removed_ = true; 788 file_externally_removed_ = true;
789 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
820 UpdateObservers(); 790 UpdateObservers();
821 } 791 }
822 792
823 // An error occurred somewhere. 793 // An error occurred somewhere.
824 void DownloadItemImpl::Interrupt(DownloadInterruptReason reason) { 794 void DownloadItemImpl::Interrupt(DownloadInterruptReason reason) {
825 // Somewhat counter-intuitively, it is possible for us to receive an 795 // Somewhat counter-intuitively, it is possible for us to receive an
826 // interrupt after we've already been interrupted. The generation of 796 // interrupt after we've already been interrupted. The generation of
827 // interrupts from the file thread Renames and the generation of 797 // interrupts from the file thread Renames and the generation of
828 // interrupts from disk writes go through two different mechanisms (driven 798 // interrupts from disk writes go through two different mechanisms (driven
829 // by rename requests from UI thread and by write requests from IO thread, 799 // by rename requests from UI thread and by write requests from IO thread,
(...skipping 26 matching lines...) Expand all
856 total_bytes_ = total_bytes; 826 total_bytes_ = total_bytes;
857 } 827 }
858 828
859 // Updates from the download thread may have been posted while this download 829 // Updates from the download thread may have been posted while this download
860 // was being cancelled in the UI thread, so we'll accept them unless we're 830 // was being cancelled in the UI thread, so we'll accept them unless we're
861 // complete. 831 // complete.
862 void DownloadItemImpl::UpdateProgress(int64 bytes_so_far, 832 void DownloadItemImpl::UpdateProgress(int64 bytes_so_far,
863 int64 bytes_per_sec, 833 int64 bytes_per_sec,
864 const std::string& hash_state) { 834 const std::string& hash_state) {
865 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 835 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
836 VLOG(20) << __FUNCTION__ << " so_far=" << bytes_so_far
837 << " per_sec=" << bytes_per_sec << " download=" << DebugString(true);
866 838
867 if (state_ != IN_PROGRESS_INTERNAL) { 839 if (state_ != IN_PROGRESS_INTERNAL) {
868 // Ignore if we're no longer in-progress. This can happen if we race a 840 // Ignore if we're no longer in-progress. This can happen if we race a
869 // Cancel on the UI thread with an update on the FILE thread. 841 // Cancel on the UI thread with an update on the FILE thread.
870 // 842 //
871 // TODO(rdsmith): Arguably we should let this go through, as this means 843 // TODO(rdsmith): Arguably we should let this go through, as this means
872 // the download really did get further than we know before it was 844 // the download really did get further than we know before it was
873 // cancelled. But the gain isn't very large, and the code is more 845 // cancelled. But the gain isn't very large, and the code is more
874 // fragile if it has to support in progress updates in a non-in-progress 846 // fragile if it has to support in progress updates in a non-in-progress
875 // state. This issue should be readdressed when we revamp performance 847 // state. This issue should be readdressed when we revamp performance
(...skipping 17 matching lines...) Expand all
893 865
894 UpdateObservers(); 866 UpdateObservers();
895 } 867 }
896 868
897 void DownloadItemImpl::OnAllDataSaved(const std::string& final_hash) { 869 void DownloadItemImpl::OnAllDataSaved(const std::string& final_hash) {
898 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 870 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
899 871
900 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_); 872 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_);
901 DCHECK(!all_data_saved_); 873 DCHECK(!all_data_saved_);
902 all_data_saved_ = true; 874 all_data_saved_ = true;
875 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
903 876
904 // Store final hash and null out intermediate serialized hash state. 877 // Store final hash and null out intermediate serialized hash state.
905 hash_ = final_hash; 878 hash_ = final_hash;
906 hash_state_ = ""; 879 hash_state_ = "";
907 880
908 UpdateObservers(); 881 UpdateObservers();
909 } 882 }
910 883
911 void DownloadItemImpl::MarkAsComplete() { 884 void DownloadItemImpl::MarkAsComplete() {
912 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 885 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
913 886
914 DCHECK(all_data_saved_); 887 DCHECK(all_data_saved_);
915 end_time_ = base::Time::Now(); 888 end_time_ = base::Time::Now();
916 TransitionTo(COMPLETE_INTERNAL); 889 TransitionTo(COMPLETE_INTERNAL);
917 } 890 }
918
919 void DownloadItemImpl::SetIsPersisted() {
920 is_persisted_ = true;
921 UpdateObservers();
922 }
923
924 void DownloadItemImpl::SetDbHandle(int64 handle) {
925 db_handle_ = handle;
926
927 bound_net_log_.AddEvent(
928 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY,
929 net::NetLog::Int64Callback("db_handle", db_handle_));
930 }
931
932 void DownloadItemImpl::DestinationUpdate(int64 bytes_so_far, 891 void DownloadItemImpl::DestinationUpdate(int64 bytes_so_far,
933 int64 bytes_per_sec, 892 int64 bytes_per_sec,
934 const std::string& hash_state) { 893 const std::string& hash_state) {
935 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 894 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
895 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
936 896
937 if (!IsInProgress()) { 897 if (!IsInProgress()) {
938 // Ignore if we're no longer in-progress. This can happen if we race a 898 // Ignore if we're no longer in-progress. This can happen if we race a
939 // Cancel on the UI thread with an update on the FILE thread. 899 // Cancel on the UI thread with an update on the FILE thread.
940 // 900 //
941 // TODO(rdsmith): Arguably we should let this go through, as this means 901 // TODO(rdsmith): Arguably we should let this go through, as this means
942 // the download really did get further than we know before it was 902 // the download really did get further than we know before it was
943 // cancelled. But the gain isn't very large, and the code is more 903 // cancelled. But the gain isn't very large, and the code is more
944 // fragile if it has to support in progress updates in a non-in-progress 904 // fragile if it has to support in progress updates in a non-in-progress
945 // state. This issue should be readdressed when we revamp performance 905 // state. This issue should be readdressed when we revamp performance
(...skipping 13 matching lines...) Expand all
959 bound_net_log_.AddEvent( 919 bound_net_log_.AddEvent(
960 net::NetLog::TYPE_DOWNLOAD_ITEM_UPDATED, 920 net::NetLog::TYPE_DOWNLOAD_ITEM_UPDATED,
961 net::NetLog::Int64Callback("bytes_so_far", received_bytes_)); 921 net::NetLog::Int64Callback("bytes_so_far", received_bytes_));
962 } 922 }
963 923
964 UpdateObservers(); 924 UpdateObservers();
965 } 925 }
966 926
967 void DownloadItemImpl::DestinationError(DownloadInterruptReason reason) { 927 void DownloadItemImpl::DestinationError(DownloadInterruptReason reason) {
968 // The DestinationError and Interrupt routines are being kept separate 928 // The DestinationError and Interrupt routines are being kept separate
969 // to allow for a future merging of the Cancel and Interrupt routines.. 929 // to allow for a future merging of the Cancel and Interrupt routines.
970 Interrupt(reason); 930 Interrupt(reason);
971 } 931 }
972 932
973 void DownloadItemImpl::DestinationCompleted(const std::string& final_hash) { 933 void DownloadItemImpl::DestinationCompleted(const std::string& final_hash) {
934 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
974 if (!IsInProgress()) 935 if (!IsInProgress())
975 return; 936 return;
976 OnAllDataSaved(final_hash); 937 OnAllDataSaved(final_hash);
977 MaybeCompleteDownload(); 938 MaybeCompleteDownload();
978 } 939 }
979 940
980 // **** Download progression cascade 941 // **** Download progression cascade
981 942
982 void DownloadItemImpl::Init(bool active, 943 void DownloadItemImpl::Init(bool active,
983 DownloadType download_type) { 944 DownloadType download_type) {
(...skipping 12 matching lines...) Expand all
996 // See if it's set programmatically. 957 // See if it's set programmatically.
997 file_name = forced_file_path_.AsUTF8Unsafe(); 958 file_name = forced_file_path_.AsUTF8Unsafe();
998 // Possibly has a 'download' attribute for the anchor. 959 // Possibly has a 'download' attribute for the anchor.
999 if (file_name.empty()) 960 if (file_name.empty())
1000 file_name = suggested_filename_; 961 file_name = suggested_filename_;
1001 // From the URL file name. 962 // From the URL file name.
1002 if (file_name.empty()) 963 if (file_name.empty())
1003 file_name = GetURL().ExtractFileName(); 964 file_name = GetURL().ExtractFileName();
1004 } 965 }
1005 966
1006 bound_net_log_.BeginEvent( 967 base::Callback<base::Value*(net::NetLog::LogLevel)> active_data = base::Bind(
1007 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, 968 &ItemActivatedNetLogCallback, this, download_type, &file_name);
1008 base::Bind(&ItemActivatedNetLogCallback, 969 if (active) {
1009 this, download_type, &file_name)); 970 bound_net_log_.BeginEvent(
1010 971 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, active_data);
1011 // If this is not an active download, end the ACTIVE event now. 972 } else {
1012 if (!active) {
1013 bound_net_log_.AddEvent( 973 bound_net_log_.AddEvent(
1014 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, 974 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, active_data);
1015 net::NetLog::Int64Callback("db_handle", db_handle_));
1016
1017 bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE);
1018 } 975 }
1019 976
1020 VLOG(20) << __FUNCTION__ << "() " << DebugString(true); 977 VLOG(20) << __FUNCTION__ << "() " << DebugString(true);
1021 } 978 }
1022 979
1023 // We're starting the download. 980 // We're starting the download.
1024 void DownloadItemImpl::Start(scoped_ptr<DownloadFile> file) { 981 void DownloadItemImpl::Start(scoped_ptr<DownloadFile> file) {
1025 DCHECK(!download_file_.get()); 982 DCHECK(!download_file_.get());
1026 DCHECK(file.get()); 983 DCHECK(file.get());
1027 download_file_ = file.Pass(); 984 download_file_ = file.Pass();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 const FilePath& intermediate_path) { 1019 const FilePath& intermediate_path) {
1063 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1020 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1064 1021
1065 // If the |target_path| is empty, then we consider this download to be 1022 // If the |target_path| is empty, then we consider this download to be
1066 // canceled. 1023 // canceled.
1067 if (target_path.empty()) { 1024 if (target_path.empty()) {
1068 Cancel(true); 1025 Cancel(true);
1069 return; 1026 return;
1070 } 1027 }
1071 1028
1029 VLOG(20) << __FUNCTION__ << " " << target_path.value() << " " << disposition
1030 << " " << danger_type << " " << DebugString(true);
1031
1072 target_path_ = target_path; 1032 target_path_ = target_path;
1073 target_disposition_ = disposition; 1033 target_disposition_ = disposition;
1074 SetDangerType(danger_type); 1034 SetDangerType(danger_type);
1075 // TODO(asanka): SetDangerType() doesn't need to send a notification here. 1035 // TODO(asanka): SetDangerType() doesn't need to send a notification here.
1076 1036
1077 // We want the intermediate and target paths to refer to the same directory so 1037 // We want the intermediate and target paths to refer to the same directory so
1078 // that they are both on the same device and subject to same 1038 // that they are both on the same device and subject to same
1079 // space/permission/availability constraints. 1039 // space/permission/availability constraints.
1080 DCHECK(intermediate_path.DirName() == target_path.DirName()); 1040 DCHECK(intermediate_path.DirName() == target_path.DirName());
1081 1041
(...skipping 22 matching lines...) Expand all
1104 base::Bind(&DownloadFile::Rename, 1064 base::Bind(&DownloadFile::Rename,
1105 // Safe because we control download file lifetime. 1065 // Safe because we control download file lifetime.
1106 base::Unretained(download_file_.get()), 1066 base::Unretained(download_file_.get()),
1107 intermediate_path, false, callback)); 1067 intermediate_path, false, callback));
1108 } 1068 }
1109 1069
1110 void DownloadItemImpl::OnDownloadRenamedToIntermediateName( 1070 void DownloadItemImpl::OnDownloadRenamedToIntermediateName(
1111 DownloadInterruptReason reason, 1071 DownloadInterruptReason reason,
1112 const FilePath& full_path) { 1072 const FilePath& full_path) {
1113 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1073 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1074 VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
1114 if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) { 1075 if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) {
1115 Interrupt(reason); 1076 Interrupt(reason);
1116 } else { 1077 } else {
1117 SetFullPath(full_path); 1078 SetFullPath(full_path);
1118 UpdateObservers(); 1079 delegate_->ShowDownloadInBrowser(this);
1119 } 1080 }
1120 1081
1121 delegate_->DownloadRenamedToIntermediateName(this); 1082 MaybeCompleteDownload();
1122 } 1083 }
1123 1084
1124 // When SavePackage downloads MHTML to GData (see 1085 // When SavePackage downloads MHTML to GData (see
1125 // SavePackageFilePickerChromeOS), GData calls MaybeCompleteDownload() like it 1086 // SavePackageFilePickerChromeOS), GData calls MaybeCompleteDownload() like it
1126 // does for non-SavePackage downloads, but SavePackage downloads never satisfy 1087 // does for non-SavePackage downloads, but SavePackage downloads never satisfy
1127 // IsDownloadReadyForCompletion(). GDataDownloadObserver manually calls 1088 // IsDownloadReadyForCompletion(). GDataDownloadObserver manually calls
1128 // DownloadItem::UpdateObservers() when the upload completes so that SavePackage 1089 // DownloadItem::UpdateObservers() when the upload completes so that SavePackage
1129 // notices that the upload has completed and runs its normal Finish() pathway. 1090 // notices that the upload has completed and runs its normal Finish() pathway.
1130 // MaybeCompleteDownload() is never the mechanism by which SavePackage completes 1091 // MaybeCompleteDownload() is never the mechanism by which SavePackage completes
1131 // downloads. SavePackage always uses its own Finish() to mark downloads 1092 // downloads. SavePackage always uses its own Finish() to mark downloads
1132 // complete. 1093 // complete.
1133 void DownloadItemImpl::MaybeCompleteDownload() { 1094 void DownloadItemImpl::MaybeCompleteDownload() {
1134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1095 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1135 1096
1136 if (!IsDownloadReadyForCompletion()) 1097 if (!IsDownloadReadyForCompletion())
1137 return; 1098 return;
1138 1099
1139 // TODO(rdsmith): DCHECK that we only pass through this point 1100 // TODO(rdsmith): DCHECK that we only pass through this point
1140 // once per download. The natural way to do this is by a state 1101 // once per download. The natural way to do this is by a state
1141 // transition on the DownloadItem. 1102 // transition on the DownloadItem.
1142 1103
1143 // Confirm we're in the proper set of states to be here; 1104 // Confirm we're in the proper set of states to be here;
1144 // have all data, have a history handle, (validated or safe). 1105 // have all data, have a history handle, (validated or safe).
1145 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_); 1106 DCHECK_EQ(IN_PROGRESS_INTERNAL, state_);
1146 DCHECK_NE(DownloadItem::DANGEROUS, GetSafetyState()); 1107 DCHECK_NE(DownloadItem::DANGEROUS, GetSafetyState());
1147 DCHECK(all_data_saved_); 1108 DCHECK(all_data_saved_);
1148 DCHECK(is_persisted_);
1149
1150 delegate_->UpdatePersistence(this);
1151 1109
1152 OnDownloadCompleting(); 1110 OnDownloadCompleting();
1153 } 1111 }
1154 1112
1155 // Called by MaybeCompleteDownload() when it has determined that the download 1113 // Called by MaybeCompleteDownload() when it has determined that the download
1156 // is ready for completion. 1114 // is ready for completion.
1157 void DownloadItemImpl::OnDownloadCompleting() { 1115 void DownloadItemImpl::OnDownloadCompleting() {
1158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1159 1117
1160 if (state_ != IN_PROGRESS_INTERNAL) 1118 if (state_ != IN_PROGRESS_INTERNAL)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1218 1176
1219 if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) { 1177 if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) {
1220 Interrupt(reason); 1178 Interrupt(reason);
1221 return; 1179 return;
1222 } 1180 }
1223 1181
1224 // full_path is now the current and target file path. 1182 // full_path is now the current and target file path.
1225 DCHECK(!full_path.empty()); 1183 DCHECK(!full_path.empty());
1226 target_path_ = full_path; 1184 target_path_ = full_path;
1227 SetFullPath(full_path); 1185 SetFullPath(full_path);
1228 delegate_->DownloadRenamedToFinalName(this);
1229 1186
1230 ReleaseDownloadFile(); 1187 ReleaseDownloadFile();
1231 } 1188 }
1232 1189
1233 void DownloadItemImpl::ReleaseDownloadFile() { 1190 void DownloadItemImpl::ReleaseDownloadFile() {
1234 // Complete the download and release the DownloadFile. 1191 // Complete the download and release the DownloadFile.
1235 DCHECK(!is_save_package_download_); 1192 DCHECK(!is_save_package_download_);
1236 DCHECK(download_file_.get()); 1193 DCHECK(download_file_.get());
1237 BrowserThread::PostTask( 1194 BrowserThread::PostTask(
1238 BrowserThread::FILE, FROM_HERE, 1195 BrowserThread::FILE, FROM_HERE,
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 // has been released. 1256 // has been released.
1300 if (!is_save_package_download_ && download_file_.get()) { 1257 if (!is_save_package_download_ && download_file_.get()) {
1301 BrowserThread::PostTask( 1258 BrowserThread::PostTask(
1302 BrowserThread::FILE, FROM_HERE, 1259 BrowserThread::FILE, FROM_HERE,
1303 // Will be deleted at end of task execution. 1260 // Will be deleted at end of task execution.
1304 base::Bind(&DownloadFileCancel, base::Passed(download_file_.Pass()))); 1261 base::Bind(&DownloadFileCancel, base::Passed(download_file_.Pass())));
1305 } 1262 }
1306 } 1263 }
1307 1264
1308 bool DownloadItemImpl::IsDownloadReadyForCompletion() { 1265 bool DownloadItemImpl::IsDownloadReadyForCompletion() {
1266 VLOG(20) << __FUNCTION__ << " " << AllDataSaved()
1267 << " " << (GetSafetyState() != DownloadItem::DANGEROUS)
1268 << " " << (state_ == IN_PROGRESS_INTERNAL)
1269 << " " << !GetTargetFilePath().empty()
1270 << " " << (target_path_.DirName() == current_path_.DirName());
1309 // If we don't have all the data, the download is not ready for 1271 // If we don't have all the data, the download is not ready for
1310 // completion. 1272 // completion.
1311 if (!AllDataSaved()) 1273 if (!AllDataSaved())
1312 return false; 1274 return false;
1313 1275
1314 // If the download is dangerous, but not yet validated, it's not ready for 1276 // If the download is dangerous, but not yet validated, it's not ready for
1315 // completion. 1277 // completion.
1316 if (GetSafetyState() == DownloadItem::DANGEROUS) 1278 if (GetSafetyState() == DownloadItem::DANGEROUS)
1317 return false; 1279 return false;
1318 1280
1319 // If the download isn't active (e.g. has been cancelled) it's not 1281 // If the download isn't active (e.g. has been cancelled) it's not
1320 // ready for completion. 1282 // ready for completion.
1321 if (state_ != IN_PROGRESS_INTERNAL) 1283 if (state_ != IN_PROGRESS_INTERNAL)
1322 return false; 1284 return false;
1323 1285
1324 // If the download hasn't been inserted into the history system 1286 // If the target filename hasn't been determined, then it's not ready for
1325 // (which occurs strictly after file name determination, intermediate 1287 // completion. This is checked in ReadyForDownloadCompletionDone().
1326 // file rename, and UI display) then it's not ready for completion. 1288 if (GetTargetFilePath().empty())
1327 if (!IsPersisted()) 1289 return false;
1290
1291 // This is checked in NeedsRename(). Without this conditional,
1292 // browser_tests:DownloadTest.DownloadMimeType fails the DCHECK.
1293 if (target_path_.DirName() != current_path_.DirName())
1328 return false; 1294 return false;
1329 1295
1330 return true; 1296 return true;
1331 } 1297 }
1332 1298
1333 bool DownloadItemImpl::NeedsRename() const { 1299 bool DownloadItemImpl::NeedsRename() const {
1334 DCHECK(target_path_.DirName() == current_path_.DirName()); 1300 DCHECK(target_path_.DirName() == current_path_.DirName());
1335 return target_path_ != current_path_; 1301 return target_path_ != current_path_;
1336 } 1302 }
1337 1303
(...skipping 24 matching lines...) Expand all
1362 case CANCELLED_INTERNAL: 1328 case CANCELLED_INTERNAL:
1363 bound_net_log_.AddEvent( 1329 bound_net_log_.AddEvent(
1364 net::NetLog::TYPE_DOWNLOAD_ITEM_CANCELED, 1330 net::NetLog::TYPE_DOWNLOAD_ITEM_CANCELED,
1365 base::Bind(&ItemCanceledNetLogCallback, received_bytes_, 1331 base::Bind(&ItemCanceledNetLogCallback, received_bytes_,
1366 &hash_state_)); 1332 &hash_state_));
1367 break; 1333 break;
1368 default: 1334 default:
1369 break; 1335 break;
1370 } 1336 }
1371 1337
1372 VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true); 1338 VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true)
1339 << " " << InternalToExternalState(old_state)
1340 << " " << InternalToExternalState(state_);
1373 1341
1374 // Only update observers on user visible state changes. 1342 // Only update observers on user visible state changes.
1375 if (InternalToExternalState(old_state) != InternalToExternalState(state_)) 1343 if (InternalToExternalState(old_state) != InternalToExternalState(state_))
1376 UpdateObservers(); 1344 UpdateObservers();
1377 1345
1378 bool is_done = (state_ != IN_PROGRESS_INTERNAL && 1346 bool is_done = (state_ != IN_PROGRESS_INTERNAL &&
1379 state_ != COMPLETING_INTERNAL); 1347 state_ != COMPLETING_INTERNAL);
1380 bool was_done = (old_state != IN_PROGRESS_INTERNAL && 1348 bool was_done = (old_state != IN_PROGRESS_INTERNAL &&
1381 old_state != COMPLETING_INTERNAL); 1349 old_state != COMPLETING_INTERNAL);
1382 if (is_done && !was_done) 1350 if (is_done && !was_done)
(...skipping 15 matching lines...) Expand all
1398 } 1366 }
1399 } 1367 }
1400 1368
1401 void DownloadItemImpl::SetFullPath(const FilePath& new_path) { 1369 void DownloadItemImpl::SetFullPath(const FilePath& new_path) {
1402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1370 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1403 VLOG(20) << __FUNCTION__ << "()" 1371 VLOG(20) << __FUNCTION__ << "()"
1404 << " new_path = \"" << new_path.value() << "\"" 1372 << " new_path = \"" << new_path.value() << "\""
1405 << " " << DebugString(true); 1373 << " " << DebugString(true);
1406 DCHECK(!new_path.empty()); 1374 DCHECK(!new_path.empty());
1407 current_path_ = new_path; 1375 current_path_ = new_path;
1376 UpdateObservers();
1408 1377
1409 bound_net_log_.AddEvent( 1378 bound_net_log_.AddEvent(
1410 net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED, 1379 net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED,
1411 base::Bind(&ItemRenamedNetLogCallback, &current_path_, &new_path)); 1380 base::Bind(&ItemRenamedNetLogCallback, &current_path_, &new_path));
1412 } 1381 }
1413 1382
1414 // static 1383 // static
1415 DownloadItem::DownloadState DownloadItemImpl::InternalToExternalState( 1384 DownloadItem::DownloadState DownloadItemImpl::InternalToExternalState(
1416 DownloadInternalState internal_state) { 1385 DownloadInternalState internal_state) {
1417 switch (internal_state) { 1386 switch (internal_state) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 return "CANCELLED"; 1432 return "CANCELLED";
1464 case INTERRUPTED_INTERNAL: 1433 case INTERRUPTED_INTERNAL:
1465 return "INTERRUPTED"; 1434 return "INTERRUPTED";
1466 default: 1435 default:
1467 NOTREACHED() << "Unknown download state " << state; 1436 NOTREACHED() << "Unknown download state " << state;
1468 return "unknown"; 1437 return "unknown";
1469 }; 1438 };
1470 } 1439 }
1471 1440
1472 } // namespace content 1441 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698