1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // The portable representation of an instance and root scriptable object. 6*6777b538SAndroid Build Coastguard Worker // The PPAPI version of the plugin instantiates a subclass of this class. 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_NACL_RENDERER_PLUGIN_PLUGIN_H_ 9*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_NACL_RENDERER_PLUGIN_PLUGIN_H_ 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 12*6777b538SAndroid Build Coastguard Worker #include <stdio.h> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include <memory> 15*6777b538SAndroid Build Coastguard Worker #include <string> 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/plugin/nacl_subprocess.h" 18*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/plugin/pnacl_coordinator.h" 19*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/plugin/service_runtime.h" 20*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/ppb_nacl_private.h" 21*6777b538SAndroid Build Coastguard Worker #include "ppapi/cpp/instance.h" 22*6777b538SAndroid Build Coastguard Worker #include "ppapi/cpp/private/uma_private.h" 23*6777b538SAndroid Build Coastguard Worker #include "ppapi/cpp/url_loader.h" 24*6777b538SAndroid Build Coastguard Worker #include "ppapi/cpp/var.h" 25*6777b538SAndroid Build Coastguard Worker #include "ppapi/cpp/view.h" 26*6777b538SAndroid Build Coastguard Worker #include "ppapi/utility/completion_callback_factory.h" 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker namespace pp { 29*6777b538SAndroid Build Coastguard Worker class CompletionCallback; 30*6777b538SAndroid Build Coastguard Worker class URLLoader; 31*6777b538SAndroid Build Coastguard Worker } 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker namespace plugin { 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker class ErrorInfo; 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker const PP_NaClFileInfo kInvalidNaClFileInfo = { 38*6777b538SAndroid Build Coastguard Worker PP_kInvalidFileHandle, 39*6777b538SAndroid Build Coastguard Worker 0, // token_lo 40*6777b538SAndroid Build Coastguard Worker 0, // token_hi 41*6777b538SAndroid Build Coastguard Worker }; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker class Plugin : public pp::Instance { 44*6777b538SAndroid Build Coastguard Worker public: 45*6777b538SAndroid Build Coastguard Worker explicit Plugin(PP_Instance instance); 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker Plugin(const Plugin&) = delete; 48*6777b538SAndroid Build Coastguard Worker Plugin& operator=(const Plugin&) = delete; 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // ----- Methods inherited from pp::Instance: 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Initializes this plugin with <embed/object ...> tag attribute count |argc|, 53*6777b538SAndroid Build Coastguard Worker // names |argn| and values |argn|. Returns false on failure. 54*6777b538SAndroid Build Coastguard Worker // Gets called by the browser right after New(). 55*6777b538SAndroid Build Coastguard Worker bool Init(uint32_t argc, const char* argn[], const char* argv[]) override; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Handles document load, when the plugin is a MIME type handler. 58*6777b538SAndroid Build Coastguard Worker bool HandleDocumentLoad(const pp::URLLoader& url_loader) override; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // Load support. 61*6777b538SAndroid Build Coastguard Worker // 62*6777b538SAndroid Build Coastguard Worker // Starts NaCl module but does not wait until low-level 63*6777b538SAndroid Build Coastguard Worker // initialization (e.g. ld.so dynamic loading of manifest files) is 64*6777b538SAndroid Build Coastguard Worker // done. The module will become ready later, asynchronously. Other 65*6777b538SAndroid Build Coastguard Worker // event handlers should block until the module is ready before 66*6777b538SAndroid Build Coastguard Worker // trying to communicate with it, i.e., until nacl_ready_state is 67*6777b538SAndroid Build Coastguard Worker // DONE. 68*6777b538SAndroid Build Coastguard Worker // 69*6777b538SAndroid Build Coastguard Worker // NB: currently we do not time out, so if the untrusted code 70*6777b538SAndroid Build Coastguard Worker // does not signal that it is ready, then we will deadlock the main 71*6777b538SAndroid Build Coastguard Worker // thread of the renderer on this subsequent event delivery. We 72*6777b538SAndroid Build Coastguard Worker // should include a time-out at which point we declare the 73*6777b538SAndroid Build Coastguard Worker // nacl_ready_state to be done, and let the normal crash detection 74*6777b538SAndroid Build Coastguard Worker // mechanism(s) take over. 75*6777b538SAndroid Build Coastguard Worker // This function takes over ownership of the file_info. 76*6777b538SAndroid Build Coastguard Worker void LoadNaClModule(PP_NaClFileInfo file_info, 77*6777b538SAndroid Build Coastguard Worker PP_NaClAppProcessType process_type); 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // Load support. 80*6777b538SAndroid Build Coastguard Worker // A helper SRPC NaCl module can be loaded given a PP_NaClFileInfo. 81*6777b538SAndroid Build Coastguard Worker // Does not update nacl_module_origin(). 82*6777b538SAndroid Build Coastguard Worker // Uses the given NaClSubprocess to contain the new SelLdr process. 83*6777b538SAndroid Build Coastguard Worker // The given callback is called when the loading is complete. 84*6777b538SAndroid Build Coastguard Worker // This function takes over ownership of the file_info. 85*6777b538SAndroid Build Coastguard Worker void LoadHelperNaClModule(const std::string& helper_url, 86*6777b538SAndroid Build Coastguard Worker PP_NaClFileInfo file_info, 87*6777b538SAndroid Build Coastguard Worker NaClSubprocess* subprocess_to_init, 88*6777b538SAndroid Build Coastguard Worker pp::CompletionCallback callback); 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Report an error that was encountered while loading a module. 91*6777b538SAndroid Build Coastguard Worker void ReportLoadError(const ErrorInfo& error_info); 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker private: 94*6777b538SAndroid Build Coastguard Worker // The browser will invoke the destructor via the pp::Instance 95*6777b538SAndroid Build Coastguard Worker // pointer to this object, not from base's Delete(). 96*6777b538SAndroid Build Coastguard Worker ~Plugin() override; 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker // Shuts down socket connection, service runtime, and receive thread, 99*6777b538SAndroid Build Coastguard Worker // in this order, for the main nacl subprocess. 100*6777b538SAndroid Build Coastguard Worker void ShutDownSubprocesses(); 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker // Callback used when getting the URL for the .nexe file. If the URL loading 103*6777b538SAndroid Build Coastguard Worker // is successful, the file descriptor is opened and can be passed to sel_ldr 104*6777b538SAndroid Build Coastguard Worker // with the sandbox on. 105*6777b538SAndroid Build Coastguard Worker void NexeFileDidOpen(int32_t pp_error); 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker // Callback used when a .nexe is translated from bitcode. If the translation 108*6777b538SAndroid Build Coastguard Worker // is successful, the file descriptor is opened and can be passed to sel_ldr 109*6777b538SAndroid Build Coastguard Worker // with the sandbox on. 110*6777b538SAndroid Build Coastguard Worker void BitcodeDidTranslate(int32_t pp_error); 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker // NaCl ISA selection manifest file support. The manifest file is specified 113*6777b538SAndroid Build Coastguard Worker // using the "nacl" attribute in the <embed> tag. First, the manifest URL (or 114*6777b538SAndroid Build Coastguard Worker // data: URI) is fetched, then the JSON is parsed. Once a valid .nexe is 115*6777b538SAndroid Build Coastguard Worker // chosen for the sandbox ISA, any current service runtime is shut down, the 116*6777b538SAndroid Build Coastguard Worker // .nexe is loaded and run. 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Callback used when getting the manifest file as a local file descriptor. 119*6777b538SAndroid Build Coastguard Worker void NaClManifestFileDidOpen(int32_t pp_error); 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker // Processes the JSON manifest string and starts loading the nexe. 122*6777b538SAndroid Build Coastguard Worker void ProcessNaClManifest(const std::string& manifest_json); 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // Keep track of the NaCl module subprocess that was spun up in the plugin. 125*6777b538SAndroid Build Coastguard Worker NaClSubprocess main_subprocess_; 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker pp::CompletionCallbackFactory<Plugin> callback_factory_; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker std::unique_ptr<PnaclCoordinator> pnacl_coordinator_; 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker int exit_status_; 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker PP_NaClFileInfo nexe_file_info_; 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker pp::UMAPrivate uma_interface_; 136*6777b538SAndroid Build Coastguard Worker }; 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker } // namespace plugin 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_NACL_RENDERER_PLUGIN_PLUGIN_H_ 141