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.
5 #include "ppapi/proxy/resource_creation_proxy.h"
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/compositor_resource.h"
11 #include "ppapi/proxy/connection.h"
12 #include "ppapi/proxy/file_chooser_resource.h"
13 #include "ppapi/proxy/file_io_resource.h"
14 #include "ppapi/proxy/file_ref_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/host_resolver_resource.h"
22 #include "ppapi/proxy/media_stream_video_track_resource.h"
23 #include "ppapi/proxy/net_address_resource.h"
24 #include "ppapi/proxy/network_monitor_resource.h"
25 #include "ppapi/proxy/output_protection_resource.h"
26 #include "ppapi/proxy/platform_verification_private_resource.h"
27 #include "ppapi/proxy/plugin_dispatcher.h"
28 #include "ppapi/proxy/plugin_globals.h"
29 #include "ppapi/proxy/plugin_resource_tracker.h"
30 #include "ppapi/proxy/ppapi_messages.h"
31 #include "ppapi/proxy/ppb_audio_proxy.h"
32 #include "ppapi/proxy/ppb_broker_proxy.h"
33 #include "ppapi/proxy/ppb_buffer_proxy.h"
34 #include "ppapi/proxy/ppb_flash_message_loop_proxy.h"
35 #include "ppapi/proxy/ppb_graphics_3d_proxy.h"
36 #include "ppapi/proxy/ppb_image_data_proxy.h"
37 #include "ppapi/proxy/ppb_video_decoder_proxy.h"
38 #include "ppapi/proxy/ppb_x509_certificate_private_proxy.h"
39 #include "ppapi/proxy/printing_resource.h"
40 #include "ppapi/proxy/talk_resource.h"
41 #include "ppapi/proxy/tcp_server_socket_private_resource.h"
42 #include "ppapi/proxy/tcp_socket_private_resource.h"
43 #include "ppapi/proxy/tcp_socket_resource.h"
44 #include "ppapi/proxy/truetype_font_resource.h"
45 #include "ppapi/proxy/udp_socket_private_resource.h"
46 #include "ppapi/proxy/udp_socket_resource.h"
47 #include "ppapi/proxy/url_loader_resource.h"
48 #include "ppapi/proxy/url_request_info_resource.h"
49 #include "ppapi/proxy/url_response_info_resource.h"
50 #include "ppapi/proxy/video_capture_resource.h"
51 #include "ppapi/proxy/video_decoder_resource.h"
52 #include "ppapi/proxy/video_destination_resource.h"
53 #include "ppapi/proxy/video_source_resource.h"
54 #include "ppapi/proxy/websocket_resource.h"
55 #include "ppapi/shared_impl/api_id.h"
56 #include "ppapi/shared_impl/host_resource.h"
57 #include "ppapi/shared_impl/ppb_audio_config_shared.h"
58 #include "ppapi/shared_impl/ppb_audio_shared.h"
59 #include "ppapi/shared_impl/ppb_input_event_shared.h"
60 #include "ppapi/shared_impl/var.h"
61 #include "ppapi/thunk/enter.h"
62 #include "ppapi/thunk/ppb_image_data_api.h"
64 using ppapi::thunk::ResourceCreationAPI
;
69 ResourceCreationProxy::ResourceCreationProxy(Dispatcher
* dispatcher
)
70 : InterfaceProxy(dispatcher
) {
73 ResourceCreationProxy::~ResourceCreationProxy() {
77 InterfaceProxy
* ResourceCreationProxy::Create(Dispatcher
* dispatcher
) {
78 return new ResourceCreationProxy(dispatcher
);
81 PP_Resource
ResourceCreationProxy::CreateFileIO(PP_Instance instance
) {
82 return (new FileIOResource(GetConnection(), instance
))->GetReference();
85 PP_Resource
ResourceCreationProxy::CreateFileRef(
87 const FileRefCreateInfo
& create_info
) {
88 return FileRefResource::CreateFileRef(GetConnection(), instance
, create_info
);
91 PP_Resource
ResourceCreationProxy::CreateFileSystem(
93 PP_FileSystemType type
) {
94 return (new FileSystemResource(GetConnection(), instance
,
95 type
))->GetReference();
98 PP_Resource
ResourceCreationProxy::CreateIMEInputEvent(
100 PP_InputEvent_Type type
,
101 PP_TimeTicks time_stamp
,
103 uint32_t segment_number
,
104 const uint32_t* segment_offsets
,
105 int32_t target_segment
,
106 uint32_t selection_start
,
107 uint32_t selection_end
) {
108 return PPB_InputEvent_Shared::CreateIMEInputEvent(
109 OBJECT_IS_PROXY
, instance
, type
, time_stamp
, text
, segment_number
,
110 segment_offsets
, target_segment
, selection_start
, selection_end
);
113 PP_Resource
ResourceCreationProxy::CreateKeyboardInputEvent_1_0(
114 PP_Instance instance
,
115 PP_InputEvent_Type type
,
116 PP_TimeTicks time_stamp
,
119 struct PP_Var character_text
) {
120 PP_Var code
= StringVar::StringToPPVar("");
121 return PPB_InputEvent_Shared::CreateKeyboardInputEvent(
122 OBJECT_IS_PROXY
, instance
, type
, time_stamp
, modifiers
, key_code
,
123 character_text
, code
);
126 PP_Resource
ResourceCreationProxy::CreateKeyboardInputEvent_1_2(
127 PP_Instance instance
,
128 PP_InputEvent_Type type
,
129 PP_TimeTicks time_stamp
,
132 struct PP_Var character_text
,
133 struct PP_Var code
) {
134 return PPB_InputEvent_Shared::CreateKeyboardInputEvent(
135 OBJECT_IS_PROXY
, instance
, type
, time_stamp
, modifiers
, key_code
,
136 character_text
, code
);
139 PP_Resource
ResourceCreationProxy::CreateMouseInputEvent(
140 PP_Instance instance
,
141 PP_InputEvent_Type type
,
142 PP_TimeTicks time_stamp
,
144 PP_InputEvent_MouseButton mouse_button
,
145 const PP_Point
* mouse_position
,
147 const PP_Point
* mouse_movement
) {
148 return PPB_InputEvent_Shared::CreateMouseInputEvent(
149 OBJECT_IS_PROXY
, instance
, type
, time_stamp
, modifiers
,
150 mouse_button
, mouse_position
, click_count
, mouse_movement
);
153 PP_Resource
ResourceCreationProxy::CreateTouchInputEvent(
154 PP_Instance instance
,
155 PP_InputEvent_Type type
,
156 PP_TimeTicks time_stamp
,
157 uint32_t modifiers
) {
158 return PPB_InputEvent_Shared::CreateTouchInputEvent(
159 OBJECT_IS_PROXY
, instance
, type
, time_stamp
, modifiers
);
162 PP_Resource
ResourceCreationProxy::CreateTrueTypeFont(
163 PP_Instance instance
,
164 const PP_TrueTypeFontDesc_Dev
* desc
) {
165 return (new TrueTypeFontResource(GetConnection(),
166 instance
, *desc
))->GetReference();
170 PP_Resource
ResourceCreationProxy::CreateURLLoader(PP_Instance instance
) {
171 return (new URLLoaderResource(GetConnection(), instance
))->GetReference();
174 PP_Resource
ResourceCreationProxy::CreateURLRequestInfo(
175 PP_Instance instance
) {
176 return (new URLRequestInfoResource(
177 GetConnection(), instance
, URLRequestInfoData()))->GetReference();
180 PP_Resource
ResourceCreationProxy::CreateWheelInputEvent(
181 PP_Instance instance
,
182 PP_TimeTicks time_stamp
,
184 const PP_FloatPoint
* wheel_delta
,
185 const PP_FloatPoint
* wheel_ticks
,
186 PP_Bool scroll_by_page
) {
187 return PPB_InputEvent_Shared::CreateWheelInputEvent(
188 OBJECT_IS_PROXY
, instance
, time_stamp
, modifiers
,
189 wheel_delta
, wheel_ticks
, scroll_by_page
);
192 PP_Resource
ResourceCreationProxy::CreateAudio1_0(
193 PP_Instance instance
,
194 PP_Resource config_id
,
195 PPB_Audio_Callback_1_0 audio_callback
,
197 return PPB_Audio_Proxy::CreateProxyResource(
198 instance
, config_id
, AudioCallbackCombined(audio_callback
), user_data
);
201 PP_Resource
ResourceCreationProxy::CreateAudio(
202 PP_Instance instance
,
203 PP_Resource config_id
,
204 PPB_Audio_Callback audio_callback
,
206 return PPB_Audio_Proxy::CreateProxyResource(
207 instance
, config_id
, AudioCallbackCombined(audio_callback
), user_data
);
210 PP_Resource
ResourceCreationProxy::CreateAudioTrusted(PP_Instance instance
) {
211 // Proxied plugins can't create trusted audio devices.
215 PP_Resource
ResourceCreationProxy::CreateAudioConfig(
216 PP_Instance instance
,
217 PP_AudioSampleRate sample_rate
,
218 uint32_t sample_frame_count
) {
219 return PPB_AudioConfig_Shared::Create(
220 OBJECT_IS_PROXY
, instance
, sample_rate
, sample_frame_count
);
223 PP_Resource
ResourceCreationProxy::CreateCompositor(PP_Instance instance
) {
224 return (new CompositorResource(GetConnection(), instance
))->GetReference();
227 PP_Resource
ResourceCreationProxy::CreateFileChooser(
228 PP_Instance instance
,
229 PP_FileChooserMode_Dev mode
,
230 const PP_Var
& accept_types
) {
231 scoped_refptr
<StringVar
> string_var
= StringVar::FromPPVar(accept_types
);
232 std::string str
= string_var
.get() ? string_var
->value() : std::string();
233 return (new FileChooserResource(GetConnection(), instance
, mode
, str
.c_str()))
237 PP_Resource
ResourceCreationProxy::CreateGraphics2D(PP_Instance instance
,
239 PP_Bool is_always_opaque
) {
240 return (new Graphics2DResource(GetConnection(), instance
, *size
,
241 is_always_opaque
))->GetReference();
244 PP_Resource
ResourceCreationProxy::CreateGraphics3D(
245 PP_Instance instance
,
246 PP_Resource share_context
,
247 const int32_t* attrib_list
) {
248 return PPB_Graphics3D_Proxy::CreateProxyResource(
249 instance
, share_context
, attrib_list
);
252 PP_Resource
ResourceCreationProxy::CreateGraphics3DRaw(
253 PP_Instance instance
,
254 PP_Resource share_context
,
255 const int32_t* attrib_list
,
256 base::SharedMemoryHandle
* shared_state
) {
257 // Not proxied. The raw creation function is used only in the implementation
258 // of the proxy on the host side.
262 PP_Resource
ResourceCreationProxy::CreateHostResolver(PP_Instance instance
) {
263 return (new HostResolverResource(GetConnection(), instance
))->GetReference();
266 PP_Resource
ResourceCreationProxy::CreateHostResolverPrivate(
267 PP_Instance instance
) {
268 return (new HostResolverPrivateResource(
269 GetConnection(), instance
))->GetReference();
272 PP_Resource
ResourceCreationProxy::CreateImageData(
273 PP_Instance instance
,
274 PP_ImageDataFormat format
,
276 PP_Bool init_to_zero
) {
277 // On the plugin side, we create PlatformImageData resources for trusted
278 // plugins and SimpleImageData resources for untrusted ones.
279 PPB_ImageData_Shared::ImageDataType type
=
280 #if !defined(OS_NACL)
281 PPB_ImageData_Shared::PLATFORM
;
283 PPB_ImageData_Shared::SIMPLE
;
285 return PPB_ImageData_Proxy::CreateProxyResource(
287 format
, *size
, init_to_zero
);
290 PP_Resource
ResourceCreationProxy::CreateImageDataSimple(
291 PP_Instance instance
,
292 PP_ImageDataFormat format
,
294 PP_Bool init_to_zero
) {
295 return PPB_ImageData_Proxy::CreateProxyResource(
297 PPB_ImageData_Shared::SIMPLE
,
298 format
, *size
, init_to_zero
);
301 PP_Resource
ResourceCreationProxy::CreateMediaStreamVideoTrack(
302 PP_Instance instance
) {
303 return (new MediaStreamVideoTrackResource(GetConnection(),
304 instance
))->GetReference();
307 PP_Resource
ResourceCreationProxy::CreateNetAddressFromIPv4Address(
308 PP_Instance instance
,
309 const PP_NetAddress_IPv4
* ipv4_addr
) {
310 return (new NetAddressResource(GetConnection(), instance
,
311 *ipv4_addr
))->GetReference();
314 PP_Resource
ResourceCreationProxy::CreateNetAddressFromIPv6Address(
315 PP_Instance instance
,
316 const PP_NetAddress_IPv6
* ipv6_addr
) {
317 return (new NetAddressResource(GetConnection(), instance
,
318 *ipv6_addr
))->GetReference();
321 PP_Resource
ResourceCreationProxy::CreateNetAddressFromNetAddressPrivate(
322 PP_Instance instance
,
323 const PP_NetAddress_Private
& private_addr
) {
324 return (new NetAddressResource(GetConnection(), instance
,
325 private_addr
))->GetReference();
328 PP_Resource
ResourceCreationProxy::CreateNetworkMonitor(
329 PP_Instance instance
) {
330 return (new NetworkMonitorResource(GetConnection(), instance
))->
334 PP_Resource
ResourceCreationProxy::CreateOutputProtectionPrivate(
335 PP_Instance instance
) {
336 return (new OutputProtectionResource(GetConnection(), instance
))->
340 PP_Resource
ResourceCreationProxy::CreatePrinting(PP_Instance instance
) {
341 return (new PrintingResource(GetConnection(), instance
))->GetReference();
344 PP_Resource
ResourceCreationProxy::CreateTCPServerSocketPrivate(
345 PP_Instance instance
) {
346 return (new TCPServerSocketPrivateResource(GetConnection(), instance
))->
350 PP_Resource
ResourceCreationProxy::CreateTCPSocket1_0(
351 PP_Instance instance
) {
352 return (new TCPSocketResource(GetConnection(), instance
,
353 TCP_SOCKET_VERSION_1_0
))->GetReference();
356 PP_Resource
ResourceCreationProxy::CreateTCPSocket(
357 PP_Instance instance
) {
358 return (new TCPSocketResource(
359 GetConnection(), instance
, TCP_SOCKET_VERSION_1_1_OR_ABOVE
))->
363 PP_Resource
ResourceCreationProxy::CreateTCPSocketPrivate(
364 PP_Instance instance
) {
365 return (new TCPSocketPrivateResource(GetConnection(), instance
))->
369 PP_Resource
ResourceCreationProxy::CreateUDPSocket(PP_Instance instance
) {
370 return (new UDPSocketResource(GetConnection(), instance
))->GetReference();
373 PP_Resource
ResourceCreationProxy::CreateUDPSocketPrivate(
374 PP_Instance instance
) {
375 return (new UDPSocketPrivateResource(
376 GetConnection(), instance
))->GetReference();
379 PP_Resource
ResourceCreationProxy::CreateVideoDecoder(PP_Instance instance
) {
380 return (new VideoDecoderResource(GetConnection(), instance
))->GetReference();
383 PP_Resource
ResourceCreationProxy::CreateVideoDestination(
384 PP_Instance instance
) {
385 return (new VideoDestinationResource(GetConnection(),
386 instance
))->GetReference();
389 PP_Resource
ResourceCreationProxy::CreateVideoSource(
390 PP_Instance instance
) {
391 return (new VideoSourceResource(GetConnection(), instance
))->GetReference();
394 PP_Resource
ResourceCreationProxy::CreateWebSocket(PP_Instance instance
) {
395 return (new WebSocketResource(GetConnection(), instance
))->GetReference();
398 PP_Resource
ResourceCreationProxy::CreateX509CertificatePrivate(
399 PP_Instance instance
) {
400 return PPB_X509Certificate_Private_Proxy::CreateProxyResource(instance
);
403 #if !defined(OS_NACL)
404 PP_Resource
ResourceCreationProxy::CreateAudioInput(
405 PP_Instance instance
) {
406 return (new AudioInputResource(GetConnection(), instance
))->GetReference();
409 PP_Resource
ResourceCreationProxy::CreateBroker(PP_Instance instance
) {
410 return PPB_Broker_Proxy::CreateProxyResource(instance
);
413 PP_Resource
ResourceCreationProxy::CreateBrowserFont(
414 PP_Instance instance
,
415 const PP_BrowserFont_Trusted_Description
* description
) {
416 PluginDispatcher
* dispatcher
= PluginDispatcher::GetForInstance(instance
);
419 return PluginGlobals::Get()->CreateBrowserFont(
420 GetConnection(), instance
, *description
, dispatcher
->preferences());
423 PP_Resource
ResourceCreationProxy::CreateBuffer(PP_Instance instance
,
425 return PPB_Buffer_Proxy::CreateProxyResource(instance
, size
);
428 PP_Resource
ResourceCreationProxy::CreateFlashDRM(PP_Instance instance
) {
429 return (new FlashDRMResource(GetConnection(), instance
))->GetReference();
432 PP_Resource
ResourceCreationProxy::CreateFlashFontFile(
433 PP_Instance instance
,
434 const PP_BrowserFont_Trusted_Description
* description
,
435 PP_PrivateFontCharset charset
) {
436 return (new FlashFontFileResource(
437 GetConnection(), instance
, description
, charset
))->GetReference();
440 PP_Resource
ResourceCreationProxy::CreateFlashMenu(
441 PP_Instance instance
,
442 const PP_Flash_Menu
* menu_data
) {
443 scoped_refptr
<FlashMenuResource
> flash_menu(
444 new FlashMenuResource(GetConnection(), instance
));
445 if (!flash_menu
->Initialize(menu_data
))
447 return flash_menu
->GetReference();
450 PP_Resource
ResourceCreationProxy::CreateFlashMessageLoop(
451 PP_Instance instance
) {
452 return PPB_Flash_MessageLoop_Proxy::CreateProxyResource(instance
);
455 PP_Resource
ResourceCreationProxy::CreatePlatformVerificationPrivate(
456 PP_Instance instance
) {
457 return (new PlatformVerificationPrivateResource(GetConnection(), instance
))->
461 PP_Resource
ResourceCreationProxy::CreateScrollbar(PP_Instance instance
,
463 NOTIMPLEMENTED(); // Not proxied yet.
467 PP_Resource
ResourceCreationProxy::CreateTalk(PP_Instance instance
) {
468 return (new TalkResource(GetConnection(), instance
))->GetReference();
471 PP_Resource
ResourceCreationProxy::CreateVideoCapture(PP_Instance instance
) {
472 PluginDispatcher
* dispatcher
= PluginDispatcher::GetForInstance(instance
);
475 return (new VideoCaptureResource(GetConnection(), instance
, dispatcher
))
479 PP_Resource
ResourceCreationProxy::CreateVideoDecoderDev(
480 PP_Instance instance
,
481 PP_Resource context3d_id
,
482 PP_VideoDecoder_Profile profile
) {
483 return PPB_VideoDecoder_Proxy::CreateProxyResource(
484 instance
, context3d_id
, profile
);
487 #endif // !defined(OS_NACL)
489 bool ResourceCreationProxy::Send(IPC::Message
* msg
) {
490 return dispatcher()->Send(msg
);
493 bool ResourceCreationProxy::OnMessageReceived(const IPC::Message
& msg
) {
497 Connection
ResourceCreationProxy::GetConnection() {
498 return Connection(PluginGlobals::Get()->GetBrowserSender(), dispatcher());