resource_creation_proxy.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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/c/trusted/ppb_image_data_trusted.h"
10#include "ppapi/proxy/audio_input_resource.h"
11#include "ppapi/proxy/browser_font_resource_trusted.h"
12#include "ppapi/proxy/connection.h"
13#include "ppapi/proxy/ext_crx_file_system_private_resource.h"
14#include "ppapi/proxy/file_chooser_resource.h"
15#include "ppapi/proxy/file_io_resource.h"
16#include "ppapi/proxy/file_system_resource.h"
17#include "ppapi/proxy/flash_drm_resource.h"
18#include "ppapi/proxy/flash_font_file_resource.h"
19#include "ppapi/proxy/flash_menu_resource.h"
20#include "ppapi/proxy/graphics_2d_resource.h"
21#include "ppapi/proxy/host_resolver_private_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::CreateURLResponseInfo(
184    PP_Instance instance,
185    const URLResponseInfoData& data,
186    PP_Resource file_ref_resource) {
187  return (new URLResponseInfoResource(GetConnection(), instance,
188                                      data,
189                                      file_ref_resource))->GetReference();
190}
191
192PP_Resource ResourceCreationProxy::CreateWheelInputEvent(
193    PP_Instance instance,
194    PP_TimeTicks time_stamp,
195    uint32_t modifiers,
196    const PP_FloatPoint* wheel_delta,
197    const PP_FloatPoint* wheel_ticks,
198    PP_Bool scroll_by_page) {
199  return PPB_InputEvent_Shared::CreateWheelInputEvent(
200      OBJECT_IS_PROXY, instance, time_stamp, modifiers,
201      wheel_delta, wheel_ticks, scroll_by_page);
202}
203
204PP_Resource ResourceCreationProxy::CreateAudio(
205    PP_Instance instance,
206    PP_Resource config_id,
207    PPB_Audio_Callback audio_callback,
208    void* user_data) {
209  return PPB_Audio_Proxy::CreateProxyResource(instance, config_id,
210                                              audio_callback, user_data);
211}
212
213PP_Resource ResourceCreationProxy::CreateAudioTrusted(PP_Instance instance) {
214  // Proxied plugins can't create trusted audio devices.
215  return 0;
216}
217
218PP_Resource ResourceCreationProxy::CreateAudioConfig(
219    PP_Instance instance,
220    PP_AudioSampleRate sample_rate,
221    uint32_t sample_frame_count) {
222  return PPB_AudioConfig_Shared::Create(
223      OBJECT_IS_PROXY, instance, sample_rate, sample_frame_count);
224}
225
226PP_Resource ResourceCreationProxy::CreateFileChooser(
227    PP_Instance instance,
228    PP_FileChooserMode_Dev mode,
229    const PP_Var& accept_types) {
230  scoped_refptr<StringVar> string_var = StringVar::FromPPVar(accept_types);
231  std::string str = string_var ? string_var->value() : std::string();
232  return (new FileChooserResource(GetConnection(), instance, mode,
233                                  str.c_str()))->GetReference();
234}
235
236PP_Resource ResourceCreationProxy::CreateGraphics2D(PP_Instance instance,
237                                                    const PP_Size* size,
238                                                    PP_Bool is_always_opaque) {
239  return (new Graphics2DResource(GetConnection(), instance, *size,
240                                 is_always_opaque))->GetReference();
241}
242
243PP_Resource ResourceCreationProxy::CreateGraphics3D(
244    PP_Instance instance,
245    PP_Resource share_context,
246    const int32_t* attrib_list) {
247  return PPB_Graphics3D_Proxy::CreateProxyResource(
248      instance, share_context, attrib_list);
249}
250
251PP_Resource ResourceCreationProxy::CreateGraphics3DRaw(
252    PP_Instance instance,
253    PP_Resource share_context,
254    const int32_t* attrib_list) {
255  // Not proxied. The raw creation function is used only in the implementation
256  // of the proxy on the host side.
257  return 0;
258}
259
260PP_Resource ResourceCreationProxy::CreateHostResolverPrivate(
261    PP_Instance instance) {
262  return (new HostResolverPrivateResource(
263      GetConnection(), instance))->GetReference();
264}
265
266PP_Resource ResourceCreationProxy::CreateImageData(PP_Instance instance,
267                                                   PP_ImageDataFormat format,
268                                                   const PP_Size* size,
269                                                   PP_Bool init_to_zero) {
270  return PPB_ImageData_Proxy::CreateProxyResource(instance, format, *size,
271                                                  init_to_zero);
272}
273
274PP_Resource ResourceCreationProxy::CreateImageDataNaCl(
275    PP_Instance instance,
276    PP_ImageDataFormat format,
277    const PP_Size* size,
278    PP_Bool init_to_zero) {
279  // These really only are different on the host side. On the plugin side, we
280  // always request a "platform" ImageData if we're trusted, or a "NaCl" one
281  // if we're untrusted (see PPB_ImageData_Proxy::CreateProxyResource()).
282  return CreateImageData(instance, format, size, init_to_zero);
283}
284
285PP_Resource ResourceCreationProxy::CreateNetworkMonitor(
286    PP_Instance instance,
287    PPB_NetworkMonitor_Callback callback,
288    void* user_data) {
289  return PPB_NetworkMonitor_Private_Proxy::CreateProxyResource(
290      instance, callback, user_data);
291}
292
293PP_Resource ResourceCreationProxy::CreatePrinting(PP_Instance instance) {
294  return (new PrintingResource(GetConnection(), instance))->GetReference();
295}
296
297PP_Resource ResourceCreationProxy::CreateTCPServerSocketPrivate(
298    PP_Instance instance) {
299  return PPB_TCPServerSocket_Private_Proxy::CreateProxyResource(instance);
300}
301
302PP_Resource ResourceCreationProxy::CreateTCPSocketPrivate(
303    PP_Instance instance) {
304  return PPB_TCPSocket_Private_Proxy::CreateProxyResource(instance);
305}
306
307PP_Resource ResourceCreationProxy::CreateUDPSocketPrivate(
308    PP_Instance instance) {
309  return (new UDPSocketPrivateResource(
310      GetConnection(), instance))->GetReference();
311}
312
313PP_Resource ResourceCreationProxy::CreateWebSocket(PP_Instance instance) {
314  return (new WebSocketResource(GetConnection(), instance))->GetReference();
315}
316
317PP_Resource ResourceCreationProxy::CreateX509CertificatePrivate(
318    PP_Instance instance) {
319  return PPB_X509Certificate_Private_Proxy::CreateProxyResource(instance);
320}
321
322#if !defined(OS_NACL)
323PP_Resource ResourceCreationProxy::CreateAudioInput(
324    PP_Instance instance) {
325  return (new AudioInputResource(GetConnection(), instance))->GetReference();
326}
327
328PP_Resource ResourceCreationProxy::CreateBroker(PP_Instance instance) {
329  return PPB_Broker_Proxy::CreateProxyResource(instance);
330}
331
332PP_Resource ResourceCreationProxy::CreateBrowserFont(
333    PP_Instance instance,
334    const PP_BrowserFont_Trusted_Description* description) {
335  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
336  if (!dispatcher)
337    return 0;
338  if (!BrowserFontResource_Trusted::IsPPFontDescriptionValid(*description))
339    return 0;
340  return (new BrowserFontResource_Trusted(GetConnection(), instance,
341      *description, dispatcher->preferences()))->GetReference();
342}
343
344PP_Resource ResourceCreationProxy::CreateBuffer(PP_Instance instance,
345                                                uint32_t size) {
346  return PPB_Buffer_Proxy::CreateProxyResource(instance, size);
347}
348
349PP_Resource ResourceCreationProxy::CreateFlashDRM(PP_Instance instance) {
350  return (new FlashDRMResource(GetConnection(), instance))->GetReference();
351}
352
353PP_Resource ResourceCreationProxy::CreateFlashFontFile(
354    PP_Instance instance,
355    const PP_BrowserFont_Trusted_Description* description,
356    PP_PrivateFontCharset charset) {
357  return (new FlashFontFileResource(
358      GetConnection(), instance, description, charset))->GetReference();
359}
360
361PP_Resource ResourceCreationProxy::CreateFlashMenu(
362    PP_Instance instance,
363    const PP_Flash_Menu* menu_data) {
364  scoped_refptr<FlashMenuResource> flash_menu(
365      new FlashMenuResource(GetConnection(), instance));
366  if (!flash_menu->Initialize(menu_data))
367    return 0;
368  return flash_menu->GetReference();
369}
370
371PP_Resource ResourceCreationProxy::CreateFlashMessageLoop(
372    PP_Instance instance) {
373  return PPB_Flash_MessageLoop_Proxy::CreateProxyResource(instance);
374}
375
376PP_Resource ResourceCreationProxy::CreateScrollbar(PP_Instance instance,
377                                                   PP_Bool vertical) {
378  NOTIMPLEMENTED();  // Not proxied yet.
379  return 0;
380}
381
382PP_Resource ResourceCreationProxy::CreateTalk(PP_Instance instance) {
383  return (new TalkResource(GetConnection(), instance))->GetReference();
384}
385
386PP_Resource ResourceCreationProxy::CreateVideoCapture(PP_Instance instance) {
387  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
388  if (!dispatcher)
389    return 0;
390  return (new VideoCaptureResource(GetConnection(), instance, dispatcher))
391      ->GetReference();
392}
393
394PP_Resource ResourceCreationProxy::CreateVideoDecoder(
395    PP_Instance instance,
396    PP_Resource context3d_id,
397    PP_VideoDecoder_Profile profile) {
398  return PPB_VideoDecoder_Proxy::CreateProxyResource(
399      instance, context3d_id, profile);
400}
401
402PP_Resource ResourceCreationProxy::CreateVideoDestination(
403    PP_Instance instance) {
404  return (new VideoDestinationResource(GetConnection(),
405                                       instance))->GetReference();
406}
407
408PP_Resource ResourceCreationProxy::CreateVideoSource(
409    PP_Instance instance) {
410  return (new VideoSourceResource(GetConnection(), instance))->GetReference();
411}
412
413#endif  // !defined(OS_NACL)
414
415bool ResourceCreationProxy::Send(IPC::Message* msg) {
416  return dispatcher()->Send(msg);
417}
418
419bool ResourceCreationProxy::OnMessageReceived(const IPC::Message& msg) {
420  return false;
421}
422
423Connection ResourceCreationProxy::GetConnection() {
424  return Connection(PluginGlobals::Get()->GetBrowserSender(), dispatcher());
425}
426
427}  // namespace proxy
428}  // namespace ppapi
429