910e62b5创建于 1月15日历史提交
// Copyright 2013 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/download_stats.h"

#include "base/metrics/histogram_functions.h"
#include "base/metrics/user_metrics.h"
#include "base/notreached.h"
#include "build/build_config.h"
#include "chrome/browser/download/download_ui_model.h"
#include "chrome/browser/profiles/profile.h"
#include "components/download/public/common/download_content.h"
#include "components/download/public/common/download_stats.h"
#include "components/profile_metrics/browser_profile_type.h"
#include "components/safe_browsing/buildflags.h"

#if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
#include "components/safe_browsing/content/browser/download/download_stats.h"
#endif

void RecordDownloadSource(ChromeDownloadSource source) {
  base::UmaHistogramEnumeration("Download.SourcesChrome", source,
                                CHROME_DOWNLOAD_SOURCE_LAST_ENTRY);
}

void MaybeRecordDangerousDownloadWarningShown(DownloadUIModel& model) {
  if (!model.IsDangerous() ||
      model.GetState() == download::DownloadItem::DownloadState::CANCELLED) {
    return;
  }
  if (model.WasUIWarningShown()) {
    return;
  }
  base::UmaHistogramEnumeration("Download.ShowedDownloadWarning",
                                model.GetDangerType(),
                                download::DOWNLOAD_DANGER_TYPE_MAX);
#if !BUILDFLAG(IS_ANDROID)
  base::UmaHistogramEnumeration("SBClientDownload.TailoredWarningType",
                                model.GetTailoredWarningType());
#endif  // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
  safe_browsing::RecordDangerousDownloadWarningShown(
      model.GetDangerType(), model.GetTargetFilePath(),
      model.GetURL().SchemeIs(url::kHttpsScheme), model.HasUserGesture());
#endif

  model.SetWasUIWarningShown(true);
}

void RecordDownloadOpen(ChromeDownloadOpenMethod open_method,
                        const std::string& mime_type_string) {
  base::RecordAction(base::UserMetricsAction("Download.Open"));
  base::UmaHistogramEnumeration("Download.OpenMethod", open_method,
                                DOWNLOAD_OPEN_METHOD_LAST_ENTRY);
  download::DownloadContent download_content =
      download::DownloadContentFromMimeType(
          mime_type_string, /*record_content_subcategory=*/false);
  base::UmaHistogramEnumeration("Download.Open.ContentType", download_content);
}

void RecordDatabaseAvailability(bool is_available) {
  base::UmaHistogramBoolean("Download.Database.IsAvailable", is_available);
}

void RecordDownloadPathGeneration(DownloadPathGenerationEvent event,
                                  bool is_transient) {
  if (is_transient) {
    base::UmaHistogramEnumeration("Download.PathGenerationEvent.Transient",
                                  event, DownloadPathGenerationEvent::COUNT);
  } else {
    base::UmaHistogramEnumeration("Download.PathGenerationEvent.UserDownload",
                                  event, DownloadPathGenerationEvent::COUNT);
  }
}

void RecordDownloadPathValidation(download::PathValidationResult result,
                                  bool is_transient) {
  if (is_transient) {
    base::UmaHistogramEnumeration("Download.PathValidationResult.Transient",
                                  result,
                                  download::PathValidationResult::COUNT);
  } else {
    base::UmaHistogramEnumeration("Download.PathValidationResult.UserDownload",
                                  result,
                                  download::PathValidationResult::COUNT);
  }
}

void RecordDownloadCancelReason(DownloadCancelReason reason) {
  base::UmaHistogramEnumeration("Download.CancelReason", reason);
}

void RecordDownloadShelfDragInfo(DownloadDragInfo drag_info) {
  base::UmaHistogramEnumeration("Download.Shelf.DragInfo", drag_info,
                                DownloadDragInfo::COUNT);
}

void RecordDownloadStartPerProfileType(Profile* profile) {
  base::UmaHistogramEnumeration(
      "Download.Start.PerProfileType",
      profile_metrics::GetBrowserProfileType(profile));
}

#if BUILDFLAG(IS_ANDROID)
// Records whether the download dialog is shown to the user.
void RecordDownloadPromptStatus(DownloadPromptStatus status) {
  base::UmaHistogramEnumeration("MobileDownload.DownloadPromptStatus", status,
                                DownloadPromptStatus::MAX_VALUE);
}
#endif  // BUILDFLAG(IS_ANDROID)

