| // 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(); |
| } |
| } |