Index: net/base/mime_sniffer.cc |
=================================================================== |
--- net/base/mime_sniffer.cc (revision 33932) |
+++ net/base/mime_sniffer.cc (working copy) |
@@ -99,18 +99,6 @@ |
#include "googleurl/src/gurl.h" |
#include "net/base/mime_util.h" |
-namespace { |
- |
-class SnifferHistogram : public LinearHistogram { |
- public: |
- SnifferHistogram(const char* name, int array_size) |
- : LinearHistogram(name, 0, array_size - 1, array_size) { |
- SetFlags(kUmaTargetedHistogramFlag); |
- } |
-}; |
- |
-} // namespace |
- |
namespace net { |
// We aren't interested in looking at more than 512 bytes of content |
@@ -218,6 +206,15 @@ |
MAGIC_HTML_TAG("p") // Mozilla |
}; |
+static scoped_refptr<Histogram> UMASnifferHistogramGet(const char* name, |
+ int array_size) { |
+ scoped_refptr<Histogram> counter = |
+ LinearHistogram::LinearHistogramFactoryGet( |
+ name, 1, array_size - 1, array_size); |
+ counter->SetFlags(kUmaTargetedHistogramFlag); |
+ return counter; |
+} |
+ |
static bool MatchMagicNumber(const char* content, size_t size, |
const MagicNumber* magic_entry, |
std::string* result) { |
@@ -273,22 +270,24 @@ |
if (!IsAsciiWhitespace(*pos)) |
break; |
} |
- static SnifferHistogram counter("mime_sniffer.kSniffableTags2", |
- arraysize(kSniffableTags)); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kSniffableTags2", |
+ arraysize(kSniffableTags)); |
// |pos| now points to first non-whitespace character (or at end). |
return CheckForMagicNumbers(pos, end - pos, |
kSniffableTags, arraysize(kSniffableTags), |
- &counter, result); |
+ counter.get(), result); |
} |
static bool SniffForMagicNumbers(const char* content, size_t size, |
std::string* result) { |
// Check our big table of Magic Numbers |
- static SnifferHistogram counter("mime_sniffer.kMagicNumbers2", |
- arraysize(kMagicNumbers)); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kMagicNumbers2", |
+ arraysize(kMagicNumbers)); |
return CheckForMagicNumbers(content, size, |
kMagicNumbers, arraysize(kMagicNumbers), |
- &counter, result); |
+ counter.get(), result); |
} |
// Byte order marks |
@@ -320,8 +319,9 @@ |
// We want to skip XML processing instructions (of the form "<?xml ...") |
// and stop at the first "plain" tag, then make a decision on the mime-type |
// based on the name (or possibly attributes) of that tag. |
- static SnifferHistogram counter("mime_sniffer.kMagicXML2", |
- arraysize(kMagicXML)); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kMagicXML2", |
+ arraysize(kMagicXML)); |
const int kMaxTagIterations = 5; |
for (int i = 0; i < kMaxTagIterations && pos < end; ++i) { |
pos = reinterpret_cast<const char*>(memchr(pos, '<', end - pos)); |
@@ -341,7 +341,7 @@ |
if (CheckForMagicNumbers(pos, end - pos, |
kMagicXML, arraysize(kMagicXML), |
- &counter, result)) |
+ counter.get(), result)) |
return true; |
// TODO(evanm): handle RSS 1.0, which is an RDF format and more difficult |
@@ -388,12 +388,13 @@ |
static bool LooksBinary(const char* content, size_t size) { |
// First, we look for a BOM. |
- static SnifferHistogram counter("mime_sniffer.kByteOrderMark2", |
- arraysize(kByteOrderMark)); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kByteOrderMark2", |
+ arraysize(kByteOrderMark)); |
std::string unused; |
if (CheckForMagicNumbers(content, size, |
kByteOrderMark, arraysize(kByteOrderMark), |
- &counter, &unused)) { |
+ counter.get(), &unused)) { |
// If there is BOM, we think the buffer is not binary. |
return false; |
} |
@@ -422,17 +423,18 @@ |
// Firefox rejects a mime type if it is exactly */* |
"*/*", |
}; |
- static SnifferHistogram counter("mime_sniffer.kUnknownMimeTypes2", |
- arraysize(kUnknownMimeTypes) + 1); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kUnknownMimeTypes2", |
+ arraysize(kUnknownMimeTypes) + 1); |
for (size_t i = 0; i < arraysize(kUnknownMimeTypes); ++i) { |
if (mime_type == kUnknownMimeTypes[i]) { |
- counter.Add(i); |
+ counter->Add(i); |
return true; |
} |
} |
if (mime_type.find('/') == std::string::npos) { |
// Firefox rejects a mime type if it does not contain a slash |
- counter.Add(arraysize(kUnknownMimeTypes)); |
+ counter->Add(arraysize(kUnknownMimeTypes)); |
return true; |
} |
return false; |
@@ -441,7 +443,8 @@ |
// Sniff a crx (chrome extension) file. |
static bool SniffCRX(const char* content, size_t content_size, const GURL& url, |
const std::string& type_hint, std::string* result) { |
- static SnifferHistogram counter("mime_sniffer.kSniffCRX", 3); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kSniffCRX", 3); |
// Technically, the crx magic number is just Cr24, but the bytes after that |
// are a version number which changes infrequently. Including it in the |
@@ -459,7 +462,7 @@ |
const int kExtensionLength = arraysize(kCRXExtension) - 1; // ignore null |
if (url.path().rfind(kCRXExtension, std::string::npos, kExtensionLength) == |
url.path().size() - kExtensionLength) { |
- counter.Add(1); |
+ counter->Add(1); |
} else { |
return false; |
} |
@@ -467,7 +470,7 @@ |
if (CheckForMagicNumbers(content, content_size, |
kCRXMagicNumbers, arraysize(kCRXMagicNumbers), |
NULL, result)) { |
- counter.Add(2); |
+ counter->Add(2); |
} else { |
return false; |
} |
@@ -476,15 +479,15 @@ |
} |
bool ShouldSniffMimeType(const GURL& url, const std::string& mime_type) { |
- static SnifferHistogram should_sniff_counter( |
- "mime_sniffer.ShouldSniffMimeType2", 3); |
+ static scoped_refptr<Histogram> should_sniff_counter = |
+ UMASnifferHistogramGet("mime_sniffer.ShouldSniffMimeType2", 3); |
// We are willing to sniff the mime type for HTTP, HTTPS, and FTP |
bool sniffable_scheme = url.is_empty() || |
url.SchemeIs("http") || |
url.SchemeIs("https") || |
url.SchemeIs("ftp"); |
if (!sniffable_scheme) { |
- should_sniff_counter.Add(1); |
+ should_sniff_counter->Add(1); |
return false; |
} |
@@ -501,23 +504,24 @@ |
"text/xml", |
"application/xml", |
}; |
- static SnifferHistogram counter("mime_sniffer.kSniffableTypes2", |
- arraysize(kSniffableTypes) + 1); |
+ static scoped_refptr<Histogram> counter = |
+ UMASnifferHistogramGet("mime_sniffer.kSniffableTypes2", |
+ arraysize(kSniffableTypes) + 1); |
for (size_t i = 0; i < arraysize(kSniffableTypes); ++i) { |
if (mime_type == kSniffableTypes[i]) { |
- counter.Add(i); |
- should_sniff_counter.Add(2); |
+ counter->Add(i); |
+ should_sniff_counter->Add(2); |
return true; |
} |
} |
if (IsUnknownMimeType(mime_type)) { |
// The web server didn't specify a content type or specified a mime |
// type that we ignore. |
- counter.Add(arraysize(kSniffableTypes)); |
- should_sniff_counter.Add(2); |
+ counter->Add(arraysize(kSniffableTypes)); |
+ should_sniff_counter->Add(2); |
return true; |
} |
- should_sniff_counter.Add(1); |
+ should_sniff_counter->Add(1); |
return false; |
} |