blob: 1d2991027512bd6e22b4a8ffbfb7855b127a5ef6 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_MODEL_H_
#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_MODEL_H_
#include <stdint.h>
#include <string>
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "chrome/browser/download/download_ui_model.h"
#include "components/download/public/common/download_item.h"
#include "components/safe_browsing/buildflags.h"
#include "components/safe_browsing/content/common/proto/download_file_types.pb.h"
namespace content {
class WebContents;
} // namespace content
// Implementation of DownloadUIModel that wrappers around a |DownloadItem*|. As
// such, the caller is expected to ensure that the |download| passed into the
// constructor outlives this |DownloadItemModel|. In addition, multiple
// DownloadItemModel objects could be wrapping the same DownloadItem.
class DownloadItemModel : public DownloadUIModel,
public download::DownloadItem::Observer {
public:
#if !BUILDFLAG(IS_ANDROID)
// How long an ephemeral warning is displayed on the download bubble on
// Desktop.
static constexpr base::TimeDelta kEphemeralWarningLifetimeOnBubble =
base::Minutes(5);
#endif
static DownloadUIModelPtr Wrap(download::DownloadItem* download);
static DownloadUIModelPtr Wrap(
download::DownloadItem* download,
std::unique_ptr<DownloadUIModel::StatusTextBuilderBase>
status_text_builder);
// Constructs a DownloadItemModel. The caller must ensure that |download|
// outlives this object.
// TODO(crbug.com/401528883): Make all usages explicitly specify which strings
// are desired by providing a StatusTextBuilderBase instance.
explicit DownloadItemModel(download::DownloadItem* download);
DownloadItemModel(download::DownloadItem* download,
std::unique_ptr<DownloadUIModel::StatusTextBuilderBase>
status_text_builder);
DownloadItemModel(const DownloadItemModel&) = delete;
DownloadItemModel& operator=(const DownloadItemModel&) = delete;
~DownloadItemModel() override;
// DownloadUIModel implementation.
ContentId GetContentId() const override;
Profile* profile() const override;
std::u16string GetTabProgressStatusText() const override;
int64_t GetCompletedBytes() const override;
int64_t GetTotalBytes() const override;
int64_t GetUploadedBytes() const override;
int PercentComplete() const override;
bool IsDangerous() const override;
bool MightBeMalicious() const override;
bool IsMalicious() const override;
bool IsInsecure() const override;
bool ShouldShowDownloadStartedAnimation() const override;
bool ShouldNotifyUI() const override;
bool WasUINotified() const override;
void SetWasUINotified(bool should_notify) override;
bool WasActionedOn() const override;
void SetActionedOn(bool actioned_on) override;
bool WasUIWarningShown() const override;
void SetWasUIWarningShown(bool was_ui_warning_shown) override;
std::optional<base::Time> GetEphemeralWarningUiShownTime() const override;
void SetEphemeralWarningUiShownTime(std::optional<base::Time> time) override;
bool ShouldPreferOpeningInBrowser() override;
void SetShouldPreferOpeningInBrowser(bool preference) override;
safe_browsing::DownloadFileType::DangerLevel GetDangerLevel() const override;
void SetDangerLevel(
safe_browsing::DownloadFileType::DangerLevel danger_level) override;
download::DownloadItem::InsecureDownloadStatus GetInsecureDownloadStatus()
const override;
void OpenUsingPlatformHandler() override;
#if BUILDFLAG(IS_CHROMEOS)
std::optional<DownloadCommands::Command> MaybeGetMediaAppAction()
const override;
void OpenUsingMediaApp() override;
#endif
bool IsBeingRevived() const override;
void SetIsBeingRevived(bool is_being_revived) override;
const download::DownloadItem* GetDownloadItem() const override;
base::FilePath GetFileNameToReportUser() const override;
base::FilePath GetTargetFilePath() const override;
void OpenDownload() override;
download::DownloadItem::DownloadState GetState() const override;
bool IsPaused() const override;
download::DownloadDangerType GetDangerType() const override;
bool GetOpenWhenComplete() const override;
bool IsOpenWhenCompleteByPolicy() const override;
bool TimeRemaining(base::TimeDelta* remaining) const override;
base::Time GetStartTime() const override;
base::Time GetEndTime() const override;
bool GetOpened() const override;
void SetOpened(bool opened) override;
bool IsDone() const override;
void Pause() override;
void Cancel(bool user_cancel) override;
void Resume() override;
void Remove() override;
void SetOpenWhenComplete(bool open) override;
base::FilePath GetFullPath() const override;
bool CanResume() const override;
bool AllDataSaved() const override;
bool GetFileExternallyRemoved() const override;
GURL GetURL() const override;
bool HasUserGesture() const override;
offline_items_collection::FailState GetLastFailState() const override;
#if !BUILDFLAG(IS_ANDROID)
bool IsCommandEnabled(const DownloadCommands* download_commands,
DownloadCommands::Command command) const override;
bool IsCommandChecked(const DownloadCommands* download_commands,
DownloadCommands::Command command) const override;
void ExecuteCommand(DownloadCommands* download_commands,
DownloadCommands::Command command) override;
TailoredWarningType GetTailoredWarningType() const override;
DangerUiPattern GetDangerUiPattern() const override;
bool ShouldShowInUi() const override;
void SetShouldShowInUi(bool should_show) override;
bool ShouldShowInBubble() const override;
#endif
bool IsEphemeralWarning() const override;
#if BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION)
void CompleteSafeBrowsingScan() override;
void ReviewScanningVerdict(content::WebContents* web_contents) override;
#endif
bool ShouldShowDropdown() const override;
void DetermineAndSetShouldPreferOpeningInBrowser(
const base::FilePath& target_path,
bool is_filetype_handled_safely) override;
bool IsTopLevelEncryptedArchive() const override;
bool IsExtensionDownload() const override;
// download::DownloadItem::Observer implementation.
void OnDownloadUpdated(download::DownloadItem* download) override;
void OnDownloadOpened(download::DownloadItem* download) override;
void OnDownloadDestroyed(download::DownloadItem* download) override;
private:
// DownloadUIModel implementation.
std::string GetMimeType() const override;
// The DownloadItem that this model represents. Note that DownloadItemModel
// itself shouldn't maintain any state since there can be more than one
// DownloadItemModel in use with the same DownloadItem.
raw_ptr<download::DownloadItem> download_;
};
#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_MODEL_H_