DownloadUiContextMenuAction DownloadCommandToContextMenuAction(
    DownloadCommands::Command download_command,
    bool clicked) {
  switch (download_command) {
    case DownloadCommands::Command::SHOW_IN_FOLDER:
      return clicked ? DownloadUiContextMenuAction::kShowInFolderClicked
                     : DownloadUiContextMenuAction::kShowInFolderEnabled;
    case DownloadCommands::Command::OPEN_WHEN_COMPLETE:
      return clicked ? DownloadUiContextMenuAction::kOpenWhenCompleteClicked
                     : DownloadUiContextMenuAction::kOpenWhenCompleteEnabled;
    case DownloadCommands::Command::ALWAYS_OPEN_TYPE:
      return clicked ? DownloadUiContextMenuAction::kAlwaysOpenTypeClicked
                     : DownloadUiContextMenuAction::kAlwaysOpenTypeEnabled;
    case DownloadCommands::Command::PLATFORM_OPEN:
      return clicked ? DownloadUiContextMenuAction::kPlatformOpenClicked
                     : DownloadUiContextMenuAction::kPlatformOpenEnabled;
    case DownloadCommands::Command::CANCEL:
      return clicked ? DownloadUiContextMenuAction::kCancelClicked
                     : DownloadUiContextMenuAction::kCancelEnabled;
    case DownloadCommands::Command::PAUSE:
      return clicked ? DownloadUiContextMenuAction::kPauseClicked
                     : DownloadUiContextMenuAction::kPauseEnabled;
    case DownloadCommands::Command::RESUME:
      return clicked ? DownloadUiContextMenuAction::kResumeClicked
                     : DownloadUiContextMenuAction::kResumeEnabled;
    case DownloadCommands::Command::DISCARD:
      return clicked ? DownloadUiContextMenuAction::kDiscardClicked
                     : DownloadUiContextMenuAction::kDiscardEnabled;
    case DownloadCommands::Command::KEEP:
      return clicked ? DownloadUiContextMenuAction::kKeepClicked
                     : DownloadUiContextMenuAction::kKeepEnabled;
    case DownloadCommands::Command::LEARN_MORE_SCANNING:
      return clicked ? DownloadUiContextMenuAction::kLearnMoreScanningClicked
                     : DownloadUiContextMenuAction::kLearnMoreScanningEnabled;
    case DownloadCommands::Command::LEARN_MORE_INTERRUPTED:
      return clicked
                 ? DownloadUiContextMenuAction::kLearnMoreInterruptedClicked
                 : DownloadUiContextMenuAction::kLearnMoreInterruptedEnabled;
    case DownloadCommands::Command::LEARN_MORE_INSECURE_DOWNLOAD:
      return clicked ? DownloadUiContextMenuAction::
                           kLearnMoreInsecureDownloadClicked
                     : DownloadUiContextMenuAction::
                           kLearnMoreInsecureDownloadEnabled;
    case DownloadCommands::Command::COPY_TO_CLIPBOARD:
      return clicked ? DownloadUiContextMenuAction::kCopyToClipboardClicked
                     : DownloadUiContextMenuAction::kCopyToClipboardEnabled;
    case DownloadCommands::Command::DEEP_SCAN:
      return clicked ? DownloadUiContextMenuAction::kDeepScanClicked
                     : DownloadUiContextMenuAction::kDeepScanEnabled;
    case DownloadCommands::BYPASS_DEEP_SCANNING_AND_OPEN:
      return clicked ? DownloadUiContextMenuAction::kBypassDeepScanningClicked
                     : DownloadUiContextMenuAction::kBypassDeepScanningEnabled;

    // The following are not actually visible in the context menu so should
    // never be logged.
    case DownloadCommands::Command::REVIEW:
    case DownloadCommands::Command::RETRY:
    case DownloadCommands::Command::CANCEL_DEEP_SCAN:
    case DownloadCommands::Command::LEARN_MORE_DOWNLOAD_BLOCKED:
    case DownloadCommands::Command::OPEN_SAFE_BROWSING_SETTING:
    case DownloadCommands::Command::BYPASS_DEEP_SCANNING:
    case DownloadCommands::Command::OPEN_WITH_MEDIA_APP:
    case DownloadCommands::Command::EDIT_WITH_MEDIA_APP:
      NOTREACHED();
  }
}