resource_creation_proxy.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1// Copyright (c) 2012 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#include "ppapi/proxy/resource_creation_proxy.h"
6
7#include "ppapi/c/pp_errors.h"
8#include "ppapi/c/pp_size.h"
9#include "ppapi/proxy/audio_input_resource.h"
10#include "ppapi/proxy/browser_font_resource_trusted.h"
11#include "ppapi/proxy/connection.h"
12#include "ppapi/proxy/ext_crx_file_system_private_resource.h"
13#include "ppapi/proxy/file_chooser_resource.h"
14#include "ppapi/proxy/file_io_resource.h"
15#include "ppapi/proxy/file_system_resource.h"
16#include "ppapi/proxy/flash_drm_resource.h"
17#include "ppapi/proxy/flash_font_file_resource.h"
18#include "ppapi/proxy/flash_menu_resource.h"
19#include "ppapi/proxy/graphics_2d_resource.h"
20#include "ppapi/proxy/host_resolver_private_resource.h"
21#include "ppapi/proxy/net_address_resource.h"
22#include "ppapi/proxy/plugin_dispatcher.h"
23#include "ppapi/proxy/plugin_globals.h"
24#include "ppapi/proxy/plugin_resource_tracker.h"
25#include "ppapi/proxy/ppapi_messages.h"
26#include "ppapi/proxy/ppb_audio_proxy.h"
27#include "ppapi/proxy/ppb_broker_proxy.h"
28#include "ppapi/proxy/ppb_buffer_proxy.h"
29#include "ppapi/proxy/ppb_file_ref_proxy.h"
30#include "ppapi/proxy/ppb_flash_message_loop_proxy.h"
31#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
32#include "ppapi/proxy/ppb_image_data_proxy.h"
33#include "ppapi/proxy/ppb_network_monitor_private_proxy.h"
34#include "ppapi/proxy/ppb_tcp_server_socket_private_proxy.h"
35#include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
36#include "ppapi/proxy/ppb_video_decoder_proxy.h"
37#include "ppapi/proxy/ppb_x509_certificate_private_proxy.h"
38#include "ppapi/proxy/printing_resource.h"
39#include "ppapi/proxy/talk_resource.h"
40#include "ppapi/proxy/truetype_font_resource.h"
41#include "ppapi/proxy/udp_socket_private_resource.h"
42#include "ppapi/proxy/url_loader_resource.h"
43#include "ppapi/proxy/url_request_info_resource.h"
44#include "ppapi/proxy/url_response_info_resource.h"
45#include "ppapi/proxy/video_capture_resource.h"
46#include "ppapi/proxy/video_destination_resource.h"
47#include "ppapi/proxy/video_source_resource.h"
48#include "ppapi/proxy/websocket_resource.h"
49#include "ppapi/shared_impl/api_id.h"
50#include "ppapi/shared_impl/host_resource.h"
51#include "ppapi/shared_impl/ppb_audio_config_shared.h"
52#include "ppapi/shared_impl/ppb_input_event_shared.h"
53#include "ppapi/shared_impl/ppb_resource_array_shared.h"
54#include "ppapi/shared_impl/var.h"
55#include "ppapi/thunk/enter.h"
56#include "ppapi/thunk/ppb_image_data_api.h"
57
58using ppapi::thunk::ResourceCreationAPI;
59
60namespace ppapi {
61namespace proxy {
62
63ResourceCreationProxy::ResourceCreationProxy(Dispatcher* dispatcher)
64    : InterfaceProxy(dispatcher) {
65}
66
67ResourceCreationProxy::~ResourceCreationProxy() {
68}
69
70// static
71InterfaceProxy* ResourceCreationProxy::Create(Dispatcher* dispatcher) {
72  return new ResourceCreationProxy(dispatcher);
73}
74
75PP_Resource ResourceCreationProxy::CreateFileIO(PP_Instance instance) {
76  return (new FileIOResource(GetConnection(), instance))->GetReference();
77}
78
79PP_Resource ResourceCreationProxy::CreateFileRef(PP_Instance instance,
80                                                 PP_Resource file_system,
81                                                 const char* path) {
82  return PPB_FileRef_Proxy::CreateProxyResource(instance, file_system, path);
83}
84
85PP_Resource ResourceCreationProxy::CreateFileRef(
86    const PPB_FileRef_CreateInfo& create_info) {
87  return PPB_FileRef_Proxy::DeserializeFileRef(create_info);
88}
89
90PP_Resource ResourceCreationProxy::CreateFileSystem(
91    PP_Instance instance,
92    PP_FileSystemType type) {
93  return (new FileSystemResource(GetConnection(), instance,
94                                 type))->GetReference();
95}
96
97PP_Resource ResourceCreationProxy::CreateIsolatedFileSystem(
98    PP_Instance instance,
99    const char* fsid) {
100  FileSystemResource* fs = new FileSystemResource(
101      GetConnection(), instance, PP_FILESYSTEMTYPE_ISOLATED);
102  fs->InitIsolatedFileSystem(fsid);
103  return fs->GetReference();
104}
105
106PP_Resource ResourceCreationProxy::CreateIMEInputEvent(
107    PP_Instance instance,
108    PP_InputEvent_Type type,
109    PP_TimeTicks time_stamp,
110    struct PP_Var text,
111    uint32_t segment_number,
112    const uint32_t* segment_offsets,
113    int32_t target_segment,
114    uint32_t selection_start,
115    uint32_t selection_end) {
116  return PPB_InputEvent_Shared::CreateIMEInputEvent(
117      OBJECT_IS_PROXY, instance, type, time_stamp, text, segment_number,
118      segment_offsets, target_segment, selection_start, selection_end);
119}
120
121PP_Resource ResourceCreationProxy::CreateKeyboardInputEvent(
122    PP_Instance instance,
123    PP_InputEvent_Type type,
124    PP_TimeTicks time_stamp,
125    uint32_t modifiers,
126    uint32_t key_code,
127    struct PP_Var character_text) {
128  return PPB_InputEvent_Shared::CreateKeyboardInputEvent(
129      OBJECT_IS_PROXY, instance, type, time_stamp, modifiers, key_code,
130      character_text);
131}
132
133PP_Resource ResourceCreationProxy::CreateMouseInputEvent(
134    PP_Instance instance,
135    PP_InputEvent_Type type,
136    PP_TimeTicks time_stamp,
137    uint32_t modifiers,
138    PP_InputEvent_MouseButton mouse_button,
139    const PP_Point* mouse_position,
140    int32_t click_count,
141    const PP_Point* mouse_movement) {
142  return PPB_InputEvent_Shared::CreateMouseInputEvent(
143      OBJECT_IS_PROXY, instance, type, time_stamp, modifiers,
144      mouse_button, mouse_position, click_count, mouse_movement);
145}
146
147PP_Resource ResourceCreationProxy::CreateTouchInputEvent(
148    PP_Instance instance,
149    PP_InputEvent_Type type,
150    PP_TimeTicks time_stamp,
151    uint32_t modifiers) {
152  return PPB_InputEvent_Shared::CreateTouchInputEvent(
153      OBJECT_IS_PROXY, instance, type, time_stamp, modifiers);
154}
155
156PP_Resource ResourceCreationProxy::CreateResourceArray(
157    PP_Instance instance,
158    const PP_Resource elements[],
159    uint32_t size) {
160  PPB_ResourceArray_Shared* object = new PPB_ResourceArray_Shared(
161      OBJECT_IS_PROXY, instance, elements, size);
162  return object->GetReference();
163}
164
165PP_Resource ResourceCreationProxy::CreateTrueTypeFont(
166    PP_Instance instance,
167    const PP_TrueTypeFontDesc_Dev* desc) {
168  return (new TrueTypeFontResource(GetConnection(),
169                                   instance, *desc))->GetReference();
170
171}
172
173PP_Resource ResourceCreationProxy::CreateURLLoader(PP_Instance instance) {
174    return (new URLLoaderResource(GetConnection(), instance))->GetReference();
175}
176
177PP_Resource ResourceCreationProxy::CreateURLRequestInfo(
178    PP_Instance instance) {
179  return (new URLRequestInfoResource(
180      GetConnection(), instance, URLRequestInfoData()))->GetReference();
181}
182
183PP_Resource ResourceCreationProxy::CreateWheelInputEvent(
184    PP_Instance instance,
185    PP_TimeTicks time_stamp,
186    uint32_t modifiers,
187    const PP_FloatPoint* wheel_delta,
188    const PP_FloatPoint* wheel_ticks,
189    PP_Bool scroll_by_page) {
190  return PPB_InputEvent_Shared::CreateWheelInputEvent(
191      OBJECT_IS_PROXY, instance, time_stamp, modifiers,
192      wheel_delta, wheel_ticks, scroll_by_page);
193}
194
195PP_Resource ResourceCreationProxy::CreateAudio(
196    PP_Instance instance,
197    PP_Resource config_id,
198    PPB_Audio_Callback audio_callback,
199    void* user_data) {
200  return PPB_Audio_Proxy::CreateProxyResource(instance, config_id,
201                                              audio_callback, user_data);
202}
203
204PP_Resource ResourceCreationProxy::CreateAudioTrusted(PP_Instance instance) {
205  // Proxied plugins can't create trusted audio devices.
206  return 0;
207}
208
209PP_Resource ResourceCreationProxy::CreateAudioConfig(
210    PP_Instance instance,
211    PP_AudioSampleRate sample_rate,
212    uint32_t sample_frame_count) {
213  return PPB_AudioConfig_Shared::Create(
214      OBJECT_IS_PROXY, instance, sample_rate, sample_frame_count);
215}
216
217PP_Resource ResourceCreationProxy::CreateFileChooser(
218    PP_Instance instance,
219    PP_FileChooserMode_Dev mode,
220    const PP_Var& accept_types) {
221  scoped_refptr<StringVar> string_var = StringVar::FromPPVar(accept_types);
222  std::string str = string_var.get() ? string_var->value() : std::string();
223  return (new FileChooserResource(GetConnection(), instance, mode, str.c_str()))
224      ->GetReference();
225}
226
227PP_Resource ResourceCreationProxy::CreateGraphics2D(PP_Instance instance,
228                                                    const PP_Size* size,
229                                                    PP_Bool is_always_opaque) {
230  return (new Graphics2DResource(GetConnection(), instance, *size,
231                                 is_always_opaque))->GetReference();
232}
233
234PP_Resource ResourceCreationProxy::CreateGraphics3D(
235    PP_Instance instance,
236    PP_Resource share_context,
237    const int32_t* attrib_list) {
238  return PPB_Graphics3D_Proxy::CreateProxyResource(
239      instance, share_context, attrib_list);
240}
241
242PP_Resource ResourceCreationProxy::CreateGraphics3DRaw(
243    PP_Instance instance,
244    PP_Resource share_context,
245    const int32_t* attrib_list) {
246  // Not proxied. The raw creation function is used only in the implementation
247  // of the proxy on the host side.
248  return 0;
249}
250
251PP_Resource ResourceCreationProxy::CreateHostResolverPrivate(
252    PP_Instance instance) {
253  return (new HostResolverPrivateResource(
254      GetConnection(), instance))->GetReference();
255}
256
257PP_Resource ResourceCreationProxy::CreateImageData(PP_Instance instance,
258                                                   PP_ImageDataFormat format,
259                                                   const PP_Size* size,
260                                                   PP_Bool init_to_zero) {
261  return PPB_ImageData_Proxy::CreateProxyResource(instance, format, *size,
262                                                  init_to_zero);
263}
264
265PP_Resource ResourceCreationProxy::CreateImageDataNaCl(
266    PP_Instance instance,
267    PP_ImageDataFormat format,
268    const PP_Size* size,
269    PP_Bool init_to_zero) {
270  // These really only are different on the host side. On the plugin side, we
271  // always request a "platform" ImageData if we're trusted, or a "NaCl" one
272  // if we're untrusted (see PPB_ImageData_Proxy::CreateProxyResource()).
273  return CreateImageData(instance, format, size, init_to_zero);
274}
275
276PP_Resource ResourceCreationProxy::CreateNetAddressFromIPv4Address(
277    PP_Instance instance,
278    const PP_NetAddress_IPv4_Dev* ipv4_addr) {
279  return (new NetAddressResource(GetConnection(), instance,
280                                 *ipv4_addr))->GetReference();
281}
282
283PP_Resource ResourceCreationProxy::CreateNetAddressFromIPv6Address(
284    PP_Instance instance,
285    const PP_NetAddress_IPv6_Dev* ipv6_addr) {
286  return (new NetAddressResource(GetConnection(), instance,
287                                 *ipv6_addr))->GetReference();
288}
289
290PP_Resource ResourceCreationProxy::CreateNetworkMonitor(
291    PP_Instance instance,
292    PPB_NetworkMonitor_Callback callback,
293    void* user_data) {
294  return PPB_NetworkMonitor_Private_Proxy::CreateProxyResource(
295      instance, callback, user_data);
296}
297
298PP_Resource ResourceCreationProxy::CreatePrinting(PP_Instance instance) {
299  return (new PrintingResource(GetConnection(), instance))->GetReference();
300}
301
302PP_Resource ResourceCreationProxy::CreateTCPServerSocketPrivate(
303    PP_Instance instance) {
304  return PPB_TCPServerSocket_Private_Proxy::CreateProxyResource(instance);
305}
306
307PP_Resource ResourceCreationProxy::CreateTCPSocketPrivate(
308    PP_Instance instance) {
309  return PPB_TCPSocket_Private_Proxy::CreateProxyResource(instance);
310}
311
312PP_Resource ResourceCreationProxy::CreateUDPSocketPrivate(
313    PP_Instance instance) {
314  return (new UDPSocketPrivateResource(
315      GetConnection(), instance))->GetReference();
316}
317
318PP_Resource ResourceCreationProxy::CreateWebSocket(PP_Instance instance) {
319  return (new WebSocketResource(GetConnection(), instance))->GetReference();
320}
321
322PP_Resource ResourceCreationProxy::CreateX509CertificatePrivate(
323    PP_Instance instance) {
324  return PPB_X509Certificate_Private_Proxy::CreateProxyResource(instance);
325}
326
327#if !defined(OS_NACL)
328PP_Resource ResourceCreationProxy::CreateAudioInput(
329    PP_Instance instance) {
330  return (new AudioInputResource(GetConnection(), instance))->GetReference();
331}
332
333PP_Resource ResourceCreationProxy::CreateBroker(PP_Instance instance) {
334  return PPB_Broker_Proxy::CreateProxyResource(instance);
335}
336
337PP_Resource ResourceCreationProxy::CreateBrowserFont(
338    PP_Instance instance,
339    const PP_BrowserFont_Trusted_Description* description) {
340  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
341  if (!dispatcher)
342    return 0;
343  if (!BrowserFontResource_Trusted::IsPPFontDescriptionValid(*description))
344    return 0;
345  return (new BrowserFontResource_Trusted(GetConnection(), instance,
346      *description, dispatcher->preferences()))->GetReference();
347}
348
349PP_Resource ResourceCreationProxy::CreateBuffer(PP_Instance instance,
350                                                uint32_t size) {
351  return PPB_Buffer_Proxy::CreateProxyResource(instance, size);
352}
353
354PP_Resource ResourceCreationProxy::CreateFlashDRM(PP_Instance instance) {
355  return (new FlashDRMResource(GetConnection(), instance))->GetReference();
356}
357
358PP_Resource ResourceCreationProxy::CreateFlashFontFile(
359    PP_Instance instance,
360    const PP_BrowserFont_Trusted_Description* description,
361    PP_PrivateFontCharset charset) {
362  return (new FlashFontFileResource(
363      GetConnection(), instance, description, charset))->GetReference();
364}
365
366PP_Resource ResourceCreationProxy::CreateFlashMenu(
367    PP_Instance instance,
368    const PP_Flash_Menu* menu_data) {
369  scoped_refptr<FlashMenuResource> flash_menu(
370      new FlashMenuResource(GetConnection(), instance));
371  if (!flash_menu->Initialize(menu_data))
372    return 0;
373  return flash_menu->GetReference();
374}
375
376PP_Resource ResourceCreationProxy::CreateFlashMessageLoop(
377    PP_Instance instance) {
378  return PPB_Flash_MessageLoop_Proxy::CreateProxyResource(instance);
379}
380
381PP_Resource ResourceCreationProxy::CreateScrollbar(PP_Instance instance,
382                                                   PP_Bool vertical) {
383  NOTIMPLEMENTED();  // Not proxied yet.
384  return 0;
385}
386
387PP_Resource ResourceCreationProxy::CreateTalk(PP_Instance instance) {
388  return (new TalkResource(GetConnection(), instance))->GetReference();
389}
390
391PP_Resource ResourceCreationProxy::CreateVideoCapture(PP_Instance instance) {
392  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
393  if (!dispatcher)
394    return 0;
395  return (new VideoCaptureResource(GetConnection(), instance, dispatcher))
396      ->GetReference();
397}
398
399PP_Resource ResourceCreationProxy::CreateVideoDecoder(
400    PP_Instance instance,
401    PP_Resource context3d_id,
402    PP_VideoDecoder_Profile profile) {
403  return PPB_VideoDecoder_Proxy::CreateProxyResource(
404      instance, context3d_id, profile);
405}
406
407PP_Resource ResourceCreationProxy::CreateVideoDestination(
408    PP_Instance instance) {
409  return (new VideoDestinationResource(GetConnection(),
410                                       instance))->GetReference();
411}
412
413PP_Resource ResourceCreationProxy::CreateVideoSource(
414    PP_Instance instance) {
415  return (new VideoSourceResource(GetConnection(), instance))->GetReference();
416}
417
418#endif  // !defined(OS_NACL)
419
420bool ResourceCreationProxy::Send(IPC::Message* msg) {
421  return dispatcher()->Send(msg);
422}
423
424bool ResourceCreationProxy::OnMessageReceived(const IPC::Message& msg) {
425  return false;
426}
427
428Connection ResourceCreationProxy::GetConnection() {
429  return Connection(PluginGlobals::Get()->GetBrowserSender(), dispatcher());
430}
431
432}  // namespace proxy
433}  // namespace ppapi
434