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/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" 63 64 using ppapi::thunk::ResourceCreationAPI; 65 66 namespace ppapi { 67 namespace proxy { 68 69 ResourceCreationProxy::ResourceCreationProxy(Dispatcher* dispatcher) 70 : InterfaceProxy(dispatcher) { 71 } 72 73 ResourceCreationProxy::~ResourceCreationProxy() { 74 } 75 76 // static 77 InterfaceProxy* ResourceCreationProxy::Create(Dispatcher* dispatcher) { 78 return new ResourceCreationProxy(dispatcher); 79 } 80 81 PP_Resource ResourceCreationProxy::CreateFileIO(PP_Instance instance) { 82 return (new FileIOResource(GetConnection(), instance))->GetReference(); 83 } 84 85 PP_Resource ResourceCreationProxy::CreateFileRef( 86 PP_Instance instance, 87 const FileRefCreateInfo& create_info) { 88 return FileRefResource::CreateFileRef(GetConnection(), instance, create_info); 89 } 90 91 PP_Resource ResourceCreationProxy::CreateFileSystem( 92 PP_Instance instance, 93 PP_FileSystemType type) { 94 return (new FileSystemResource(GetConnection(), instance, 95 type))->GetReference(); 96 } 97 98 PP_Resource ResourceCreationProxy::CreateIMEInputEvent( 99 PP_Instance instance, 100 PP_InputEvent_Type type, 101 PP_TimeTicks time_stamp, 102 struct PP_Var text, 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); 111 } 112 113 PP_Resource ResourceCreationProxy::CreateKeyboardInputEvent_1_0( 114 PP_Instance instance, 115 PP_InputEvent_Type type, 116 PP_TimeTicks time_stamp, 117 uint32_t modifiers, 118 uint32_t key_code, 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); 124 } 125 126 PP_Resource ResourceCreationProxy::CreateKeyboardInputEvent_1_2( 127 PP_Instance instance, 128 PP_InputEvent_Type type, 129 PP_TimeTicks time_stamp, 130 uint32_t modifiers, 131 uint32_t key_code, 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); 137 } 138 139 PP_Resource ResourceCreationProxy::CreateMouseInputEvent( 140 PP_Instance instance, 141 PP_InputEvent_Type type, 142 PP_TimeTicks time_stamp, 143 uint32_t modifiers, 144 PP_InputEvent_MouseButton mouse_button, 145 const PP_Point* mouse_position, 146 int32_t click_count, 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); 151 } 152 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); 160 } 161 162 PP_Resource ResourceCreationProxy::CreateTrueTypeFont( 163 PP_Instance instance, 164 const PP_TrueTypeFontDesc_Dev* desc) { 165 return (new TrueTypeFontResource(GetConnection(), 166 instance, *desc))->GetReference(); 167 168 } 169 170 PP_Resource ResourceCreationProxy::CreateURLLoader(PP_Instance instance) { 171 return (new URLLoaderResource(GetConnection(), instance))->GetReference(); 172 } 173 174 PP_Resource ResourceCreationProxy::CreateURLRequestInfo( 175 PP_Instance instance) { 176 return (new URLRequestInfoResource( 177 GetConnection(), instance, URLRequestInfoData()))->GetReference(); 178 } 179 180 PP_Resource ResourceCreationProxy::CreateWheelInputEvent( 181 PP_Instance instance, 182 PP_TimeTicks time_stamp, 183 uint32_t modifiers, 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); 190 } 191 192 PP_Resource ResourceCreationProxy::CreateAudio1_0( 193 PP_Instance instance, 194 PP_Resource config_id, 195 PPB_Audio_Callback_1_0 audio_callback, 196 void* user_data) { 197 return PPB_Audio_Proxy::CreateProxyResource( 198 instance, config_id, AudioCallbackCombined(audio_callback), user_data); 199 } 200 201 PP_Resource ResourceCreationProxy::CreateAudio( 202 PP_Instance instance, 203 PP_Resource config_id, 204 PPB_Audio_Callback audio_callback, 205 void* user_data) { 206 return PPB_Audio_Proxy::CreateProxyResource( 207 instance, config_id, AudioCallbackCombined(audio_callback), user_data); 208 } 209 210 PP_Resource ResourceCreationProxy::CreateAudioTrusted(PP_Instance instance) { 211 // Proxied plugins can't create trusted audio devices. 212 return 0; 213 } 214 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); 221 } 222 223 PP_Resource ResourceCreationProxy::CreateCompositor(PP_Instance instance) { 224 return (new CompositorResource(GetConnection(), instance))->GetReference(); 225 } 226 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())) 234 ->GetReference(); 235 } 236 237 PP_Resource ResourceCreationProxy::CreateGraphics2D(PP_Instance instance, 238 const PP_Size* size, 239 PP_Bool is_always_opaque) { 240 return (new Graphics2DResource(GetConnection(), instance, *size, 241 is_always_opaque))->GetReference(); 242 } 243 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); 250 } 251 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. 259 return 0; 260 } 261 262 PP_Resource ResourceCreationProxy::CreateHostResolver(PP_Instance instance) { 263 return (new HostResolverResource(GetConnection(), instance))->GetReference(); 264 } 265 266 PP_Resource ResourceCreationProxy::CreateHostResolverPrivate( 267 PP_Instance instance) { 268 return (new HostResolverPrivateResource( 269 GetConnection(), instance))->GetReference(); 270 } 271 272 PP_Resource ResourceCreationProxy::CreateImageData( 273 PP_Instance instance, 274 PP_ImageDataFormat format, 275 const PP_Size* size, 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; 282 #else 283 PPB_ImageData_Shared::SIMPLE; 284 #endif 285 return PPB_ImageData_Proxy::CreateProxyResource( 286 instance, type, 287 format, *size, init_to_zero); 288 } 289 290 PP_Resource ResourceCreationProxy::CreateImageDataSimple( 291 PP_Instance instance, 292 PP_ImageDataFormat format, 293 const PP_Size* size, 294 PP_Bool init_to_zero) { 295 return PPB_ImageData_Proxy::CreateProxyResource( 296 instance, 297 PPB_ImageData_Shared::SIMPLE, 298 format, *size, init_to_zero); 299 } 300 301 PP_Resource ResourceCreationProxy::CreateMediaStreamVideoTrack( 302 PP_Instance instance) { 303 return (new MediaStreamVideoTrackResource(GetConnection(), 304 instance))->GetReference(); 305 } 306 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(); 312 } 313 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(); 319 } 320 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(); 326 } 327 328 PP_Resource ResourceCreationProxy::CreateNetworkMonitor( 329 PP_Instance instance) { 330 return (new NetworkMonitorResource(GetConnection(), instance))-> 331 GetReference(); 332 } 333 334 PP_Resource ResourceCreationProxy::CreateOutputProtectionPrivate( 335 PP_Instance instance) { 336 return (new OutputProtectionResource(GetConnection(), instance))-> 337 GetReference(); 338 } 339 340 PP_Resource ResourceCreationProxy::CreatePrinting(PP_Instance instance) { 341 return (new PrintingResource(GetConnection(), instance))->GetReference(); 342 } 343 344 PP_Resource ResourceCreationProxy::CreateTCPServerSocketPrivate( 345 PP_Instance instance) { 346 return (new TCPServerSocketPrivateResource(GetConnection(), instance))-> 347 GetReference(); 348 } 349 350 PP_Resource ResourceCreationProxy::CreateTCPSocket1_0( 351 PP_Instance instance) { 352 return (new TCPSocketResource(GetConnection(), instance, 353 TCP_SOCKET_VERSION_1_0))->GetReference(); 354 } 355 356 PP_Resource ResourceCreationProxy::CreateTCPSocket( 357 PP_Instance instance) { 358 return (new TCPSocketResource( 359 GetConnection(), instance, TCP_SOCKET_VERSION_1_1_OR_ABOVE))-> 360 GetReference(); 361 } 362 363 PP_Resource ResourceCreationProxy::CreateTCPSocketPrivate( 364 PP_Instance instance) { 365 return (new TCPSocketPrivateResource(GetConnection(), instance))-> 366 GetReference(); 367 } 368 369 PP_Resource ResourceCreationProxy::CreateUDPSocket(PP_Instance instance) { 370 return (new UDPSocketResource(GetConnection(), instance))->GetReference(); 371 } 372 373 PP_Resource ResourceCreationProxy::CreateUDPSocketPrivate( 374 PP_Instance instance) { 375 return (new UDPSocketPrivateResource( 376 GetConnection(), instance))->GetReference(); 377 } 378 379 PP_Resource ResourceCreationProxy::CreateVideoDecoder(PP_Instance instance) { 380 return (new VideoDecoderResource(GetConnection(), instance))->GetReference(); 381 } 382 383 PP_Resource ResourceCreationProxy::CreateVideoDestination( 384 PP_Instance instance) { 385 return (new VideoDestinationResource(GetConnection(), 386 instance))->GetReference(); 387 } 388 389 PP_Resource ResourceCreationProxy::CreateVideoSource( 390 PP_Instance instance) { 391 return (new VideoSourceResource(GetConnection(), instance))->GetReference(); 392 } 393 394 PP_Resource ResourceCreationProxy::CreateWebSocket(PP_Instance instance) { 395 return (new WebSocketResource(GetConnection(), instance))->GetReference(); 396 } 397 398 PP_Resource ResourceCreationProxy::CreateX509CertificatePrivate( 399 PP_Instance instance) { 400 return PPB_X509Certificate_Private_Proxy::CreateProxyResource(instance); 401 } 402 403 #if !defined(OS_NACL) 404 PP_Resource ResourceCreationProxy::CreateAudioInput( 405 PP_Instance instance) { 406 return (new AudioInputResource(GetConnection(), instance))->GetReference(); 407 } 408 409 PP_Resource ResourceCreationProxy::CreateBroker(PP_Instance instance) { 410 return PPB_Broker_Proxy::CreateProxyResource(instance); 411 } 412 413 PP_Resource ResourceCreationProxy::CreateBrowserFont( 414 PP_Instance instance, 415 const PP_BrowserFont_Trusted_Description* description) { 416 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 417 if (!dispatcher) 418 return 0; 419 return PluginGlobals::Get()->CreateBrowserFont( 420 GetConnection(), instance, *description, dispatcher->preferences()); 421 } 422 423 PP_Resource ResourceCreationProxy::CreateBuffer(PP_Instance instance, 424 uint32_t size) { 425 return PPB_Buffer_Proxy::CreateProxyResource(instance, size); 426 } 427 428 PP_Resource ResourceCreationProxy::CreateFlashDRM(PP_Instance instance) { 429 return (new FlashDRMResource(GetConnection(), instance))->GetReference(); 430 } 431 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(); 438 } 439 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)) 446 return 0; 447 return flash_menu->GetReference(); 448 } 449 450 PP_Resource ResourceCreationProxy::CreateFlashMessageLoop( 451 PP_Instance instance) { 452 return PPB_Flash_MessageLoop_Proxy::CreateProxyResource(instance); 453 } 454 455 PP_Resource ResourceCreationProxy::CreatePlatformVerificationPrivate( 456 PP_Instance instance) { 457 return (new PlatformVerificationPrivateResource(GetConnection(), instance))-> 458 GetReference(); 459 } 460 461 PP_Resource ResourceCreationProxy::CreateScrollbar(PP_Instance instance, 462 PP_Bool vertical) { 463 NOTIMPLEMENTED(); // Not proxied yet. 464 return 0; 465 } 466 467 PP_Resource ResourceCreationProxy::CreateTalk(PP_Instance instance) { 468 return (new TalkResource(GetConnection(), instance))->GetReference(); 469 } 470 471 PP_Resource ResourceCreationProxy::CreateVideoCapture(PP_Instance instance) { 472 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 473 if (!dispatcher) 474 return 0; 475 return (new VideoCaptureResource(GetConnection(), instance, dispatcher)) 476 ->GetReference(); 477 } 478 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); 485 } 486 487 #endif // !defined(OS_NACL) 488 489 bool ResourceCreationProxy::Send(IPC::Message* msg) { 490 return dispatcher()->Send(msg); 491 } 492 493 bool ResourceCreationProxy::OnMessageReceived(const IPC::Message& msg) { 494 return false; 495 } 496 497 Connection ResourceCreationProxy::GetConnection() { 498 return Connection(PluginGlobals::Get()->GetBrowserSender(), dispatcher()); 499 } 500 501 } // namespace proxy 502 } // namespace ppapi 503