• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CHROME_RENDERER_PLUGINS_PLUGIN_UMA_H_
6 #define CHROME_RENDERER_PLUGINS_PLUGIN_UMA_H_
7 
8 #include <string>
9 
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/singleton.h"
12 #include "url/gurl.h"
13 
14 // Used to send UMA data about missing plugins to UMA histogram server. Method
15 // ReportPluginMissing should be called whenever plugin that is not available or
16 // enabled is called. We try to determine plugin's type by requested mime type,
17 // or, if mime type is unknown, by plugin's src url.
18 class PluginUMAReporter {
19  public:
20   enum ReportType {
21     MISSING_PLUGIN,
22     DISABLED_PLUGIN
23   };
24 
25   // Make sure the enum list in tools/histogram/histograms.xml is updated with
26   // any change in this list.
27   enum PluginType {
28     WINDOWS_MEDIA_PLAYER = 0,
29     SILVERLIGHT = 1,
30     REALPLAYER = 2,
31     JAVA = 3,
32     QUICKTIME = 4,
33     OTHER = 5,  // This is obsolete and replaced by UNSUPPORTED_* types.
34     UNSUPPORTED_MIMETYPE,
35     UNSUPPORTED_EXTENSION,
36     // NOTE: Add new unsupported types only immediately above this line.
37     BROWSER_PLUGIN = 10,
38     SHOCKWAVE_FLASH,
39     WIDEVINE_CDM,
40     // NOTE: Add new plugin types only immediately above this line.
41     PLUGIN_TYPE_MAX
42   };
43 
44   // Sends UMA data, i.e. plugin's type.
45   class UMASender {
46    public:
~UMASender()47     virtual ~UMASender() {}
48     virtual void SendPluginUMA(ReportType report_type,
49                                PluginType plugin_type) = 0;
50   };
51 
52   // Returns singleton instance.
53   static PluginUMAReporter* GetInstance();
54 
55   void ReportPluginMissing(const std::string& plugin_mime_type,
56                            const GURL& plugin_src);
57 
58   void ReportPluginDisabled(const std::string& plugin_mime_type,
59                             const GURL& plugin_src);
60 
61  private:
62   friend struct DefaultSingletonTraits<PluginUMAReporter>;
63   friend class PluginUMATest;
64 
65   PluginUMAReporter();
66   ~PluginUMAReporter();
67 
68   static bool CompareCStrings(const char* first, const char* second);
69   bool CStringArrayContainsCString(const char** array,
70                                    size_t array_size,
71                                    const char* str);
72   // Extracts file extension from url.
73   void ExtractFileExtension(const GURL& src, std::string* extension);
74 
75   PluginType GetPluginType(const std::string& plugin_mime_type,
76                            const GURL& plugin_src);
77 
78   // Converts plugin's src to plugin type.
79   PluginType SrcToPluginType(const GURL& src);
80   // Converts plugin's mime type to plugin type.
81   PluginType MimeTypeToPluginType(const std::string& mime_type);
82 
83   scoped_ptr<UMASender> report_sender_;
84 
85   DISALLOW_COPY_AND_ASSIGN(PluginUMAReporter);
86 };
87 
88 #endif  // CHROME_RENDERER_PLUGINS_PLUGIN_UMA_H_
89