plugin_module.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "build/build_config.h"
173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/common/view_messages.h"
1858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/content_renderer_client.h"
19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h"
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/host_dispatcher_wrapper.h"
21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h"
223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_hung_plugin_filter.h"
2358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/pepper_plugin_registry.h"
25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h"
26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_proxy_impl.h"
27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_scrollbar_impl.h"
28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_var_deprecated_impl.h"
29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_video_decoder_impl.h"
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/render_view_impl.h"
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ppapi/c/dev/ppb_alarms_dev.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_audio_input_dev.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_buffer_dev.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_char_set_dev.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_crypto_dev.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_cursor_control_dev.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_device_ref_dev.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_file_chooser_dev.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_find_dev.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_font_dev.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_graphics_2d_dev.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_memory_dev.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_opengles2ext_dev.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_printing_dev.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_scrollbar_dev.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_text_input_dev.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_trace_event_dev.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_truetype_font_dev.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_url_util_dev.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_var_deprecated.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_capture_dev.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_decoder_dev.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_view_dev.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_widget_dev.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_zoom_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"
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_audio_buffer.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h"
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/ppb_console.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_io.h"
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_file_mapping.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_ref.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_file_system.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_fullscreen.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_graphics_2d.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_graphics_3d.h"
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_host_resolver.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_image_data.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_instance.h"
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_media_stream_audio_track.h"
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_media_stream_video_track.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_messaging.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_cursor.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_mouse_lock.h"
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_net_address.h"
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/ppb_network_list.h"
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/ppb_network_monitor.h"
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_network_proxy.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_opengles2.h"
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_tcp_socket.h"
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ppapi/c/ppb_text_input_controller.h"
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_udp_socket.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_loader.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_request_info.h"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_url_response_info.h"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var.h"
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_array.h"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var_array_buffer.h"
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_dictionary.h"
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_video_frame.h"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_view.h"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h"
101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_file_io_private.h"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_file_ref_private.h"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash.h"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_clipboard.h"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_device_id.h"
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_drm.h"
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_file.h"
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_font_file.h"
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_fullscreen.h"
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_menu.h"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_message_loop.h"
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash_print.h"
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_host_resolver_private.h"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_instance_private.h"
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/c/private/ppb_isolated_file_system_private.h"
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ppapi/c/private/ppb_output_protection_private.h"
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h"
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_proxy_private.h"
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_talk_private.h"
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_tcp_server_socket_private.h"
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_tcp_socket_private.h"
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/c/private/ppb_testing_private.h"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_udp_socket_private.h"
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_uma_private.h"
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_destination_private.h"
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/ppb_video_source_private.h"
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_x509_certificate_private.h"
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_broker_trusted.h"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_char_set_trusted.h"
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/callback_tracker.h"
1353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "ppapi/shared_impl/ppapi_preferences.h"
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_switches.h"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h"
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_opengles2_shared.h"
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_var_shared.h"
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h"
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h"
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_graphics_2d_api.h"
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h"
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS)
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/c/private/ppb_platform_verification_private.h"
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeTicksToPPTimeTicks;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TimeToPPTime;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResource;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics2D_API;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_InputEvent_API;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Global tracking info for PPAPI plugins. This is lazily created before the
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first plugin is allocated, and leaked on shutdown.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that we don't want a Singleton here since destroying this object will
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// try to free some stuff that requires WebKit, and Singletons are destroyed
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after WebKit.
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TODO(raymes): I'm not sure if it is completely necessary to leak the
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HostGlobals. Figure out the shutdown sequence and find a way to do this
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// more elegantly.
17058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochHostGlobals* host_globals = NULL;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maintains all currently loaded plugin libs for validating PP_Module
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// identifiers.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::set<PluginModule*> PluginModuleSet;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModuleSet* GetLivePluginSet() {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(PluginModuleSet, live_plugin_libs, ());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &live_plugin_libs;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Core --------------------------------------------------------------------
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddRefResource(PP_Resource resource) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(resource);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReleaseResource(PP_Resource resource) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(resource);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Time GetTime() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeToPPTime(base::Time::Now());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_TimeTicks GetTickTime() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeTicksToPPTimeTicks(base::TimeTicks::Now());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallOnMainThread(int delay_in_msec,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_CompletionCallback callback,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int32_t result) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (callback.func) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostDelayedTask(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(callback.func, callback.user_data, result),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(delay_in_msec));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsMainThread() {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BoolToPPBool(PpapiGlobals::Get()->
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainThreadMessageLoop()->BelongsToCurrentThread());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Core core_interface = {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &AddRefResource,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &ReleaseResource,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetTime,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetTickTime,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &CallOnMainThread,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &IsMainThread
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Testing -----------------------------------------------------------------
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool ReadImageData(PP_Resource device_context_2d,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_Resource image,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const PP_Point* top_left) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterResource<PPB_Graphics2D_API> enter(device_context_2d, true);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return BoolToPPBool(enter.object()->ReadImageData(image, top_left));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunMessageLoop(PP_Instance instance) {
236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::ScopedNestableTaskAllower allow(
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::MessageLoop::current());
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitMessageLoop(PP_Instance instance) {
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->QuitNow();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HostGlobals::Get()->GetResourceTracker()->GetLiveObjectsForInstance(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_id);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsOutOfProcess() {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateInputEvent(PP_Instance instance, PP_Resource input_event) {
25558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* plugin_instance =
25658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      host_globals->GetInstance(instance);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plugin_instance)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterResource<PPB_InputEvent_API> enter(input_event, false);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputEventData& input_event_data = enter.object()->GetInputEventData();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_instance->SimulateInputEvent(input_event_data);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) {
26958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* plugin_instance =
27058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      host_globals->GetInstance(instance);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plugin_instance)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_MakeUndefined();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return plugin_instance->GetDocumentURL(instance, components);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PP_Var> vars =
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PpapiGlobals::Get()->GetVarTracker()->GetLiveVars();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0u;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i < std::min(static_cast<size_t>(array_size), vars.size());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    live_vars[i] = vars[i];
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return vars.size();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetMinimumArrayBufferSizeForShmem(PP_Instance /*instance*/,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       uint32_t /*threshold*/) {
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Does nothing. Not needed in-process.
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const PPB_Testing_Private testing_interface = {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &ReadImageData,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &RunMessageLoop,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &QuitMessageLoop,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetLiveObjectsForInstance,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &IsOutOfProcess,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &SimulateInputEvent,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetDocumentURL,
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  &GetLiveVars,
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  &SetMinimumArrayBufferSizeForShmem
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetInterface ----------------------------------------------------------------
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* InternalGetInterface(const char* name) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow custom interface factories first stab at the GetInterface call.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* custom_interface =
30858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      GetContentClient()->renderer()->CreatePPAPIInterface(name);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (custom_interface)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return custom_interface;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) put these in a hash map for better performance.
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #define UNPROXIED_IFACE(iface_str, iface_struct) \
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (strcmp(name, iface_str) == 0) \
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return ppapi::thunk::Get##iface_struct##_Thunk();
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #define PROXIED_IFACE(iface_str, iface_struct) \
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      UNPROXIED_IFACE(iface_str, iface_struct)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #include "ppapi/thunk/interfaces_ppb_private.h"
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #include "ppapi/thunk/interfaces_ppb_private_flash.h"
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h"
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #include "ppapi/thunk/interfaces_ppb_public_dev.h"
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #include "ppapi/thunk/interfaces_ppb_public_dev_channel.h"
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #include "ppapi/thunk/interfaces_ppb_public_stable.h"
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #undef UNPROXIED_API
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #undef PROXIED_IFACE
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  #define LEGACY_IFACE(iface_str, function_name) \
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (strcmp(name, iface_str) == 0) \
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return function_name;
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  #include "ppapi/thunk/interfaces_legacy.h"
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  #undef LEGACY_IFACE
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only support the testing interface when the command line switch is
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified. This allows us to prevent people from (ab)using this interface
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in production code.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          switches::kEnablePepperTesting)) {
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (strcmp(name, PPB_TESTING_PRIVATE_INTERFACE) == 0)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &testing_interface;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* GetInterface(const char* name) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All interfaces should be used on the main thread.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsMainThread());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return InternalGetInterface(name);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the PPAPI entry points from the given library and places them into the
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given structure. Returns true on success.
357bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool LoadEntryPointsFromLibrary(
358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const base::NativeLibrary& library,
35958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    PepperPluginInfo::EntryPoints* entry_points) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_points->get_interface =
36158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      reinterpret_cast<PepperPluginInfo::GetInterfaceFunc>(
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::GetFunctionPointerFromNativeLibrary(library,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    "PPP_GetInterface"));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_points->get_interface) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "No PPP_GetInterface in plugin library";
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_points->initialize_module =
37058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      reinterpret_cast<PepperPluginInfo::PPP_InitializeModuleFunc>(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::GetFunctionPointerFromNativeLibrary(library,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    "PPP_InitializeModule"));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_points->initialize_module) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "No PPP_InitializeModule in plugin library";
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It's okay for PPP_ShutdownModule to not be defined and shutdown_module to
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be NULL.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_points->shutdown_module =
38158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      reinterpret_cast<PepperPluginInfo::PPP_ShutdownModuleFunc>(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::GetFunctionPointerFromNativeLibrary(library,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    "PPP_ShutdownModule"));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateHostForInProcessModule(RenderFrameImpl* render_frame,
3893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                  PluginModule* module,
3903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                  const WebPluginInfo& webplugin_info) {
3913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // First time an in-process plugin was used, make a host for it.
3923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  const PepperPluginInfo* info =
3933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info);
3943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  DCHECK(!info->is_out_of_process);
3953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
3963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ppapi::PpapiPermissions perms(
3973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      PepperPluginRegistry::GetInstance()->GetInfoForPlugin(
3983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          webplugin_info)->permissions);
3993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  RendererPpapiHostImpl* host_impl =
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      RendererPpapiHostImpl::CreateOnModuleForInProcess(module, perms);
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_frame->PepperPluginCreated(host_impl);
4023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
4033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PluginModule ----------------------------------------------------------------
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::PluginModule(const std::string& name,
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const base::FilePath& path,
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           const ppapi::PpapiPermissions& perms)
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : callback_tracker_(new ppapi::CallbackTracker),
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_in_destructor_(false),
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_crashed_(false),
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      broker_(NULL),
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      library_(NULL),
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name_(name),
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      path_(path),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      permissions_(perms),
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reserve_instance_id_(NULL) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the globals object is created.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_globals)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_globals = new HostGlobals;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&entry_points_, 0, sizeof(entry_points_));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_module_ = HostGlobals::Get()->AddModule(this);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLivePluginSet()->insert(this);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule::~PluginModule() {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the past there have been crashes reentering the plugin module
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destructor. Catch if that happens again earlier.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!is_in_destructor_);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_in_destructor_ = true;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the module is being deleted, there should be no more instances still
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // holding a reference to us.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(instances_.empty());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Some resources and other stuff are hung off of the embedder state, which
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should be torn down before the routing stuff below.
441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  renderer_ppapi_host_.reset();
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLivePluginSet()->erase(this);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_tracker_->AbortAll();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry_points_.shutdown_module)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_points_.shutdown_module();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (library_)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::UnloadNativeLibrary(library_);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications that we've been deleted should be last.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostGlobals::Get()->ModuleDeleted(pp_module_);
455bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (!is_crashed_) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When the plugin crashes, we immediately tell the lifetime delegate that
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we're gone, so we don't want to tell it again.
45858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    PepperPluginRegistry::GetInstance()->PluginModuleDead(this);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't add stuff here, the two notifications that the module object has
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been deleted should be last. This allows, for example,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_Proxy.IsInModuleDestructor to map PP_Module to this class during the
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // previous parts of the destructor.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
467558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PluginModule::SetRendererPpapiHost(
468558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<RendererPpapiHostImpl> host) {
469558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  renderer_ppapi_host_ = host.Pass();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitAsInternalPlugin(
47358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    const PepperPluginInfo::EntryPoints& entry_points) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (InitializeModule(entry_points)) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_points_ = entry_points;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::InitAsLibrary(const base::FilePath& path) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::NativeLibrary library = base::LoadNativeLibrary(path, NULL);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!library)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInfo::EntryPoints entry_points;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!LoadEntryPointsFromLibrary(library, &entry_points) ||
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !InitializeModule(entry_points)) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::UnloadNativeLibrary(library);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_points_ = entry_points;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  library_ = library;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::InitAsProxied(
499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    HostDispatcherWrapper* host_dispatcher_wrapper) {
500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(!host_dispatcher_wrapper_.get());
501558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_dispatcher_wrapper_.reset(host_dispatcher_wrapper);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
504a3f7b4e666c476898878fa745f637129375cd889Ben Murdochscoped_refptr<PluginModule>
505a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    PluginModule::CreateModuleForExternalPluginInstance() {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new module, but don't set the lifetime delegate. This isn't a
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugin in the usual sense, so it isn't tracked by the browser.
508a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  scoped_refptr<PluginModule> external_plugin_module(
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PluginModule(name_,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       path_,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       permissions_));
512a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return external_plugin_module;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPP_ExternalPluginResult PluginModule::InitAsProxiedExternalPlugin(
51658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    PepperPluginInstanceImpl* instance) {
517558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(host_dispatcher_wrapper_.get());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InitAsProxied (for the trusted/out-of-process case) initializes only the
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // module, and one or more instances are added later. In this case, the
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PluginInstance was already created as in-process, so we missed the proxy
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddInstance step and must do it now.
522558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_dispatcher_wrapper_->AddInstance(instance->pp_instance());
523a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // For external plugins, we need to tell the instance to reset itself as
524a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // proxied. This will clear cached interface pointers and send DidCreate (etc)
525a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // to the plugin side of the proxy.
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return instance->ResetAsProxied(this);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PluginModule::IsProxied() const {
530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return !!host_dispatcher_wrapper_;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::ProcessId PluginModule::GetPeerProcessId() {
534558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (host_dispatcher_wrapper_)
535558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return host_dispatcher_wrapper_->peer_pid();
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::kNullProcessId;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int PluginModule::GetPluginChildId() {
540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (host_dispatcher_wrapper_)
541558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return host_dispatcher_wrapper_->plugin_child_id();
542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return 0;
543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_Core* PluginModule::GetCore() {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &core_interface;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::SupportsInterface(const char* name) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!InternalGetInterface(name);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::CreateInstance(
556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RenderFrameImpl* render_frame,
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebPluginContainer* container,
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& plugin_url) {
55958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance = PepperPluginInstanceImpl::Create(
560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      render_frame, this, container, plugin_url);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Plugin doesn't support instance interface, failing.";
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (host_dispatcher_wrapper_)
566558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    host_dispatcher_wrapper_->AddInstance(instance->pp_instance());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PluginModule::GetSomeInstance() const {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will generally crash later if there is not actually any instance to
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return, so we force a crash now to make bugs easier to track down.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!instances_.empty());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *instances_.begin();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* PluginModule::GetPluginInterface(const char* name) const {
578558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (host_dispatcher_wrapper_)
579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return host_dispatcher_wrapper_->GetProxiedInterface(name);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In-process plugins.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_points_.get_interface)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entry_points_.get_interface(name);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceCreated(PepperPluginInstanceImpl* instance) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instances_.insert(instance);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PluginModule::InstanceDeleted(PepperPluginInstanceImpl* instance) {
592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (host_dispatcher_wrapper_)
593558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    host_dispatcher_wrapper_->RemoveInstance(instance->pp_instance());
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instances_.erase(instance);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
597ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_refptr<ppapi::CallbackTracker> PluginModule::GetCallbackTracker() {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return callback_tracker_;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::PluginCrashed() {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!is_crashed_);  // Should only get one notification.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_crashed_ = true;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify all instances that they crashed.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PluginInstanceSet::iterator i = instances_.begin();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != instances_.end(); ++i)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*i)->InstanceCrashed();
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginRegistry::GetInstance()->PluginModuleDead(this);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginModule::SetReserveInstanceIDCallback(
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Bool (*reserve)(PP_Module, PP_Instance)) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!reserve_instance_id_) << "Only expect one set.";
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reserve_instance_id_ = reserve;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginModule::ReserveInstanceID(PP_Instance instance) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reserve_instance_id_)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PPBoolToBool(reserve_instance_id_(pp_module_, instance));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;  // Instance ID is usable.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PluginModule::SetBroker(PepperBroker* broker) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!broker_ || !broker);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  broker_ = broker;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
630558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochPepperBroker* PluginModule::GetBroker() {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return broker_;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochRendererPpapiHostImpl* PluginModule::CreateOutOfProcessModule(
635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RenderFrameImpl* render_frame,
6363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    const base::FilePath& path,
6373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ppapi::PpapiPermissions permissions,
6383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    const IPC::ChannelHandle& channel_handle,
6393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    base::ProcessId peer_pid,
6403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    int plugin_child_id,
6413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    bool is_external) {
6423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  scoped_refptr<PepperHungPluginFilter> hung_filter(new PepperHungPluginFilter(
643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      path, render_frame->GetRoutingID(), plugin_child_id));
6443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  scoped_ptr<HostDispatcherWrapper> dispatcher(
6453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      new HostDispatcherWrapper(this,
6463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                peer_pid,
6473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                plugin_child_id,
6483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                permissions,
6493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                is_external));
6503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!dispatcher->Init(
6513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          channel_handle,
6523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          &GetInterface,
653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          ppapi::Preferences(render_frame->render_view()->webkit_preferences()),
6543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          hung_filter.get()))
6553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return NULL;
6563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
6573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  RendererPpapiHostImpl* host_impl =
6583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      RendererPpapiHostImpl::CreateOnModuleForOutOfProcess(
6593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          this, dispatcher->dispatcher(), permissions);
660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_frame->PepperPluginCreated(host_impl);
6613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
6623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  InitAsProxied(dispatcher.release());
6633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  return host_impl;
6643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
6653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static
66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PluginModule::ResetHostGlobalsForTest() {
66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  delete host_globals;
66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  host_globals = NULL;
67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
672bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PluginModule::InitializeModule(
67358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    const PepperPluginInfo::EntryPoints& entry_points) {
674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(!host_dispatcher_wrapper_.get()) << "Don't call for proxied modules.";
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(entry_points.initialize_module != NULL);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int retval = entry_points.initialize_module(pp_module(), &GetInterface);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (retval != 0) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "PPP_InitializeModule returned failure " << retval;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochscoped_refptr<PluginModule> PluginModule::Create(
685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RenderFrameImpl* render_frame,
6863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    const WebPluginInfo& webplugin_info,
6873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    bool* pepper_plugin_was_registered) {
6883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *pepper_plugin_was_registered = true;
6893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
6903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // See if a module has already been loaded for this plugin.
6913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  base::FilePath path(webplugin_info.path);
6923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  scoped_refptr<PluginModule> module =
6933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      PepperPluginRegistry::GetInstance()->GetLiveModule(path);
6943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (module.get()) {
6953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (!module->renderer_ppapi_host()) {
6963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // If the module exists and no embedder state was associated with it,
6973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // then the module was one of the ones preloaded and is an in-process
6983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // plugin. We need to associate our host state with it.
699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      CreateHostForInProcessModule(render_frame, module.get(), webplugin_info);
7003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
7013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return module;
7023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
7033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
7043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // In-process plugins will have always been created up-front to avoid the
7053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // sandbox restrictions. So getting here implies it doesn't exist or should
7063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // be out of process.
7073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  const PepperPluginInfo* info =
7083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info);
7093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!info) {
7103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    *pepper_plugin_was_registered = false;
7113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return scoped_refptr<PluginModule>();
7123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  } else if (!info->is_out_of_process) {
7133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // In-process plugin not preloaded, it probably couldn't be initialized.
7143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return scoped_refptr<PluginModule>();
7153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
7163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
7173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ppapi::PpapiPermissions permissions =
7183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      ppapi::PpapiPermissions::GetForCommandLine(info->permissions);
7193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
7203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Out of process: have the browser start the plugin process for us.
7213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  IPC::ChannelHandle channel_handle;
7223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  base::ProcessId peer_pid;
7233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  int plugin_child_id = 0;
724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_frame->Send(new ViewHostMsg_OpenChannelToPepperPlugin(
7253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      path, &channel_handle, &peer_pid, &plugin_child_id));
7263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (channel_handle.name.empty()) {
7273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // Couldn't be initialized.
7283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return scoped_refptr<PluginModule>();
7293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
7303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
7313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // AddLiveModule must be called before any early returns since the
7323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // module's destructor will remove itself.
7333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  module = new PluginModule(info->name, path, permissions);
7343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  PepperPluginRegistry::GetInstance()->AddLiveModule(path, module.get());
7353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!module->CreateOutOfProcessModule(render_frame,
7373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                        path,
7383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                        permissions,
7393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                        channel_handle,
7403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                        peer_pid,
7413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                        plugin_child_id,
7423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                        false))  // is_external = false
7433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return scoped_refptr<PluginModule>();
7443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
7453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  return module;
7463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
7473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
74858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}  // namespace content
749