Home | History | Annotate | Download | only in plugins
      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:
     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