// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // The portable representation of an instance and root scriptable object. // The PPAPI version of the plugin instantiates a subclass of this class. #ifndef COMPONENTS_NACL_RENDERER_PLUGIN_PLUGIN_H_ #define COMPONENTS_NACL_RENDERER_PLUGIN_PLUGIN_H_ #include #include #include #include #include "components/nacl/renderer/plugin/nacl_subprocess.h" #include "components/nacl/renderer/plugin/pnacl_coordinator.h" #include "components/nacl/renderer/plugin/service_runtime.h" #include "components/nacl/renderer/ppb_nacl_private.h" #include "ppapi/cpp/instance.h" #include "ppapi/cpp/private/uma_private.h" #include "ppapi/cpp/url_loader.h" #include "ppapi/cpp/var.h" #include "ppapi/cpp/view.h" #include "ppapi/utility/completion_callback_factory.h" namespace pp { class CompletionCallback; class URLLoader; } namespace plugin { class ErrorInfo; const PP_NaClFileInfo kInvalidNaClFileInfo = { PP_kInvalidFileHandle, 0, // token_lo 0, // token_hi }; class Plugin : public pp::Instance { public: explicit Plugin(PP_Instance instance); Plugin(const Plugin&) = delete; Plugin& operator=(const Plugin&) = delete; // ----- Methods inherited from pp::Instance: // Initializes this plugin with tag attribute count |argc|, // names |argn| and values |argn|. Returns false on failure. // Gets called by the browser right after New(). bool Init(uint32_t argc, const char* argn[], const char* argv[]) override; // Handles document load, when the plugin is a MIME type handler. bool HandleDocumentLoad(const pp::URLLoader& url_loader) override; // Load support. // // Starts NaCl module but does not wait until low-level // initialization (e.g. ld.so dynamic loading of manifest files) is // done. The module will become ready later, asynchronously. Other // event handlers should block until the module is ready before // trying to communicate with it, i.e., until nacl_ready_state is // DONE. // // NB: currently we do not time out, so if the untrusted code // does not signal that it is ready, then we will deadlock the main // thread of the renderer on this subsequent event delivery. We // should include a time-out at which point we declare the // nacl_ready_state to be done, and let the normal crash detection // mechanism(s) take over. // This function takes over ownership of the file_info. void LoadNaClModule(PP_NaClFileInfo file_info, PP_NaClAppProcessType process_type); // Load support. // A helper SRPC NaCl module can be loaded given a PP_NaClFileInfo. // Does not update nacl_module_origin(). // Uses the given NaClSubprocess to contain the new SelLdr process. // The given callback is called when the loading is complete. // This function takes over ownership of the file_info. void LoadHelperNaClModule(const std::string& helper_url, PP_NaClFileInfo file_info, NaClSubprocess* subprocess_to_init, pp::CompletionCallback callback); // Report an error that was encountered while loading a module. void ReportLoadError(const ErrorInfo& error_info); private: // The browser will invoke the destructor via the pp::Instance // pointer to this object, not from base's Delete(). ~Plugin() override; // Shuts down socket connection, service runtime, and receive thread, // in this order, for the main nacl subprocess. void ShutDownSubprocesses(); // Callback used when getting the URL for the .nexe file. If the URL loading // is successful, the file descriptor is opened and can be passed to sel_ldr // with the sandbox on. void NexeFileDidOpen(int32_t pp_error); // Callback used when a .nexe is translated from bitcode. If the translation // is successful, the file descriptor is opened and can be passed to sel_ldr // with the sandbox on. void BitcodeDidTranslate(int32_t pp_error); // NaCl ISA selection manifest file support. The manifest file is specified // using the "nacl" attribute in the tag. First, the manifest URL (or // data: URI) is fetched, then the JSON is parsed. Once a valid .nexe is // chosen for the sandbox ISA, any current service runtime is shut down, the // .nexe is loaded and run. // Callback used when getting the manifest file as a local file descriptor. void NaClManifestFileDidOpen(int32_t pp_error); // Processes the JSON manifest string and starts loading the nexe. void ProcessNaClManifest(const std::string& manifest_json); // Keep track of the NaCl module subprocess that was spun up in the plugin. NaClSubprocess main_subprocess_; pp::CompletionCallbackFactory callback_factory_; std::unique_ptr pnacl_coordinator_; int exit_status_; PP_NaClFileInfo nexe_file_info_; pp::UMAPrivate uma_interface_; }; } // namespace plugin #endif // COMPONENTS_NACL_RENDERER_PLUGIN_PLUGIN_H_