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.

#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_
#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_

#include "build/build_config.h"
#include "chrome/browser/download/download_commands.h"
#include "chrome/browser/download/download_prompt_status.h"
#include "components/download/public/common/download_danger_type.h"
#include "components/download/public/common/download_path_reservation_tracker.h"

class Profile;

// Used for counting UMA stats. Similar to content's
// download_stats::DownloadInitiattionSources but from the chrome layer.
enum ChromeDownloadSource {
  // The download was initiated by navigating to a URL (e.g. by user click).
  DOWNLOAD_INITIATED_BY_NAVIGATION = 0,

  // The download was initiated by invoking a context menu within a page.
  DOWNLOAD_INITIATED_BY_CONTEXT_MENU,

  // Formerly DOWNLOAD_INITIATED_BY_WEBSTORE_INSTALLER.
  CHROME_DOWNLOAD_SOURCE_UNUSED_2,

  // Formerly DOWNLOAD_INITIATED_BY_IMAGE_BURNER.
  CHROME_DOWNLOAD_SOURCE_UNUSED_3,

  // Formerly DOWNLOAD_INITIATED_BY_PLUGIN_INSTALLER.
  CHROME_DOWNLOAD_SOURCE_UNUSED_4,

  // The download was initiated by the PDF plugin.
  DOWNLOAD_INITIATED_BY_PDF_SAVE,

  // Formerly DOWNLOAD_INITIATED_BY_EXTENSION.
  CHROME_DOWNLOAD_SOURCE_UNUSED_6,

  CHROME_DOWNLOAD_SOURCE_LAST_ENTRY
};

// How a download was opened. Note that a download could be opened multiple
// times.
enum ChromeDownloadOpenMethod {
  // The download was opened using the platform handler. There was no special
  // handling for this download.
  DOWNLOAD_OPEN_METHOD_DEFAULT_PLATFORM = 0,

  // The download was opened using the browser bypassing the system handler.
  DOWNLOAD_OPEN_METHOD_DEFAULT_BROWSER,

  // The user chose to open the download using the system handler even though
  // the preferred method was to open the download using the browser.
  DOWNLOAD_OPEN_METHOD_USER_PLATFORM,

  // The download was opened using a rename handler.
  DOWNLOAD_OPEN_METHOD_RENAME_HANDLER,

  // The download was opened with the Media App on ChromeOS.
  DOWNLOAD_OPEN_METHOD_MEDIA_APP,

  DOWNLOAD_OPEN_METHOD_LAST_ENTRY
};

// Records path generation behavior in download target determination process.
// Used in UMA, do not remove, change or reuse existing entries.
// Update histograms.xml and enums.xml when adding entries.
enum class DownloadPathGenerationEvent {
  // Use existing virtual path provided to download target determiner.
  USE_EXISTING_VIRTUAL_PATH = 0,
  // Use the force path provided to download target determiner.
  USE_FORCE_PATH,
  // Use last prompt directory.
  USE_LAST_PROMPT_DIRECTORY,
  // Use the default download directory.
  USE_DEFAULTL_DOWNLOAD_DIRECTORY,
  // No valid target file path is provided, the download will fail soon.
  NO_VALID_PATH,

  COUNT
};

// Records reasons that will result in the download being canceled with
// DOWNLOAD_INTERRUPT_REASON_USER_CANCELED.
// Used in UMA, do not remove, change or reuse existing entries.
// Update histograms.xml and enums.xml when adding entries.
enum class DownloadCancelReason {
  // Existed download path after download target determination.
  kExistingDownloadPath = 0,
  // Canceled due to download target determiner confirmation result.
  kTargetConfirmationResult = 1,
  // Canceled due to no valid virtual path.
  kNoValidPath = 2,
  // Canceled due to no insecure download.
  kInsecureDownload = 3,
  // Canceled due to failed path reservacation.
  kFailedPathReservation = 4,
  // Canceled due to empty local path.
  kEmptyLocalPath = 5,
  kMaxValue = kEmptyLocalPath
};

