Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1119)

Side by Side Diff: chrome/renderer/plugin_uma.cc

Issue 8461011: Clean up plug-in placeholders: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/plugin_uma.h ('k') | chrome/renderer/plugin_uma_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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.
4
5 #include "chrome/renderer/plugin_uma.h"
6
7 #include <algorithm>
8 #include <cstring>
9
10 #include "base/metrics/histogram.h"
11 #include "base/string_util.h"
12
13 namespace {
14
15 // String we will use to convert mime tyoe to plugin type.
16 const char kWindowsMediaPlayerType[] = "application/x-mplayer2";
17 const char kSilverlightTypePrefix[] = "application/x-silverlight";
18 const char kRealPlayerTypePrefix[] = "audio/x-pn-realaudio";
19 const char kJavaTypeSubstring[] = "application/x-java-applet";
20 const char kQuickTimeType[] = "video/quicktime";
21
22 // Arrays containing file extensions connected with specific plugins.
23 // The arrays must be sorted because binary search is used on them.
24 const char* kWindowsMediaPlayerExtensions[] = {
25 ".asx"
26 };
27
28 const char* kRealPlayerExtensions[] = {
29 ".ra",
30 ".ram",
31 ".rm",
32 ".rmm",
33 ".rmp",
34 ".rpm"
35 };
36
37 const char* kQuickTimeExtensions[] = {
38 ".moov",
39 ".mov",
40 ".qif",
41 ".qt",
42 ".qti",
43 ".qtif"
44 };
45
46 } // namespace.
47
48 class UMASenderImpl : public MissingPluginReporter::UMASender {
49 virtual void SendPluginUMA(MissingPluginReporter::PluginType plugin_type)
50 OVERRIDE;
51 };
52
53 void UMASenderImpl::SendPluginUMA(
54 MissingPluginReporter::PluginType plugin_type) {
55 UMA_HISTOGRAM_ENUMERATION("Plugin.MissingPlugins",
56 plugin_type,
57 MissingPluginReporter::OTHER);
58 }
59
60 // static.
61 MissingPluginReporter* MissingPluginReporter::GetInstance() {
62 return Singleton<MissingPluginReporter>::get();
63 }
64
65 void MissingPluginReporter::ReportPluginMissing(
66 std::string plugin_mime_type, const GURL& plugin_src) {
67 PluginType plugin_type;
68 // If we know plugin's mime type, we use it to determine plugin's type. Else,
69 // we try to determine plugin type using plugin source's extension.
70 if (!plugin_mime_type.empty()) {
71 StringToLowerASCII(&plugin_mime_type);
72 plugin_type = MimeTypeToPluginType(plugin_mime_type);
73 } else {
74 plugin_type = SrcToPluginType(plugin_src);
75 }
76 report_sender_->SendPluginUMA(plugin_type);
77 }
78
79 void MissingPluginReporter::SetUMASender(UMASender* sender) {
80 report_sender_.reset(sender);
81 }
82
83 MissingPluginReporter::MissingPluginReporter()
84 : report_sender_(new UMASenderImpl()) {
85 }
86
87 MissingPluginReporter::~MissingPluginReporter() {
88 }
89
90 // static.
91 bool MissingPluginReporter::CompareCStrings(const char* first,
92 const char* second) {
93 return strcmp(first, second) < 0;
94 }
95
96 bool MissingPluginReporter::CStringArrayContainsCString(const char** array,
97 size_t array_size,
98 const char* str) {
99 return std::binary_search(array, array + array_size, str, CompareCStrings);
100 }
101
102 void MissingPluginReporter::ExtractFileExtension(const GURL& src,
103 std::string* extension) {
104 std::string extension_file_path(src.ExtractFileName());
105 if (extension_file_path.empty())
106 extension_file_path = src.host();
107
108 size_t last_dot = extension_file_path.find_last_of('.');
109 if (last_dot != std::string::npos) {
110 *extension = extension_file_path.substr(last_dot);
111 } else {
112 extension->clear();
113 }
114
115 StringToLowerASCII(extension);
116 }
117
118 MissingPluginReporter::PluginType MissingPluginReporter::SrcToPluginType(
119 const GURL& src) {
120 std::string file_extension;
121 ExtractFileExtension(src, &file_extension);
122 if (CStringArrayContainsCString(kWindowsMediaPlayerExtensions,
123 arraysize(kWindowsMediaPlayerExtensions),
124 file_extension.c_str())) {
125 return WINDOWS_MEDIA_PLAYER;
126 }
127
128 if (CStringArrayContainsCString(kQuickTimeExtensions,
129 arraysize(kQuickTimeExtensions),
130 file_extension.c_str())) {
131 return QUICKTIME;
132 }
133
134 if (CStringArrayContainsCString(kRealPlayerExtensions,
135 arraysize(kRealPlayerExtensions),
136 file_extension.c_str())) {
137 return REALPLAYER;
138 }
139
140 return OTHER;
141 }
142
143 MissingPluginReporter::PluginType MissingPluginReporter::MimeTypeToPluginType(
144 const std::string& mime_type) {
145 if (strcmp(mime_type.c_str(), kWindowsMediaPlayerType) == 0)
146 return WINDOWS_MEDIA_PLAYER;
147
148 size_t prefix_length = strlen(kSilverlightTypePrefix);
149 if (strncmp(mime_type.c_str(), kSilverlightTypePrefix, prefix_length) == 0)
150 return SILVERLIGHT;
151
152 prefix_length = strlen(kRealPlayerTypePrefix);
153 if (strncmp(mime_type.c_str(), kRealPlayerTypePrefix, prefix_length) == 0)
154 return REALPLAYER;
155
156 if (strstr(mime_type.c_str(), kJavaTypeSubstring))
157 return JAVA;
158
159 if (strcmp(mime_type.c_str(), kQuickTimeType) == 0)
160 return QUICKTIME;
161
162 return OTHER;
163 }
164
OLDNEW
« no previous file with comments | « chrome/renderer/plugin_uma.h ('k') | chrome/renderer/plugin_uma_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698