xref: /aosp_15_r20/external/cronet/components/nacl/renderer/plugin/plugin.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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