| Index: webkit/plugins/ppapi/plugin_module.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/plugin_module.cc (revision 213561)
|
| +++ webkit/plugins/ppapi/plugin_module.cc (working copy)
|
| @@ -1,639 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "webkit/plugins/ppapi/plugin_module.h"
|
| -
|
| -#include <set>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| -#include "base/time/time.h"
|
| -#include "ppapi/c/dev/ppb_audio_input_dev.h"
|
| -#include "ppapi/c/dev/ppb_buffer_dev.h"
|
| -#include "ppapi/c/dev/ppb_char_set_dev.h"
|
| -#include "ppapi/c/dev/ppb_crypto_dev.h"
|
| -#include "ppapi/c/dev/ppb_cursor_control_dev.h"
|
| -#include "ppapi/c/dev/ppb_device_ref_dev.h"
|
| -#include "ppapi/c/dev/ppb_file_chooser_dev.h"
|
| -#include "ppapi/c/dev/ppb_find_dev.h"
|
| -#include "ppapi/c/dev/ppb_font_dev.h"
|
| -#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h"
|
| -#include "ppapi/c/dev/ppb_graphics_2d_dev.h"
|
| -#include "ppapi/c/dev/ppb_memory_dev.h"
|
| -#include "ppapi/c/dev/ppb_opengles2ext_dev.h"
|
| -#include "ppapi/c/dev/ppb_printing_dev.h"
|
| -#include "ppapi/c/dev/ppb_resource_array_dev.h"
|
| -#include "ppapi/c/dev/ppb_scrollbar_dev.h"
|
| -#include "ppapi/c/dev/ppb_testing_dev.h"
|
| -#include "ppapi/c/dev/ppb_text_input_dev.h"
|
| -#include "ppapi/c/dev/ppb_trace_event_dev.h"
|
| -#include "ppapi/c/dev/ppb_truetype_font_dev.h"
|
| -#include "ppapi/c/dev/ppb_url_util_dev.h"
|
| -#include "ppapi/c/dev/ppb_var_deprecated.h"
|
| -#include "ppapi/c/dev/ppb_video_capture_dev.h"
|
| -#include "ppapi/c/dev/ppb_video_decoder_dev.h"
|
| -#include "ppapi/c/dev/ppb_view_dev.h"
|
| -#include "ppapi/c/dev/ppb_widget_dev.h"
|
| -#include "ppapi/c/dev/ppb_zoom_dev.h"
|
| -#include "ppapi/c/extensions/dev/ppb_ext_alarms_dev.h"
|
| -#include "ppapi/c/extensions/dev/ppb_ext_socket_dev.h"
|
| -#include "ppapi/c/pp_module.h"
|
| -#include "ppapi/c/pp_resource.h"
|
| -#include "ppapi/c/pp_var.h"
|
| -#include "ppapi/c/ppb_audio.h"
|
| -#include "ppapi/c/ppb_audio_config.h"
|
| -#include "ppapi/c/ppb_console.h"
|
| -#include "ppapi/c/ppb_core.h"
|
| -#include "ppapi/c/ppb_file_io.h"
|
| -#include "ppapi/c/ppb_file_ref.h"
|
| -#include "ppapi/c/ppb_file_system.h"
|
| -#include "ppapi/c/ppb_fullscreen.h"
|
| -#include "ppapi/c/ppb_graphics_2d.h"
|
| -#include "ppapi/c/ppb_graphics_3d.h"
|
| -#include "ppapi/c/ppb_host_resolver.h"
|
| -#include "ppapi/c/ppb_image_data.h"
|
| -#include "ppapi/c/ppb_instance.h"
|
| -#include "ppapi/c/ppb_messaging.h"
|
| -#include "ppapi/c/ppb_mouse_cursor.h"
|
| -#include "ppapi/c/ppb_mouse_lock.h"
|
| -#include "ppapi/c/ppb_net_address.h"
|
| -#include "ppapi/c/ppb_network_proxy.h"
|
| -#include "ppapi/c/ppb_opengles2.h"
|
| -#include "ppapi/c/ppb_tcp_socket.h"
|
| -#include "ppapi/c/ppb_udp_socket.h"
|
| -#include "ppapi/c/ppb_url_loader.h"
|
| -#include "ppapi/c/ppb_url_request_info.h"
|
| -#include "ppapi/c/ppb_url_response_info.h"
|
| -#include "ppapi/c/ppb_var.h"
|
| -#include "ppapi/c/ppb_var_array.h"
|
| -#include "ppapi/c/ppb_var_array_buffer.h"
|
| -#include "ppapi/c/ppb_var_dictionary.h"
|
| -#include "ppapi/c/ppb_view.h"
|
| -#include "ppapi/c/ppp.h"
|
| -#include "ppapi/c/ppp_instance.h"
|
| -#include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
|
| -#include "ppapi/c/private/ppb_file_io_private.h"
|
| -#include "ppapi/c/private/ppb_file_ref_private.h"
|
| -#include "ppapi/c/private/ppb_flash.h"
|
| -#include "ppapi/c/private/ppb_flash_clipboard.h"
|
| -#include "ppapi/c/private/ppb_flash_device_id.h"
|
| -#include "ppapi/c/private/ppb_flash_drm.h"
|
| -#include "ppapi/c/private/ppb_flash_file.h"
|
| -#include "ppapi/c/private/ppb_flash_font_file.h"
|
| -#include "ppapi/c/private/ppb_flash_fullscreen.h"
|
| -#include "ppapi/c/private/ppb_flash_menu.h"
|
| -#include "ppapi/c/private/ppb_flash_message_loop.h"
|
| -#include "ppapi/c/private/ppb_flash_print.h"
|
| -#include "ppapi/c/private/ppb_gpu_blacklist_private.h"
|
| -#include "ppapi/c/private/ppb_host_resolver_private.h"
|
| -#include "ppapi/c/private/ppb_instance_private.h"
|
| -#include "ppapi/c/private/ppb_network_list_private.h"
|
| -#include "ppapi/c/private/ppb_network_monitor_private.h"
|
| -#include "ppapi/c/private/ppb_pdf.h"
|
| -#include "ppapi/c/private/ppb_proxy_private.h"
|
| -#include "ppapi/c/private/ppb_talk_private.h"
|
| -#include "ppapi/c/private/ppb_tcp_server_socket_private.h"
|
| -#include "ppapi/c/private/ppb_tcp_socket_private.h"
|
| -#include "ppapi/c/private/ppb_udp_socket_private.h"
|
| -#include "ppapi/c/private/ppb_uma_private.h"
|
| -#include "ppapi/c/private/ppb_video_destination_private.h"
|
| -#include "ppapi/c/private/ppb_video_source_private.h"
|
| -#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
| -#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
| -#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
| -#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
| -#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
| -#include "ppapi/c/trusted/ppb_file_io_trusted.h"
|
| -#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
|
| -#include "ppapi/shared_impl/callback_tracker.h"
|
| -#include "ppapi/shared_impl/ppapi_switches.h"
|
| -#include "ppapi/shared_impl/ppb_input_event_shared.h"
|
| -#include "ppapi/shared_impl/ppb_opengles2_shared.h"
|
| -#include "ppapi/shared_impl/ppb_var_shared.h"
|
| -#include "ppapi/shared_impl/time_conversion.h"
|
| -#include "ppapi/thunk/enter.h"
|
| -#include "ppapi/thunk/ppb_graphics_2d_api.h"
|
| -#include "ppapi/thunk/thunk.h"
|
| -#include "webkit/plugins/plugin_switches.h"
|
| -#include "webkit/plugins/ppapi/common.h"
|
| -#include "webkit/plugins/ppapi/host_globals.h"
|
| -#include "webkit/plugins/ppapi/ppapi_interface_factory.h"
|
| -#include "webkit/plugins/ppapi/ppapi_plugin_instance_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_gpu_blacklist_private_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_image_data_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_proxy_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_scrollbar_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_uma_private_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_var_deprecated_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_video_decoder_impl.h"
|
| -
|
| -using ppapi::InputEventData;
|
| -using ppapi::PpapiGlobals;
|
| -using ppapi::TimeTicksToPPTimeTicks;
|
| -using ppapi::TimeToPPTime;
|
| -using ppapi::thunk::EnterResource;
|
| -using ppapi::thunk::PPB_Graphics2D_API;
|
| -using ppapi::thunk::PPB_InputEvent_API;
|
| -
|
| -namespace webkit {
|
| -namespace ppapi {
|
| -
|
| -namespace {
|
| -
|
| -// Global tracking info for PPAPI plugins. This is lazily created before the
|
| -// first plugin is allocated, and leaked on shutdown.
|
| -//
|
| -// Note that we don't want a Singleton here since destroying this object will
|
| -// try to free some stuff that requires WebKit, and Singletons are destroyed
|
| -// after WebKit.
|
| -// TODO(raymes): I'm not sure if it is completely necessary to leak the
|
| -// HostGlobals. Figure out the shutdown sequence and find a way to do this
|
| -// more elegantly.
|
| -webkit::ppapi::HostGlobals* host_globals = NULL;
|
| -
|
| -// Maintains all currently loaded plugin libs for validating PP_Module
|
| -// identifiers.
|
| -typedef std::set<PluginModule*> PluginModuleSet;
|
| -
|
| -PluginModuleSet* GetLivePluginSet() {
|
| - CR_DEFINE_STATIC_LOCAL(PluginModuleSet, live_plugin_libs, ());
|
| - return &live_plugin_libs;
|
| -}
|
| -
|
| -// PPB_Core --------------------------------------------------------------------
|
| -
|
| -void AddRefResource(PP_Resource resource) {
|
| - PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(resource);
|
| -}
|
| -
|
| -void ReleaseResource(PP_Resource resource) {
|
| - PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(resource);
|
| -}
|
| -
|
| -PP_Time GetTime() {
|
| - return TimeToPPTime(base::Time::Now());
|
| -}
|
| -
|
| -PP_TimeTicks GetTickTime() {
|
| - return TimeTicksToPPTimeTicks(base::TimeTicks::Now());
|
| -}
|
| -
|
| -void CallOnMainThread(int delay_in_msec,
|
| - PP_CompletionCallback callback,
|
| - int32_t result) {
|
| - if (callback.func) {
|
| - PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(callback.func, callback.user_data, result),
|
| - base::TimeDelta::FromMilliseconds(delay_in_msec));
|
| - }
|
| -}
|
| -
|
| -PP_Bool IsMainThread() {
|
| - return BoolToPPBool(PpapiGlobals::Get()->
|
| - GetMainThreadMessageLoop()->BelongsToCurrentThread());
|
| -}
|
| -
|
| -const PPB_Core core_interface = {
|
| - &AddRefResource,
|
| - &ReleaseResource,
|
| - &GetTime,
|
| - &GetTickTime,
|
| - &CallOnMainThread,
|
| - &IsMainThread
|
| -};
|
| -
|
| -// PPB_Testing -----------------------------------------------------------------
|
| -
|
| -PP_Bool ReadImageData(PP_Resource device_context_2d,
|
| - PP_Resource image,
|
| - const PP_Point* top_left) {
|
| - EnterResource<PPB_Graphics2D_API> enter(device_context_2d, true);
|
| - if (enter.failed())
|
| - return PP_FALSE;
|
| - return BoolToPPBool(enter.object()->ReadImageData(image, top_left));
|
| -}
|
| -
|
| -void RunMessageLoop(PP_Instance instance) {
|
| - base::MessageLoop::ScopedNestableTaskAllower allow(
|
| - base::MessageLoop::current());
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -void QuitMessageLoop(PP_Instance instance) {
|
| - base::MessageLoop::current()->QuitNow();
|
| -}
|
| -
|
| -uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) {
|
| - return HostGlobals::Get()->GetResourceTracker()->GetLiveObjectsForInstance(
|
| - instance_id);
|
| -}
|
| -
|
| -PP_Bool IsOutOfProcess() {
|
| - return PP_FALSE;
|
| -}
|
| -
|
| -void SimulateInputEvent(PP_Instance instance, PP_Resource input_event) {
|
| - PluginInstanceImpl* plugin_instance = host_globals->GetInstance(instance);
|
| - if (!plugin_instance)
|
| - return;
|
| -
|
| - EnterResource<PPB_InputEvent_API> enter(input_event, false);
|
| - if (enter.failed())
|
| - return;
|
| -
|
| - const InputEventData& input_event_data = enter.object()->GetInputEventData();
|
| - plugin_instance->SimulateInputEvent(input_event_data);
|
| -}
|
| -
|
| -PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) {
|
| - PluginInstanceImpl* plugin_instance = host_globals->GetInstance(instance);
|
| - if (!plugin_instance)
|
| - return PP_MakeUndefined();
|
| - return plugin_instance->GetDocumentURL(instance, components);
|
| -}
|
| -
|
| -uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) {
|
| - std::vector<PP_Var> vars =
|
| - PpapiGlobals::Get()->GetVarTracker()->GetLiveVars();
|
| - for (size_t i = 0u;
|
| - i < std::min(static_cast<size_t>(array_size), vars.size());
|
| - ++i)
|
| - live_vars[i] = vars[i];
|
| - return vars.size();
|
| -}
|
| -
|
| -void SetMinimumArrayBufferSizeForShmem(PP_Instance /*instance*/,
|
| - uint32_t /*threshold*/) {
|
| - // Does nothing. Not needed in-process.
|
| -}
|
| -
|
| -const PPB_Testing_Dev testing_interface = {
|
| - &ReadImageData,
|
| - &RunMessageLoop,
|
| - &QuitMessageLoop,
|
| - &GetLiveObjectsForInstance,
|
| - &IsOutOfProcess,
|
| - &SimulateInputEvent,
|
| - &GetDocumentURL,
|
| - &GetLiveVars,
|
| - &SetMinimumArrayBufferSizeForShmem
|
| -};
|
| -
|
| -// GetInterface ----------------------------------------------------------------
|
| -
|
| -const void* InternalGetInterface(const char* name) {
|
| - // Allow custom interface factories first stab at the GetInterface call.
|
| - const void* custom_interface =
|
| - PpapiInterfaceFactoryManager::GetInstance()->GetInterface(name);
|
| - if (custom_interface)
|
| - return custom_interface;
|
| -
|
| - // TODO(brettw) put these in a hash map for better performance.
|
| - #define UNPROXIED_IFACE(api_name, iface_str, iface_struct) \
|
| - if (strcmp(name, iface_str) == 0) \
|
| - return ::ppapi::thunk::Get##iface_struct##_Thunk();
|
| - #define PROXIED_IFACE(api_name, iface_str, iface_struct) \
|
| - UNPROXIED_IFACE(api_name, iface_str, iface_struct)
|
| -
|
| - #include "ppapi/thunk/interfaces_ppb_public_stable.h"
|
| - #include "ppapi/thunk/interfaces_ppb_public_dev.h"
|
| - #include "ppapi/thunk/interfaces_ppb_private.h"
|
| - #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h"
|
| - #include "ppapi/thunk/interfaces_ppb_private_flash.h"
|
| -
|
| - #undef UNPROXIED_API
|
| - #undef PROXIED_IFACE
|
| -
|
| - #define LEGACY_IFACE(iface_str, function_name) \
|
| - if (strcmp(name, iface_str) == 0) \
|
| - return function_name;
|
| -
|
| - #include "ppapi/thunk/interfaces_legacy.h"
|
| -
|
| - #undef LEGACY_IFACE
|
| -
|
| - // Only support the testing interface when the command line switch is
|
| - // specified. This allows us to prevent people from (ab)using this interface
|
| - // in production code.
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kEnablePepperTesting)) {
|
| - if (strcmp(name, PPB_TESTING_DEV_INTERFACE) == 0 ||
|
| - strcmp(name, PPB_TESTING_DEV_INTERFACE_0_9) == 0) {
|
| - return &testing_interface;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -const void* GetInterface(const char* name) {
|
| - // All interfaces should be used on the main thread.
|
| - CHECK(IsMainThread());
|
| -
|
| - return InternalGetInterface(name);
|
| -}
|
| -
|
| -// Gets the PPAPI entry points from the given library and places them into the
|
| -// given structure. Returns true on success.
|
| -bool LoadEntryPointsFromLibrary(const base::NativeLibrary& library,
|
| - PluginModule::EntryPoints* entry_points) {
|
| - entry_points->get_interface =
|
| - reinterpret_cast<PluginModule::GetInterfaceFunc>(
|
| - base::GetFunctionPointerFromNativeLibrary(library,
|
| - "PPP_GetInterface"));
|
| - if (!entry_points->get_interface) {
|
| - LOG(WARNING) << "No PPP_GetInterface in plugin library";
|
| - return false;
|
| - }
|
| -
|
| - entry_points->initialize_module =
|
| - reinterpret_cast<PluginModule::PPP_InitializeModuleFunc>(
|
| - base::GetFunctionPointerFromNativeLibrary(library,
|
| - "PPP_InitializeModule"));
|
| - if (!entry_points->initialize_module) {
|
| - LOG(WARNING) << "No PPP_InitializeModule in plugin library";
|
| - return false;
|
| - }
|
| -
|
| - // It's okay for PPP_ShutdownModule to not be defined and shutdown_module to
|
| - // be NULL.
|
| - entry_points->shutdown_module =
|
| - reinterpret_cast<PluginModule::PPP_ShutdownModuleFunc>(
|
| - base::GetFunctionPointerFromNativeLibrary(library,
|
| - "PPP_ShutdownModule"));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -PluginModule::EntryPoints::EntryPoints()
|
| - : get_interface(NULL),
|
| - initialize_module(NULL),
|
| - shutdown_module(NULL) {
|
| -}
|
| -
|
| -// PluginModule ----------------------------------------------------------------
|
| -
|
| -PluginModule::PluginModule(const std::string& name,
|
| - const base::FilePath& path,
|
| - PluginDelegate::ModuleLifetime* lifetime_delegate,
|
| - const ::ppapi::PpapiPermissions& perms)
|
| - : lifetime_delegate_(lifetime_delegate),
|
| - callback_tracker_(new ::ppapi::CallbackTracker),
|
| - is_in_destructor_(false),
|
| - is_crashed_(false),
|
| - broker_(NULL),
|
| - library_(NULL),
|
| - name_(name),
|
| - path_(path),
|
| - permissions_(perms),
|
| - reserve_instance_id_(NULL) {
|
| - // Ensure the globals object is created.
|
| - if (!host_globals)
|
| - host_globals = new HostGlobals;
|
| -
|
| - memset(&entry_points_, 0, sizeof(entry_points_));
|
| - pp_module_ = HostGlobals::Get()->AddModule(this);
|
| - GetLivePluginSet()->insert(this);
|
| -}
|
| -
|
| -PluginModule::~PluginModule() {
|
| - // In the past there have been crashes reentering the plugin module
|
| - // destructor. Catch if that happens again earlier.
|
| - CHECK(!is_in_destructor_);
|
| - is_in_destructor_ = true;
|
| -
|
| - // When the module is being deleted, there should be no more instances still
|
| - // holding a reference to us.
|
| - DCHECK(instances_.empty());
|
| -
|
| - // Some resources and other stuff are hung off of the embedder state, which
|
| - // should be torn down before the routing stuff below.
|
| - embedder_state_.reset();
|
| -
|
| - GetLivePluginSet()->erase(this);
|
| -
|
| - callback_tracker_->AbortAll();
|
| -
|
| - if (entry_points_.shutdown_module)
|
| - entry_points_.shutdown_module();
|
| -
|
| - if (library_)
|
| - base::UnloadNativeLibrary(library_);
|
| -
|
| - // Notifications that we've been deleted should be last.
|
| - HostGlobals::Get()->ModuleDeleted(pp_module_);
|
| - if (!is_crashed_ && lifetime_delegate_) {
|
| - // When the plugin crashes, we immediately tell the lifetime delegate that
|
| - // we're gone, so we don't want to tell it again.
|
| - lifetime_delegate_->PluginModuleDead(this);
|
| - }
|
| -
|
| - // Don't add stuff here, the two notifications that the module object has
|
| - // been deleted should be last. This allows, for example,
|
| - // PPB_Proxy.IsInModuleDestructor to map PP_Module to this class during the
|
| - // previous parts of the destructor.
|
| -}
|
| -
|
| -void PluginModule::SetEmbedderState(scoped_ptr<EmbedderState> state) {
|
| - embedder_state_ = state.Pass();
|
| -}
|
| -
|
| -PluginModule::EmbedderState* PluginModule::GetEmbedderState() {
|
| - return embedder_state_.get();
|
| -}
|
| -
|
| -bool PluginModule::InitAsInternalPlugin(const EntryPoints& entry_points) {
|
| - if (InitializeModule(entry_points)) {
|
| - entry_points_ = entry_points;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool PluginModule::InitAsLibrary(const base::FilePath& path) {
|
| - base::NativeLibrary library = base::LoadNativeLibrary(path, NULL);
|
| - if (!library)
|
| - return false;
|
| -
|
| - EntryPoints entry_points;
|
| -
|
| - if (!LoadEntryPointsFromLibrary(library, &entry_points) ||
|
| - !InitializeModule(entry_points)) {
|
| - base::UnloadNativeLibrary(library);
|
| - return false;
|
| - }
|
| - entry_points_ = entry_points;
|
| - library_ = library;
|
| - return true;
|
| -}
|
| -
|
| -void PluginModule::InitAsProxied(
|
| - PluginDelegate::OutOfProcessProxy* out_of_process_proxy) {
|
| - DCHECK(!out_of_process_proxy_.get());
|
| - out_of_process_proxy_.reset(out_of_process_proxy);
|
| -}
|
| -
|
| -scoped_refptr<PluginModule>
|
| - PluginModule::CreateModuleForExternalPluginInstance() {
|
| - // Create a new module, but don't set the lifetime delegate. This isn't a
|
| - // plugin in the usual sense, so it isn't tracked by the browser.
|
| - scoped_refptr<PluginModule> external_plugin_module(
|
| - new PluginModule(name_,
|
| - path_,
|
| - NULL, // no lifetime_delegate
|
| - permissions_));
|
| - return external_plugin_module;
|
| -}
|
| -
|
| -PP_ExternalPluginResult PluginModule::InitAsProxiedExternalPlugin(
|
| - PluginInstanceImpl* instance) {
|
| - DCHECK(out_of_process_proxy_.get());
|
| - // InitAsProxied (for the trusted/out-of-process case) initializes only the
|
| - // module, and one or more instances are added later. In this case, the
|
| - // PluginInstance was already created as in-process, so we missed the proxy
|
| - // AddInstance step and must do it now.
|
| - out_of_process_proxy_->AddInstance(instance->pp_instance());
|
| - // For external plugins, we need to tell the instance to reset itself as
|
| - // proxied. This will clear cached interface pointers and send DidCreate (etc)
|
| - // to the plugin side of the proxy.
|
| - return instance->ResetAsProxied(this);
|
| -}
|
| -
|
| -bool PluginModule::IsProxied() const {
|
| - return !!out_of_process_proxy_;
|
| -}
|
| -
|
| -base::ProcessId PluginModule::GetPeerProcessId() {
|
| - if (out_of_process_proxy_)
|
| - return out_of_process_proxy_->GetPeerProcessId();
|
| - return base::kNullProcessId;
|
| -}
|
| -
|
| -int PluginModule::GetPluginChildId() {
|
| - if (out_of_process_proxy_)
|
| - return out_of_process_proxy_->GetPluginChildId();
|
| - return 0;
|
| -}
|
| -
|
| -// static
|
| -const PPB_Core* PluginModule::GetCore() {
|
| - return &core_interface;
|
| -}
|
| -
|
| -// static
|
| -PluginModule::GetInterfaceFunc PluginModule::GetLocalGetInterfaceFunc() {
|
| - return &GetInterface;
|
| -}
|
| -
|
| -// static
|
| -bool PluginModule::SupportsInterface(const char* name) {
|
| - return !!InternalGetInterface(name);
|
| -}
|
| -
|
| -PluginInstanceImpl* PluginModule::CreateInstance(
|
| - PluginDelegate* delegate,
|
| - content::RenderView* render_view,
|
| - WebKit::WebPluginContainer* container,
|
| - const GURL& plugin_url) {
|
| - PluginInstanceImpl* instance = PluginInstanceImpl::Create(
|
| - delegate, render_view, this, container, plugin_url);
|
| - if (!instance) {
|
| - LOG(WARNING) << "Plugin doesn't support instance interface, failing.";
|
| - return NULL;
|
| - }
|
| - if (out_of_process_proxy_)
|
| - out_of_process_proxy_->AddInstance(instance->pp_instance());
|
| - return instance;
|
| -}
|
| -
|
| -PluginInstanceImpl* PluginModule::GetSomeInstance() const {
|
| - // This will generally crash later if there is not actually any instance to
|
| - // return, so we force a crash now to make bugs easier to track down.
|
| - CHECK(!instances_.empty());
|
| - return *instances_.begin();
|
| -}
|
| -
|
| -const void* PluginModule::GetPluginInterface(const char* name) const {
|
| - if (out_of_process_proxy_)
|
| - return out_of_process_proxy_->GetProxiedInterface(name);
|
| -
|
| - // In-process plugins.
|
| - if (!entry_points_.get_interface)
|
| - return NULL;
|
| - return entry_points_.get_interface(name);
|
| -}
|
| -
|
| -void PluginModule::InstanceCreated(PluginInstanceImpl* instance) {
|
| - instances_.insert(instance);
|
| -}
|
| -
|
| -void PluginModule::InstanceDeleted(PluginInstanceImpl* instance) {
|
| - if (out_of_process_proxy_)
|
| - out_of_process_proxy_->RemoveInstance(instance->pp_instance());
|
| - instances_.erase(instance);
|
| -}
|
| -
|
| -scoped_refptr< ::ppapi::CallbackTracker> PluginModule::GetCallbackTracker() {
|
| - return callback_tracker_;
|
| -}
|
| -
|
| -void PluginModule::PluginCrashed() {
|
| - DCHECK(!is_crashed_); // Should only get one notification.
|
| - is_crashed_ = true;
|
| -
|
| - // Notify all instances that they crashed.
|
| - for (PluginInstanceSet::iterator i = instances_.begin();
|
| - i != instances_.end(); ++i)
|
| - (*i)->InstanceCrashed();
|
| -
|
| - if (lifetime_delegate_)
|
| - lifetime_delegate_->PluginModuleDead(this);
|
| -}
|
| -
|
| -void PluginModule::SetReserveInstanceIDCallback(
|
| - PP_Bool (*reserve)(PP_Module, PP_Instance)) {
|
| - DCHECK(!reserve_instance_id_) << "Only expect one set.";
|
| - reserve_instance_id_ = reserve;
|
| -}
|
| -
|
| -bool PluginModule::ReserveInstanceID(PP_Instance instance) {
|
| - if (reserve_instance_id_)
|
| - return PPBoolToBool(reserve_instance_id_(pp_module_, instance));
|
| - return true; // Instance ID is usable.
|
| -}
|
| -
|
| -void PluginModule::SetBroker(PluginDelegate::Broker* broker) {
|
| - DCHECK(!broker_ || !broker);
|
| - broker_ = broker;
|
| -}
|
| -
|
| -PluginDelegate::Broker* PluginModule::GetBroker() {
|
| - return broker_;
|
| -}
|
| -
|
| -// static
|
| -void PluginModule::ResetHostGlobalsForTest() {
|
| - delete host_globals;
|
| - host_globals = NULL;
|
| -}
|
| -
|
| -bool PluginModule::InitializeModule(const EntryPoints& entry_points) {
|
| - DCHECK(!out_of_process_proxy_.get()) << "Don't call for proxied modules.";
|
| - DCHECK(entry_points.initialize_module != NULL);
|
| - int retval = entry_points.initialize_module(pp_module(), &GetInterface);
|
| - if (retval != 0) {
|
| - LOG(WARNING) << "PPP_InitializeModule returned failure " << retval;
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -} // namespace ppapi
|
| -} // namespace webkit
|
|
|