summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/proxy')
-rw-r--r--ppapi/proxy/interface_list.cc24
-rw-r--r--ppapi/proxy/interface_list.h14
-rw-r--r--ppapi/proxy/interface_list_unittest.cc14
-rw-r--r--ppapi/proxy/ppapi_messages.h3
4 files changed, 49 insertions, 6 deletions
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc
index 79789d7..9e33c72 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
diff --git a/ppapi/proxy/interface_list.h b/ppapi/proxy/interface_list.h
index 85b7eb6..a2b4569c 100644
--- a/ppapi/proxy/interface_list.h
+++ b/ppapi/proxy/interface_list.h
@@ -41,7 +41,7 @@ class PPAPI_PROXY_EXPORT InterfaceList {
// Returns the interface pointer for the given browser or plugin interface,
// or NULL if it's not supported.
- const void* GetInterfaceForPPB(const std::string& name) const;
+ const void* GetInterfaceForPPB(const std::string& name);
const void* GetInterfaceForPPP(const std::string& name) const;
private:
@@ -50,11 +50,13 @@ class PPAPI_PROXY_EXPORT InterfaceList {
struct InterfaceInfo {
InterfaceInfo()
: iface(NULL),
- required_permission(PERMISSION_NONE) {
+ required_permission(PERMISSION_NONE),
+ interface_logged(false) {
}
InterfaceInfo(const void* in_interface, Permission in_perm)
: iface(in_interface),
- required_permission(in_perm) {
+ required_permission(in_perm),
+ interface_logged(false) {
}
const void* iface;
@@ -63,6 +65,9 @@ class PPAPI_PROXY_EXPORT InterfaceList {
// be checked with the value set via SetProcessGlobalPermissionBits when
// an interface is requested.
Permission required_permission;
+
+ // Interface usage is logged just once per-interface-per-plugin-process.
+ bool interface_logged;
};
typedef std::map<std::string, InterfaceInfo> NameToInterfaceInfoMap;
@@ -75,6 +80,9 @@ class PPAPI_PROXY_EXPORT InterfaceList {
void AddPPB(const char* name, const void* iface, Permission permission);
void AddPPP(const char* name, const void* iface);
+ // Hash the interface name for UMA logging.
+ static int HashInterfaceName(const std::string& name);
+
PpapiPermissions permissions_;
NameToInterfaceInfoMap name_to_browser_info_;
diff --git a/ppapi/proxy/interface_list_unittest.cc b/ppapi/proxy/interface_list_unittest.cc
index 17140f0..902a0a18 100644
--- a/ppapi/proxy/interface_list_unittest.cc
+++ b/ppapi/proxy/interface_list_unittest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/hash.h"
#include "ppapi/c/ppb_core.h"
#include "ppapi/proxy/interface_list.h"
#include "ppapi/proxy/ppapi_proxy_test.h"
@@ -16,6 +17,12 @@ class InterfaceListTest : public PluginProxyTest {
const char* iface_name, void* iface_addr, Permission perm) {
list->AddPPB(iface_name, iface_addr, perm);
}
+
+ // Wrapper function so we can use the private
+ // InterfaceList::HashInterfaceName.
+ int HashInterfaceName(const std::string& name) {
+ return InterfaceList::HashInterfaceName(name);
+ }
};
// Tests looking up a stable interface.
@@ -62,5 +69,12 @@ TEST_F(InterfaceListTest, DevChannel) {
ASSERT_TRUE(list.GetInterfaceForPPB(dev_iface_name) == dev_iface_addr);
}
+// Test that the hash function provided by base::Hash is unchanged. This is so
+// that we will generate correct values when logging interface use to UMA.
+TEST_F(InterfaceListTest, InterfaceHash) {
+ EXPECT_EQ(612625164, HashInterfaceName("PPB_InputEvent;1.0"));
+ EXPECT_EQ(79708274, HashInterfaceName("PPB_TCPSocket;1.1"));
+}
+
} // namespace proxy
} // namespace ppapi
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index a6f8f2c..7e6543e 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -422,6 +422,9 @@ IPC_SYNC_MESSAGE_CONTROL1_1(PpapiMsg_SupportsInterface,
std::string /* interface_name */,
bool /* result */)
+IPC_MESSAGE_CONTROL1(PpapiHostMsg_LogInterfaceUsage,
+ int /* interface_hash */)
+
#if !defined(OS_NACL) && !defined(NACL_WIN64)
// Network state notification from the browser for implementing
// PPP_NetworkState_Dev.