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