15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "build/build_config.h" 173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/common/view_messages.h" 1858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/content_renderer_client.h" 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/host_dispatcher_wrapper.h" 20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h" 213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_hung_plugin_filter.h" 2258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/pepper_plugin_registry.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/renderer/pepper/ppapi_preferences_builder.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h" 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_proxy_impl.h" 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_scrollbar_impl.h" 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_var_deprecated_impl.h" 29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_video_decoder_impl.h" 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/renderer_ppapi_host_impl.h" 313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/render_view_impl.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_audio_input_dev.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_buffer_dev.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_char_set_dev.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_crypto_dev.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_cursor_control_dev.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_device_ref_dev.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_file_chooser_dev.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_font_dev.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_memory_dev.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_opengles2ext_dev.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_printing_dev.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_scrollbar_dev.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_text_input_dev.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_trace_event_dev.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_truetype_font_dev.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_url_util_dev.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_var_deprecated.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_capture_dev.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_decoder_dev.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_view_dev.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_widget_dev.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_zoom_dev.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_module.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio.h" 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_audio_buffer.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h" 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/c/ppb_compositor.h" 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/c/ppb_compositor_layer.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/ppb_console.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_io.h" 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_file_mapping.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_ref.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_system.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_fullscreen.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_graphics_2d.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_graphics_3d.h" 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_host_resolver.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_image_data.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_instance.h" 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_media_stream_audio_track.h" 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_media_stream_video_track.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_messaging.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_cursor.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_lock.h" 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_net_address.h" 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/ppb_network_list.h" 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/ppb_network_monitor.h" 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_network_proxy.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_opengles2.h" 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_tcp_socket.h" 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ppapi/c/ppb_text_input_controller.h" 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_udp_socket.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_loader.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_request_info.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_response_info.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var.h" 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_array.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var_array_buffer.h" 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_dictionary.h" 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/c/ppb_video_decoder.h" 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_video_frame.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_view.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ppapi/c/private/ppb_ext_crx_file_system_private.h" 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_file_io_private.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_file_ref_private.h" 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/c/private/ppb_find_private.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_clipboard.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_device_id.h" 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_drm.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_file.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_font_file.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_fullscreen.h" 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_menu.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_message_loop.h" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_print.h" 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_host_resolver_private.h" 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/private/ppb_input_event_private.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_instance_private.h" 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/c/private/ppb_isolated_file_system_private.h" 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ppapi/c/private/ppb_output_protection_private.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_proxy_private.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_talk_private.h" 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_tcp_server_socket_private.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_tcp_socket_private.h" 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/c/private/ppb_testing_private.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_udp_socket_private.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_uma_private.h" 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_destination_private.h" 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_source_private.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_x509_certificate_private.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_broker_trusted.h" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_browser_font_trusted.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_char_set_trusted.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_file_chooser_trusted.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_url_loader_trusted.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/callback_tracker.h" 1363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "ppapi/shared_impl/ppapi_preferences.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_switches.h" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_opengles2_shared.h" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_var_shared.h" 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_graphics_2d_api.h" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h" 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS) 147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/c/private/ppb_platform_verification_private.h" 148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeTicksToPPTimeTicks; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeToPPTime; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResource; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics2D_API; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_InputEvent_API; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Global tracking info for PPAPI plugins. This is lazily created before the 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first plugin is allocated, and leaked on shutdown. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that we don't want a Singleton here since destroying this object will 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// try to free some stuff that requires WebKit, and Singletons are destroyed 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after WebKit. 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TODO(raymes): I'm not sure if it is completely necessary to leak the 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HostGlobals. Figure out the shutdown sequence and find a way to do this 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// more elegantly. 17158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochHostGlobals* host_globals = NULL; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maintains all currently loaded plugin libs for validating PP_Module 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// identifiers. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::set<PluginModule*> PluginModuleSet; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModuleSet* GetLivePluginSet() { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(PluginModuleSet, live_plugin_libs, ()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &live_plugin_libs; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Core -------------------------------------------------------------------- 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddRefResource(PP_Resource resource) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(resource); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReleaseResource(PP_Resource resource) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(resource); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPP_Time GetTime() { return TimeToPPTime(base::Time::Now()); } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_TimeTicks GetTickTime() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallOnMainThread(int delay_in_msec, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (callback.func) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostDelayedTask( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(callback.func, callback.user_data, result), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(delay_in_msec)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsMainThread() { 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return PP_FromBool(PpapiGlobals::Get() 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetMainThreadMessageLoop() 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->BelongsToCurrentThread()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst PPB_Core core_interface = {&AddRefResource, &ReleaseResource, 216a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &GetTime, &GetTickTime, 217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &CallOnMainThread, &IsMainThread}; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Testing ----------------------------------------------------------------- 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool ReadImageData(PP_Resource device_context_2d, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource image, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_Point* top_left) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResource<PPB_Graphics2D_API> enter(device_context_2d, true); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return PP_FromBool(enter.object()->ReadImageData(image, top_left)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunMessageLoop(PP_Instance instance) { 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()); 233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitMessageLoop(PP_Instance instance) { 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->QuitNow(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HostGlobals::Get()->GetResourceTracker()->GetLiveObjectsForInstance( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_id); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPP_Bool IsOutOfProcess() { return PP_FALSE; } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateInputEvent(PP_Instance instance, PP_Resource input_event) { 24858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin_instance = 24958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch host_globals->GetInstance(instance); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_instance) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResource<PPB_InputEvent_API> enter(input_event, false); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InputEventData& input_event_data = enter.object()->GetInputEventData(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_instance->SimulateInputEvent(input_event_data); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) { 26258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin_instance = 26358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch host_globals->GetInstance(instance); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_instance) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_instance->GetDocumentURL(instance, components); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_Var> vars = 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->GetLiveVars(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0u; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < std::min(static_cast<size_t>(array_size), vars.size()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_vars[i] = vars[i]; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return vars.size(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetMinimumArrayBufferSizeForShmem(PP_Instance /*instance*/, 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32_t /*threshold*/) { 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Does nothing. Not needed in-process. 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RunV8GC(PP_Instance instance) { 2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::PepperPluginInstance::Get(instance)->GetIsolate()-> 2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RequestGarbageCollectionForTesting(v8::Isolate::kFullGarbageCollection); 2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const PPB_Testing_Private testing_interface = { 290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &ReadImageData, &RunMessageLoop, 291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &QuitMessageLoop, &GetLiveObjectsForInstance, 292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &IsOutOfProcess, &SimulateInputEvent, 293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &GetDocumentURL, &GetLiveVars, 2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &SetMinimumArrayBufferSizeForShmem,&RunV8GC}; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetInterface ---------------------------------------------------------------- 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* InternalGetInterface(const char* name) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow custom interface factories first stab at the GetInterface call. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* custom_interface = 30158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GetContentClient()->renderer()->CreatePPAPIInterface(name); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_interface) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return custom_interface; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// TODO(brettw) put these in a hash map for better performance. 306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define PROXIED_IFACE(iface_str, iface_struct) \ 307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (strcmp(name, iface_str) == 0) \ 308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return ppapi::thunk::Get##iface_struct##_Thunk(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_ppb_private.h" 311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_ppb_private_flash.h" 312a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_ppb_private_no_permissions.h" 313a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_ppb_public_dev.h" 314a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_ppb_public_dev_channel.h" 315a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_ppb_public_stable.h" 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 317a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#undef PROXIED_IFACE 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 319a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define LEGACY_IFACE(iface_str, function_name) \ 320a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (strcmp(name, iface_str) == 0) \ 321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return function_name; 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 323a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/thunk/interfaces_legacy.h" 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 325a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#undef LEGACY_IFACE 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only support the testing interface when the command line switch is 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. This allows us to prevent people from (ab)using this interface 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in production code. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePepperTesting)) { 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (strcmp(name, PPB_TESTING_PRIVATE_INTERFACE) == 0) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &testing_interface; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* GetInterface(const char* name) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All interfaces should be used on the main thread. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(IsMainThread()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InternalGetInterface(name); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the PPAPI entry points from the given library and places them into the 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given structure. Returns true on success. 347a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool LoadEntryPointsFromLibrary(const base::NativeLibrary& library, 348a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PepperPluginInfo::EntryPoints* entry_points) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->get_interface = 35058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::GetInterfaceFunc>( 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_GetInterface")); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points->get_interface) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "No PPP_GetInterface in plugin library"; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->initialize_module = 35958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::PPP_InitializeModuleFunc>( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_InitializeModule")); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points->initialize_module) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "No PPP_InitializeModule in plugin library"; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's okay for PPP_ShutdownModule to not be defined and shutdown_module to 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be NULL. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->shutdown_module = 37058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::PPP_ShutdownModuleFunc>( 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_ShutdownModule")); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateHostForInProcessModule(RenderFrameImpl* render_frame, 3783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PluginModule* module, 3793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const WebPluginInfo& webplugin_info) { 3803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // First time an in-process plugin was used, make a host for it. 3813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const PepperPluginInfo* info = 3823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info); 3833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch DCHECK(!info->is_out_of_process); 3843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ppapi::PpapiPermissions perms(PepperPluginRegistry::GetInstance() 386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ->GetInfoForPlugin(webplugin_info) 387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ->permissions); 3883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RendererPpapiHostImpl* host_impl = 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RendererPpapiHostImpl::CreateOnModuleForInProcess(module, perms); 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame->PepperPluginCreated(host_impl); 3913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 3923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PluginModule ---------------------------------------------------------------- 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::PluginModule(const std::string& name, 39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& version, 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ppapi::PpapiPermissions& perms) 401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : callback_tracker_(new ppapi::CallbackTracker), 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_in_destructor_(false), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_crashed_(false), 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) broker_(NULL), 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library_(NULL), 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_(name), 40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) version_(version), 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_(path), 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) permissions_(ppapi::PpapiPermissions::GetForCommandLine(perms.GetBits())), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserve_instance_id_(NULL) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the globals object is created. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_globals) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_globals = new HostGlobals; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&entry_points_, 0, sizeof(entry_points_)); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_module_ = HostGlobals::Get()->AddModule(this); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLivePluginSet()->insert(this); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::~PluginModule() { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the past there have been crashes reentering the plugin module 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructor. Catch if that happens again earlier. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!is_in_destructor_); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_in_destructor_ = true; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the module is being deleted, there should be no more instances still 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // holding a reference to us. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(instances_.empty()); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some resources and other stuff are hung off of the embedder state, which 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be torn down before the routing stuff below. 432558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch renderer_ppapi_host_.reset(); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLivePluginSet()->erase(this); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_tracker_->AbortAll(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_points_.shutdown_module) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_.shutdown_module(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (library_) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UnloadNativeLibrary(library_); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifications that we've been deleted should be last. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->ModuleDeleted(pp_module_); 446bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!is_crashed_) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the plugin crashes, we immediately tell the lifetime delegate that 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we're gone, so we don't want to tell it again. 44958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginRegistry::GetInstance()->PluginModuleDead(this); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't add stuff here, the two notifications that the module object has 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been deleted should be last. This allows, for example, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PPB_Proxy.IsInModuleDestructor to map PP_Module to this class during the 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous parts of the destructor. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PluginModule::SetRendererPpapiHost( 459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<RendererPpapiHostImpl> host) { 460558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch renderer_ppapi_host_ = host.Pass(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 463bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitAsInternalPlugin( 46458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PepperPluginInfo::EntryPoints& entry_points) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (InitializeModule(entry_points)) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_ = entry_points; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::InitAsLibrary(const base::FilePath& path) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeLibrary library = base::LoadNativeLibrary(path, NULL); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!library) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInfo::EntryPoints entry_points; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadEntryPointsFromLibrary(library, &entry_points) || 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !InitializeModule(entry_points)) { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UnloadNativeLibrary(library); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_ = entry_points; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library_ = library; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::InitAsProxied( 490558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch HostDispatcherWrapper* host_dispatcher_wrapper) { 491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!host_dispatcher_wrapper_.get()); 492558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_.reset(host_dispatcher_wrapper); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495a3f7b4e666c476898878fa745f637129375cd889Ben Murdochscoped_refptr<PluginModule> 496a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPluginModule::CreateModuleForExternalPluginInstance() { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new module, but don't set the lifetime delegate. This isn't a 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin in the usual sense, so it isn't tracked by the browser. 499a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch scoped_refptr<PluginModule> external_plugin_module( 50003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new PluginModule(name_, version_, path_, permissions_)); 501a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return external_plugin_module; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 504a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPP_ExternalPluginResult PluginModule::InitAsProxiedExternalPlugin( 50558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance) { 506558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(host_dispatcher_wrapper_.get()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InitAsProxied (for the trusted/out-of-process case) initializes only the 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // module, and one or more instances are added later. In this case, the 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginInstance was already created as in-process, so we missed the proxy 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AddInstance step and must do it now. 511558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_->AddInstance(instance->pp_instance()); 512a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // For external plugins, we need to tell the instance to reset itself as 513a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // proxied. This will clear cached interface pointers and send DidCreate (etc) 514a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // to the plugin side of the proxy. 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return instance->ResetAsProxied(this); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 518a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PluginModule::IsProxied() const { return !!host_dispatcher_wrapper_; } 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::ProcessId PluginModule::GetPeerProcessId() { 521558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 522558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return host_dispatcher_wrapper_->peer_pid(); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::kNullProcessId; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int PluginModule::GetPluginChildId() { 527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 528558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return host_dispatcher_wrapper_->plugin_child_id(); 529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return 0; 530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 533a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst PPB_Core* PluginModule::GetCore() { return &core_interface; } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::SupportsInterface(const char* name) { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!InternalGetInterface(name); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::CreateInstance( 541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame, 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer* container, 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& plugin_url) { 54458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance = PepperPluginInstanceImpl::Create( 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame, this, container, plugin_url); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Plugin doesn't support instance interface, failing."; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 550558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 551558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_->AddInstance(instance->pp_instance()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::GetSomeInstance() const { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will generally crash later if there is not actually any instance to 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return, so we force a crash now to make bugs easier to track down. 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!instances_.empty()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *instances_.begin(); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* PluginModule::GetPluginInterface(const char* name) const { 563558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 564558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return host_dispatcher_wrapper_->GetProxiedInterface(name); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In-process plugins. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points_.get_interface) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry_points_.get_interface(name); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceCreated(PepperPluginInstanceImpl* instance) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instances_.insert(instance); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceDeleted(PepperPluginInstanceImpl* instance) { 577558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 578558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_->RemoveInstance(instance->pp_instance()); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instances_.erase(instance); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_refptr<ppapi::CallbackTracker> PluginModule::GetCallbackTracker() { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return callback_tracker_; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::PluginCrashed() { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_crashed_); // Should only get one notification. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_crashed_ = true; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all instances that they crashed. 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginInstanceSet::iterator i = instances_.begin(); 592a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch i != instances_.end(); 593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ++i) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*i)->InstanceCrashed(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginRegistry::GetInstance()->PluginModuleDead(this); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::SetReserveInstanceIDCallback( 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool (*reserve)(PP_Module, PP_Instance)) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!reserve_instance_id_) << "Only expect one set."; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserve_instance_id_ = reserve; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::ReserveInstanceID(PP_Instance instance) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reserve_instance_id_) 607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return PP_ToBool(reserve_instance_id_(pp_module_, instance)); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Instance ID is usable. 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 611558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PluginModule::SetBroker(PepperBroker* broker) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!broker_ || !broker); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) broker_ = broker; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 616a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperBroker* PluginModule::GetBroker() { return broker_; } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochRendererPpapiHostImpl* PluginModule::CreateOutOfProcessModule( 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame, 6203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const base::FilePath& path, 6213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ppapi::PpapiPermissions permissions, 6223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const IPC::ChannelHandle& channel_handle, 6233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::ProcessId peer_pid, 6243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int plugin_child_id, 6253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool is_external) { 6263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<PepperHungPluginFilter> hung_filter(new PepperHungPluginFilter( 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) path, render_frame->GetRoutingID(), plugin_child_id)); 628a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<HostDispatcherWrapper> dispatcher(new HostDispatcherWrapper( 629a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch this, peer_pid, plugin_child_id, permissions, is_external)); 630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!dispatcher->Init(channel_handle, 631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &GetInterface, 632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ppapi::Preferences(PpapiPreferencesBuilder::Build( 633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame->render_view()->webkit_preferences())), 634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch hung_filter.get())) 6353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return NULL; 6363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 6373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RendererPpapiHostImpl* host_impl = 6383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RendererPpapiHostImpl::CreateOnModuleForOutOfProcess( 6393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch this, dispatcher->dispatcher(), permissions); 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame->PepperPluginCreated(host_impl); 6413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 6423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch InitAsProxied(dispatcher.release()); 6433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return host_impl; 6443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 6453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PluginModule::ResetHostGlobalsForTest() { 64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete host_globals; 64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) host_globals = NULL; 65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 652bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitializeModule( 65358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PepperPluginInfo::EntryPoints& entry_points) { 654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!host_dispatcher_wrapper_.get()) << "Don't call for proxied modules."; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(entry_points.initialize_module != NULL); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int retval = entry_points.initialize_module(pp_module(), &GetInterface); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (retval != 0) { 658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(DISABLE_NACL) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "PPP_InitializeModule returned failure " << retval; 660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // !defined(DISABLE_NACL) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochscoped_refptr<PluginModule> PluginModule::Create( 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame, 6683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const WebPluginInfo& webplugin_info, 6693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool* pepper_plugin_was_registered) { 6703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch *pepper_plugin_was_registered = true; 6713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 6723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // See if a module has already been loaded for this plugin. 6733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::FilePath path(webplugin_info.path); 6743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<PluginModule> module = 6753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginRegistry::GetInstance()->GetLiveModule(path); 6763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (module.get()) { 6773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!module->renderer_ppapi_host()) { 6783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // If the module exists and no embedder state was associated with it, 6793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // then the module was one of the ones preloaded and is an in-process 6803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plugin. We need to associate our host state with it. 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateHostForInProcessModule(render_frame, module.get(), webplugin_info); 6823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 6833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return module; 6843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 6853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 6863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // In-process plugins will have always been created up-front to avoid the 6873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // sandbox restrictions. So getting here implies it doesn't exist or should 6883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // be out of process. 6893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const PepperPluginInfo* info = 6903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info); 6913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!info) { 6923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch *pepper_plugin_was_registered = false; 6933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return scoped_refptr<PluginModule>(); 6943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else if (!info->is_out_of_process) { 6953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // In-process plugin not preloaded, it probably couldn't be initialized. 6963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return scoped_refptr<PluginModule>(); 6973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 6983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 6993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Out of process: have the browser start the plugin process for us. 7003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch IPC::ChannelHandle channel_handle; 701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ProcessId peer_pid = 0; 7023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int plugin_child_id = 0; 703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame->Send(new ViewHostMsg_OpenChannelToPepperPlugin( 7043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch path, &channel_handle, &peer_pid, &plugin_child_id)); 7053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (channel_handle.name.empty()) { 7063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Couldn't be initialized. 7073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return scoped_refptr<PluginModule>(); 7083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 7093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ppapi::PpapiPermissions permissions(info->permissions); 711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // AddLiveModule must be called before any early returns since the 7133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // module's destructor will remove itself. 71403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) module = new PluginModule(info->name, info->version, path, permissions); 7153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginRegistry::GetInstance()->AddLiveModule(path, module.get()); 7163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!module->CreateOutOfProcessModule(render_frame, 7183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch path, 7193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch permissions, 7203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch channel_handle, 7213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch peer_pid, 7223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch plugin_child_id, 7233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch false)) // is_external = false 7243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return scoped_refptr<PluginModule>(); 7253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 7263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return module; 7273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 7283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 72958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 730