• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_NACL_RENDERER_NEXE_LOAD_MANAGER_H_
6 #define COMPONENTS_NACL_RENDERER_NEXE_LOAD_MANAGER_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "base/files/file.h"
12 #include "base/macros.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/time/time.h"
16 #include "ppapi/c/private/ppb_nacl_private.h"
17 #include "url/gurl.h"
18 
19 namespace content {
20 class PepperPluginInstance;
21 }
22 
23 namespace nacl {
24 
25 class ManifestServiceChannel;
26 class TrustedPluginChannel;
27 
28 // NexeLoadManager provides methods for reporting the progress of loading a
29 // nexe.
30 class NexeLoadManager {
31  public:
32   explicit NexeLoadManager(PP_Instance instance);
33   ~NexeLoadManager();
34 
35   void NexeFileDidOpen(int32_t pp_error,
36                        const base::File& file,
37                        int32_t http_status,
38                        int64_t nexe_bytes_read,
39                        const std::string& url,
40                        base::TimeDelta time_since_open);
41   void ReportLoadSuccess(const std::string& url,
42                          uint64_t loaded_bytes,
43                          uint64_t total_bytes);
44   void ReportLoadError(PP_NaClError error,
45                        const std::string& error_message);
46 
47   // console_message is a part of the error that is logged to
48   // the JavaScript console but is not reported to JavaScript via
49   // the lastError property.  This is used to report internal errors which
50   // may easily change in new versions of the browser and we don't want apps
51   // to come to depend on the details of these errors.
52   void ReportLoadError(PP_NaClError error,
53                        const std::string& error_message,
54                        const std::string& console_message);
55   void ReportLoadAbort();
56   void NexeDidCrash(const char* crash_log);
57 
58   // TODO(dmichael): Everything below this comment should eventually be made
59   // private, when ppb_nacl_private_impl.cc is no longer using them directly.
60   // The intent is for this class to only expose functions for reporting a
61   // load state transition (e.g., ReportLoadError, ReportProgress,
62   // ReportLoadAbort, etc.)
63   void set_trusted_plugin_channel(scoped_ptr<TrustedPluginChannel> channel);
64   void set_manifest_service_channel(
65       scoped_ptr<ManifestServiceChannel> channel);
66 
67   PP_NaClReadyState nacl_ready_state();
68   void set_nacl_ready_state(PP_NaClReadyState ready_state);
69 
70   void SetReadOnlyProperty(PP_Var key, PP_Var value);
71   void SetLastError(const std::string& error);
72   void LogToConsole(const std::string& message);
73 
is_installed()74   bool is_installed() const { return is_installed_; }
75 
exit_status()76   int32_t exit_status() const { return exit_status_; }
77   void set_exit_status(int32_t exit_status);
78 
79   void InitializePlugin(uint32_t argc, const char* argn[], const char* argv[]);
80 
81   void ReportStartupOverhead() const;
82 
nexe_size()83   int64_t nexe_size() const { return nexe_size_; }
84 
85   bool RequestNaClManifest(const std::string& url);
86   void ProcessNaClManifest(const std::string& program_url);
87 
88   // URL resolution support.
89   // plugin_base_url is the URL used for resolving relative URLs used in
90   // src="...".
plugin_base_url()91   const GURL& plugin_base_url() const { return plugin_base_url_; }
92 
93   // manifest_base_url is the URL used for resolving relative URLs mentioned
94   // in manifest files.  If the manifest is a data URI, this is an empty string
manifest_base_url()95   const GURL& manifest_base_url() const { return manifest_base_url_; }
96 
97   // Returns the manifest URL passed as an argument for this plugin instance.
98   std::string GetManifestURLArgument() const;
99 
100   // Returns true if the MIME type for this plugin matches the type for PNaCl,
101   // false otherwise.
102   bool IsPNaCl() const;
103 
104   // Returns true if dev interfaces are enabled for this plugin.
105   bool DevInterfacesEnabled() const;
106 
107  private:
108   DISALLOW_COPY_AND_ASSIGN(NexeLoadManager);
109 
110   void ReportDeadNexe();
111 
112   // Copies a crash log to the console, one line at a time.
113   void CopyCrashLogToJsConsole(const std::string& crash_log);
114 
115   PP_Instance pp_instance_;
116   PP_NaClReadyState nacl_ready_state_;
117   bool nexe_error_reported_;
118 
119   // A flag indicating if the NaCl executable is being loaded from an installed
120   // application.  This flag is used to bucket UMA statistics more precisely to
121   // help determine whether nexe loading problems are caused by networking
122   // issues.  (Installed applications will be loaded from disk.)
123   // Unfortunately, the definition of what it means to be part of an installed
124   // application is a little murky - for example an installed application can
125   // register a mime handler that loads NaCl executables into an arbitrary web
126   // page.  As such, the flag actually means "our best guess, based on the URLs
127   // for NaCl resources that we have seen so far".
128   bool is_installed_;
129 
130   // Time of a successful nexe load.
131   base::Time ready_time_;
132 
133   // Time of plugin initialization.
134   base::Time init_time_;
135 
136   // Time of the start of loading a NaCl module.
137   base::Time load_start_;
138 
139   // The exit status of the plugin process.
140   // This will have a value in the range (0x00-0xff) if the exit status is set,
141   // or -1 if set_exit_status() has never been called.
142   int32_t exit_status_;
143 
144   // Size of the downloaded nexe, in bytes.
145   int64_t nexe_size_;
146 
147   // Non-owning.
148   content::PepperPluginInstance* plugin_instance_;
149 
150   // The URL for the document corresponding to this plugin instance.
151   GURL plugin_base_url_;
152 
153   GURL manifest_base_url_;
154 
155   // Arguments passed to this plugin instance from the DOM.
156   std::map<std::string, std::string> args_;
157 
158   // We store mime_type_ outside of args_ explicitly because we change it to be
159   // lowercase.
160   std::string mime_type_;
161 
162   scoped_ptr<TrustedPluginChannel> trusted_plugin_channel_;
163   scoped_ptr<ManifestServiceChannel> manifest_service_channel_;
164   base::WeakPtrFactory<NexeLoadManager> weak_factory_;
165 };
166 
167 }  // namespace nacl
168 
169 #endif  // COMPONENTS_NACL_RENDERER_NEXE_LOAD_MANAGER_H_
170