| Index: chrome/test/test_launcher/out_of_proc_test_runner.cc | 
| diff --git a/chrome/test/test_launcher/out_of_proc_test_runner.cc b/chrome/test/test_launcher/out_of_proc_test_runner.cc | 
| index 47be495b7f48e5aea54ff94d8117727842cfa697..282ae4a777906061477e4791b34b637654671bec 100644 | 
| --- a/chrome/test/test_launcher/out_of_proc_test_runner.cc | 
| +++ b/chrome/test/test_launcher/out_of_proc_test_runner.cc | 
| @@ -89,7 +89,18 @@ class OutOfProcTestRunner : public tests::TestRunner { | 
| new_cmd_line.AppendSwitch(base::TestSuite::kStrictFailureHandling); | 
|  | 
| base::ProcessHandle process_handle; | 
| +#if defined(OS_POSIX) | 
| +    // On POSIX, we launch the test in a new process group with pgid equal to | 
| +    // its pid. Any child processes that the test may create will inherit the | 
| +    // same pgid. This way, if the test is abruptly terminated, we can clean up | 
| +    // any orphaned child processes it may have left behind. | 
| +    base::environment_vector no_env; | 
| +    base::file_handle_mapping_vector no_files; | 
| +    if (!base::LaunchAppInNewProcessGroup(new_cmd_line.argv(), no_env, no_files, | 
| +                                          false, &process_handle)) | 
| +#else | 
| if (!base::LaunchApp(new_cmd_line, false, false, &process_handle)) | 
| +#endif | 
| return false; | 
|  | 
| int test_terminate_timeout_ms = kDefaultTestTimeoutMs; | 
| @@ -111,6 +122,13 @@ class OutOfProcTestRunner : public tests::TestRunner { | 
|  | 
| // Ensure that the process terminates. | 
| base::KillProcess(process_handle, -1, true); | 
| + | 
| +#if defined(OS_POSIX) | 
| +      // On POSIX, we need to clean up any child processes that the test might | 
| +      // have created. On windows, child processes are automatically cleaned up | 
| +      // using JobObjects. | 
| +      base::KillProcessGroup(process_handle); | 
| +#endif | 
| } | 
|  | 
| return exit_code == 0; | 
|  |