OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef COMPONENTS_NACL_BROWSER_NACL_PROCESS_HOST_H_ | 5 #ifndef COMPONENTS_NACL_BROWSER_NACL_PROCESS_HOST_H_ |
6 #define COMPONENTS_NACL_BROWSER_NACL_PROCESS_HOST_H_ | 6 #define COMPONENTS_NACL_BROWSER_NACL_PROCESS_HOST_H_ |
7 | 7 |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 | 9 |
10 #include <stddef.h> | 10 #include <stddef.h> |
11 #include <stdint.h> | 11 #include <stdint.h> |
12 | 12 |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/files/file.h" | 15 #include "base/files/file.h" |
16 #include "base/files/file_path.h" | 16 #include "base/files/file_path.h" |
17 #include "base/files/file_util_proxy.h" | 17 #include "base/files/file_util_proxy.h" |
18 #include "base/macros.h" | 18 #include "base/macros.h" |
19 #include "base/memory/ref_counted.h" | 19 #include "base/memory/ref_counted.h" |
20 #include "base/memory/shared_memory.h" | 20 #include "base/memory/shared_memory.h" |
21 #include "base/memory/weak_ptr.h" | 21 #include "base/memory/weak_ptr.h" |
22 #include "base/message_loop/message_loop.h" | 22 #include "base/message_loop/message_loop.h" |
23 #include "base/process/process.h" | 23 #include "base/process/process.h" |
| 24 #include "components/nacl/common/nacl.mojom.h" |
24 #include "components/nacl/common/nacl_types.h" | 25 #include "components/nacl/common/nacl_types.h" |
25 #include "content/public/browser/browser_child_process_host_delegate.h" | 26 #include "content/public/browser/browser_child_process_host_delegate.h" |
26 #include "content/public/browser/browser_child_process_host_iterator.h" | 27 #include "content/public/browser/browser_child_process_host_iterator.h" |
27 #include "ipc/ipc_channel_handle.h" | 28 #include "ipc/ipc_channel_handle.h" |
28 #include "net/socket/socket_descriptor.h" | 29 #include "net/socket/socket_descriptor.h" |
29 #include "ppapi/shared_impl/ppapi_permissions.h" | 30 #include "ppapi/shared_impl/ppapi_permissions.h" |
30 #include "url/gurl.h" | 31 #include "url/gurl.h" |
31 | 32 |
32 namespace content { | 33 namespace content { |
33 class BrowserChildProcessHost; | 34 class BrowserChildProcessHost; |
(...skipping 10 matching lines...) Expand all Loading... |
44 // to query the browser process for trusted information about a file. This | 45 // to query the browser process for trusted information about a file. This |
45 // helps establish that the file is known by the browser to be immutable | 46 // helps establish that the file is known by the browser to be immutable |
46 // and suitable for file-identity-based validation caching. lo == 0 && hi | 47 // and suitable for file-identity-based validation caching. lo == 0 && hi |
47 // == 0 indicates the token is invalid and no additional information is | 48 // == 0 indicates the token is invalid and no additional information is |
48 // available. | 49 // available. |
49 struct NaClFileToken { | 50 struct NaClFileToken { |
50 uint64_t lo; | 51 uint64_t lo; |
51 uint64_t hi; | 52 uint64_t hi; |
52 }; | 53 }; |
53 | 54 |
54 class NaClHostMessageFilter; | |
55 void* AllocateAddressSpaceASLR(base::ProcessHandle process, size_t size); | 55 void* AllocateAddressSpaceASLR(base::ProcessHandle process, size_t size); |
56 | 56 |
57 // Represents the browser side of the browser <--> NaCl communication | 57 // Represents the browser side of the browser <--> NaCl communication |
58 // channel. There will be one NaClProcessHost per NaCl process | 58 // channel. There will be one NaClProcessHost per NaCl process |
59 // The browser is responsible for starting the NaCl process | 59 // The browser is responsible for starting the NaCl process |
60 // when requested by the renderer. | 60 // when requested by the renderer. |
61 // After that, most of the communication is directly between NaCl plugin | 61 // After that, most of the communication is directly between NaCl plugin |
62 // running in the renderer and NaCl processes. | 62 // running in the renderer and NaCl processes. |
63 class NaClProcessHost : public content::BrowserChildProcessHostDelegate { | 63 class NaClProcessHost : public content::BrowserChildProcessHostDelegate { |
64 public: | 64 public: |
65 // manifest_url: the URL of the manifest of the Native Client plugin being | 65 // manifest_url: the URL of the manifest of the Native Client plugin being |
66 // executed. | 66 // executed. |
67 // nexe_file: A file that corresponds to the nexe module to be loaded. | 67 // nexe_file: A file that corresponds to the nexe module to be loaded. |
68 // nexe_token: A cache validation token for nexe_file. | 68 // nexe_token: A cache validation token for nexe_file. |
69 // prefetched_resource_files_info: An array of resource files prefetched. | 69 // prefetched_resource_files_info: An array of resource files prefetched. |
70 // permissions: PPAPI permissions, to control access to private APIs. | 70 // permissions: PPAPI permissions, to control access to private APIs. |
71 // render_view_id: RenderView routing id, to control access to private APIs. | 71 // render_view_id: RenderView routing id, to control access to private APIs. |
72 // permission_bits: controls which interfaces the NaCl plugin can use. | 72 // permission_bits: controls which interfaces the NaCl plugin can use. |
73 // uses_nonsfi_mode: whether the program should be loaded under non-SFI mode. | 73 // uses_nonsfi_mode: whether the program should be loaded under non-SFI mode. |
74 // off_the_record: was the process launched from an incognito renderer? | 74 // off_the_record: was the process launched from an incognito renderer? |
75 // process_type: the type of NaCl process. | 75 // process_type: the type of NaCl process. |
76 // profile_directory: is the path of current profile directory. | 76 // profile_directory: is the path of current profile directory. |
77 NaClProcessHost( | 77 NaClProcessHost( |
78 const GURL& manifest_url, | 78 const GURL& manifest_url, |
79 base::File nexe_file, | 79 base::File nexe_file, |
80 const NaClFileToken& nexe_token, | 80 const NaClFileToken& nexe_token, |
81 const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files, | 81 const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files, |
82 ppapi::PpapiPermissions permissions, | 82 ppapi::PpapiPermissions permissions, |
| 83 int render_process_id, |
83 int render_view_id, | 84 int render_view_id, |
84 uint32_t permission_bits, | 85 uint32_t permission_bits, |
85 bool uses_nonsfi_mode, | 86 bool uses_nonsfi_mode, |
86 bool off_the_record, | 87 bool off_the_record, |
87 NaClAppProcessType process_type, | 88 NaClAppProcessType process_type, |
88 const base::FilePath& profile_directory); | 89 const base::FilePath& profile_directory); |
89 ~NaClProcessHost() override; | 90 ~NaClProcessHost() override; |
90 | 91 |
91 void OnProcessCrashed(int exit_status) override; | 92 void OnProcessCrashed(int exit_status) override; |
92 | 93 |
93 // Do any minimal work that must be done at browser startup. | 94 // Do any minimal work that must be done at browser startup. |
94 static void EarlyStartup(); | 95 static void EarlyStartup(); |
95 | 96 |
96 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 97 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
97 // Launch the NaCl zygote early in the browser startup. | 98 // Launch the NaCl zygote early in the browser startup. |
98 static void EarlyZygoteLaunch(); | 99 static void EarlyZygoteLaunch(); |
99 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) | 100 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) |
100 | 101 |
101 // Specifies throttling time in milliseconds for PpapiHostMsg_Keepalive IPCs. | 102 // Specifies throttling time in milliseconds for PpapiHostMsg_Keepalive IPCs. |
102 static void SetPpapiKeepAliveThrottleForTesting(unsigned milliseconds); | 103 static void SetPpapiKeepAliveThrottleForTesting(unsigned milliseconds); |
103 | 104 |
104 // Initialize the new NaCl process. Result is returned by sending ipc | 105 // Initialize the new NaCl process. Result is returned via |callback|. |
105 // message reply_msg. | 106 void Launch(const base::FilePath& manifest_path, |
106 void Launch(NaClHostMessageFilter* nacl_host_message_filter, | 107 const mojom::NaClHost::LaunchNaClCallback& callback); |
107 IPC::Message* reply_msg, | |
108 const base::FilePath& manifest_path); | |
109 | 108 |
110 void OnChannelConnected(int32_t peer_pid) override; | 109 void OnChannelConnected(int32_t peer_pid) override; |
111 | 110 |
112 #if defined(OS_WIN) | 111 #if defined(OS_WIN) |
113 void OnProcessLaunchedByBroker(base::ProcessHandle handle); | 112 void OnProcessLaunchedByBroker(base::ProcessHandle handle); |
114 void OnDebugExceptionHandlerLaunchedByBroker(bool success); | 113 void OnDebugExceptionHandlerLaunchedByBroker(bool success); |
115 #endif | 114 #endif |
116 | 115 |
117 bool Send(IPC::Message* msg); | 116 bool Send(IPC::Message* msg); |
118 | 117 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 void ReplyToRenderer( | 150 void ReplyToRenderer( |
152 mojo::ScopedMessagePipeHandle ppapi_channel_handle, | 151 mojo::ScopedMessagePipeHandle ppapi_channel_handle, |
153 mojo::ScopedMessagePipeHandle trusted_channel_handle, | 152 mojo::ScopedMessagePipeHandle trusted_channel_handle, |
154 mojo::ScopedMessagePipeHandle manifest_service_channel_handle); | 153 mojo::ScopedMessagePipeHandle manifest_service_channel_handle); |
155 | 154 |
156 // Sends the reply with error message to the renderer. | 155 // Sends the reply with error message to the renderer. |
157 void SendErrorToRenderer(const std::string& error_message); | 156 void SendErrorToRenderer(const std::string& error_message); |
158 | 157 |
159 // Sends the reply message to the renderer. Either result or | 158 // Sends the reply message to the renderer. Either result or |
160 // error message must be empty. | 159 // error message must be empty. |
161 void SendMessageToRenderer(const NaClLaunchResult& result, | 160 void SendMessageToRenderer(mojom::NaClLaunchResultPtr result, |
162 const std::string& error_message); | 161 const std::string& error_message); |
163 | 162 |
164 // Sends the message to the NaCl process to load the plugin. Returns true | 163 // Sends the message to the NaCl process to load the plugin. Returns true |
165 // on success. | 164 // on success. |
166 bool StartNaClExecution(); | 165 bool StartNaClExecution(); |
167 | 166 |
168 void StartNaClFileResolved( | 167 void StartNaClFileResolved( |
169 NaClStartParams params, | 168 NaClStartParams params, |
170 const base::FilePath& file_path, | 169 const base::FilePath& file_path, |
171 base::File nexe_file); | 170 base::File nexe_file); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 NaClFileToken nexe_token_; | 207 NaClFileToken nexe_token_; |
209 std::vector<NaClResourcePrefetchResult> prefetched_resource_files_; | 208 std::vector<NaClResourcePrefetchResult> prefetched_resource_files_; |
210 | 209 |
211 ppapi::PpapiPermissions permissions_; | 210 ppapi::PpapiPermissions permissions_; |
212 | 211 |
213 #if defined(OS_WIN) | 212 #if defined(OS_WIN) |
214 // This field becomes true when the broker successfully launched | 213 // This field becomes true when the broker successfully launched |
215 // the NaCl loader. | 214 // the NaCl loader. |
216 bool process_launched_by_broker_; | 215 bool process_launched_by_broker_; |
217 #endif | 216 #endif |
218 // The NaClHostMessageFilter that requested this NaCl process. We use | |
219 // this for sending the reply once the process has started. | |
220 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter_; | |
221 | 217 |
222 // The reply message to send. We must always send this message when the | 218 // The result callback. We must always call this callback when the sub-process |
223 // sub-process either succeeds or fails to unblock the renderer waiting for | 219 // either succeeds or fails to unblock the renderer waiting for the reply. |
224 // the reply. NULL when there is no reply to send. | 220 mojom::NaClHost::LaunchNaClCallback launch_callback_; |
225 IPC::Message* reply_msg_; | |
226 #if defined(OS_WIN) | 221 #if defined(OS_WIN) |
227 bool debug_exception_handler_requested_; | 222 bool debug_exception_handler_requested_; |
228 std::unique_ptr<IPC::Message> attach_debug_exception_handler_reply_msg_; | 223 std::unique_ptr<IPC::Message> attach_debug_exception_handler_reply_msg_; |
229 #endif | 224 #endif |
230 | 225 |
231 // The file path to the manifest is passed to nacl-gdb when it is used to | 226 // The file path to the manifest is passed to nacl-gdb when it is used to |
232 // debug the NaCl loader. | 227 // debug the NaCl loader. |
233 base::FilePath manifest_path_; | 228 base::FilePath manifest_path_; |
234 | 229 |
235 std::unique_ptr<content::BrowserChildProcessHost> process_; | 230 std::unique_ptr<content::BrowserChildProcessHost> process_; |
236 | 231 |
237 bool uses_nonsfi_mode_; | 232 bool uses_nonsfi_mode_; |
238 | 233 |
239 bool enable_debug_stub_; | 234 bool enable_debug_stub_; |
240 bool enable_crash_throttling_; | 235 bool enable_crash_throttling_; |
241 bool off_the_record_; | 236 const bool off_the_record_; |
242 NaClAppProcessType process_type_; | 237 const NaClAppProcessType process_type_; |
243 | 238 |
244 const base::FilePath profile_directory_; | 239 const base::FilePath profile_directory_; |
245 | 240 |
246 // Channel proxy to terminate the NaCl-Browser PPAPI channel. | 241 // Channel proxy to terminate the NaCl-Browser PPAPI channel. |
247 std::unique_ptr<IPC::ChannelProxy> ipc_proxy_channel_; | 242 std::unique_ptr<IPC::ChannelProxy> ipc_proxy_channel_; |
248 // Browser host for plugin process. | 243 // Browser host for plugin process. |
249 std::unique_ptr<content::BrowserPpapiHost> ppapi_host_; | 244 std::unique_ptr<content::BrowserPpapiHost> ppapi_host_; |
250 | 245 |
251 int render_view_id_; | 246 const int render_process_id_; |
| 247 const int render_view_id_; |
252 | 248 |
253 // Throttling time in milliseconds for PpapiHostMsg_Keepalive IPCs. | 249 // Throttling time in milliseconds for PpapiHostMsg_Keepalive IPCs. |
254 static unsigned keepalive_throttle_interval_milliseconds_; | 250 static unsigned keepalive_throttle_interval_milliseconds_; |
255 | 251 |
256 // Shared memory provided to the plugin and renderer for | 252 // Shared memory provided to the plugin and renderer for |
257 // reporting crash information. | 253 // reporting crash information. |
258 base::SharedMemory crash_info_shmem_; | 254 base::SharedMemory crash_info_shmem_; |
259 | 255 |
260 base::WeakPtrFactory<NaClProcessHost> weak_factory_; | 256 base::WeakPtrFactory<NaClProcessHost> weak_factory_; |
261 | 257 |
262 DISALLOW_COPY_AND_ASSIGN(NaClProcessHost); | 258 DISALLOW_COPY_AND_ASSIGN(NaClProcessHost); |
263 }; | 259 }; |
264 | 260 |
265 } // namespace nacl | 261 } // namespace nacl |
266 | 262 |
267 #endif // COMPONENTS_NACL_BROWSER_NACL_PROCESS_HOST_H_ | 263 #endif // COMPONENTS_NACL_BROWSER_NACL_PROCESS_HOST_H_ |
OLD | NEW |