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