1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Holds helpers for gathering UMA stats about downloads.
7 #ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_
8 #define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_
12 #include "base/basictypes.h"
13 #include "content/common/content_export.h"
14 #include "content/public/browser/download_danger_type.h"
15 #include "content/public/browser/download_interrupt_reasons.h"
26 // We keep a count of how often various events occur in the
27 // histogram "Download.Counts".
28 enum DownloadCountTypes
{
29 // Stale enum values left around so that values passed to UMA don't
31 DOWNLOAD_COUNT_UNUSED_0
= 0,
32 DOWNLOAD_COUNT_UNUSED_1
,
33 DOWNLOAD_COUNT_UNUSED_2
,
34 DOWNLOAD_COUNT_UNUSED_3
,
35 DOWNLOAD_COUNT_UNUSED_4
,
37 // Downloads that made it to DownloadResourceHandler
40 // Downloads that actually complete.
43 // Downloads that are cancelled before completion (user action or error).
46 // Downloads that are started. Should be equal to UNTHROTTLED_COUNT.
49 // Downloads that were interrupted by the OS.
52 // (Deprecated) Write sizes for downloads.
53 // This is equal to the number of samples in Download.WriteSize histogram.
54 DOWNLOAD_COUNT_UNUSED_10
,
56 // (Deprecated) Counts iterations of the BaseFile::AppendDataToFile() loop.
57 // This is equal to the number of samples in Download.WriteLoopCount
59 DOWNLOAD_COUNT_UNUSED_11
,
61 // Counts interruptions that happened at the end of the download.
62 INTERRUPTED_AT_END_COUNT
,
64 // Counts errors due to writes to BaseFiles that have been detached already.
65 // This can happen when saving web pages as complete packages. It happens
66 // when we get messages to append data to files that have already finished and
67 // been detached, but haven't yet been removed from the list of files in
69 APPEND_TO_DETACHED_FILE_COUNT
,
71 // Counts the number of instances where the downloaded file is missing after a
72 // successful invocation of ScanAndSaveDownloadedFile().
73 FILE_MISSING_AFTER_SUCCESSFUL_SCAN_COUNT
,
75 // (Deprecated) Count of downloads with a strong ETag and specified
76 // 'Accept-Ranges: bytes'.
77 DOWNLOAD_COUNT_UNUSED_15
,
79 // Count of downloads that didn't have a valid WebContents at the time it was
81 INTERRUPTED_WITHOUT_WEBCONTENTS
,
83 // Count of downloads that supplies a strong validator (implying byte-wise
84 // equivalence) and has a 'Accept-Ranges: bytes' header. These downloads are
85 // candidates for partial resumption.
86 STRONG_VALIDATOR_AND_ACCEPTS_RANGES
,
88 DOWNLOAD_COUNT_TYPES_LAST_ENTRY
92 // The download was initiated when the SavePackage system rejected
93 // a Save Page As ... by returning false from
94 // SavePackage::IsSaveableContents().
95 INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML
= 0,
97 // The download was initiated by a drag and drop from a drag-and-drop
98 // enabled web application.
99 INITIATED_BY_DRAG_N_DROP
,
101 // The download was initiated by explicit RPC from the renderer process
102 // (e.g. by Alt-click) through the IPC ViewHostMsg_DownloadUrl.
103 INITIATED_BY_RENDERER
,
105 // Fomerly INITIATED_BY_PEPPER_SAVE.
106 DOWNLOAD_SOURCE_UNUSED_3
,
108 // A request that was initiated as a result of resuming an interrupted
110 INITIATED_BY_RESUMPTION
,
112 DOWNLOAD_SOURCE_LAST_ENTRY
115 enum DownloadDiscardReason
{
116 // The download is being discarded due to a user action.
117 DOWNLOAD_DISCARD_DUE_TO_USER_ACTION
,
119 // The download is being discarded due to the browser being shut down.
120 DOWNLOAD_DISCARD_DUE_TO_SHUTDOWN
123 // Increment one of the above counts.
124 void RecordDownloadCount(DownloadCountTypes type
);
126 // Record initiation of a download from a specific source.
127 void RecordDownloadSource(DownloadSource source
);
129 // Record COMPLETED_COUNT and how long the download took.
130 void RecordDownloadCompleted(const base::TimeTicks
& start
, int64 download_len
);
132 // Record INTERRUPTED_COUNT, |reason|, |received| and |total| bytes.
133 void RecordDownloadInterrupted(DownloadInterruptReason reason
,
137 // Record that a download has been classified as malicious.
138 void RecordMaliciousDownloadClassified(DownloadDangerType danger_type
);
140 // Record a dangerous download accept event.
141 void RecordDangerousDownloadAccept(
142 DownloadDangerType danger_type
,
143 const base::FilePath
& file_path
);
145 // Record a dangerous download discard event.
146 void RecordDangerousDownloadDiscard(
147 DownloadDiscardReason reason
,
148 DownloadDangerType danger_type
,
149 const base::FilePath
& file_path
);
151 // Records the mime type of the download.
152 void RecordDownloadMimeType(const std::string
& mime_type
);
154 // Records usage of Content-Disposition header.
155 void RecordDownloadContentDisposition(const std::string
& content_disposition
);
157 // Record WRITE_SIZE_COUNT and data_len.
158 void RecordDownloadWriteSize(size_t data_len
);
160 // Record WRITE_LOOP_COUNT and number of loops.
161 void RecordDownloadWriteLoopCount(int count
);
163 // Record the number of buffers piled up by the IO thread
164 // before the file thread gets to draining them.
165 void RecordFileThreadReceiveBuffers(size_t num_buffers
);
167 // Record the bandwidth seen in DownloadResourceHandler
168 // |actual_bandwidth| and |potential_bandwidth| are in bytes/second.
169 void RecordBandwidth(double actual_bandwidth
, double potential_bandwidth
);
171 // Record the time of both the first open and all subsequent opens since the
172 // download completed.
173 void RecordOpen(const base::Time
& end
, bool first
);
175 // Record whether or not the server accepts ranges, and the download size. Also
176 // counts if a strong validator is supplied. The combination of range request
177 // support and ETag indicates downloads that are candidates for partial
179 void RecordAcceptsRanges(const std::string
& accepts_ranges
,
181 bool has_strong_validator
);
183 // Record the number of downloads removed by ClearAll.
184 void RecordClearAllSize(int size
);
186 // Record the number of completed unopened downloads when a download is opened.
187 void RecordOpensOutstanding(int size
);
189 // Record how long we block the file thread at a time.
190 void RecordContiguousWriteTime(base::TimeDelta time_blocked
);
192 // Record the percentage of time we had to block the network (i.e.
193 // how often, for each download, something other than the network
194 // was the bottleneck).
195 void RecordNetworkBlockage(base::TimeDelta resource_handler_lifetime
,
196 base::TimeDelta resource_handler_blocked_time
);
198 // Record overall bandwidth stats at the file end.
199 void RecordFileBandwidth(size_t length
,
200 base::TimeDelta disk_write_time
,
201 base::TimeDelta elapsed_time
);
203 // Record the result of a download file rename.
204 void RecordDownloadFileRenameResultAfterRetry(
205 base::TimeDelta time_since_first_failure
,
206 DownloadInterruptReason interrupt_reason
);
208 enum SavePackageEvent
{
209 // The user has started to save a page as a package.
210 SAVE_PACKAGE_STARTED
,
212 // The save package operation was cancelled.
213 SAVE_PACKAGE_CANCELLED
,
215 // The save package operation finished without being cancelled.
216 SAVE_PACKAGE_FINISHED
,
218 // The save package tried to write to an already completed file.
219 SAVE_PACKAGE_WRITE_TO_COMPLETED
,
221 // The save package tried to write to an already failed file.
222 SAVE_PACKAGE_WRITE_TO_FAILED
,
224 SAVE_PACKAGE_LAST_ENTRY
227 void RecordSavePackageEvent(SavePackageEvent event
);
229 enum OriginStateOnResumption
{
230 ORIGIN_STATE_ON_RESUMPTION_ADDITIONAL_REDIRECTS
= 1<<0,
231 ORIGIN_STATE_ON_RESUMPTION_VALIDATORS_CHANGED
= 1<<1,
232 ORIGIN_STATE_ON_RESUMPTION_CONTENT_DISPOSITION_CHANGED
= 1<<2,
233 ORIGIN_STATE_ON_RESUMPTION_MAX
= 1<<3
236 // Record the state of the origin information across a download resumption
237 // request. |state| is a combination of values from OriginStateOnResumption
239 void RecordOriginStateOnResumption(bool is_partial
,
242 } // namespace content
244 #endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_