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.
18class 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