plugin_module.cc revision 58e6fbe4ee35d65e14b626c557d37565bf8ad179
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" 18bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h" 1958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/pepper_plugin_registry.h" 21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_gpu_blacklist_private_impl.h" 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h" 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_proxy_impl.h" 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_scrollbar_impl.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_uma_private_impl.h" 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_var_deprecated_impl.h" 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_video_decoder_impl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_audio_input_dev.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_buffer_dev.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_char_set_dev.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_crypto_dev.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_cursor_control_dev.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_device_ref_dev.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_file_chooser_dev.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_find_dev.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_font_dev.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_graphics_2d_dev.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_memory_dev.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_opengles2ext_dev.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_printing_dev.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_resource_array_dev.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_scrollbar_dev.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_testing_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" 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/extensions/dev/ppb_ext_alarms_dev.h" 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/extensions/dev/ppb_ext_socket_dev.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_module.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/ppb_console.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_io.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_ref.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_system.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_fullscreen.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_graphics_2d.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_graphics_3d.h" 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_host_resolver.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_image_data.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_instance.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_messaging.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_cursor.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_lock.h" 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_net_address.h" 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_network_proxy.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_opengles2.h" 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_tcp_socket.h" 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_udp_socket.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_loader.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_request_info.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_response_info.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var.h" 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_array.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var_array_buffer.h" 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_dictionary.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_view.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ppapi/c/private/ppb_ext_crx_file_system_private.h" 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_file_io_private.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_file_ref_private.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_clipboard.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_device_id.h" 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_drm.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_file.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_font_file.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_fullscreen.h" 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_menu.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_message_loop.h" 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_print.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_gpu_blacklist_private.h" 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_host_resolver_private.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_instance_private.h" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_network_list_private.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_network_monitor_private.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_proxy_private.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_talk_private.h" 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_tcp_server_socket_private.h" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_tcp_socket_private.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_udp_socket_private.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_uma_private.h" 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_destination_private.h" 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_source_private.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_x509_certificate_private.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_broker_trusted.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_browser_font_trusted.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_char_set_trusted.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_file_chooser_trusted.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_file_io_trusted.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_url_loader_trusted.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/callback_tracker.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_switches.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_opengles2_shared.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_var_shared.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_graphics_2d_api.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/plugin_switches.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeTicksToPPTimeTicks; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeToPPTime; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResource; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics2D_API; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_InputEvent_API; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Global tracking info for PPAPI plugins. This is lazily created before the 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first plugin is allocated, and leaked on shutdown. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that we don't want a Singleton here since destroying this object will 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// try to free some stuff that requires WebKit, and Singletons are destroyed 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after WebKit. 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TODO(raymes): I'm not sure if it is completely necessary to leak the 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HostGlobals. Figure out the shutdown sequence and find a way to do this 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// more elegantly. 15758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochHostGlobals* host_globals = NULL; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maintains all currently loaded plugin libs for validating PP_Module 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// identifiers. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::set<PluginModule*> PluginModuleSet; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModuleSet* GetLivePluginSet() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(PluginModuleSet, live_plugin_libs, ()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &live_plugin_libs; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Core -------------------------------------------------------------------- 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddRefResource(PP_Resource resource) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(resource); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReleaseResource(PP_Resource resource) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(resource); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Time GetTime() { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeToPPTime(base::Time::Now()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_TimeTicks GetTickTime() { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallOnMainThread(int delay_in_msec, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (callback.func) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostDelayedTask( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(callback.func, callback.user_data, result), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(delay_in_msec)); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsMainThread() { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BoolToPPBool(PpapiGlobals::Get()-> 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainThreadMessageLoop()->BelongsToCurrentThread()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Core core_interface = { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &AddRefResource, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReleaseResource, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetTime, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetTickTime, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &CallOnMainThread, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsMainThread 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Testing ----------------------------------------------------------------- 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool ReadImageData(PP_Resource device_context_2d, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource image, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_Point* top_left) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResource<PPB_Graphics2D_API> enter(device_context_2d, true); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return BoolToPPBool(enter.object()->ReadImageData(image, top_left)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunMessageLoop(PP_Instance instance) { 223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()); 225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitMessageLoop(PP_Instance instance) { 229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->QuitNow(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HostGlobals::Get()->GetResourceTracker()->GetLiveObjectsForInstance( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_id); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsOutOfProcess() { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateInputEvent(PP_Instance instance, PP_Resource input_event) { 24258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin_instance = 24358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch host_globals->GetInstance(instance); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_instance) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResource<PPB_InputEvent_API> enter(input_event, false); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InputEventData& input_event_data = enter.object()->GetInputEventData(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_instance->SimulateInputEvent(input_event_data); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) { 25658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin_instance = 25758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch host_globals->GetInstance(instance); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_instance) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_instance->GetDocumentURL(instance, components); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_Var> vars = 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->GetLiveVars(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0u; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < std::min(static_cast<size_t>(array_size), vars.size()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_vars[i] = vars[i]; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return vars.size(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetMinimumArrayBufferSizeForShmem(PP_Instance /*instance*/, 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32_t /*threshold*/) { 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Does nothing. Not needed in-process. 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Testing_Dev testing_interface = { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReadImageData, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RunMessageLoop, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &QuitMessageLoop, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetLiveObjectsForInstance, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsOutOfProcess, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SimulateInputEvent, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetDocumentURL, 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &GetLiveVars, 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &SetMinimumArrayBufferSizeForShmem 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetInterface ---------------------------------------------------------------- 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* InternalGetInterface(const char* name) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow custom interface factories first stab at the GetInterface call. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* custom_interface = 29558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GetContentClient()->renderer()->CreatePPAPIInterface(name); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_interface) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return custom_interface; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) put these in a hash map for better performance. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define UNPROXIED_IFACE(api_name, iface_str, iface_struct) \ 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(name, iface_str) == 0) \ 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ::ppapi::thunk::Get##iface_struct##_Thunk(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define PROXIED_IFACE(api_name, iface_str, iface_struct) \ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNPROXIED_IFACE(api_name, iface_str, iface_struct) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_public_stable.h" 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_public_dev.h" 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_private.h" 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h" 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #include "ppapi/thunk/interfaces_ppb_private_flash.h" 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef UNPROXIED_API 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef PROXIED_IFACE 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) #define LEGACY_IFACE(iface_str, function_name) \ 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (strcmp(name, iface_str) == 0) \ 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return function_name; 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) #include "ppapi/thunk/interfaces_legacy.h" 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) #undef LEGACY_IFACE 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only support the testing interface when the command line switch is 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. This allows us to prevent people from (ab)using this interface 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in production code. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePepperTesting)) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(name, PPB_TESTING_DEV_INTERFACE) == 0 || 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcmp(name, PPB_TESTING_DEV_INTERFACE_0_9) == 0) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &testing_interface; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* GetInterface(const char* name) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All interfaces should be used on the main thread. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(IsMainThread()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InternalGetInterface(name); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the PPAPI entry points from the given library and places them into the 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given structure. Returns true on success. 345bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool LoadEntryPointsFromLibrary( 346bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const base::NativeLibrary& library, 34758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInfo::EntryPoints* entry_points) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->get_interface = 34958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::GetInterfaceFunc>( 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_GetInterface")); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points->get_interface) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "No PPP_GetInterface in plugin library"; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->initialize_module = 35858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::PPP_InitializeModuleFunc>( 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_InitializeModule")); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points->initialize_module) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "No PPP_InitializeModule in plugin library"; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's okay for PPP_ShutdownModule to not be defined and shutdown_module to 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be NULL. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points->shutdown_module = 36958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch reinterpret_cast<PepperPluginInfo::PPP_ShutdownModuleFunc>( 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(library, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PPP_ShutdownModule")); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PluginModule ---------------------------------------------------------------- 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::PluginModule(const std::string& name, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ::ppapi::PpapiPermissions& perms) 383bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : callback_tracker_(new ::ppapi::CallbackTracker), 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_in_destructor_(false), 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_crashed_(false), 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) broker_(NULL), 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library_(NULL), 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_(name), 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_(path), 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions_(perms), 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserve_instance_id_(NULL) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the globals object is created. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_globals) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_globals = new HostGlobals; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&entry_points_, 0, sizeof(entry_points_)); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_module_ = HostGlobals::Get()->AddModule(this); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLivePluginSet()->insert(this); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::~PluginModule() { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the past there have been crashes reentering the plugin module 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructor. Catch if that happens again earlier. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!is_in_destructor_); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_in_destructor_ = true; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the module is being deleted, there should be no more instances still 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // holding a reference to us. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(instances_.empty()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some resources and other stuff are hung off of the embedder state, which 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be torn down before the routing stuff below. 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder_state_.reset(); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLivePluginSet()->erase(this); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_tracker_->AbortAll(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_points_.shutdown_module) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_.shutdown_module(); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (library_) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UnloadNativeLibrary(library_); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifications that we've been deleted should be last. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->ModuleDeleted(pp_module_); 427bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!is_crashed_) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the plugin crashes, we immediately tell the lifetime delegate that 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we're gone, so we don't want to tell it again. 43058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginRegistry::GetInstance()->PluginModuleDead(this); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't add stuff here, the two notifications that the module object has 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been deleted should be last. This allows, for example, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PPB_Proxy.IsInModuleDestructor to map PP_Module to this class during the 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous parts of the destructor. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::SetEmbedderState(scoped_ptr<EmbedderState> state) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) embedder_state_ = state.Pass(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::EmbedderState* PluginModule::GetEmbedderState() { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return embedder_state_.get(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 447bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitAsInternalPlugin( 44858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PepperPluginInfo::EntryPoints& entry_points) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (InitializeModule(entry_points)) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_ = entry_points; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::InitAsLibrary(const base::FilePath& path) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeLibrary library = base::LoadNativeLibrary(path, NULL); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!library) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInfo::EntryPoints entry_points; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadEntryPointsFromLibrary(library, &entry_points) || 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !InitializeModule(entry_points)) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UnloadNativeLibrary(library); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_points_ = entry_points; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) library_ = library; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::InitAsProxied( 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDelegate::OutOfProcessProxy* out_of_process_proxy) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!out_of_process_proxy_.get()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_of_process_proxy_.reset(out_of_process_proxy); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 479a3f7b4e666c476898878fa745f637129375cd889Ben Murdochscoped_refptr<PluginModule> 480a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PluginModule::CreateModuleForExternalPluginInstance() { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new module, but don't set the lifetime delegate. This isn't a 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin in the usual sense, so it isn't tracked by the browser. 483a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch scoped_refptr<PluginModule> external_plugin_module( 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PluginModule(name_, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions_)); 487a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return external_plugin_module; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 490a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPP_ExternalPluginResult PluginModule::InitAsProxiedExternalPlugin( 49158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(out_of_process_proxy_.get()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InitAsProxied (for the trusted/out-of-process case) initializes only the 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // module, and one or more instances are added later. In this case, the 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginInstance was already created as in-process, so we missed the proxy 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AddInstance step and must do it now. 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_of_process_proxy_->AddInstance(instance->pp_instance()); 498a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // For external plugins, we need to tell the instance to reset itself as 499a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // proxied. This will clear cached interface pointers and send DidCreate (etc) 500a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // to the plugin side of the proxy. 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return instance->ResetAsProxied(this); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::IsProxied() const { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !!out_of_process_proxy_; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::ProcessId PluginModule::GetPeerProcessId() { 509b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (out_of_process_proxy_) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return out_of_process_proxy_->GetPeerProcessId(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::kNullProcessId; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int PluginModule::GetPluginChildId() { 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (out_of_process_proxy_) 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return out_of_process_proxy_->GetPluginChildId(); 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return 0; 518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Core* PluginModule::GetCore() { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &core_interface; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 52658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInfo::GetInterfaceFunc PluginModule::GetLocalGetInterfaceFunc() { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &GetInterface; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::SupportsInterface(const char* name) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!InternalGetInterface(name); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::CreateInstance( 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginDelegate* delegate, 53758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch RenderView* render_view, 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer* container, 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& plugin_url) { 54058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance = PepperPluginInstanceImpl::Create( 541bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch delegate, render_view, this, container, plugin_url); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Plugin doesn't support instance interface, failing."; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 546b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (out_of_process_proxy_) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_of_process_proxy_->AddInstance(instance->pp_instance()); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::GetSomeInstance() const { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will generally crash later if there is not actually any instance to 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return, so we force a crash now to make bugs easier to track down. 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!instances_.empty()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *instances_.begin(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* PluginModule::GetPluginInterface(const char* name) const { 559b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (out_of_process_proxy_) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out_of_process_proxy_->GetProxiedInterface(name); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In-process plugins. 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry_points_.get_interface) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry_points_.get_interface(name); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceCreated(PepperPluginInstanceImpl* instance) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instances_.insert(instance); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceDeleted(PepperPluginInstanceImpl* instance) { 573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (out_of_process_proxy_) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_of_process_proxy_->RemoveInstance(instance->pp_instance()); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instances_.erase(instance); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr< ::ppapi::CallbackTracker> PluginModule::GetCallbackTracker() { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return callback_tracker_; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::PluginCrashed() { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_crashed_); // Should only get one notification. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_crashed_ = true; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all instances that they crashed. 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginInstanceSet::iterator i = instances_.begin(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != instances_.end(); ++i) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*i)->InstanceCrashed(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginRegistry::GetInstance()->PluginModuleDead(this); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::SetReserveInstanceIDCallback( 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool (*reserve)(PP_Module, PP_Instance)) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!reserve_instance_id_) << "Only expect one set."; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserve_instance_id_ = reserve; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::ReserveInstanceID(PP_Instance instance) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reserve_instance_id_) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PPBoolToBool(reserve_instance_id_(pp_module_, instance)); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Instance ID is usable. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::SetBroker(PluginDelegate::Broker* broker) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!broker_ || !broker); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) broker_ = broker; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginDelegate::Broker* PluginModule::GetBroker() { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return broker_; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PluginModule::ResetHostGlobalsForTest() { 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete host_globals; 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) host_globals = NULL; 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 621bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitializeModule( 62258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PepperPluginInfo::EntryPoints& entry_points) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!out_of_process_proxy_.get()) << "Don't call for proxied modules."; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(entry_points.initialize_module != NULL); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int retval = entry_points.initialize_module(pp_module(), &GetInterface); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (retval != 0) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "PPP_InitializeModule returned failure " << retval; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 634