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