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 <string>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_macros.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_nacl_private.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/instance.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/private/uma_private.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/url_loader.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/view.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/nacl_subprocess.h"
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/service_runtime.h"
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h"
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h"
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nacl {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapper;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapperFactory;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace nacl
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass CompletionCallback;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLLoader;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLUtil_Dev;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorInfo;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Manifest;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int32_t ConvertFileDescriptor(PP_FileHandle handle);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst PP_NaClFileInfo kInvalidNaClFileInfo = {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PP_kInvalidFileHandle,
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  0,  // token_lo
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  0,  // token_hi
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Plugin : public pp::Instance {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  explicit Plugin(PP_Instance instance);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ----- Methods inherited from pp::Instance:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes this plugin with <embed/object ...> tag attribute count |argc|,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // names |argn| and values |argn|. Returns false on failure.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets called by the browser right after New().
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handles document load, when the plugin is a MIME type handler.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleDocumentLoad(const pp::URLLoader& url_loader);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load support.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts NaCl module but does not wait until low-level
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // initialization (e.g. ld.so dynamic loading of manifest files) is
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // done.  The module will become ready later, asynchronously.  Other
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event handlers should block until the module is ready before
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trying to communicate with it, i.e., until nacl_ready_state is
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DONE.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NB: currently we do not time out, so if the untrusted code
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does not signal that it is ready, then we will deadlock the main
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread of the renderer on this subsequent event delivery.  We
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should include a time-out at which point we declare the
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nacl_ready_state to be done, and let the normal crash detection
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mechanism(s) take over.
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void LoadNaClModule(PP_NaClFileInfo file_info,
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      bool uses_nonsfi_mode,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      bool enable_dyncode_syscalls,
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      bool enable_exception_handling,
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      bool enable_crash_throttling,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const pp::CompletionCallback& init_done_cb);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish hooking interfaces up, after low-level initialization is
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // complete.
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool LoadNaClModuleContinuationIntern();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Continuation for starting SRPC/JSProxy services as appropriate.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is invoked as a callback when the NaCl module makes the
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // init_done reverse RPC to tell us that low-level initialization
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // such as ld.so processing is done.  That initialization requires
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that the main thread be free in order to do Pepper
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // main-thread-only operations such as file processing.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadNaClModuleContinuation(int32_t pp_error);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load support.
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // A helper SRPC NaCl module can be loaded given a PP_NaClFileInfo.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blocks until the helper module signals initialization is done.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does not update nacl_module_origin().
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL or the NaClSubprocess of the new helper NaCl module.
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NaClSubprocess* LoadHelperNaClModule(const std::string& helper_url,
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       PP_NaClFileInfo file_info,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ErrorInfo* error_info);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Report an error that was encountered while loading a module.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportLoadError(const ErrorInfo& error_info);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::DescWrapperFactory* wrapper_factory() const { return wrapper_factory_; }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPB_NaCl_Private* nacl_interface() const { return nacl_interface_; }
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pp::UMAPrivate& uma_interface() { return uma_interface_; }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NACL_DISALLOW_COPY_AND_ASSIGN(Plugin);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser will invoke the destructor via the pp::Instance
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pointer to this object, not from base's Delete().
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Plugin();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shuts down socket connection, service runtime, and receive thread,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in this order, for the main nacl subprocess.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutDownSubprocesses();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Histogram helper functions, internal to Plugin so they can use
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // uma_interface_ normally.
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void HistogramTimeSmall(const std::string& name, int64_t ms);
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Loads and starts a helper (e.g. llc, ld) NaCl module.
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Only to be used from a background (non-main) thread for the PNaCl
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // translator. This will fully initialize the |subprocess| if the load was
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // successful.
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool LoadHelperNaClModuleInternal(NaClSubprocess* subprocess,
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const SelLdrStartParams& params);
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Start sel_ldr from the main thread, given the start params.
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |pp_error| is set by CallOnMainThread (should be PP_OK).
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void StartSelLdrOnMainThread(int32_t pp_error,
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               ServiceRuntime* service_runtime,
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               const SelLdrStartParams& params,
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               pp::CompletionCallback callback);
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Signals that StartSelLdr has finished.
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // This is invoked on the main thread.
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SignalStartSelLdrDone(int32_t pp_error,
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             bool* started,
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             ServiceRuntime* service_runtime);
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This is invoked on the main thread.
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void StartNexe(int32_t pp_error, ServiceRuntime* service_runtime);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when getting the URL for the .nexe file.  If the URL loading
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is successful, the file descriptor is opened and can be passed to sel_ldr
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the sandbox on.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NexeFileDidOpen(int32_t pp_error);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NexeFileDidOpenContinuation(int32_t pp_error);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when a .nexe is translated from bitcode.  If the translation
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is successful, the file descriptor is opened and can be passed to sel_ldr
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the sandbox on.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BitcodeDidTranslate(int32_t pp_error);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BitcodeDidTranslateContinuation(int32_t pp_error);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NaCl ISA selection manifest file support.  The manifest file is specified
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // using the "nacl" attribute in the <embed> tag.  First, the manifest URL (or
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data: URI) is fetched, then the JSON is parsed.  Once a valid .nexe is
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chosen for the sandbox ISA, any current service runtime is shut down, the
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // .nexe is loaded and run.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when getting the manifest file as a local file descriptor.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NaClManifestFileDidOpen(int32_t pp_error);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Processes the JSON manifest string and starts loading the nexe.
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ProcessNaClManifest(const std::string& manifest_json);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of the NaCl module subprocess that was spun up in the plugin.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClSubprocess main_subprocess_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool uses_nonsfi_mode_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::DescWrapperFactory* wrapper_factory_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallbackFactory<Plugin> callback_factory_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::scoped_ptr<PnaclCoordinator> pnacl_coordinator_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int exit_status_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PP_NaClFileInfo nexe_file_info_;
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPB_NaCl_Private* nacl_interface_;
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pp::UMAPrivate uma_interface_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace plugin
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_
205