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 CONTENT_BROWSER_CHILD_PROCESS_LAUNCHER_H_ | 5 #ifndef CONTENT_BROWSER_CHILD_PROCESS_LAUNCHER_H_ |
6 #define CONTENT_BROWSER_CHILD_PROCESS_LAUNCHER_H_ | 6 #define CONTENT_BROWSER_CHILD_PROCESS_LAUNCHER_H_ |
7 | 7 |
8 #include "base/files/scoped_file.h" | 8 #include "base/files/scoped_file.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
11 #include "base/process/kill.h" | 11 #include "base/process/kill.h" |
12 #include "base/process/launch.h" | 12 #include "base/process/launch.h" |
13 #include "base/process/process.h" | 13 #include "base/process/process.h" |
14 #include "base/threading/non_thread_safe.h" | 14 #include "base/threading/non_thread_safe.h" |
15 #include "build/build_config.h" | 15 #include "build/build_config.h" |
16 #include "content/common/content_export.h" | 16 #include "content/common/content_export.h" |
17 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
18 #include "content/public/common/sandboxed_process_launcher_delegate.h" | 18 #include "content/public/common/sandboxed_process_launcher_delegate.h" |
19 #include "mojo/edk/embedder/platform_channel_pair.h" | 19 #include "mojo/edk/embedder/platform_channel_pair.h" |
20 | 20 |
| 21 #if defined(OS_WIN) |
| 22 #include "sandbox/win/src/sandbox_types.h" |
| 23 #endif |
| 24 |
21 namespace base { | 25 namespace base { |
22 class CommandLine; | 26 class CommandLine; |
23 } | 27 } |
24 | 28 |
25 namespace content { | 29 namespace content { |
26 | 30 |
| 31 // Note: These codes are listed in a histogram and any new codes should be added |
| 32 // at the end. |
| 33 enum LaunchResultCode { |
| 34 // Launch start code, to not overlap with sandbox::ResultCode. |
| 35 LAUNCH_RESULT_START = 1001, |
| 36 // Launch success. |
| 37 LAUNCH_RESULT_SUCCESS, |
| 38 // Generic launch failure. |
| 39 LAUNCH_RESULT_FAILURE, |
| 40 // Placeholder for last item of the enum. |
| 41 LAUNCH_RESULT_CODE_LAST_CODE |
| 42 }; |
| 43 |
| 44 #if defined(OS_WIN) |
| 45 static_assert(static_cast<int>(LAUNCH_RESULT_START) > |
| 46 static_cast<int>(sandbox::SBOX_ERROR_LAST), |
| 47 "LaunchResultCode must not overlap with sandbox::ResultCode"); |
| 48 #endif |
| 49 |
27 // Launches a process asynchronously and notifies the client of the process | 50 // Launches a process asynchronously and notifies the client of the process |
28 // handle when it's available. It's used to avoid blocking the calling thread | 51 // handle when it's available. It's used to avoid blocking the calling thread |
29 // on the OS since often it can take > 100 ms to create the process. | 52 // on the OS since often it can take > 100 ms to create the process. |
30 class CONTENT_EXPORT ChildProcessLauncher : public base::NonThreadSafe { | 53 class CONTENT_EXPORT ChildProcessLauncher : public base::NonThreadSafe { |
31 public: | 54 public: |
32 class CONTENT_EXPORT Client { | 55 class CONTENT_EXPORT Client { |
33 public: | 56 public: |
34 // Will be called on the thread that the ChildProcessLauncher was | 57 // Will be called on the thread that the ChildProcessLauncher was |
35 // constructed on. | 58 // constructed on. |
36 virtual void OnProcessLaunched() = 0; | 59 virtual void OnProcessLaunched() = 0; |
37 | 60 |
38 virtual void OnProcessLaunchFailed() {}; | 61 virtual void OnProcessLaunchFailed(int error_code) {}; |
39 | 62 |
40 protected: | 63 protected: |
41 virtual ~Client() {} | 64 virtual ~Client() {} |
42 }; | 65 }; |
43 | 66 |
44 // Launches the process asynchronously, calling the client when the result is | 67 // Launches the process asynchronously, calling the client when the result is |
45 // ready. Deleting this object before the process is created is safe, since | 68 // ready. Deleting this object before the process is created is safe, since |
46 // the callback won't be called. If the process is still running by the time | 69 // the callback won't be called. If the process is still running by the time |
47 // this object destructs, it will be terminated. | 70 // this object destructs, it will be terminated. |
48 // Takes ownership of cmd_line. | 71 // Takes ownership of cmd_line. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 // to launch the child process on the launcher thread. | 117 // to launch the child process on the launcher thread. |
95 // It makes sure we always perform the necessary cleanup if the | 118 // It makes sure we always perform the necessary cleanup if the |
96 // client went away. | 119 // client went away. |
97 static void DidLaunch(base::WeakPtr<ChildProcessLauncher> instance, | 120 static void DidLaunch(base::WeakPtr<ChildProcessLauncher> instance, |
98 bool terminate_on_shutdown, | 121 bool terminate_on_shutdown, |
99 ZygoteHandle zygote, | 122 ZygoteHandle zygote, |
100 #if defined(OS_ANDROID) | 123 #if defined(OS_ANDROID) |
101 base::ScopedFD ipcfd, | 124 base::ScopedFD ipcfd, |
102 base::ScopedFD mojo_fd, | 125 base::ScopedFD mojo_fd, |
103 #endif | 126 #endif |
104 base::Process process); | 127 base::Process process, |
| 128 int error_code); |
105 | 129 |
106 // Notifies the client about the result of the operation. | 130 // Notifies the client about the result of the operation. |
107 void Notify(ZygoteHandle zygote, | 131 void Notify(ZygoteHandle zygote, |
108 #if defined(OS_ANDROID) | 132 #if defined(OS_ANDROID) |
109 base::ScopedFD ipcfd, | 133 base::ScopedFD ipcfd, |
110 #endif | 134 #endif |
111 base::Process process); | 135 base::Process process, |
| 136 int error_code); |
112 | 137 |
113 #if defined(MOJO_SHELL_CLIENT) | 138 #if defined(MOJO_SHELL_CLIENT) |
114 // When this process is run from an external Mojo shell, this function will | 139 // When this process is run from an external Mojo shell, this function will |
115 // create a channel and pass one end to the spawned process and register the | 140 // create a channel and pass one end to the spawned process and register the |
116 // other end with the external shell, allowing the spawned process to bind an | 141 // other end with the external shell, allowing the spawned process to bind an |
117 // Application request from the shell. | 142 // Application request from the shell. |
118 void CreateMojoShellChannel(base::CommandLine* command_line, | 143 void CreateMojoShellChannel(base::CommandLine* command_line, |
119 int child_process_id); | 144 int child_process_id); |
120 #endif | 145 #endif |
121 | 146 |
(...skipping 12 matching lines...) Expand all Loading... |
134 mojo::edk::PlatformChannelPair mojo_platform_channel_; | 159 mojo::edk::PlatformChannelPair mojo_platform_channel_; |
135 | 160 |
136 base::WeakPtrFactory<ChildProcessLauncher> weak_factory_; | 161 base::WeakPtrFactory<ChildProcessLauncher> weak_factory_; |
137 | 162 |
138 DISALLOW_COPY_AND_ASSIGN(ChildProcessLauncher); | 163 DISALLOW_COPY_AND_ASSIGN(ChildProcessLauncher); |
139 }; | 164 }; |
140 | 165 |
141 } // namespace content | 166 } // namespace content |
142 | 167 |
143 #endif // CONTENT_BROWSER_CHILD_PROCESS_LAUNCHER_H_ | 168 #endif // CONTENT_BROWSER_CHILD_PROCESS_LAUNCHER_H_ |
OLD | NEW |