interface_list.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// Use of this source code is governed by a BSD-style license that can be
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// found in the LICENSE file.
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/interface_list.h"
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "base/lazy_instance.h"
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "base/memory/singleton.h"
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_audio_input_dev.h"
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_buffer_dev.h"
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_char_set_dev.h"
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_crypto_dev.h"
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_cursor_control_dev.h"
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_device_ref_dev.h"
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_font_dev.h"
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h"
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_graphics_2d_dev.h"
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_ime_input_event_dev.h"
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_keyboard_input_event_dev.h"
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_memory_dev.h"
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_opengles2ext_dev.h"
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_printing_dev.h"
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_resource_array_dev.h"
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_testing_dev.h"
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_text_input_dev.h"
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_trace_event_dev.h"
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_truetype_font_dev.h"
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_url_util_dev.h"
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_var_deprecated.h"
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_video_capture_dev.h"
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/dev/ppb_view_dev.h"
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/extensions/dev/ppb_ext_alarms_dev.h"
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/extensions/dev/ppb_ext_socket_dev.h"
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_audio_config.h"
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_audio.h"
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_console.h"
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_core.h"
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_file_io.h"
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_file_ref.h"
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_file_system.h"
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_fullscreen.h"
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_graphics_2d.h"
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_host_resolver.h"
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_image_data.h"
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_input_event.h"
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_instance.h"
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_message_loop.h"
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_messaging.h"
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_mouse_lock.h"
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_net_address.h"
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_network_proxy.h"
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_opengles2.h"
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_tcp_socket.h"
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_udp_socket.h"
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_url_loader.h"
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_url_request_info.h"
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_url_response_info.h"
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_var.h"
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_var_array.h"
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_var_array_buffer.h"
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_var_dictionary.h"
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppb_view.h"
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/pp_errors.h"
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/ppp_instance.h"
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_content_decryptor_private.h"
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_file_io_private.h"
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_file_ref_private.h"
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_clipboard.h"
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_file.h"
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_font_file.h"
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_fullscreen.h"
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash.h"
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_device_id.h"
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_drm.h"
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_menu.h"
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_message_loop.h"
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_flash_print.h"
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_host_resolver_private.h"
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_net_address_private.h"
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_network_list_private.h"
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_network_monitor_private.h"
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_pdf.h"
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_talk_private.h"
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_tcp_server_socket_private.h"
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_tcp_socket_private.h"
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_udp_socket_private.h"
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_video_destination_private.h"
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_video_source_private.h"
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppb_x509_certificate_private.h"
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/private/ppp_content_decryptor_private.h"
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/trusted/ppb_broker_trusted.h"
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/trusted/ppb_char_set_trusted.h"
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/trusted/ppb_file_io_trusted.h"
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/interface_proxy.h"
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_audio_proxy.h"
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_broker_proxy.h"
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_buffer_proxy.h"
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_core_proxy.h"
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_file_ref_proxy.h"
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_flash_message_loop_proxy.h"
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_image_data_proxy.h"
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_instance_proxy.h"
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_message_loop_proxy.h"
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_network_monitor_private_proxy.h"
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_tcp_server_socket_private_proxy.h"
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_tcp_socket_proxy.h"
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_testing_proxy.h"
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_var_deprecated_proxy.h"
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_video_decoder_proxy.h"
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppb_x509_certificate_private_proxy.h"
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_class_proxy.h"
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_content_decryptor_private_proxy.h"
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_graphics_3d_proxy.h"
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_input_event_proxy.h"
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_instance_private_proxy.h"
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_instance_proxy.h"
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_messaging_proxy.h"
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_mouse_lock_proxy.h"
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_printing_proxy.h"
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_text_input_proxy.h"
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/ppp_video_decoder_proxy.h"
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/proxy/resource_creation_proxy.h"
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/shared_impl/ppb_opengles2_shared.h"
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/shared_impl/ppb_var_shared.h"
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "ppapi/thunk/thunk.h"
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// Helper to get the proxy name PPB_Foo_Proxy given the API name PPB_Foo.
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PROXY_CLASS_NAME(api_name) api_name##_Proxy
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// Helper to get the interface ID PPB_Foo_Proxy::kApiID given the API
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// name PPB_Foo.
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PROXY_API_ID(api_name) PROXY_CLASS_NAME(api_name)::kApiID
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// Helper to get the name of the templatized factory function.
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PROXY_FACTORY_NAME(api_name) ProxyFactory<PROXY_CLASS_NAME(api_name)>
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// Helper to get the name of the thunk GetPPB_Foo_1_0_Thunk given the interface
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// struct name PPB_Foo_1_0.
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define INTERFACE_THUNK_NAME(iface_struct) thunk::Get##iface_struct##_Thunk
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnamespace ppapi {
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnamespace proxy {
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnamespace {
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// The interface list has interfaces with no ID listed as "NoAPIName" which
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// means there's no corresponding _Proxy object. Our macros expand this to
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// NoAPIName_Proxy, and then they look for kApiID inside it.
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng//
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// This dummy class provides the correct definition for that interface ID,
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// which is "NONE".
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass NoAPIName_Proxy {
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng public:
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  static const ApiID kApiID = API_ID_NONE;
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtemplate<typename ProxyClass>
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengInterfaceProxy* ProxyFactory(Dispatcher* dispatcher) {
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  return new ProxyClass(dispatcher);
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbase::LazyInstance<PpapiPermissions> g_process_global_permissions;
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}  // namespace
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengInterfaceList::InterfaceList() {
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  memset(id_to_factory_, 0, sizeof(id_to_factory_));
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // Register the API factories for each of the API types. This calls AddProxy
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // for each InterfaceProxy type we support.
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  #define PROXIED_API(api_name) \
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng      AddProxy(PROXY_API_ID(api_name), &PROXY_FACTORY_NAME(api_name));
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // Register each proxied interface by calling AddPPB for each supported
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // interface. Set current_required_permission to the appropriate value for
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // the value you want expanded by this macro.
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  #define PROXIED_IFACE(api_name, iface_str, iface_struct) \
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng      AddPPB(iface_str, PROXY_API_ID(api_name), \
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng             INTERFACE_THUNK_NAME(iface_struct)(), \
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng             current_required_permission);
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  {
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    Permission current_required_permission = PERMISSION_NONE;
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h"
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    #include "ppapi/thunk/interfaces_ppb_public_stable.h"
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  }
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  {
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    Permission current_required_permission = PERMISSION_DEV;
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    #include "ppapi/thunk/interfaces_ppb_public_dev.h"
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  }
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  {
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    Permission current_required_permission = PERMISSION_PRIVATE;
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    #include "ppapi/thunk/interfaces_ppb_private.h"
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  }
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  {
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if !defined(OS_NACL)
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    Permission current_required_permission = PERMISSION_FLASH;
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    #include "ppapi/thunk/interfaces_ppb_private_flash.h"
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif  // !defined(OS_NACL)
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  }
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  #undef PROXIED_API
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  #undef PROXIED_IFACE
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // Manually add some special proxies. Some of these don't have interfaces
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // that they support, so aren't covered by the macros above, but have proxies
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // for message routing. Others have different implementations between the
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // proxy and the impl and there's no obvious message routing.
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddProxy(API_ID_RESOURCE_CREATION, &ResourceCreationProxy::Create);
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddProxy(API_ID_PPP_CLASS, &PPP_Class_Proxy::Create);
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_CORE_INTERFACE_1_0, API_ID_PPB_CORE,
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_Core_Proxy::GetPPB_Core_Interface(), PERMISSION_NONE);
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_MESSAGELOOP_INTERFACE_1_0, API_ID_NONE,
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_MessageLoop_Proxy::GetInterface(), PERMISSION_NONE);
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_INTERFACE_1_0, API_ID_NONE,
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetInterface(), PERMISSION_NONE);
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_INSTANCEDARRAYS_INTERFACE_1_0, API_ID_NONE,
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetInstancedArraysInterface(), PERMISSION_NONE);
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_FRAMEBUFFERBLIT_INTERFACE_1_0, API_ID_NONE,
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetFramebufferBlitInterface(), PERMISSION_NONE);
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_FRAMEBUFFERMULTISAMPLE_INTERFACE_1_0, API_ID_NONE,
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetFramebufferMultisampleInterface(),
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PERMISSION_NONE);
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_CHROMIUMENABLEFEATURE_INTERFACE_1_0, API_ID_NONE,
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetChromiumEnableFeatureInterface(),
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PERMISSION_NONE);
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_INTERFACE_1_0, API_ID_NONE,
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), PERMISSION_NONE);
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_DEV_INTERFACE_1_0, API_ID_NONE,
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), PERMISSION_NONE);
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_OPENGLES2_QUERY_INTERFACE_1_0, API_ID_NONE,
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_OpenGLES2_Shared::GetQueryInterface(), PERMISSION_NONE);
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_VAR_ARRAY_BUFFER_INTERFACE_1_0, API_ID_NONE,
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_Var_Shared::GetVarArrayBufferInterface1_0(),
242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PERMISSION_NONE);
243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_VAR_INTERFACE_1_1, API_ID_NONE,
244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_Var_Shared::GetVarInterface1_1(), PERMISSION_NONE);
245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_VAR_INTERFACE_1_0, API_ID_NONE,
246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPB_Var_Shared::GetVarInterface1_0(), PERMISSION_NONE);
247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if !defined(OS_NACL)
249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // PPB (browser) interfaces.
250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // Do not add more stuff here, they should be added to interface_list*.h
251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // TODO(brettw) remove these.
252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_Instance_Proxy::GetInfoPrivate(), PERMISSION_PRIVATE);
253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_Var_Deprecated_Proxy::GetInfo(), PERMISSION_DEV);
254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // TODO(tomfinegan): Figure out where to put these once we refactor things
256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // to load the PPP interface struct from the PPB interface.
257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddProxy(API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng           &ProxyFactory<PPP_ContentDecryptor_Private_Proxy>);
259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE,
260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPP_ContentDecryptor_Private_Proxy::GetProxyInterface());
262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPB(PPB_Testing_Proxy::GetInfo(), PERMISSION_TESTING);
264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // PPP (plugin) interfaces.
266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // TODO(brettw) move these to interface_list*.h
267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddProxy(API_ID_PPP_INSTANCE, &ProxyFactory<PPP_Instance_Proxy>);
268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  #if !defined(OS_NACL)
269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_INSTANCE_INTERFACE_1_1, API_ID_PPP_INSTANCE,
270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPP_Instance_Proxy::GetInstanceInterface());
271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  #endif
272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddProxy(API_ID_PPP_PRINTING, &ProxyFactory<PPP_Printing_Proxy>);
273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_PRINTING_DEV_INTERFACE, API_ID_PPP_PRINTING,
274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPP_Printing_Proxy::GetProxyInterface());
275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddProxy(API_ID_PPP_TEXT_INPUT, &ProxyFactory<PPP_TextInput_Proxy>);
276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_TEXTINPUT_DEV_INTERFACE, API_ID_PPP_TEXT_INPUT,
277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         PPP_TextInput_Proxy::GetProxyInterface());
278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // Old-style GetInfo PPP interfaces.
280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // Do not add more stuff here, they should be added to interface_list*.h
281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  // TODO(brettw) remove these.
282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_InputEvent_Proxy::GetInfo());
283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_Messaging_Proxy::GetInfo());
284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_MouseLock_Proxy::GetInfo());
285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_Graphics3D_Proxy::GetInfo());
286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if !defined(OS_NACL)
287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_Instance_Private_Proxy::GetInfo());
288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  AddPPP(PPP_VideoDecoder_Proxy::GetInfo());
289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengInterfaceList::~InterfaceList() {
293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// static
296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengInterfaceList* InterfaceList::GetInstance() {
297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  return Singleton<InterfaceList>::get();
298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// static
301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid InterfaceList::SetProcessGlobalPermissions(
302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    const PpapiPermissions& permissions) {
303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  g_process_global_permissions.Get() = permissions;
304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengApiID InterfaceList::GetIDForPPBInterface(const std::string& name) const {
307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  NameToInterfaceInfoMap::const_iterator found =
308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng      name_to_browser_info_.find(name);
309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  if (found == name_to_browser_info_.end())
310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    return API_ID_NONE;
311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng  return found->second.id;
312}
313
314ApiID InterfaceList::GetIDForPPPInterface(const std::string& name) const {
315  NameToInterfaceInfoMap::const_iterator found =
316      name_to_plugin_info_.find(name);
317  if (found == name_to_plugin_info_.end())
318    return API_ID_NONE;
319  return found->second.id;
320}
321
322InterfaceProxy::Factory InterfaceList::GetFactoryForID(ApiID id) const {
323  int index = static_cast<int>(id);
324  COMPILE_ASSERT(API_ID_NONE == 0, none_must_be_zero);
325  if (id <= 0 || id >= API_ID_COUNT)
326    return NULL;
327  return id_to_factory_[index];
328}
329
330const void* InterfaceList::GetInterfaceForPPB(const std::string& name) const {
331  NameToInterfaceInfoMap::const_iterator found =
332      name_to_browser_info_.find(name);
333  if (found == name_to_browser_info_.end())
334    return NULL;
335
336  if (g_process_global_permissions.Get().HasPermission(
337          found->second.required_permission))
338    return found->second.iface;
339  return NULL;
340}
341
342const void* InterfaceList::GetInterfaceForPPP(const std::string& name) const {
343  NameToInterfaceInfoMap::const_iterator found =
344      name_to_plugin_info_.find(name);
345  if (found == name_to_plugin_info_.end())
346    return NULL;
347  return found->second.iface;
348}
349
350void InterfaceList::AddProxy(ApiID id,
351                             InterfaceProxy::Factory factory) {
352  // For interfaces with no corresponding _Proxy objects, the macros will
353  // generate calls to this function with API_ID_NONE. This means we
354  // should just skip adding a factory for these functions.
355  if (id == API_ID_NONE)
356    return;
357
358  // The factory should be an exact dupe of the one we already have if it
359  // has already been registered before.
360  int index = static_cast<int>(id);
361  DCHECK(!id_to_factory_[index] || id_to_factory_[index] == factory);
362
363  id_to_factory_[index] = factory;
364}
365
366void InterfaceList::AddPPB(const char* name,
367                           ApiID id,
368                           const void* iface,
369                           Permission perm) {
370  DCHECK(name_to_browser_info_.find(name) == name_to_browser_info_.end());
371  name_to_browser_info_[name] = InterfaceInfo(id, iface, perm);
372}
373
374void InterfaceList::AddPPP(const char* name,
375                           ApiID id,
376                           const void* iface) {
377  DCHECK(name_to_plugin_info_.find(name) == name_to_plugin_info_.end());
378  name_to_plugin_info_[name] = InterfaceInfo(id, iface, PERMISSION_NONE);
379}
380
381void InterfaceList::AddPPB(const InterfaceProxy::Info* info, Permission perm) {
382  AddProxy(info->id, info->create_proxy);
383  AddPPB(info->name, info->id, info->interface_ptr, perm);
384}
385
386void InterfaceList::AddPPP(const InterfaceProxy::Info* info) {
387  AddProxy(info->id, info->create_proxy);
388  AddPPP(info->name, info->id, info->interface_ptr);
389}
390
391}  // namespace proxy
392}  // namespace ppapi
393