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