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"
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "native_client/src/trusted/validator/nacl_file_info.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_nacl_private.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/var_private.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for pp::VarPrivate
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/instance_private.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/rect.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/url_loader.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/view.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/file_downloader.h"
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/nacl_subprocess.h"
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h"
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/service_runtime.h"
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h"
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NaClSrpcChannel;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nacl {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapper;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapperFactory;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace nacl
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Find_Dev;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MouseLock;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Printing_Dev;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Selection_Dev;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLLoader;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLUtil_Dev;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Zoom_Dev;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi_proxy {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserPpp;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorInfo;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Manifest;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProgressEvent;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScriptablePlugin;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Plugin : public pp::InstancePrivate {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory method for creation.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Plugin* New(PP_Instance instance);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ----- Methods inherited from pp::Instance:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes this plugin with <embed/object ...> tag attribute count |argc|,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // names |argn| and values |argn|. Returns false on failure.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets called by the browser right after New().
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handles document load, when the plugin is a MIME type handler.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleDocumentLoad(const pp::URLLoader& url_loader);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a scriptable reference to this plugin element.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by JavaScript document.getElementById(plugin_id).
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual pp::Var GetInstanceObject();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ----- Plugin interface support.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load support.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NaCl module can be loaded given a DescWrapper.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts NaCl module but does not wait until low-level
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialization (e.g., ld.so dynamic loading of manifest files) is
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // done.  The module will become ready later, asynchronously.  Other
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event handlers should block until the module is ready before
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trying to communicate with it, i.e., until nacl_ready_state is
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DONE.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NB: currently we do not time out, so if the untrusted code
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does not signal that it is ready, then we will deadlock the main
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread of the renderer on this subsequent event delivery.  We
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should include a time-out at which point we declare the
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nacl_ready_state to be done, and let the normal crash detection
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mechanism(s) take over.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates nacl_module_origin() and nacl_module_url().
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadNaClModule(nacl::DescWrapper* wrapper, ErrorInfo* error_info,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      bool enable_dyncode_syscalls,
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      bool enable_exception_handling,
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      const pp::CompletionCallback& init_done_cb,
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      const pp::CompletionCallback& crash_cb);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish hooking interfaces up, after low-level initialization is
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // complete.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadNaClModuleContinuationIntern(ErrorInfo* error_info);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Continuation for starting SRPC/JSProxy services as appropriate.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is invoked as a callback when the NaCl module makes the
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // init_done reverse RPC to tell us that low-level initialization
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // such as ld.so processing is done.  That initialization requires
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that the main thread be free in order to do Pepper
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // main-thread-only operations such as file processing.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadNaClModuleContinuation(int32_t pp_error);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load support.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A helper SRPC NaCl module can be loaded given a DescWrapper.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blocks until the helper module signals initialization is done.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does not update nacl_module_origin().
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL or the NaClSubprocess of the new helper NaCl module.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClSubprocess* LoadHelperNaClModule(nacl::DescWrapper* wrapper,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const Manifest* manifest,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ErrorInfo* error_info);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the argument value for the specified key, or NULL if not found.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The callee retains ownership of the result.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* LookupArgument(const char* key);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum LengthComputable {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LENGTH_IS_NOT_COMPUTABLE = 0,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LENGTH_IS_COMPUTABLE = 1
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Report successful loading of a module.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportLoadSuccess(LengthComputable length_computable,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint64_t loaded_bytes,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint64_t total_bytes);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Report an error that was encountered while loading a module.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportLoadError(const ErrorInfo& error_info);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Report loading a module was aborted, typically due to user action.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportLoadAbort();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write a text string on the JavaScript console.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddToConsole(const nacl::string& text);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatch a JavaScript event to indicate a key step in loading.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event_type| is a character string indicating which type of progress
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event (loadstart, progress, error, abort, load, loadend).  Events are
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enqueued on the JavaScript event loop, which then calls back through
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DispatchProgressEvent.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnqueueProgressEvent(const char* event_type);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnqueueProgressEvent(const char* event_type,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const nacl::string& url,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            LengthComputable length_computable,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint64_t loaded_bytes,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint64_t total_bytes);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Progress event types.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventLoadStart;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventProgress;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventError;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventAbort;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventLoad;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventLoadEnd;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kProgressEventCrash;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Report the error code that sel_ldr produces when starting a nexe.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportSelLdrLoadStatus(int status);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Report nexe death after load to JS and shut down the proxy.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportDeadNexe();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The embed/object tag argument list.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc() const { return argc_; }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char** argn() const { return argn_; }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char** argv() const { return argv_; }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Plugin* plugin() const { return const_cast<Plugin*>(this); }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL resolution support.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugin_base_url is the URL used for resolving relative URLs used in
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // src="...".
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string plugin_base_url() const { return plugin_base_url_; }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_plugin_base_url(const nacl::string& url) { plugin_base_url_ = url; }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manifest_base_url is the URL used for resolving relative URLs mentioned
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in manifest files.  If the manifest is a data URI, this is an empty string.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string manifest_base_url() const { return manifest_base_url_; }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_manifest_base_url(const nacl::string& url) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest_base_url_ = url;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL of the manifest file as set by the "src" attribute.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is not the fully resolved URL if it was set as relative.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const nacl::string& manifest_url() const { return manifest_url_; }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_manifest_url(const nacl::string& manifest_url) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest_url_ = manifest_url;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The state of readiness of the plugin.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ReadyState {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The trusted plugin begins in this ready state.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNSENT = 0,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The manifest file has been requested, but not yet received.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OPENED = 1,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This state is unused.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HEADERS_RECEIVED = 2,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The manifest file has been received and the nexe successfully requested.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOADING = 3,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The nexe has been loaded and the proxy started, so it is ready for
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // interaction with the page.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DONE = 4
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadyState nacl_ready_state() const { return nacl_ready_state_; }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_nacl_ready_state(ReadyState nacl_ready_state) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nacl_ready_state_ = nacl_ready_state;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool nexe_error_reported() const { return nexe_error_reported_; }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_nexe_error_reported(bool val) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nexe_error_reported_ = val;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::DescWrapperFactory* wrapper_factory() const { return wrapper_factory_; }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests a NaCl manifest download from a |url| relative to the page origin.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RequestNaClManifest(const nacl::string& url);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Support for property getting.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void (Plugin::* PropertyGetter)(NaClSrpcArg* prop_value);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPropertyGet(const nacl::string& prop_name, PropertyGetter getter);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasProperty(const nacl::string& prop_name);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetProperty(const nacl::string& prop_name, NaClSrpcArg* prop_value);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The supported property getters.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetExitStatus(NaClSrpcArg* prop_value);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetLastError(NaClSrpcArg* prop_value);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetReadyStateProperty(NaClSrpcArg* prop_value);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The size returned when a file download operation is unable to determine
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the size of the file to load.  W3C ProgressEvents specify that unknown
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sizes return 0.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint64_t kUnknownBytes = 0;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called back by CallOnMainThread.  Dispatches the first enqueued progress
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DispatchProgressEvent(int32_t result);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests a URL asynchronously resulting in a call to pp_callback with
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a PP_Error indicating status. On success an open file descriptor
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corresponding to the url body is recorded for further lookup.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StreamAsFile(const nacl::string& url,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PP_CompletionCallback pp_callback);
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns rich information for a file retrieved by StreamAsFile(). This info
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // contains a file descriptor. The caller must take ownership of this
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // descriptor.
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct NaClFileInfo GetFileInfo(const nacl::string& url);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A helper function that gets the scheme type for |url|. Uses URLUtil_Dev
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interface which this class has as a member.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UrlSchemeType GetUrlScheme(const std::string& url);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A helper function that indicates if |url| can be requested by the document
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // under the same-origin policy. Strictly speaking, it may be possible for the
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // document to request the URL using CORS even if this function returns false.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DocumentCanRequest(const std::string& url);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the text description of the last error reported by the plugin.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const nacl::string& last_error_string() const { return last_error_string_; }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_last_error_string(const nacl::string& error) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_error_string_ = error;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The MIME type used to instantiate this instance of the NaCl plugin.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Typically, the MIME type will be application/x-nacl.  However, if the NEXE
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is being used as a content type handler for another content type (such as
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PDF), then this function will return that type.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const nacl::string& mime_type() const { return mime_type_; }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default MIME type for the NaCl plugin.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const kNaClMIMEType;
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The MIME type for the plugin when using PNaCl.
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static const char* const kPnaclMIMEType;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if PPAPI Dev interfaces should be allowed.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_dev_interfaces() { return enable_dev_interfaces_; }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Manifest const* manifest() const { return manifest_.get(); }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const pp::URLUtil_Dev* url_util() const { return url_util_; }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the exit status from the (main) service runtime.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exit_status() const {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (NULL == main_service_runtime()) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return main_service_runtime()->exit_status();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPB_NaCl_Private* nacl_interface() const { return nacl_interface_; }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NACL_DISALLOW_COPY_AND_ASSIGN(Plugin);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevent construction and destruction from outside the class:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must use factory New() method instead.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Plugin(PP_Instance instance);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser will invoke the destructor via the pp::Instance
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pointer to this object, not from base's Delete().
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Plugin();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(int argc, char* argn[], char* argv[]);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shuts down socket connection, service runtime, and receive thread,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in this order, for the main nacl subprocess.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutDownSubprocesses();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScriptablePlugin* scriptable_plugin() const { return scriptable_plugin_; }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_scriptable_plugin(ScriptablePlugin* scriptable_plugin) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scriptable_plugin_ = scriptable_plugin;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Access the service runtime for the main NaCl subprocess.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceRuntime* main_service_runtime() const {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return main_subprocess_.service_runtime();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Help load a nacl module, from the file specified in wrapper.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will fully initialize the |subprocess| if the load was successful.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadNaClModuleCommon(nacl::DescWrapper* wrapper,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            NaClSubprocess* subprocess,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const Manifest* manifest,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool should_report_uma,
3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            const SelLdrStartParams& params,
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            const pp::CompletionCallback& init_done_cb,
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            const pp::CompletionCallback& crash_cb);
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Start sel_ldr from the main thread, given the start params.
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Sets |success| to true on success.
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |pp_error| is set by CallOnMainThread (should be PP_OK).
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void StartSelLdrOnMainThread(int32_t pp_error,
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               ServiceRuntime* service_runtime,
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               const SelLdrStartParams& params,
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               bool* success);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when getting the URL for the .nexe file.  If the URL loading
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is successful, the file descriptor is opened and can be passed to sel_ldr
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the sandbox on.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NexeFileDidOpen(int32_t pp_error);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NexeFileDidOpenContinuation(int32_t pp_error);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when the reverse channel closes.  This is an
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // asynchronous event that might turn into a JavaScript error or
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crash event -- this is controlled by the two state variables
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nacl_ready_state_ and nexe_error_reported_: If an error or crash
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // had already been reported, no additional crash event is
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // generated.  If no error has been reported but nacl_ready_state_
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is not DONE, then the loadend event has not been reported, and we
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enqueue an error event followed by loadend.  If nacl_ready_state_
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is DONE, then we are in the post-loadend (we need temporal
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // predicate symbols), and we enqueue a crash event.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NexeDidCrash(int32_t pp_error);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when a .nexe is translated from bitcode.  If the translation
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is successful, the file descriptor is opened and can be passed to sel_ldr
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the sandbox on.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BitcodeDidTranslate(int32_t pp_error);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BitcodeDidTranslateContinuation(int32_t pp_error);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NaCl ISA selection manifest file support.  The manifest file is specified
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // using the "nacl" attribute in the <embed> tag.  First, the manifest URL (or
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data: URI) is fetched, then the JSON is parsed.  Once a valid .nexe is
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chosen for the sandbox ISA, any current service runtime is shut down, the
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // .nexe is loaded and run.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when getting the manifest file as a buffer (e.g., data URIs)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NaClManifestBufferReady(int32_t pp_error);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when getting the manifest file as a local file descriptor.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NaClManifestFileDidOpen(int32_t pp_error);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Processes the JSON manifest string and starts loading the nexe.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessNaClManifest(const nacl::string& manifest_json);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses the JSON in |manifest_json| and retains a Manifest in
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |manifest_| for use by subsequent resource lookups.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On success, |true| is returned and |manifest_| is updated to
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contain a Manifest that is used by SelectNexeURLFromManifest.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On failure, |false| is returned, and |manifest_| is unchanged.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetManifestObject(const nacl::string& manifest_json,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ErrorInfo* error_info);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs timing information to a UMA histogram, and also logs the same timing
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information divided by the size of the nexe to another histogram.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HistogramStartupTimeSmall(const std::string& name, float dt);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HistogramStartupTimeMedium(const std::string& name, float dt);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This NEXE is being used as a content type handler rather than directly by
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an HTML document.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool NexeIsContentHandler() const;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback used when loading a URL for SRPC-based StreamAsFile().
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UrlDidOpenForStreamAsFile(int32_t pp_error,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 FileDownloader*& url_downloader,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 PP_CompletionCallback pp_callback);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy the main service runtime's most recent NaClLog output to the
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JavaScript console.  Valid to use only after a crash, e.g., via a
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // detail level LOG_FATAL NaClLog entry.  If the crash was not due
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to a LOG_FATAL this method will do nothing.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CopyCrashLogToJsConsole();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Open an app file by requesting a file descriptor from the browser. This
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // method first checks that the url is for an installed file before making the
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // request so it won't slow down non-installed file downloads.
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool OpenURLFast(const nacl::string& url, FileDownloader* downloader);
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScriptablePlugin* scriptable_plugin_;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc_;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char** argn_;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char** argv_;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of the NaCl module subprocess that was spun up in the plugin.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClSubprocess main_subprocess_;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string plugin_base_url_;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string manifest_base_url_;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string manifest_url_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadyState nacl_ready_state_;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool nexe_error_reported_;  // error or crash reported
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::DescWrapperFactory* wrapper_factory_;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<nacl::string, PropertyGetter> property_getters_;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // File download support.  |nexe_downloader_| can be opened with a specific
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback to run when the file has been downloaded and is opened for
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reading.  We use one downloader for all URL downloads to prevent issuing
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multiple GETs that might arrive out of order.  For example, this will
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prevent a GET of a NaCl manifest while a .nexe GET is pending.  Note that
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this will also prevent simultaneous handling of multiple .nexes on a page.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileDownloader nexe_downloader_;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallbackFactory<Plugin> callback_factory_;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::scoped_ptr<PnaclCoordinator> pnacl_coordinator_;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The manifest dictionary.  Used for looking up resources to be loaded.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::scoped_ptr<Manifest> manifest_;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL processing interface for use in looking up resources in manifests.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const pp::URLUtil_Dev* url_util_;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A string containing the text description of the last error
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // produced by this plugin.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string last_error_string_;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPAPI Dev interfaces are disabled by default.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_dev_interfaces_;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A flag indicating if the NaCl executable is being loaded from an installed
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // application.  This flag is used to bucket UMA statistics more precisely to
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // help determine whether nexe loading problems are caused by networking
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // issues.  (Installed applications will be loaded from disk.)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unfortunately, the definition of what it means to be part of an installed
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // application is a little murky - for example an installed application can
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // register a mime handler that loads NaCl executables into an arbitrary web
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // page.  As such, the flag actually means "our best guess, based on the URLs
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for NaCl resources that we have seen so far".
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_installed_;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we get a DidChangeView event before the nexe is loaded, we store it and
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // replay it to nexe after it's loaded. We need to replay when this View
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resource is non-is_null().
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::View view_to_replay_;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we get a HandleDocumentLoad event before the nexe is loaded, we store
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it and replay it to nexe after it's loaded. We need to replay when this
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLLoader resource is non-is_null().
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::URLLoader document_load_to_replay_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string mime_type_;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of the FileDownloaders created to fetch urls.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<FileDownloader*> url_downloaders_;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of file descriptors opened by StreamAsFile().
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are owned by the browser.
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::map<nacl::string, struct NaClFileInfo> url_file_info_map_;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pending progress events.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<ProgressEvent*> progress_events_;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for NexeFileDidOpenContinuation
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64_t load_start_;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64_t init_time_;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64_t ready_time_;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t nexe_size_;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback to receive .nexe and .dso download progress notifications.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void UpdateDownloadProgress(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Instance pp_instance,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Resource pp_resource,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64_t bytes_sent,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64_t total_bytes_to_be_sent,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64_t bytes_received,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64_t total_bytes_to_be_received);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finds the file downloader which owns the given URL loader. This is used
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in UpdateDownloadProgress to map a url loader back to the URL being
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // downloaded.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileDownloader* FindFileDownloader(PP_Resource url_loader) const;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64_t time_of_last_progress_event_;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPB_NaCl_Private* nacl_interface_;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace plugin
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_
521