// Copyright (c) 2011 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 "chrome/renderer/chrome_ppapi_interfaces.h" #include "base/command_line.h" #include "base/logging.h" #include "base/rand_util_c.h" #include "base/utf_string_conversions.h" #include "chrome/common/render_messages.h" #include "chrome/renderer/chrome_ppb_pdf_impl.h" #include "content/public/common/content_switches.h" #include "content/public/renderer/render_thread.h" #include "ppapi/c/private/ppb_nacl_private.h" #include "ppapi/c/private/ppb_pdf.h" #include "webkit/plugins/ppapi/ppapi_interface_factory.h" #if !defined(DISABLE_NACL) #include "native_client/src/shared/imc/nacl_imc.h" #include "ppapi/native_client/src/trusted/plugin/nacl_entry_points.h" #endif using content::RenderThread; namespace chrome { // Launch NaCl's sel_ldr process. bool LaunchSelLdr(const char* alleged_url, int socket_count, void* imc_handles, void* nacl_process_handle, int* nacl_process_id) { #if !defined(DISABLE_NACL) std::vector sockets; base::ProcessHandle nacl_process; if (!RenderThread::Get()->Send( new ChromeViewHostMsg_LaunchNaCl( ASCIIToWide(alleged_url), socket_count, &sockets, &nacl_process, reinterpret_cast(nacl_process_id)))) { return false; } CHECK(static_cast(sockets.size()) == socket_count); for (int i = 0; i < socket_count; i++) { static_cast(imc_handles)[i] = nacl::ToNativeHandle(sockets[i]); } *static_cast(nacl_process_handle) = nacl_process; return true; #else return false; #endif } int UrandomFD(void) { #if defined(OS_POSIX) return GetUrandomFD(); #else return 0; #endif } bool Are3DInterfacesDisabled() { return CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisable3DAPIs); } const PPB_NaCl_Private ppb_nacl = { &LaunchSelLdr, &UrandomFD, &Are3DInterfacesDisabled, }; class PPB_NaCl_Impl { public: // Returns a pointer to the interface implementing PPB_NaCl_Private that is // exposed to the plugin. static const PPB_NaCl_Private* GetInterface() { return &ppb_nacl; } }; const void* ChromePPAPIInterfaceFactory(const std::string& interface_name) { if (interface_name == PPB_NACL_PRIVATE_INTERFACE) return chrome::PPB_NaCl_Impl::GetInterface(); if (interface_name == PPB_PDF_INTERFACE) return chrome::PPB_PDF_Impl::GetInterface(); return NULL; } } // namespace chrome