Index: ppapi/proxy/interface_list.cc |
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc |
index 79789d70ace37d9fc95b62b3a6bb4790289e589b..9e33c7208be50815f990fef61348d4e371ee438a 100644 |
--- a/ppapi/proxy/interface_list.cc |
+++ b/ppapi/proxy/interface_list.cc |
@@ -4,6 +4,7 @@ |
#include "ppapi/proxy/interface_list.h" |
+#include "base/hash.h" |
#include "base/lazy_instance.h" |
#include "base/memory/singleton.h" |
#include "ppapi/c/dev/ppb_alarms_dev.h" |
@@ -104,6 +105,8 @@ |
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h" |
#include "ppapi/c/trusted/ppb_url_loader_trusted.h" |
#include "ppapi/proxy/interface_proxy.h" |
+#include "ppapi/proxy/plugin_globals.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
#include "ppapi/proxy/ppb_audio_proxy.h" |
#include "ppapi/proxy/ppb_broker_proxy.h" |
#include "ppapi/proxy/ppb_buffer_proxy.h" |
@@ -315,15 +318,22 @@ InterfaceProxy::Factory InterfaceList::GetFactoryForID(ApiID id) const { |
return id_to_factory_[index]; |
} |
-const void* InterfaceList::GetInterfaceForPPB(const std::string& name) const { |
- NameToInterfaceInfoMap::const_iterator found = |
+const void* InterfaceList::GetInterfaceForPPB(const std::string& name) { |
+ NameToInterfaceInfoMap::iterator found = |
name_to_browser_info_.find(name); |
if (found == name_to_browser_info_.end()) |
return NULL; |
if (g_process_global_permissions.Get().HasPermission( |
- found->second.required_permission)) |
+ found->second.required_permission)) { |
+ // Only log interface use once per plugin. |
+ if (!found->second.interface_logged) { |
+ PluginGlobals::Get()->GetBrowserSender()->Send( |
+ new PpapiHostMsg_LogInterfaceUsage(HashInterfaceName(name))); |
+ found->second.interface_logged = true; |
+ } |
return found->second.iface; |
+ } |
return NULL; |
} |
@@ -364,5 +374,13 @@ void InterfaceList::AddPPP(const char* name, |
name_to_plugin_info_[name] = InterfaceInfo(iface, PERMISSION_NONE); |
} |
+// static |
+int InterfaceList::HashInterfaceName(const std::string& name) { |
+ uint32 data = base::Hash(name.c_str(), name.size()); |
+ // Strip off the signed bit because UMA doesn't support negative values, |
+ // but takes a signed int as input. |
+ return static_cast<int>(data & 0x7fffffff); |
+} |
+ |
} // namespace proxy |
} // namespace ppapi |