chromium/chrome/browser/download/android/insecure_download_infobar_delegate.cc

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/download/android/insecure_download_infobar_delegate.h"

#include <memory>
#include <utility>

#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/single_thread_task_runner.h"
#include "chrome/browser/android/android_theme_resources.h"
#include "chrome/grit/generated_resources.h"
#include "components/download/public/common/download_item.h"
#include "components/infobars/android/confirm_infobar.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/infobars/core/infobar.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/strings/grit/ui_strings.h"

using InsecureDownloadStatus = download::DownloadItem::InsecureDownloadStatus;

// static
void InsecureDownloadInfoBarDelegate::Create(
    infobars::ContentInfoBarManager* infobar_manager,
    const base::FilePath& basename,
    download::DownloadItem::InsecureDownloadStatus insecure_download_status,
    ResultCallback callback) {
  infobar_manager->AddInfoBar(std::make_unique<infobars::ConfirmInfoBar>(
      base::WrapUnique(new InsecureDownloadInfoBarDelegate(
          basename, insecure_download_status, std::move(callback)))));
}

InsecureDownloadInfoBarDelegate::InsecureDownloadInfoBarDelegate(
    const base::FilePath& basename,
    download::DownloadItem::InsecureDownloadStatus insecure_download_status,
    ResultCallback callback)
    : insecure_download_status_(insecure_download_status),
      callback_(std::move(callback)) {
  message_text_ =
      l10n_util::GetStringFUTF16(IDS_PROMPT_CONFIRM_INSECURE_DOWNLOAD,
                                 base::UTF8ToUTF16(basename.value()));
}

InsecureDownloadInfoBarDelegate::~InsecureDownloadInfoBarDelegate() = default;

infobars::InfoBarDelegate::InfoBarIdentifier
InsecureDownloadInfoBarDelegate::GetIdentifier() const {
  return INSECURE_DOWNLOAD_INFOBAR_DELEGATE_ANDROID;
}

int InsecureDownloadInfoBarDelegate::GetIconId() const {
  return IDR_ANDROID_INFOBAR_WARNING;
}

bool InsecureDownloadInfoBarDelegate::ShouldExpire(
    const NavigationDetails& details) const {
  return false;
}

void InsecureDownloadInfoBarDelegate::InfoBarDismissed() {
  PostReply(false);
}

std::u16string InsecureDownloadInfoBarDelegate::GetMessageText() const {
  return message_text_;
}

std::u16string InsecureDownloadInfoBarDelegate::GetButtonLabel(
    InfoBarButton button) const {
  if (insecure_download_status_ == InsecureDownloadStatus::WARN) {
    return l10n_util::GetStringUTF16(
        button == BUTTON_OK ? IDS_CONFIRM_DOWNLOAD : IDS_DISCARD_DOWNLOAD);
  }

  DCHECK_EQ(insecure_download_status_, InsecureDownloadStatus::BLOCK);
  // Default button is Discard when blocking.
  return l10n_util::GetStringUTF16(button == BUTTON_OK ? IDS_DISCARD_DOWNLOAD
                                                       : IDS_CONFIRM_DOWNLOAD);
}

bool InsecureDownloadInfoBarDelegate::Accept() {
  if (insecure_download_status_ == InsecureDownloadStatus::WARN) {
    PostReply(true);
    return true;
  }

  DCHECK_EQ(insecure_download_status_, InsecureDownloadStatus::BLOCK);
  // Default button is Discard when blocking.
  PostReply(false);
  return true;
}

bool InsecureDownloadInfoBarDelegate::Cancel() {
  if (insecure_download_status_ == InsecureDownloadStatus::WARN) {
    PostReply(false);
    return true;
  }

  CHECK_EQ(insecure_download_status_, InsecureDownloadStatus::BLOCK);
  // Cancel button is Keep when blocking.
  PostReply(true);
  return true;
}

void InsecureDownloadInfoBarDelegate::PostReply(bool should_download) {
  DCHECK(callback_);
  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE, base::BindOnce(std::move(callback_), should_download));
}