plugin.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -*- c++ -*- 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The portable representation of an instance and root scriptable object. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The PPAPI version of the plugin instantiates a subclass of this class. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_macros.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_scoped_ptr.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_string.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "native_client/src/public/nacl_file_info.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_nacl_private.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/instance.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/private/uma_private.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/url_loader.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/view.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/file_downloader.h" 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/nacl_subprocess.h" 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/service_runtime.h" 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h" 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nacl { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapper; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapperFactory; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace nacl 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass CompletionCallback; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLLoader; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLUtil_Dev; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorInfo; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Manifest; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int32_t ConvertFileDescriptor(PP_FileHandle handle); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Plugin : public pp::Instance { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit Plugin(PP_Instance instance); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ----- Methods inherited from pp::Instance: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes this plugin with <embed/object ...> tag attribute count |argc|, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // names |argn| and values |argn|. Returns false on failure. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets called by the browser right after New(). 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles document load, when the plugin is a MIME type handler. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleDocumentLoad(const pp::URLLoader& url_loader); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load support. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts NaCl module but does not wait until low-level 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // initialization (e.g. ld.so dynamic loading of manifest files) is 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // done. The module will become ready later, asynchronously. Other 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event handlers should block until the module is ready before 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // trying to communicate with it, i.e., until nacl_ready_state is 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DONE. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NB: currently we do not time out, so if the untrusted code 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does not signal that it is ready, then we will deadlock the main 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread of the renderer on this subsequent event delivery. We 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should include a time-out at which point we declare the 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nacl_ready_state to be done, and let the normal crash detection 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mechanism(s) take over. 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void LoadNaClModule(PP_NaClFileInfo file_info, 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool uses_nonsfi_mode, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enable_dyncode_syscalls, 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool enable_exception_handling, 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool enable_crash_throttling, 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const pp::CompletionCallback& init_done_cb, 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const pp::CompletionCallback& crash_cb); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finish hooking interfaces up, after low-level initialization is 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // complete. 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool LoadNaClModuleContinuationIntern(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Continuation for starting SRPC/JSProxy services as appropriate. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is invoked as a callback when the NaCl module makes the 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // init_done reverse RPC to tell us that low-level initialization 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // such as ld.so processing is done. That initialization requires 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the main thread be free in order to do Pepper 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // main-thread-only operations such as file processing. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LoadNaClModuleContinuation(int32_t pp_error); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load support. 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // A helper SRPC NaCl module can be loaded given a PP_FileHandle. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blocks until the helper module signals initialization is done. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not update nacl_module_origin(). 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns NULL or the NaClSubprocess of the new helper NaCl module. 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NaClSubprocess* LoadHelperNaClModule(const nacl::string& helper_url, 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_FileHandle file_handle, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorInfo* error_info); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Report an error that was encountered while loading a module. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportLoadError(const ErrorInfo& error_info); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::DescWrapperFactory* wrapper_factory() const { return wrapper_factory_; } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A helper function that indicates if |url| can be requested by the document 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // under the same-origin policy. Strictly speaking, it may be possible for the 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // document to request the URL using CORS even if this function returns false. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DocumentCanRequest(const std::string& url); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // set_exit_status may be called off the main thread. 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void set_exit_status(int exit_status); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_NaCl_Private* nacl_interface() const { return nacl_interface_; } 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::UMAPrivate& uma_interface() { return uma_interface_; } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NACL_DISALLOW_COPY_AND_ASSIGN(Plugin); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The browser will invoke the destructor via the pp::Instance 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer to this object, not from base's Delete(). 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Plugin(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shuts down socket connection, service runtime, and receive thread, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in this order, for the main nacl subprocess. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutDownSubprocesses(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Histogram helper functions, internal to Plugin so they can use 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // uma_interface_ normally. 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HistogramTimeSmall(const std::string& name, int64_t ms); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Load a nacl module from the file specified in file_handle. 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Only to be used from a background (non-main) thread for the PNaCl 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // translator. This will fully initialize the |subprocess| if the load was 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // successful. 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool LoadHelperNaClModule(PP_FileHandle file_handle, 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NaClSubprocess* subprocess, 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SelLdrStartParams& params); 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Start sel_ldr from the main thread, given the start params. 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |pp_error| is set by CallOnMainThread (should be PP_OK). 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void StartSelLdrOnMainThread(int32_t pp_error, 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ServiceRuntime* service_runtime, 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const SelLdrStartParams& params, 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::CompletionCallback callback); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Signals that StartSelLdr has finished. 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This is invoked on the main thread. 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SignalStartSelLdrDone(int32_t pp_error, 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* started, 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ServiceRuntime* service_runtime); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Signals that the nexe is started. 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This is invoked on the main thread. 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SignalNexeStarted(int32_t pp_error, 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool* started, 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ServiceRuntime* service_runtime); 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // This is invoked on the main thread. 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void LoadNexeAndStart(int32_t pp_error, 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ServiceRuntime* service_runtime, 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_NaClFileInfo file_info, 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const pp::CompletionCallback& callback); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback used when getting the URL for the .nexe file. If the URL loading 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is successful, the file descriptor is opened and can be passed to sel_ldr 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the sandbox on. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NexeFileDidOpen(int32_t pp_error); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NexeFileDidOpenContinuation(int32_t pp_error); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback used when the reverse channel closes. This is an 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronous event that might turn into a JavaScript error or 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crash event -- this is controlled by the two state variables 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nacl_ready_state_ and nexe_error_reported_: If an error or crash 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // had already been reported, no additional crash event is 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated. If no error has been reported but nacl_ready_state_ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not DONE, then the loadend event has not been reported, and we 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enqueue an error event followed by loadend. If nacl_ready_state_ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is DONE, then we are in the post-loadend (we need temporal 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // predicate symbols), and we enqueue a crash event. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NexeDidCrash(int32_t pp_error); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback used when a .nexe is translated from bitcode. If the translation 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is successful, the file descriptor is opened and can be passed to sel_ldr 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the sandbox on. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BitcodeDidTranslate(int32_t pp_error); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BitcodeDidTranslateContinuation(int32_t pp_error); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NaCl ISA selection manifest file support. The manifest file is specified 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // using the "nacl" attribute in the <embed> tag. First, the manifest URL (or 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data: URI) is fetched, then the JSON is parsed. Once a valid .nexe is 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chosen for the sandbox ISA, any current service runtime is shut down, the 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .nexe is loaded and run. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback used when getting the manifest file as a local file descriptor. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NaClManifestFileDidOpen(int32_t pp_error); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes the JSON manifest string and starts loading the nexe. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessNaClManifest(const nacl::string& manifest_json); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetExitStatusOnMainThread(int32_t pp_error, int exit_status); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep track of the NaCl module subprocess that was spun up in the plugin. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClSubprocess main_subprocess_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool uses_nonsfi_mode_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::DescWrapperFactory* wrapper_factory_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Original, unresolved URL for the .nexe program to load. 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string program_url_; 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallbackFactory<Plugin> callback_factory_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::scoped_ptr<PnaclCoordinator> pnacl_coordinator_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int exit_status_; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_NaClFileInfo nexe_file_info_; 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_NaCl_Private* nacl_interface_; 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::UMAPrivate uma_interface_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace plugin 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_ 239