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 #include "content/browser/download/download_item_impl.h" | 5 #include "content/browser/download/download_item_impl.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 delegate_delayed_complete_(false), | 252 delegate_delayed_complete_(false), |
253 bound_net_log_(bound_net_log), | 253 bound_net_log_(bound_net_log), |
254 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 254 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
255 delegate_->Attach(); | 255 delegate_->Attach(); |
256 Init(true /* actively downloading */, | 256 Init(true /* actively downloading */, |
257 download_net_logs::SRC_NEW_DOWNLOAD); | 257 download_net_logs::SRC_NEW_DOWNLOAD); |
258 | 258 |
259 // Link the event sources. | 259 // Link the event sources. |
260 bound_net_log_.AddEvent( | 260 bound_net_log_.AddEvent( |
261 net::NetLog::TYPE_DOWNLOAD_URL_REQUEST, | 261 net::NetLog::TYPE_DOWNLOAD_URL_REQUEST, |
262 make_scoped_refptr(new net::NetLogSourceParameter( | 262 info.request_bound_net_log.source().ToEventParametersCallback()); |
263 "source_dependency", | |
264 info.request_bound_net_log.source()))); | |
265 | 263 |
266 info.request_bound_net_log.AddEvent( | 264 info.request_bound_net_log.AddEvent( |
267 net::NetLog::TYPE_DOWNLOAD_STARTED, | 265 net::NetLog::TYPE_DOWNLOAD_STARTED, |
268 make_scoped_refptr(new net::NetLogSourceParameter( | 266 bound_net_log_.source().ToEventParametersCallback()); |
269 "source_dependency", | |
270 bound_net_log_.source()))); | |
271 } | 267 } |
272 | 268 |
273 // Constructing for the "Save Page As..." feature: | 269 // Constructing for the "Save Page As..." feature: |
274 DownloadItemImpl::DownloadItemImpl(Delegate* delegate, | 270 DownloadItemImpl::DownloadItemImpl(Delegate* delegate, |
275 const FilePath& path, | 271 const FilePath& path, |
276 const GURL& url, | 272 const GURL& url, |
277 bool is_otr, | 273 bool is_otr, |
278 DownloadId download_id, | 274 DownloadId download_id, |
279 const std::string& mime_type, | 275 const std::string& mime_type, |
280 const net::BoundNetLog& bound_net_log) | 276 const net::BoundNetLog& bound_net_log) |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 DCHECK_EQ(DANGEROUS, GetSafetyState()); | 397 DCHECK_EQ(DANGEROUS, GetSafetyState()); |
402 | 398 |
403 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", | 399 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", |
404 GetDangerType(), | 400 GetDangerType(), |
405 content::DOWNLOAD_DANGER_TYPE_MAX); | 401 content::DOWNLOAD_DANGER_TYPE_MAX); |
406 | 402 |
407 safety_state_ = DANGEROUS_BUT_VALIDATED; | 403 safety_state_ = DANGEROUS_BUT_VALIDATED; |
408 | 404 |
409 bound_net_log_.AddEvent( | 405 bound_net_log_.AddEvent( |
410 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, | 406 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, |
411 make_scoped_refptr(new download_net_logs::ItemCheckedParameters( | 407 base::Bind(&download_net_logs::ItemCheckedCallback, |
412 GetDangerType(), GetSafetyState()))); | 408 GetDangerType(), GetSafetyState())); |
413 | 409 |
414 UpdateObservers(); | 410 UpdateObservers(); |
415 | 411 |
416 delegate_->MaybeCompleteDownload(this); | 412 delegate_->MaybeCompleteDownload(this); |
417 } | 413 } |
418 | 414 |
419 void DownloadItemImpl::ProgressComplete(int64 bytes_so_far, | 415 void DownloadItemImpl::ProgressComplete(int64 bytes_so_far, |
420 const std::string& final_hash) { | 416 const std::string& final_hash) { |
421 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 417 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
422 | 418 |
(...skipping 15 matching lines...) Expand all Loading... |
438 received_bytes_ = bytes_so_far; | 434 received_bytes_ = bytes_so_far; |
439 | 435 |
440 // If we've received more data than we were expecting (bad server info?), | 436 // If we've received more data than we were expecting (bad server info?), |
441 // revert to 'unknown size mode'. | 437 // revert to 'unknown size mode'. |
442 if (received_bytes_ > total_bytes_) | 438 if (received_bytes_ > total_bytes_) |
443 total_bytes_ = 0; | 439 total_bytes_ = 0; |
444 | 440 |
445 if (bound_net_log_.IsLoggingAllEvents()) { | 441 if (bound_net_log_.IsLoggingAllEvents()) { |
446 bound_net_log_.AddEvent( | 442 bound_net_log_.AddEvent( |
447 net::NetLog::TYPE_DOWNLOAD_ITEM_UPDATED, | 443 net::NetLog::TYPE_DOWNLOAD_ITEM_UPDATED, |
448 make_scoped_refptr( | 444 net::NetLog::Int64Callback("bytes_so_far", received_bytes_)); |
449 new download_net_logs::ItemUpdatedParameters(received_bytes_))); | |
450 } | 445 } |
451 } | 446 } |
452 | 447 |
453 // Updates from the download thread may have been posted while this download | 448 // Updates from the download thread may have been posted while this download |
454 // was being cancelled in the UI thread, so we'll accept them unless we're | 449 // was being cancelled in the UI thread, so we'll accept them unless we're |
455 // complete. | 450 // complete. |
456 void DownloadItemImpl::UpdateProgress(int64 bytes_so_far, | 451 void DownloadItemImpl::UpdateProgress(int64 bytes_so_far, |
457 int64 bytes_per_sec, | 452 int64 bytes_per_sec, |
458 const std::string& hash_state) { | 453 const std::string& hash_state) { |
459 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 454 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 if (state_ == new_state) | 548 if (state_ == new_state) |
554 return; | 549 return; |
555 | 550 |
556 DownloadState old_state = state_; | 551 DownloadState old_state = state_; |
557 state_ = new_state; | 552 state_ = new_state; |
558 | 553 |
559 switch (state_) { | 554 switch (state_) { |
560 case COMPLETE: | 555 case COMPLETE: |
561 bound_net_log_.AddEvent( | 556 bound_net_log_.AddEvent( |
562 net::NetLog::TYPE_DOWNLOAD_ITEM_FINISHED, | 557 net::NetLog::TYPE_DOWNLOAD_ITEM_FINISHED, |
563 make_scoped_refptr( | 558 base::Bind(&download_net_logs::ItemFinishedCallback, |
564 new download_net_logs::ItemFinishedParameters(received_bytes_, | 559 received_bytes_, &hash_)); |
565 hash_))); | |
566 break; | 560 break; |
567 case INTERRUPTED: | 561 case INTERRUPTED: |
568 bound_net_log_.AddEvent( | 562 bound_net_log_.AddEvent( |
569 net::NetLog::TYPE_DOWNLOAD_ITEM_INTERRUPTED, | 563 net::NetLog::TYPE_DOWNLOAD_ITEM_INTERRUPTED, |
570 make_scoped_refptr( | 564 base::Bind(&download_net_logs::ItemInterruptedCallback, |
571 new download_net_logs::ItemInterruptedParameters(last_reason_, | 565 last_reason_, received_bytes_, &hash_state_)); |
572 received_bytes_, | |
573 hash_state_))); | |
574 break; | 566 break; |
575 case CANCELLED: | 567 case CANCELLED: |
576 bound_net_log_.AddEvent( | 568 bound_net_log_.AddEvent( |
577 net::NetLog::TYPE_DOWNLOAD_ITEM_CANCELED, | 569 net::NetLog::TYPE_DOWNLOAD_ITEM_CANCELED, |
578 make_scoped_refptr( | 570 base::Bind(&download_net_logs::ItemCanceledCallback, |
579 new download_net_logs::ItemCanceledParameters(received_bytes_, | 571 received_bytes_, &hash_state_)); |
580 hash_state_))); | |
581 break; | 572 break; |
582 default: | 573 default: |
583 break; | 574 break; |
584 } | 575 } |
585 | 576 |
586 VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true); | 577 VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true); |
587 | 578 |
588 UpdateObservers(); | 579 UpdateObservers(); |
589 | 580 |
590 bool is_done = (state_ != IN_PROGRESS); | 581 bool is_done = (state_ != IN_PROGRESS); |
591 bool was_done = (old_state != IN_PROGRESS); | 582 bool was_done = (old_state != IN_PROGRESS); |
592 if (is_done && !was_done) | 583 if (is_done && !was_done) |
593 bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, NULL); | 584 bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE); |
594 } | 585 } |
595 | 586 |
596 void DownloadItemImpl::SetDangerType(content::DownloadDangerType danger_type) { | 587 void DownloadItemImpl::SetDangerType(content::DownloadDangerType danger_type) { |
597 danger_type_ = danger_type; | 588 danger_type_ = danger_type; |
598 // Notify observers if the safety state has changed as a result of the new | 589 // Notify observers if the safety state has changed as a result of the new |
599 // danger type. | 590 // danger type. |
600 SafetyState updated_value = IsDangerous() ? | 591 SafetyState updated_value = IsDangerous() ? |
601 DownloadItem::DANGEROUS : DownloadItem::SAFE; | 592 DownloadItem::DANGEROUS : DownloadItem::SAFE; |
602 if (updated_value != safety_state_) { | 593 if (updated_value != safety_state_) { |
603 safety_state_ = updated_value; | 594 safety_state_ = updated_value; |
604 bound_net_log_.AddEvent( | 595 bound_net_log_.AddEvent( |
605 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, | 596 net::NetLog::TYPE_DOWNLOAD_ITEM_SAFETY_STATE_UPDATED, |
606 make_scoped_refptr(new download_net_logs::ItemCheckedParameters( | 597 base::Bind(&download_net_logs::ItemCheckedCallback, |
607 GetDangerType(), GetSafetyState()))); | 598 GetDangerType(), GetSafetyState())); |
608 UpdateObservers(); | 599 UpdateObservers(); |
609 } | 600 } |
610 } | 601 } |
611 | 602 |
612 void DownloadItemImpl::SetFullPath(const FilePath& new_path) { | 603 void DownloadItemImpl::SetFullPath(const FilePath& new_path) { |
613 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 604 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
614 VLOG(20) << __FUNCTION__ << "()" | 605 VLOG(20) << __FUNCTION__ << "()" |
615 << " new_path = \"" << new_path.value() << "\"" | 606 << " new_path = \"" << new_path.value() << "\"" |
616 << " " << DebugString(true); | 607 << " " << DebugString(true); |
617 DCHECK(!new_path.empty()); | 608 DCHECK(!new_path.empty()); |
618 current_path_ = new_path; | 609 current_path_ = new_path; |
619 | 610 |
620 bound_net_log_.AddEvent( | 611 bound_net_log_.AddEvent( |
621 net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED, | 612 net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED, |
622 make_scoped_refptr( | 613 base::Bind(&download_net_logs::ItemRenamedCallback, |
623 new download_net_logs::ItemRenamedParameters( | 614 ¤t_path_, &new_path)); |
624 current_path_.AsUTF8Unsafe(), new_path.AsUTF8Unsafe()))); | |
625 } | 615 } |
626 | 616 |
627 void DownloadItemImpl::Interrupted(int64 size, | 617 void DownloadItemImpl::Interrupted(int64 size, |
628 const std::string& hash_state, | 618 const std::string& hash_state, |
629 content::DownloadInterruptReason reason) { | 619 content::DownloadInterruptReason reason) { |
630 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
631 | 621 |
632 if (!IsInProgress()) | 622 if (!IsInProgress()) |
633 return; | 623 return; |
634 | 624 |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 // Possibly has a 'download' attribute for the anchor. | 950 // Possibly has a 'download' attribute for the anchor. |
961 if (file_name.empty()) | 951 if (file_name.empty()) |
962 file_name = suggested_filename_; | 952 file_name = suggested_filename_; |
963 // From the URL file name. | 953 // From the URL file name. |
964 if (file_name.empty()) | 954 if (file_name.empty()) |
965 file_name = GetURL().ExtractFileName(); | 955 file_name = GetURL().ExtractFileName(); |
966 } | 956 } |
967 | 957 |
968 bound_net_log_.BeginEvent( | 958 bound_net_log_.BeginEvent( |
969 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, | 959 net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, |
970 make_scoped_refptr(new download_net_logs::ItemActivatedParameters( | 960 base::Bind(&download_net_logs::ItemActivatedCallback, |
971 download_type, | 961 this, download_type, &file_name)); |
972 download_id_.local(), | |
973 GetOriginalUrl().spec(), | |
974 GetURL().spec(), | |
975 file_name, | |
976 GetDangerType(), | |
977 GetSafetyState(), | |
978 received_bytes_))); | |
979 | 962 |
980 // If this is not an active download, end the ACTIVE event now. | 963 // If this is not an active download, end the ACTIVE event now. |
981 if (!active) { | 964 if (!active) { |
982 bound_net_log_.AddEvent( | 965 bound_net_log_.AddEvent( |
983 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, | 966 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, |
984 make_scoped_refptr( | 967 net::NetLog::Int64Callback("db_handle", db_handle_)); |
985 new download_net_logs::ItemInHistoryParameters(db_handle_))); | |
986 | 968 |
987 bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, NULL); | 969 bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE); |
988 } | 970 } |
989 | 971 |
990 VLOG(20) << __FUNCTION__ << "() " << DebugString(true); | 972 VLOG(20) << __FUNCTION__ << "() " << DebugString(true); |
991 } | 973 } |
992 | 974 |
993 bool DownloadItemImpl::NeedsRename() const { | 975 bool DownloadItemImpl::NeedsRename() const { |
994 DCHECK(target_path_.DirName() == current_path_.DirName()); | 976 DCHECK(target_path_.DirName() == current_path_.DirName()); |
995 return target_path_ != current_path_; | 977 return target_path_ != current_path_; |
996 } | 978 } |
997 | 979 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 | 1108 |
1127 bool DownloadItemImpl::IsPersisted() const { | 1109 bool DownloadItemImpl::IsPersisted() const { |
1128 return is_persisted_; | 1110 return is_persisted_; |
1129 } | 1111 } |
1130 | 1112 |
1131 void DownloadItemImpl::SetDbHandle(int64 handle) { | 1113 void DownloadItemImpl::SetDbHandle(int64 handle) { |
1132 db_handle_ = handle; | 1114 db_handle_ = handle; |
1133 | 1115 |
1134 bound_net_log_.AddEvent( | 1116 bound_net_log_.AddEvent( |
1135 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, | 1117 net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY, |
1136 make_scoped_refptr( | 1118 net::NetLog::Int64Callback("db_handle", db_handle_)); |
1137 new download_net_logs::ItemInHistoryParameters(db_handle_))); | |
1138 } | 1119 } |
1139 | 1120 |
1140 int64 DownloadItemImpl::GetDbHandle() const { return db_handle_; } | 1121 int64 DownloadItemImpl::GetDbHandle() const { return db_handle_; } |
1141 bool DownloadItemImpl::IsPaused() const { return is_paused_; } | 1122 bool DownloadItemImpl::IsPaused() const { return is_paused_; } |
1142 bool DownloadItemImpl::GetOpenWhenComplete() const { | 1123 bool DownloadItemImpl::GetOpenWhenComplete() const { |
1143 return open_when_complete_; | 1124 return open_when_complete_; |
1144 } | 1125 } |
1145 void DownloadItemImpl::SetOpenWhenComplete(bool open) { | 1126 void DownloadItemImpl::SetOpenWhenComplete(bool open) { |
1146 open_when_complete_ = open; | 1127 open_when_complete_ = open; |
1147 } | 1128 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1202 std::map<const void*, ExternalData*>::iterator it = | 1183 std::map<const void*, ExternalData*>::iterator it = |
1203 external_data_map_.find(key); | 1184 external_data_map_.find(key); |
1204 | 1185 |
1205 if (it == external_data_map_.end()) { | 1186 if (it == external_data_map_.end()) { |
1206 external_data_map_[key] = data; | 1187 external_data_map_[key] = data; |
1207 } else if (it->second != data) { | 1188 } else if (it->second != data) { |
1208 delete it->second; | 1189 delete it->second; |
1209 it->second = data; | 1190 it->second = data; |
1210 } | 1191 } |
1211 } | 1192 } |
OLD | NEW |