// Record initiation of a download from a specific source.
void RecordDownloadSource(ChromeDownloadSource source);

// Record that a download warning was shown, if the download was dangerous. To
// avoid double-logging, it checks DownloadItemModel::WasUIWarningShown() first.
// Also records the warning shown by setting WasUIWarningShown to true on the
// model.
void MaybeRecordDangerousDownloadWarningShown(DownloadUIModel& model);

// Record that a download was opened.
void RecordDownloadOpen(ChromeDownloadOpenMethod open_method,
                        const std::string& mime_type_string);

// Record if the database is available to provide the next download id before
// starting all downloads.
void RecordDatabaseAvailability(bool is_available);

// Record download path generation event in target determination process.
void RecordDownloadPathGeneration(DownloadPathGenerationEvent event,
                                  bool is_transient);

// Record path validation result.
void RecordDownloadPathValidation(download::PathValidationResult result,
                                  bool is_transient);

// Record download cancel reason.
void RecordDownloadCancelReason(DownloadCancelReason reason);

// Records information related to dragging completed downloads from the
// shelf/bubble. Used in UMA. Do not remove, change or reuse existing entries.
// Update histograms.xml and enums.xml when adding entries.
enum class DownloadDragInfo {
  // A download starting to be dragged. It is possible the drag-and-drop will
  // not complete depending on the user's actions.
  DRAG_STARTED,
  // As a point of reference for dragged downloads, this represents when a
  // download completes on the shelf/bubble. This omits downloads that are
  // immediately removed from the shelf/bubble when they complete.
  DOWNLOAD_COMPLETE,

  COUNT
};

// Records either when a drag event is initiated by the user or, as a point of
// reference, when a download completes on the shelf/bubble.
void RecordDownloadShelfDragInfo(DownloadDragInfo drag_info);
void RecordDownloadBubbleDragInfo(DownloadDragInfo drag_info);

void RecordDownloadStartPerProfileType(Profile* profile);

#if BUILDFLAG(IS_ANDROID)
// Records whether the download dialog is shown to the user.
void RecordDownloadPromptStatus(DownloadPromptStatus status);
#endif  // BUILDFLAG(IS_ANDROID)

enum class DownloadUiContextMenuAction {
  // Drop down button for download UI context menu is visible
  kDropDownShown = 0,
  // Drop down button was pressed
  kDropDownPressed = 1,
  kShowInFolderEnabled = 2,
  kShowInFolderClicked = 3,
  kOpenWhenCompleteEnabled = 4,
  kOpenWhenCompleteClicked = 5,
  kAlwaysOpenTypeEnabled = 6,
  kAlwaysOpenTypeClicked = 7,
  kPlatformOpenEnabled = 8,
  kPlatformOpenClicked = 9,
  kCancelEnabled = 10,
  kCancelClicked = 11,
  kPauseEnabled = 12,
  kPauseClicked = 13,
  kResumeEnabled = 14,
  kResumeClicked = 15,
  kDiscardEnabled = 16,
  kDiscardClicked = 17,
  kKeepEnabled = 18,
  kKeepClicked = 19,
  kLearnMoreScanningEnabled = 20,
  kLearnMoreScanningClicked = 21,
  kLearnMoreInterruptedEnabled = 22,
  kLearnMoreInterruptedClicked = 23,
  kLearnMoreInsecureDownloadEnabled = 24,
  kLearnMoreInsecureDownloadClicked = 25,
  kCopyToClipboardEnabled = 26,
  kCopyToClipboardClicked = 27,
  // kAnnotateEnabled = 28,
  // kAnnotateClicked = 29,
  kDeepScanEnabled = 30,
  kDeepScanClicked = 31,
  kBypassDeepScanningEnabled = 32,
  kBypassDeepScanningClicked = 33,
  // kReviewEnabled = 34,
  // kReviewClicked = 35,
  kNotReached = 36,  // Should not be possible to hit
  kMaxValue = kNotReached
};

DownloadUiContextMenuAction DownloadCommandToContextMenuAction(
    DownloadCommands::Command download_command,
    bool clicked);

#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_