plugin_module.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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" 1658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/content_renderer_client.h" 17bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h" 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/host_dispatcher_wrapper.h" 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h" 2058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/pepper_plugin_registry.h" 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_gpu_blacklist_private_impl.h" 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h" 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_proxy_impl.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_scrollbar_impl.h" 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_uma_private_impl.h" 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_var_deprecated_impl.h" 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_video_decoder_impl.h" 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/renderer_ppapi_host_impl.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_audio_input_dev.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_buffer_dev.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_char_set_dev.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_crypto_dev.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_cursor_control_dev.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_device_ref_dev.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_file_chooser_dev.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_find_dev.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_font_dev.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_graphics_2d_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_resource_array_dev.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_scrollbar_dev.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_testing_dev.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_text_input_dev.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_trace_event_dev.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_truetype_font_dev.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_url_util_dev.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_var_deprecated.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_capture_dev.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_decoder_dev.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_view_dev.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_widget_dev.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_zoom_dev.h" 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/extensions/dev/ppb_ext_alarms_dev.h" 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/extensions/dev/ppb_ext_socket_dev.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_module.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/ppb_console.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_io.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" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_messaging.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_cursor.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_lock.h" 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_net_address.h" 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_network_proxy.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_opengles2.h" 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_tcp_socket.h" 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_udp_socket.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_loader.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_request_info.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_response_info.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var.h" 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_array.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var_array_buffer.h" 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_dictionary.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_view.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ppapi/c/private/ppb_ext_crx_file_system_private.h" 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_file_io_private.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_file_ref_private.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_clipboard.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_device_id.h" 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_drm.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_file.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_font_file.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_fullscreen.h" 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_menu.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_message_loop.h" 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_print.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_gpu_blacklist_private.h" 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_host_resolver_private.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_instance_private.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_network_list_private.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_network_monitor_private.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_proxy_private.h" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_talk_private.h" 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_tcp_server_socket_private.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_tcp_socket_private.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_udp_socket_private.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_uma_private.h" 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_destination_private.h" 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_source_private.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_x509_certificate_private.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_broker_trusted.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_browser_font_trusted.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_char_set_trusted.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_file_chooser_trusted.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_file_io_trusted.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_url_loader_trusted.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/callback_tracker.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_switches.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_opengles2_shared.h" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_var_shared.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_graphics_2d_api.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/plugin_switches.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeTicksToPPTimeTicks; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeToPPTime; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResource; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics2D_API; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_InputEvent_API; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Global tracking info for PPAPI plugins. This is lazily created before the 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first plugin is allocated, and leaked on shutdown. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that we don't want a Singleton here since destroying this object will 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// try to free some stuff that requires WebKit, and Singletons are destroyed 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after WebKit. 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TODO(raymes): I'm not sure if it is completely necessary to leak the 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HostGlobals. Figure out the shutdown sequence and find a way to do this 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// more elegantly. 15958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochHostGlobals* host_globals = NULL; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maintains all currently loaded plugin libs for validating PP_Module 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// identifiers. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::set<PluginModule*> PluginModuleSet; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModuleSet* GetLivePluginSet() { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(PluginModuleSet, live_plugin_libs, ()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &live_plugin_libs; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Core -------------------------------------------------------------------- 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddRefResource(PP_Resource resource) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(resource); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReleaseResource(PP_Resource resource) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(resource); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Time GetTime() { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeToPPTime(base::Time::Now()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_TimeTicks GetTickTime() { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallOnMainThread(int delay_in_msec, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (callback.func) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostDelayedTask( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(callback.func, callback.user_data, result), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(delay_in_msec)); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsMainThread() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BoolToPPBool(PpapiGlobals::Get()-> 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainThreadMessageLoop()->BelongsToCurrentThread()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Core core_interface = { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &AddRefResource, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReleaseResource, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetTime, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetTickTime, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &CallOnMainThread, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsMainThread 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Testing ----------------------------------------------------------------- 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool ReadImageData(PP_Resource device_context_2d, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource image, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_Point* top_left) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResource<PPB_Graphics2D_API> enter(device_context_2d, true); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return BoolToPPBool(enter.object()->ReadImageData(image, top_left)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunMessageLoop(PP_Instance instance) { 225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()); 227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitMessageLoop(PP_Instance instance) { 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->QuitNow(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HostGlobals::Get()->GetResourceTracker()->GetLiveObjectsForInstance( 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_id); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsOutOfProcess() { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateInputEvent(PP_Instance instance, PP_Resource input_event) { 24458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin_instance = 24558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch host_globals->GetInstance(instance); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_instance) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResource<PPB_InputEvent_API> enter(input_event, false); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InputEventData& input_event_data = enter.object()->GetInputEventData(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_instance->SimulateInputEvent(input_event_data); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) { 25858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin_instance = 25958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch host_globals->GetInstance(instance); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_instance) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_instance->GetDocumentURL(instance, components); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_Var> vars = 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->GetLiveVars(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0u; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < std::min(static_cast<size_t>(array_size), vars.size()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_vars[i] = vars[i]; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return vars.size(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetMinimumArrayBufferSizeForShmem(PP_Instance /*instance*/, 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32_t /*threshold*/) { 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Does nothing. Not needed in-process. 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Testing_Dev testing_interface = { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReadImageData, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RunMessageLoop, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &QuitMessageLoop, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetLiveObjectsForInstance, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsOutOfProcess, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SimulateInputEvent, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetDocumentURL, 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &GetLiveVars, 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &SetMinimumArrayBufferSizeForShmem 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetInterface ---------------------------------------------------------------- 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* InternalGetInterface(const char* name) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow custom interface factories first stab at the GetInterface call. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* custom_interface = 29758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GetContentClient()->renderer()->CreatePPAPIInterface(name); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_interface) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return custom_interface; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) put these in a hash map for better performance. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define UNPROXIED_IFACE(api_name, iface_str, iface_struct) \ 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(name, iface_str) == 0) \ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ::ppapi::thunk::Get##iface_struct##_Thunk(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define PROXIED_IFACE(api_name, iface_str, iface_struct) \ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNPROXIED_IFACE(api_name, iface_str, iface_struct) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_public_stable.h" 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_public_dev.h" 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_private.h" 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h" 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_private_flash.h" 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef UNPROXIED_API 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef PROXIED_IFACE 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) #define LEGACY_IFACE(iface_str, function_name) \ 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (strcmp(name, iface_str) == 0) \ 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return function_name; 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) #include "ppapi/thunk/interfaces_legacy.h" 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) #undef LEGACY_IFACE 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only support the testing interface when the command line switch is 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. This allows us to prevent people from (ab)using this interface 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in production code. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePepperTesting)) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(name, PPB_TESTING_DEV_INTERFACE) == 0 || 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcmp(name, PPB_TESTING_DEV_INTERFACE_0_9) == 0) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &testing_interface; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 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. 347bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool LoadEntryPointsFromLibrary( 348bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const base::NativeLibrary& library, 34958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInfo::EntryPoints* entry_points) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->get_interface = 35158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::GetInterfaceFunc>( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_GetInterface")); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points->get_interface) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "No PPP_GetInterface in plugin library"; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->initialize_module = 36058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::PPP_InitializeModuleFunc>( 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_InitializeModule")); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points->initialize_module) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "No PPP_InitializeModule in plugin library"; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's okay for PPP_ShutdownModule to not be defined and shutdown_module to 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be NULL. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->shutdown_module = 37158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::PPP_ShutdownModuleFunc>( 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_ShutdownModule")); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PluginModule ---------------------------------------------------------------- 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::PluginModule(const std::string& name, 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ::ppapi::PpapiPermissions& perms) 385bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : callback_tracker_(new ::ppapi::CallbackTracker), 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_in_destructor_(false), 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_crashed_(false), 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) broker_(NULL), 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library_(NULL), 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_(name), 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_(path), 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions_(perms), 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserve_instance_id_(NULL) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the globals object is created. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_globals) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_globals = new HostGlobals; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&entry_points_, 0, sizeof(entry_points_)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_module_ = HostGlobals::Get()->AddModule(this); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLivePluginSet()->insert(this); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::~PluginModule() { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the past there have been crashes reentering the plugin module 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructor. Catch if that happens again earlier. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!is_in_destructor_); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_in_destructor_ = true; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the module is being deleted, there should be no more instances still 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // holding a reference to us. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(instances_.empty()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some resources and other stuff are hung off of the embedder state, which 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be torn down before the routing stuff below. 415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch renderer_ppapi_host_.reset(); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLivePluginSet()->erase(this); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_tracker_->AbortAll(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_points_.shutdown_module) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_.shutdown_module(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (library_) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UnloadNativeLibrary(library_); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifications that we've been deleted should be last. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->ModuleDeleted(pp_module_); 429bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!is_crashed_) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the plugin crashes, we immediately tell the lifetime delegate that 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we're gone, so we don't want to tell it again. 43258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginRegistry::GetInstance()->PluginModuleDead(this); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't add stuff here, the two notifications that the module object has 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been deleted should be last. This allows, for example, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PPB_Proxy.IsInModuleDestructor to map PP_Module to this class during the 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous parts of the destructor. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PluginModule::SetRendererPpapiHost( 442558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<RendererPpapiHostImpl> host) { 443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch renderer_ppapi_host_ = host.Pass(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 446bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitAsInternalPlugin( 44758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PepperPluginInfo::EntryPoints& entry_points) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (InitializeModule(entry_points)) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_ = entry_points; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::InitAsLibrary(const base::FilePath& path) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeLibrary library = base::LoadNativeLibrary(path, NULL); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!library) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInfo::EntryPoints entry_points; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadEntryPointsFromLibrary(library, &entry_points) || 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !InitializeModule(entry_points)) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UnloadNativeLibrary(library); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_ = entry_points; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library_ = library; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::InitAsProxied( 473558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch HostDispatcherWrapper* host_dispatcher_wrapper) { 474558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!host_dispatcher_wrapper_.get()); 475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_.reset(host_dispatcher_wrapper); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 478a3f7b4e666c476898878fa745f637129375cd889Ben Murdochscoped_refptr<PluginModule> 479a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PluginModule::CreateModuleForExternalPluginInstance() { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new module, but don't set the lifetime delegate. This isn't a 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin in the usual sense, so it isn't tracked by the browser. 482a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch scoped_refptr<PluginModule> external_plugin_module( 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PluginModule(name_, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions_)); 486a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return external_plugin_module; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 489a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPP_ExternalPluginResult PluginModule::InitAsProxiedExternalPlugin( 49058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance) { 491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(host_dispatcher_wrapper_.get()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InitAsProxied (for the trusted/out-of-process case) initializes only the 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // module, and one or more instances are added later. In this case, the 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginInstance was already created as in-process, so we missed the proxy 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AddInstance step and must do it now. 496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_->AddInstance(instance->pp_instance()); 497a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // For external plugins, we need to tell the instance to reset itself as 498a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // proxied. This will clear cached interface pointers and send DidCreate (etc) 499a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // to the plugin side of the proxy. 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return instance->ResetAsProxied(this); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::IsProxied() const { 504558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return !!host_dispatcher_wrapper_; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::ProcessId PluginModule::GetPeerProcessId() { 508558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 509558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return host_dispatcher_wrapper_->peer_pid(); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::kNullProcessId; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int PluginModule::GetPluginChildId() { 514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 515558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return host_dispatcher_wrapper_->plugin_child_id(); 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return 0; 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Core* PluginModule::GetCore() { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &core_interface; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 52558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInfo::GetInterfaceFunc PluginModule::GetLocalGetInterfaceFunc() { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &GetInterface; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::SupportsInterface(const char* name) { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!InternalGetInterface(name); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::CreateInstance( 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginDelegate* delegate, 536558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderViewImpl* render_view, 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer* container, 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& plugin_url) { 53958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance = PepperPluginInstanceImpl::Create( 540bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch delegate, render_view, this, container, plugin_url); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Plugin doesn't support instance interface, failing."; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 546558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_->AddInstance(instance->pp_instance()); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::GetSomeInstance() const { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will generally crash later if there is not actually any instance to 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return, so we force a crash now to make bugs easier to track down. 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!instances_.empty()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *instances_.begin(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* PluginModule::GetPluginInterface(const char* name) const { 558558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 559558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return host_dispatcher_wrapper_->GetProxiedInterface(name); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In-process plugins. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points_.get_interface) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry_points_.get_interface(name); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceCreated(PepperPluginInstanceImpl* instance) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instances_.insert(instance); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceDeleted(PepperPluginInstanceImpl* instance) { 572558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host_dispatcher_wrapper_) 573558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch host_dispatcher_wrapper_->RemoveInstance(instance->pp_instance()); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instances_.erase(instance); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr< ::ppapi::CallbackTracker> PluginModule::GetCallbackTracker() { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return callback_tracker_; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::PluginCrashed() { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_crashed_); // Should only get one notification. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_crashed_ = true; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all instances that they crashed. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginInstanceSet::iterator i = instances_.begin(); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != instances_.end(); ++i) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*i)->InstanceCrashed(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginRegistry::GetInstance()->PluginModuleDead(this); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::SetReserveInstanceIDCallback( 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool (*reserve)(PP_Module, PP_Instance)) { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!reserve_instance_id_) << "Only expect one set."; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserve_instance_id_ = reserve; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::ReserveInstanceID(PP_Instance instance) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reserve_instance_id_) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PPBoolToBool(reserve_instance_id_(pp_module_, instance)); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Instance ID is usable. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PluginModule::SetBroker(PepperBroker* broker) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!broker_ || !broker); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) broker_ = broker; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 610558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochPepperBroker* PluginModule::GetBroker() { 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return broker_; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PluginModule::ResetHostGlobalsForTest() { 61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete host_globals; 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) host_globals = NULL; 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 620bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitializeModule( 62158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PepperPluginInfo::EntryPoints& entry_points) { 622558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!host_dispatcher_wrapper_.get()) << "Don't call for proxied modules."; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(entry_points.initialize_module != NULL); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int retval = entry_points.initialize_module(pp_module(), &GetInterface); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (retval != 0) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "PPP_InitializeModule returned failure " << retval; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 633