| 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 "chrome/browser/download/download_item_model.h" | 5 #include "chrome/browser/download/download_item_model.h" |
| 6 | 6 |
| 7 #include "base/i18n/number_formatting.h" | 7 #include "base/i18n/number_formatting.h" |
| 8 #include "base/i18n/rtl.h" | 8 #include "base/i18n/rtl.h" |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 class DownloadItemModelData : public base::SupportsUserData::Data { | 41 class DownloadItemModelData : public base::SupportsUserData::Data { |
| 42 public: | 42 public: |
| 43 // Get the DownloadItemModelData object for |download|. Returns NULL if | 43 // Get the DownloadItemModelData object for |download|. Returns NULL if |
| 44 // there's no model data. | 44 // there's no model data. |
| 45 static const DownloadItemModelData* Get(const DownloadItem* download); | 45 static const DownloadItemModelData* Get(const DownloadItem* download); |
| 46 | 46 |
| 47 // Get the DownloadItemModelData object for |download|. Creates a model data | 47 // Get the DownloadItemModelData object for |download|. Creates a model data |
| 48 // object if not found. Always returns a non-NULL pointer, unless OOM. | 48 // object if not found. Always returns a non-NULL pointer, unless OOM. |
| 49 static DownloadItemModelData* GetOrCreate(DownloadItem* download); | 49 static DownloadItemModelData* GetOrCreate(DownloadItem* download); |
| 50 | 50 |
| 51 bool should_show_in_shelf() const { return should_show_in_shelf_; } | |
| 52 void set_should_show_in_shelf(bool should_show_in_shelf) { | |
| 53 should_show_in_shelf_ = should_show_in_shelf; | |
| 54 } | |
| 55 | |
| 56 bool was_ui_notified() const { return was_ui_notified_; } | |
| 57 void set_was_ui_notified(bool was_ui_notified) { | |
| 58 was_ui_notified_ = was_ui_notified; | |
| 59 } | |
| 60 | |
| 61 bool should_prefer_opening_in_browser() const { | |
| 62 return should_prefer_opening_in_browser_; | |
| 63 } | |
| 64 void set_should_prefer_opening_in_browser(bool preference) { | |
| 65 should_prefer_opening_in_browser_ = preference; | |
| 66 } | |
| 67 | |
| 68 private: | |
| 69 DownloadItemModelData(); | |
| 70 virtual ~DownloadItemModelData() {} | |
| 71 | |
| 72 static const char kKey[]; | |
| 73 | |
| 74 // Whether the download should be displayed in the download shelf. True by | 51 // Whether the download should be displayed in the download shelf. True by |
| 75 // default. | 52 // default. |
| 76 bool should_show_in_shelf_; | 53 bool should_show_in_shelf_; |
| 77 | 54 |
| 78 // Whether the UI has been notified about this download. | 55 // Whether the UI has been notified about this download. |
| 79 bool was_ui_notified_; | 56 bool was_ui_notified_; |
| 80 | 57 |
| 81 // Whether the download should be opened in the browser vs. the system handler | 58 // Whether the download should be opened in the browser vs. the system handler |
| 82 // for the file type. | 59 // for the file type. |
| 83 bool should_prefer_opening_in_browser_; | 60 bool should_prefer_opening_in_browser_; |
| 61 |
| 62 // Whether the download should be considered dangerous if SafeBrowsing doesn't |
| 63 // come up with a verdict. |
| 64 bool is_dangerous_file_based_on_type_; |
| 65 |
| 66 private: |
| 67 DownloadItemModelData(); |
| 68 virtual ~DownloadItemModelData() {} |
| 69 |
| 70 static const char kKey[]; |
| 84 }; | 71 }; |
| 85 | 72 |
| 86 // static | 73 // static |
| 87 const char DownloadItemModelData::kKey[] = "DownloadItemModelData key"; | 74 const char DownloadItemModelData::kKey[] = "DownloadItemModelData key"; |
| 88 | 75 |
| 89 // static | 76 // static |
| 90 const DownloadItemModelData* DownloadItemModelData::Get( | 77 const DownloadItemModelData* DownloadItemModelData::Get( |
| 91 const DownloadItem* download) { | 78 const DownloadItem* download) { |
| 92 return static_cast<const DownloadItemModelData*>(download->GetUserData(kKey)); | 79 return static_cast<const DownloadItemModelData*>(download->GetUserData(kKey)); |
| 93 } | 80 } |
| 94 | 81 |
| 95 // static | 82 // static |
| 96 DownloadItemModelData* DownloadItemModelData::GetOrCreate( | 83 DownloadItemModelData* DownloadItemModelData::GetOrCreate( |
| 97 DownloadItem* download) { | 84 DownloadItem* download) { |
| 98 DownloadItemModelData* data = | 85 DownloadItemModelData* data = |
| 99 static_cast<DownloadItemModelData*>(download->GetUserData(kKey)); | 86 static_cast<DownloadItemModelData*>(download->GetUserData(kKey)); |
| 100 if (data == NULL) { | 87 if (data == NULL) { |
| 101 data = new DownloadItemModelData(); | 88 data = new DownloadItemModelData(); |
| 102 download->SetUserData(kKey, data); | 89 download->SetUserData(kKey, data); |
| 103 } | 90 } |
| 104 return data; | 91 return data; |
| 105 } | 92 } |
| 106 | 93 |
| 107 DownloadItemModelData::DownloadItemModelData() | 94 DownloadItemModelData::DownloadItemModelData() |
| 108 : should_show_in_shelf_(true), | 95 : should_show_in_shelf_(true), |
| 109 was_ui_notified_(false), | 96 was_ui_notified_(false), |
| 110 should_prefer_opening_in_browser_(false) { | 97 should_prefer_opening_in_browser_(false), |
| 98 is_dangerous_file_based_on_type_(false) { |
| 111 } | 99 } |
| 112 | 100 |
| 113 base::string16 InterruptReasonStatusMessage(int reason) { | 101 base::string16 InterruptReasonStatusMessage(int reason) { |
| 114 int string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS; | 102 int string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS; |
| 115 | 103 |
| 116 switch (static_cast<content::DownloadInterruptReason>(reason)) { | 104 switch (static_cast<content::DownloadInterruptReason>(reason)) { |
| 117 case content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED: | 105 case content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED: |
| 118 string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS_ACCESS_DENIED; | 106 string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS_ACCESS_DENIED; |
| 119 break; | 107 break; |
| 120 case content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE: | 108 case content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE: |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 return false; | 541 return false; |
| 554 } | 542 } |
| 555 | 543 |
| 556 bool DownloadItemModel::ShouldShowDownloadStartedAnimation() const { | 544 bool DownloadItemModel::ShouldShowDownloadStartedAnimation() const { |
| 557 return !download_->IsSavePackageDownload() && | 545 return !download_->IsSavePackageDownload() && |
| 558 !download_crx_util::IsExtensionDownload(*download_); | 546 !download_crx_util::IsExtensionDownload(*download_); |
| 559 } | 547 } |
| 560 | 548 |
| 561 bool DownloadItemModel::ShouldShowInShelf() const { | 549 bool DownloadItemModel::ShouldShowInShelf() const { |
| 562 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); | 550 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); |
| 563 return !data || data->should_show_in_shelf(); | 551 return !data || data->should_show_in_shelf_; |
| 564 } | 552 } |
| 565 | 553 |
| 566 void DownloadItemModel::SetShouldShowInShelf(bool should_show) { | 554 void DownloadItemModel::SetShouldShowInShelf(bool should_show) { |
| 567 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); | 555 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); |
| 568 data->set_should_show_in_shelf(should_show); | 556 data->should_show_in_shelf_ = should_show; |
| 569 } | 557 } |
| 570 | 558 |
| 571 bool DownloadItemModel::ShouldNotifyUI() const { | 559 bool DownloadItemModel::ShouldNotifyUI() const { |
| 572 Profile* profile = | 560 Profile* profile = |
| 573 Profile::FromBrowserContext(download_->GetBrowserContext()); | 561 Profile::FromBrowserContext(download_->GetBrowserContext()); |
| 574 DownloadService* download_service = | 562 DownloadService* download_service = |
| 575 DownloadServiceFactory::GetForBrowserContext(profile); | 563 DownloadServiceFactory::GetForBrowserContext(profile); |
| 576 DownloadHistory* download_history = | 564 DownloadHistory* download_history = |
| 577 (download_service ? download_service->GetDownloadHistory() : NULL); | 565 (download_service ? download_service->GetDownloadHistory() : NULL); |
| 578 | 566 |
| 579 // The browser is only interested in new downloads. Ones that were restored | 567 // The browser is only interested in new downloads. Ones that were restored |
| 580 // from history are not displayed on the shelf. The downloads page | 568 // from history are not displayed on the shelf. The downloads page |
| 581 // independently listens for new downloads when it is active. Note that the UI | 569 // independently listens for new downloads when it is active. Note that the UI |
| 582 // will be notified of downloads even if they are not meant to be displayed on | 570 // will be notified of downloads even if they are not meant to be displayed on |
| 583 // the shelf (i.e. ShouldShowInShelf() returns false). This is because: | 571 // the shelf (i.e. ShouldShowInShelf() returns false). This is because: |
| 584 // * The shelf isn't the only UI. E.g. on Android, the UI is the system | 572 // * The shelf isn't the only UI. E.g. on Android, the UI is the system |
| 585 // DownloadManager. | 573 // DownloadManager. |
| 586 // * There are other UI activities that need to be performed. E.g. if the | 574 // * There are other UI activities that need to be performed. E.g. if the |
| 587 // download was initiated from a new tab, then that tab should be closed. | 575 // download was initiated from a new tab, then that tab should be closed. |
| 588 // | 576 // |
| 589 // TODO(asanka): If an interrupted download is restored from history and is | 577 // TODO(asanka): If an interrupted download is restored from history and is |
| 590 // resumed, then ideally the UI should be notified. | 578 // resumed, then ideally the UI should be notified. |
| 591 return !download_history || | 579 return !download_history || |
| 592 !download_history->WasRestoredFromHistory(download_); | 580 !download_history->WasRestoredFromHistory(download_); |
| 593 } | 581 } |
| 594 | 582 |
| 595 bool DownloadItemModel::WasUINotified() const { | 583 bool DownloadItemModel::WasUINotified() const { |
| 596 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); | 584 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); |
| 597 return data && data->was_ui_notified(); | 585 return data && data->was_ui_notified_; |
| 598 } | 586 } |
| 599 | 587 |
| 600 void DownloadItemModel::SetWasUINotified(bool was_ui_notified) { | 588 void DownloadItemModel::SetWasUINotified(bool was_ui_notified) { |
| 601 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); | 589 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); |
| 602 data->set_was_ui_notified(was_ui_notified); | 590 data->was_ui_notified_ = was_ui_notified; |
| 603 } | 591 } |
| 604 | 592 |
| 605 bool DownloadItemModel::ShouldPreferOpeningInBrowser() const { | 593 bool DownloadItemModel::ShouldPreferOpeningInBrowser() const { |
| 606 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); | 594 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); |
| 607 return data && data->should_prefer_opening_in_browser(); | 595 return data && data->should_prefer_opening_in_browser_; |
| 608 } | 596 } |
| 609 | 597 |
| 610 void DownloadItemModel::SetShouldPreferOpeningInBrowser(bool preference) { | 598 void DownloadItemModel::SetShouldPreferOpeningInBrowser(bool preference) { |
| 611 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); | 599 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); |
| 612 data->set_should_prefer_opening_in_browser(preference); | 600 data->should_prefer_opening_in_browser_ = preference; |
| 601 } |
| 602 |
| 603 bool DownloadItemModel::IsDangerousFileBasedOnType() const { |
| 604 const DownloadItemModelData* data = DownloadItemModelData::Get(download_); |
| 605 return data && data->is_dangerous_file_based_on_type_; |
| 606 } |
| 607 |
| 608 void DownloadItemModel::SetIsDangerousFileBasedOnType(bool dangerous) { |
| 609 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_); |
| 610 data->is_dangerous_file_based_on_type_ = dangerous; |
| 613 } | 611 } |
| 614 | 612 |
| 615 base::string16 DownloadItemModel::GetProgressSizesString() const { | 613 base::string16 DownloadItemModel::GetProgressSizesString() const { |
| 616 base::string16 size_ratio; | 614 base::string16 size_ratio; |
| 617 int64 size = GetCompletedBytes(); | 615 int64 size = GetCompletedBytes(); |
| 618 int64 total = GetTotalBytes(); | 616 int64 total = GetTotalBytes(); |
| 619 if (total > 0) { | 617 if (total > 0) { |
| 620 ui::DataUnits amount_units = ui::GetByteDisplayUnits(total); | 618 ui::DataUnits amount_units = ui::GetByteDisplayUnits(total); |
| 621 base::string16 simple_size = ui::FormatBytesWithUnits(size, amount_units, fa
lse); | 619 base::string16 simple_size = ui::FormatBytesWithUnits(size, amount_units, fa
lse); |
| 622 | 620 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 if (!download_service) | 693 if (!download_service) |
| 696 return; | 694 return; |
| 697 | 695 |
| 698 ChromeDownloadManagerDelegate* delegate = | 696 ChromeDownloadManagerDelegate* delegate = |
| 699 download_service->GetDownloadManagerDelegate(); | 697 download_service->GetDownloadManagerDelegate(); |
| 700 if (!delegate) | 698 if (!delegate) |
| 701 return; | 699 return; |
| 702 delegate->OpenDownloadUsingPlatformHandler(download_); | 700 delegate->OpenDownloadUsingPlatformHandler(download_); |
| 703 RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_USER_PLATFORM); | 701 RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_USER_PLATFORM); |
| 704 } | 702 } |
| OLD | NEW |