| Index: src/trusted/plugin/plugin.h
|
| diff --git a/src/trusted/plugin/plugin.h b/src/trusted/plugin/plugin.h
|
| deleted file mode 100644
|
| index 2df08270eed74e8b10ec05facbb30712e3a209ad..0000000000000000000000000000000000000000
|
| --- a/src/trusted/plugin/plugin.h
|
| +++ /dev/null
|
| @@ -1,514 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| - * 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 NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_
|
| -#define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_
|
| -
|
| -#include <stdio.h>
|
| -#include <map>
|
| -#include <set>
|
| -#include <queue>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "native_client/src/include/nacl_macros.h"
|
| -#include "native_client/src/include/nacl_scoped_ptr.h"
|
| -#include "native_client/src/include/nacl_string.h"
|
| -#include "native_client/src/trusted/plugin/file_downloader.h"
|
| -#include "native_client/src/trusted/plugin/method_map.h"
|
| -#include "native_client/src/trusted/plugin/nacl_subprocess.h"
|
| -#include "native_client/src/trusted/plugin/pnacl_coordinator.h"
|
| -#include "native_client/src/trusted/plugin/service_runtime.h"
|
| -#include "native_client/src/trusted/plugin/utility.h"
|
| -
|
| -#include "ppapi/cpp/private/var_private.h"
|
| -// for pp::VarPrivate
|
| -#include "ppapi/cpp/private/instance_private.h"
|
| -#include "ppapi/cpp/rect.h"
|
| -#include "ppapi/cpp/url_loader.h"
|
| -#include "ppapi/cpp/var.h"
|
| -
|
| -struct NaClSrpcChannel;
|
| -struct NaClDesc;
|
| -
|
| -namespace nacl {
|
| -class DescWrapper;
|
| -class DescWrapperFactory;
|
| -} // namespace nacl
|
| -
|
| -namespace pp {
|
| -class Find_Dev;
|
| -class Printing_Dev;
|
| -class Selection_Dev;
|
| -class URLLoader;
|
| -class WidgetClient_Dev;
|
| -class URLUtil_Dev;
|
| -class Zoom_Dev;
|
| -}
|
| -
|
| -namespace ppapi_proxy {
|
| -class BrowserPpp;
|
| -}
|
| -
|
| -namespace plugin {
|
| -
|
| -class ErrorInfo;
|
| -class Manifest;
|
| -class PnaclCoordinator;
|
| -class ProgressEvent;
|
| -class ScriptableHandle;
|
| -
|
| -typedef enum {
|
| - METHOD_CALL = 0,
|
| - PROPERTY_GET,
|
| - PROPERTY_SET
|
| -} CallType;
|
| -
|
| -
|
| -class Plugin : public pp::InstancePrivate {
|
| - public:
|
| - // Factory method for creation.
|
| - static Plugin* New(PP_Instance instance);
|
| -
|
| - // ----- Methods inherited from pp::Instance:
|
| -
|
| - // Initializes this plugin with <embed/object ...> tag attribute count |argc|,
|
| - // names |argn| and values |argn|. Returns false on failure.
|
| - // Gets called by the browser right after New().
|
| - virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
|
| -
|
| - // Handles view changes from the browser.
|
| - virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip);
|
| -
|
| - // Handles gaining or losing focus.
|
| - virtual void DidChangeFocus(bool has_focus);
|
| -
|
| - // Handles input events delivered from the browser to this plugin element.
|
| - virtual bool HandleInputEvent(const pp::InputEvent& event);
|
| -
|
| - // Handles gaining or losing focus.
|
| - virtual bool HandleDocumentLoad(const pp::URLLoader& url_loader);
|
| -
|
| - // Returns a scriptable reference to this plugin element.
|
| - // Called by JavaScript document.getElementById(plugin_id).
|
| - virtual pp::Var GetInstanceObject();
|
| -
|
| - // Handles postMessage from browser
|
| - virtual void HandleMessage(const pp::Var& message);
|
| -
|
| - // ----- Plugin interface support.
|
| -
|
| - // Load support.
|
| - // NaCl module can be loaded given a DescWrapper.
|
| - //
|
| - // 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. Note, however, we already have another mechanism that
|
| - // prevents event delivery: StartJSObjectProxy plumbs through
|
| - // NaClSubprocess to SrpcClient which upcalls
|
| - // Plugin::StartProxiedExecution, which sets ppapi_proxy_. And NULL
|
| - // == ppapi_proxy_ prevents events from being delivered, even if
|
| - // 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.
|
| - //
|
| - // Updates nacl_module_origin() and nacl_module_url().
|
| - bool LoadNaClModule(nacl::DescWrapper* wrapper, ErrorInfo* error_info,
|
| - pp::CompletionCallback init_done_cb);
|
| -
|
| - // Finish hooking interfaces up, after low-level initialization is
|
| - // complete.
|
| - bool LoadNaClModuleContinuationIntern(ErrorInfo* error_info);
|
| -
|
| - // Continuation for starting SRPC/JSProxy services as appropriate.
|
| - // This is invoked as a callback when the NaCl module makes the
|
| - // init_done reverse RPC to tell us that low-level initialization
|
| - // such as ld.so processing is done. That initialization requires
|
| - // that the main thread be free in order to do Pepper
|
| - // main-thread-only operations such as file processing.
|
| - bool LoadNaClModuleContinuation(int32_t pp_error);
|
| -
|
| - // Load support.
|
| - // A helper SRPC NaCl module can be loaded given a DescWrapper.
|
| - // Blocks until the helper module signals initialization is done.
|
| - // Does not update nacl_module_origin().
|
| - // Returns kInvalidNaClSubprocessId or the ID of the new helper NaCl module.
|
| - NaClSubprocessId LoadHelperNaClModule(nacl::DescWrapper* wrapper,
|
| - ErrorInfo* error_info);
|
| -
|
| - // Returns the argument value for the specified key, or NULL if not found.
|
| - // The callee retains ownership of the result.
|
| - char* LookupArgument(const char* key);
|
| -
|
| - enum LengthComputable {
|
| - LENGTH_IS_NOT_COMPUTABLE = 0,
|
| - LENGTH_IS_COMPUTABLE = 1
|
| - };
|
| - // Report successful loading of a module.
|
| - void ReportLoadSuccess(LengthComputable length_computable,
|
| - uint64_t loaded_bytes,
|
| - uint64_t total_bytes);
|
| - // Report an error that was encountered while loading a module.
|
| - void ReportLoadError(const ErrorInfo& error_info);
|
| - // Report loading a module was aborted, typically due to user action.
|
| - void ReportLoadAbort();
|
| - // Dispatch a JavaScript event to indicate a key step in loading.
|
| - // |event_type| is a character string indicating which type of progress
|
| - // event (loadstart, progress, error, abort, load, loadend). Events are
|
| - // enqueued on the JavaScript event loop, which then calls back through
|
| - // DispatchProgressEvent.
|
| - void EnqueueProgressEvent(const char* event_type,
|
| - LengthComputable length_computable,
|
| - uint64_t loaded_bytes,
|
| - uint64_t total_bytes);
|
| -
|
| - // Report the error code that sel_ldr produces when starting a nexe.
|
| - void ReportSelLdrLoadStatus(int status);
|
| -
|
| - // Report nexe death after load to JS and shut down the proxy.
|
| - void ReportDeadNexe();
|
| -
|
| - // The embed/object tag argument list.
|
| - int argc() const { return argc_; }
|
| - char** argn() const { return argn_; }
|
| - char** argv() const { return argv_; }
|
| -
|
| - BrowserInterface* browser_interface() const { return browser_interface_; }
|
| - Plugin* plugin() const { return const_cast<Plugin*>(this); }
|
| -
|
| - // URL resolution support.
|
| - // plugin_base_url is the URL used for resolving relative URLs used in
|
| - // src="...".
|
| - nacl::string plugin_base_url() const { return plugin_base_url_; }
|
| - void set_plugin_base_url(nacl::string url) { plugin_base_url_ = url; }
|
| - // manifest_base_url is the URL used for resolving relative URLs mentioned
|
| - // in manifest files. If the manifest is a data URI, this is an empty string.
|
| - nacl::string manifest_base_url() const { return manifest_base_url_; }
|
| - void set_manifest_base_url(nacl::string url) { manifest_base_url_ = url; }
|
| -
|
| - // The URL of the manifest file as set by the "src" attribute.
|
| - // It is not the fully resolved URL if it was set as relative.
|
| - const nacl::string& manifest_url() const { return manifest_url_; }
|
| - void set_manifest_url(const nacl::string& manifest_url) {
|
| - manifest_url_ = manifest_url;
|
| - }
|
| -
|
| - // The state of readiness of the plugin.
|
| - enum ReadyState {
|
| - // The trusted plugin begins in this ready state.
|
| - UNSENT = 0,
|
| - // The manifest file has been requested, but not yet received.
|
| - OPENED = 1,
|
| - // This state is unused.
|
| - HEADERS_RECEIVED = 2,
|
| - // The manifest file has been received and the nexe successfully requested.
|
| - LOADING = 3,
|
| - // The nexe has been loaded and the proxy started, so it is ready for
|
| - // interaction with the page.
|
| - DONE = 4
|
| - };
|
| - ReadyState nacl_ready_state() const { return nacl_ready_state_; }
|
| - void set_nacl_ready_state(ReadyState nacl_ready_state) {
|
| - nacl_ready_state_ = nacl_ready_state;
|
| - }
|
| -
|
| - // Get the NaCl module subprocess that was assigned the ID |id|.
|
| - NaClSubprocess* nacl_subprocess(NaClSubprocessId id) const {
|
| - if (kInvalidNaClSubprocessId == id) {
|
| - return NULL;
|
| - }
|
| - return nacl_subprocesses_[id];
|
| - }
|
| - NaClSubprocessId next_nacl_subprocess_id() const {
|
| - return static_cast<NaClSubprocessId>(nacl_subprocesses_.size());
|
| - }
|
| -
|
| - nacl::DescWrapperFactory* wrapper_factory() const { return wrapper_factory_; }
|
| -
|
| - // Requests a NaCl manifest download from a |url| relative to the page origin.
|
| - void RequestNaClManifest(const nacl::string& url);
|
| -
|
| - // Start up proxied execution of the browser API.
|
| - bool StartProxiedExecution(NaClSrpcChannel* srpc_channel,
|
| - ErrorInfo* error_info);
|
| -
|
| - // Determines whether experimental APIs are usable.
|
| - static bool ExperimentalJavaScriptApisAreEnabled();
|
| -
|
| - // Methods for method and property dispatch.
|
| - bool InitParams(uintptr_t method_id, CallType call_type, SrpcParams* params);
|
| - bool HasMethod(uintptr_t method_id, CallType call_type);
|
| - bool Invoke(uintptr_t method_id, CallType call_type, SrpcParams* params);
|
| - std::vector<uintptr_t>* GetPropertyIdentifiers() {
|
| - return property_get_methods_.Keys();
|
| - }
|
| -
|
| - // The size returned when a file download operation is unable to determine
|
| - // the size of the file to load. W3C ProgressEvents specify that unknown
|
| - // sizes return 0.
|
| - static const uint64_t kUnknownBytes = 0;
|
| -
|
| - // Getter for PPAPI proxy interface.
|
| - ppapi_proxy::BrowserPpp* ppapi_proxy() const { return ppapi_proxy_; }
|
| -
|
| - // Called back by CallOnMainThread. Dispatches the first enqueued progress
|
| - // event.
|
| - void DispatchProgressEvent(int32_t result);
|
| -
|
| - // Requests a URL asynchronously resulting in a call to pp_callback with
|
| - // a PP_Error indicating status. On success an open file descriptor
|
| - // corresponding to the url body is recorded for further lookup.
|
| - // This is used by SRPC-based StreamAsFile().
|
| - bool StreamAsFile(const nacl::string& url, PP_CompletionCallback pp_callback);
|
| - // Returns an open POSIX file descriptor retrieved by StreamAsFile()
|
| - // or NACL_NO_FILE_DESC. The caller must take ownership of the descriptor.
|
| - int32_t GetPOSIXFileDesc(const nacl::string& url);
|
| -
|
| - // A helper function that gets the scheme type for |url|. Uses URLUtil_Dev
|
| - // interface which this class has as a member.
|
| - UrlSchemeType GetUrlScheme(const std::string& url);
|
| -
|
| - // Get the text description of the last error reported by the plugin.
|
| - const nacl::string& last_error_string() const { return last_error_string_; }
|
| - void set_last_error_string(const nacl::string& error) {
|
| - last_error_string_ = error;
|
| - }
|
| -
|
| - // The MIME type used to instantiate this instance of the NaCl plugin.
|
| - // Typically, the MIME type will be application/x-nacl. However, if the NEXE
|
| - // is being used as a content type handler for another content type (such as
|
| - // PDF), then this function will return that type.
|
| - const nacl::string& mime_type() const { return mime_type_; }
|
| - // The default MIME type for the NaCl plugin.
|
| - static const char* const kNaClMIMEType;
|
| - // Tests if the MIME type is not a NaCl MIME type.
|
| - bool IsForeignMIMEType() const;
|
| - // Returns true if PPAPI Dev interfaces should be allowed.
|
| - bool enable_dev_interface() { return enable_dev_interface_; }
|
| -
|
| - Manifest const* manifest() const { return manifest_.get(); }
|
| -
|
| - private:
|
| - NACL_DISALLOW_COPY_AND_ASSIGN(Plugin);
|
| -#ifndef HACK_FOR_MACOS_HANG_REMOVED
|
| - void XYZZY(const nacl::string& url, pp::VarPrivate js_callback);
|
| -#endif // HACK_FOR_MACOS_HANG_REMOVED
|
| - // Prevent construction and destruction from outside the class:
|
| - // must use factory New() method instead.
|
| - explicit Plugin(PP_Instance instance);
|
| - // The browser will invoke the destructor via the pp::Instance
|
| - // pointer to this object, not from base's Delete().
|
| - ~Plugin();
|
| -
|
| - bool Init(BrowserInterface* browser_interface,
|
| - int argc,
|
| - char* argn[],
|
| - char* argv[]);
|
| - void LoadMethods();
|
| - // Shuts down socket connection, service runtime, and receive thread,
|
| - // in this order, for all spun up NaCl module subprocesses.
|
| - void ShutDownSubprocesses();
|
| -
|
| - ScriptableHandle* scriptable_handle() const { return scriptable_handle_; }
|
| - void set_scriptable_handle(ScriptableHandle* scriptable_handle) {
|
| - scriptable_handle_ = scriptable_handle;
|
| - }
|
| -
|
| - // Access the service runtime for the main NaCl subprocess.
|
| - ServiceRuntime* main_service_runtime() const {
|
| - return main_subprocess_.service_runtime();
|
| - }
|
| -
|
| - // Setting the properties and methods exported.
|
| - void AddPropertyGet(RpcFunction function_ptr,
|
| - const char* name,
|
| - const char* outs);
|
| -
|
| - // Help load a nacl module, from the file specified in wrapper.
|
| - // This will fully initialize the |subprocess| if the load was successful.
|
| - bool LoadNaClModuleCommon(nacl::DescWrapper* wrapper,
|
| - NaClSubprocess* subprocess,
|
| - ErrorInfo* error_info,
|
| - pp::CompletionCallback init_done_cb);
|
| - bool StartSrpcServices(NaClSubprocess* subprocess, ErrorInfo* error_info);
|
| - bool StartSrpcServicesCommon(NaClSubprocess* subprocess,
|
| - ErrorInfo* error_info);
|
| - bool StartJSObjectProxy(NaClSubprocess* subprocess, ErrorInfo* error_info);
|
| -
|
| - MethodInfo* GetMethodInfo(uintptr_t method_id, CallType call_type);
|
| -
|
| - // Check url and decide if PPAPI Dev interfaces are required.
|
| - bool RequiresDevInterface(const nacl::string& manifest_url);
|
| -
|
| - // 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);
|
| - void NexeFileDidOpenContinuation(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);
|
| - void BitcodeDidTranslateContinuation(int32_t pp_error);
|
| -
|
| - // NaCl ISA selection manifest file support. The manifest file is specified
|
| - // using the "nacl" attribute in the <embed> 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 buffer (e.g., data URIs)
|
| - void NaClManifestBufferReady(int32_t pp_error);
|
| -
|
| - // 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 nacl::string& manifest_json);
|
| -
|
| - // Parses the JSON in |manifest_json| and retains a Manifest in
|
| - // |manifest_| for use by subsequent resource lookups.
|
| - // On success, |true| is returned and |manifest_| is updated to
|
| - // contain a Manifest that is used by SelectNexeURLFromManifest.
|
| - // On failure, |false| is returned, and |manifest_| is unchanged.
|
| - bool SetManifestObject(const nacl::string& manifest_json,
|
| - ErrorInfo* error_info);
|
| -
|
| - // Determines the URL of the program module appropriate for the NaCl sandbox
|
| - // implemented by the installed sel_ldr. The URL is determined from the
|
| - // Manifest in |manifest_|. On success, |true| is returned and |result| is
|
| - // set to the URL to use for the program, and |is_portable| is set to
|
| - // |true| if the program is portable bitcode.
|
| - // On failure, |false| is returned.
|
| - bool SelectProgramURLFromManifest(nacl::string* result,
|
| - ErrorInfo* error_info,
|
| - bool* is_portable);
|
| -
|
| - // TODO(jvoung): get rid of these once we find a better way to store / install
|
| - // the pnacl translator nexes.
|
| - bool SelectLLCURLFromManifest(nacl::string* result,
|
| - ErrorInfo* error_info);
|
| - bool SelectLDURLFromManifest(nacl::string* result,
|
| - ErrorInfo* error_info);
|
| -
|
| - // Logs timing information to a UMA histogram, and also logs the same timing
|
| - // information divided by the size of the nexe to another histogram.
|
| - void HistogramStartupTimeSmall(const std::string& name, float dt);
|
| - void HistogramStartupTimeMedium(const std::string& name, float dt);
|
| -
|
| - // Determines the appropriate nexe for the sandbox and requests a load.
|
| - void RequestNexeLoad();
|
| -
|
| - // Callback used when loading a URL for SRPC-based StreamAsFile().
|
| - void UrlDidOpenForStreamAsFile(int32_t pp_error,
|
| - FileDownloader*& url_downloader,
|
| - PP_CompletionCallback pp_callback);
|
| -
|
| - // Shuts down the proxy for PPAPI nexes.
|
| - void ShutdownProxy(); // Nexe shutdown + proxy deletion.
|
| -
|
| - BrowserInterface* browser_interface_;
|
| - ScriptableHandle* scriptable_handle_;
|
| -
|
| - int argc_;
|
| - char** argn_;
|
| - char** argv_;
|
| -
|
| - // Keep track of the NaCl module subprocesses that were spun up in the plugin.
|
| - NaClSubprocess main_subprocess_;
|
| - std::vector<NaClSubprocess*> nacl_subprocesses_;
|
| -
|
| - nacl::string plugin_base_url_;
|
| - nacl::string manifest_base_url_;
|
| - nacl::string manifest_url_;
|
| - ReadyState nacl_ready_state_;
|
| -
|
| - nacl::DescWrapperFactory* wrapper_factory_;
|
| -
|
| - MethodMap property_get_methods_;
|
| -
|
| - // File download support. |nexe_downloader_| can be opened with a specific
|
| - // callback to run when the file has been downloaded and is opened for
|
| - // reading. We use one downloader for all URL downloads to prevent issuing
|
| - // multiple GETs that might arrive out of order. For example, this will
|
| - // prevent a GET of a NaCl manifest while a .nexe GET is pending. Note that
|
| - // this will also prevent simultaneous handling of multiple .nexes on a page.
|
| - FileDownloader nexe_downloader_;
|
| - pp::CompletionCallbackFactory<Plugin> callback_factory_;
|
| -
|
| - PnaclCoordinator pnacl_;
|
| -
|
| - // The manifest dictionary. Used for looking up resources to be loaded.
|
| - nacl::scoped_ptr<Manifest> manifest_;
|
| - // URL processing interface for use in looking up resources in manifests.
|
| - const pp::URLUtil_Dev* url_util_;
|
| -
|
| - // A string containing the text description of the last error produced by
|
| - // this plugin.
|
| - nacl::string last_error_string_;
|
| -
|
| - // A pointer to the browser end of a proxy pattern connecting the
|
| - // NaCl plugin to the PPAPI .nexe's PPP interface
|
| - // (InitializeModule, Shutdown, and GetInterface).
|
| - // TODO(sehr): this should be a scoped_ptr for shutdown.
|
| - ppapi_proxy::BrowserPpp* ppapi_proxy_;
|
| -
|
| - // PPAPI Dev interfaces are disabled by default.
|
| - bool enable_dev_interface_;
|
| -
|
| - // If we get a DidChangeView event before the nexe is loaded, we store it and
|
| - // replay it to nexe after it's loaded.
|
| - bool replayDidChangeView;
|
| - pp::Rect replayDidChangeViewPosition;
|
| - pp::Rect replayDidChangeViewClip;
|
| -
|
| - // If we get a HandleDocumentLoad event before the nexe is loaded, we store
|
| - // it and replay it to nexe after it's loaded.
|
| - bool replayHandleDocumentLoad;
|
| - pp::URLLoader replayHandleDocumentLoadURLLoader;
|
| -
|
| - nacl::string mime_type_;
|
| -
|
| - // Keep track of the FileDownloaders created to fetch urls.
|
| - std::set<FileDownloader*> url_downloaders_;
|
| - // Keep track of file descriptors opened by StreamAsFile().
|
| - // These are owned by the browser.
|
| - std::map<nacl::string, int32_t> url_fd_map_;
|
| -
|
| - // Pending progress events.
|
| - std::queue<ProgressEvent*> progress_events_;
|
| -
|
| - // Adapter class constructors require a reference to 'this', so we can't
|
| - // contain them directly.
|
| - nacl::scoped_ptr<pp::Find_Dev> find_adapter_;
|
| - nacl::scoped_ptr<pp::Printing_Dev> printing_adapter_;
|
| - nacl::scoped_ptr<pp::Selection_Dev> selection_adapter_;
|
| - nacl::scoped_ptr<pp::WidgetClient_Dev> widget_client_adapter_;
|
| - nacl::scoped_ptr<pp::Zoom_Dev> zoom_adapter_;
|
| -
|
| - // used for NexeFileDidOpenContinuation
|
| - int64_t load_start_;
|
| -
|
| - int64_t init_time_;
|
| - int64_t ready_time_;
|
| - size_t nexe_size_;
|
| -};
|
| -
|
| -} // namespace plugin
|
| -
|
| -#endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PLUGIN_H_
|
|
|