Home | History | Annotate | Download | only in proxy
      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