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