Index: chrome/test/test_launcher/out_of_proc_test_runner.cc |
=================================================================== |
--- chrome/test/test_launcher/out_of_proc_test_runner.cc (revision 49137) |
+++ chrome/test/test_launcher/out_of_proc_test_runner.cc (working copy) |
@@ -8,10 +8,21 @@ |
#include "base/logging.h" |
#include "base/process_util.h" |
#include "base/test/test_suite.h" |
- |
#include "chrome/test/test_launcher/test_runner.h" |
#include "chrome/test/unit/chrome_test_suite.h" |
+#if defined(OS_WIN) |
+#include "base/base_switches.h" |
+#include "chrome/common/chrome_constants.h" |
+#include "chrome/common/sandbox_policy.h" |
+#include "sandbox/src/dep.h" |
+#include "sandbox/src/sandbox_factory.h" |
+#include "sandbox/src/sandbox_types.h" |
+ |
+// The entry point signature of chrome.dll. |
+typedef int (*DLL_MAIN)(HINSTANCE, sandbox::SandboxInterfaceInfo*, wchar_t*); |
+#endif |
+ |
// This version of the test launcher forks a new process for each test it runs. |
namespace { |
@@ -146,9 +157,43 @@ |
command_line->HasSwitch(kSingleProcessTestsAndChromeFlag) || |
command_line->HasSwitch(kGTestListTestsFlag) || |
command_line->HasSwitch(kGTestHelpFlag)) { |
+ |
+#if defined(OS_WIN) |
+ if (command_line->HasSwitch(kChildProcessFlag)) { |
+ // This is the browser process, so setup the sandbox broker. |
+ sandbox::BrokerServices* broker_services = |
+ sandbox::SandboxFactory::GetBrokerServices(); |
+ if (broker_services) { |
+ sandbox::InitBrokerServices(broker_services); |
+ // Precreate the desktop and window station used by the renderers. |
+ sandbox::TargetPolicy* policy = broker_services->CreatePolicy(); |
+ sandbox::ResultCode result = policy->CreateAlternateDesktop(true); |
+ CHECK(sandbox::SBOX_ERROR_FAILED_TO_SWITCH_BACK_WINSTATION != result); |
+ policy->Release(); |
+ } |
+ } |
+#endif |
return ChromeTestSuite(argc, argv).Run(); |
} |
+#if defined(OS_WIN) |
+ if (command_line->HasSwitch(switches::kProcessType)) { |
+ // This is a child process, call ChromeMain. |
+ FilePath chrome_path(command_line->GetProgram().DirName()); |
+ chrome_path = chrome_path.Append(chrome::kBrowserResourcesDll); |
+ HMODULE dll = LoadLibrary(chrome_path.value().c_str()); |
+ DLL_MAIN entry_point = |
+ reinterpret_cast<DLL_MAIN>(::GetProcAddress(dll, "ChromeMain")); |
+ if (!entry_point) |
+ return -1; |
+ |
+ // Initialize the sandbox services. |
+ sandbox::SandboxInterfaceInfo sandbox_info = {0}; |
+ sandbox_info.target_services = sandbox::SandboxFactory::GetTargetServices(); |
+ return entry_point(GetModuleHandle(NULL), &sandbox_info, GetCommandLineW()); |
+ } |
+#endif |
+ |
fprintf(stdout, |
"Starting tests...\n" |
"IMPORTANT DEBUGGING NOTE: each test is run inside its own process.\n" |