| Index: content/browser/download/download_stats.cc
|
| diff --git a/content/browser/download/download_stats.cc b/content/browser/download/download_stats.cc
|
| index 2da505a27a00e85e61d46f28f4c2995e71b8d3ce..cad6cbe4bac245454522b354b6c6a05f10a2bbcb 100644
|
| --- a/content/browser/download/download_stats.cc
|
| +++ b/content/browser/download/download_stats.cc
|
| @@ -8,9 +8,12 @@
|
| #include "base/string_util.h"
|
| #include "content/browser/download/download_resource_handler.h"
|
| #include "content/public/browser/download_interrupt_reasons.h"
|
| +#include "net/http/http_content_disposition.h"
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| // All possible error codes from the network module. Note that the error codes
|
| // are all positive (since histograms expect positive sample values).
|
| const int kAllInterruptReasonCodes[] = {
|
| @@ -19,6 +22,52 @@ const int kAllInterruptReasonCodes[] = {
|
| #undef INTERRUPT_REASON
|
| };
|
|
|
| +// These values are based on net::HttpContentDisposition::ParseResult values.
|
| +// Values other than HEADER_PRESENT and IS_VALID are only measured if |IS_VALID|
|
| +// is true.
|
| +enum ContentDispositionCountTypes {
|
| + // Count of downloads which had a Content-Disposition headers. The total
|
| + // number of downloads is measured by UNTHROTTLED_COUNT.
|
| + CONTENT_DISPOSITION_HEADER_PRESENT = 0,
|
| +
|
| + // At least one of 'name', 'filename' or 'filenae*' attributes were valid and
|
| + // yielded a non-empty filename.
|
| + CONTENT_DISPOSITION_IS_VALID,
|
| +
|
| + // The following enum values correspond to
|
| + // net::HttpContentDisposition::ParseResult.
|
| + CONTENT_DISPOSITION_HAS_DISPOSITION_TYPE,
|
| + CONTENT_DISPOSITION_HAS_UNKNOWN_TYPE,
|
| + CONTENT_DISPOSITION_HAS_NAME,
|
| + CONTENT_DISPOSITION_HAS_FILENAME,
|
| + CONTENT_DISPOSITION_HAS_EXT_FILENAME,
|
| + CONTENT_DISPOSITION_HAS_NON_ASCII_STRINGS,
|
| + CONTENT_DISPOSITION_HAS_PERCENT_ENCODED_STRINGS,
|
| + CONTENT_DISPOSITION_HAS_RFC2047_ENCODED_STRINGS,
|
| +
|
| + // Only have the 'name' attribute is present.
|
| + CONTENT_DISPOSITION_HAS_NAME_ONLY,
|
| +
|
| + CONTENT_DISPOSITION_LAST_ENTRY
|
| +};
|
| +
|
| +void RecordContentDispositionCount(ContentDispositionCountTypes type,
|
| + bool record) {
|
| + if (!record)
|
| + return;
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "Download.ContentDisposition", type, CONTENT_DISPOSITION_LAST_ENTRY);
|
| +}
|
| +
|
| +void RecordContentDispositionCountFlag(
|
| + ContentDispositionCountTypes type,
|
| + int flags_to_test,
|
| + net::HttpContentDisposition::ParseResultFlags flag) {
|
| + RecordContentDispositionCount(type, (flags_to_test & flag) == flag);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| void RecordDownloadCount(DownloadCountTypes type) {
|
| UMA_HISTOGRAM_ENUMERATION(
|
| "Download.Counts", type, DOWNLOAD_COUNT_TYPES_LAST_ENTRY);
|
| @@ -252,6 +301,53 @@ void RecordDownloadMimeType(const std::string& mime_type_string) {
|
| DOWNLOAD_CONTENT_MAX);
|
| }
|
|
|
| +void RecordDownloadContentDisposition(
|
| + const std::string& content_disposition_string) {
|
| + if (content_disposition_string.empty())
|
| + return;
|
| + net::HttpContentDisposition content_disposition(
|
| + content_disposition_string, "");
|
| + int result = content_disposition.parse_result_flags();
|
| +
|
| + bool is_valid = !content_disposition.filename().empty();
|
| + RecordContentDispositionCount(CONTENT_DISPOSITION_HEADER_PRESENT, true);
|
| + RecordContentDispositionCount(CONTENT_DISPOSITION_IS_VALID, is_valid);
|
| + if (!is_valid)
|
| + return;
|
| +
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_DISPOSITION_TYPE, result,
|
| + net::HttpContentDisposition::HAS_DISPOSITION_TYPE);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_UNKNOWN_TYPE, result,
|
| + net::HttpContentDisposition::HAS_UNKNOWN_DISPOSITION_TYPE);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_NAME, result,
|
| + net::HttpContentDisposition::HAS_NAME);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_FILENAME, result,
|
| + net::HttpContentDisposition::HAS_FILENAME);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_EXT_FILENAME, result,
|
| + net::HttpContentDisposition::HAS_EXT_FILENAME);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_NON_ASCII_STRINGS, result,
|
| + net::HttpContentDisposition::HAS_NON_ASCII_STRINGS);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_PERCENT_ENCODED_STRINGS, result,
|
| + net::HttpContentDisposition::HAS_PERCENT_ENCODED_STRINGS);
|
| + RecordContentDispositionCountFlag(
|
| + CONTENT_DISPOSITION_HAS_RFC2047_ENCODED_STRINGS, result,
|
| + net::HttpContentDisposition::HAS_RFC2047_ENCODED_STRINGS);
|
| +
|
| + RecordContentDispositionCount(
|
| + CONTENT_DISPOSITION_HAS_NAME_ONLY,
|
| + (result & (net::HttpContentDisposition::HAS_NAME |
|
| + net::HttpContentDisposition::HAS_FILENAME |
|
| + net::HttpContentDisposition::HAS_EXT_FILENAME)) ==
|
| + net::HttpContentDisposition::HAS_NAME);
|
| +}
|
| +
|
| void RecordFileThreadReceiveBuffers(size_t num_buffers) {
|
| UMA_HISTOGRAM_CUSTOM_COUNTS(
|
| "Download.FileThreadReceiveBuffers", num_buffers, 1,
|
|
|