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