| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 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 #include "chrome/nacl/broker_thread.h" | |
| 6 | |
| 7 #include "base/base_switches.h" | |
| 8 #include "base/command_line.h" | |
| 9 #include "base/path_service.h" | |
| 10 #include "base/process_util.h" | |
| 11 #include "chrome/common/chrome_switches.h" | |
| 12 #include "chrome/common/nacl_cmd_line.h" | |
| 13 #include "chrome/common/nacl_messages.h" | |
| 14 #include "content/common/child_process.h" | |
| 15 #include "content/common/sandbox_policy.h" | |
| 16 #include "ipc/ipc_switches.h" | |
| 17 | |
| 18 NaClBrokerThread::NaClBrokerThread() | |
| 19 : browser_handle_(0), | |
| 20 broker_services_(NULL) { | |
| 21 } | |
| 22 | |
| 23 NaClBrokerThread::~NaClBrokerThread() { | |
| 24 base::CloseProcessHandle(browser_handle_); | |
| 25 } | |
| 26 | |
| 27 NaClBrokerThread* NaClBrokerThread::current() { | |
| 28 return static_cast<NaClBrokerThread*>(ChildThread::current()); | |
| 29 } | |
| 30 | |
| 31 bool NaClBrokerThread::OnControlMessageReceived(const IPC::Message& msg) { | |
| 32 bool handled = true; | |
| 33 IPC_BEGIN_MESSAGE_MAP(NaClBrokerThread, msg) | |
| 34 IPC_MESSAGE_HANDLER(NaClProcessMsg_LaunchLoaderThroughBroker, | |
| 35 OnLaunchLoaderThroughBroker) | |
| 36 IPC_MESSAGE_HANDLER(NaClProcessMsg_StopBroker, OnStopBroker) | |
| 37 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 38 IPC_END_MESSAGE_MAP() | |
| 39 return handled; | |
| 40 } | |
| 41 | |
| 42 void NaClBrokerThread::OnLaunchLoaderThroughBroker( | |
| 43 const std::wstring& loader_channel_id) { | |
| 44 base::ProcessHandle loader_process = 0; | |
| 45 base::ProcessHandle loader_handle_in_browser = 0; | |
| 46 | |
| 47 // Create the path to the nacl broker/loader executable - it's the executable | |
| 48 // this code is running in. | |
| 49 FilePath exe_path; | |
| 50 PathService::Get(base::FILE_EXE, &exe_path); | |
| 51 if (!exe_path.empty()) { | |
| 52 CommandLine* cmd_line = new CommandLine(exe_path); | |
| 53 nacl::CopyNaClCommandLineArguments(cmd_line); | |
| 54 | |
| 55 cmd_line->AppendSwitchASCII(switches::kProcessType, | |
| 56 switches::kNaClLoaderProcess); | |
| 57 | |
| 58 // TODO(evanm): remove needless usage of wstring for channel id. | |
| 59 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, | |
| 60 WideToASCII(loader_channel_id)); | |
| 61 | |
| 62 loader_process = sandbox::StartProcessWithAccess(cmd_line, FilePath()); | |
| 63 if (loader_process) { | |
| 64 DuplicateHandle(::GetCurrentProcess(), loader_process, | |
| 65 browser_handle_, &loader_handle_in_browser, | |
| 66 PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION , FALSE, 0); | |
| 67 } | |
| 68 } | |
| 69 Send(new NaClProcessMsg_LoaderLaunched(loader_channel_id, | |
| 70 loader_handle_in_browser)); | |
| 71 } | |
| 72 | |
| 73 void NaClBrokerThread::OnStopBroker() { | |
| 74 ChildProcess::current()->ReleaseProcess(); | |
| 75 } | |
| 76 | |
| 77 void NaClBrokerThread::OnChannelConnected(int32 peer_pid) { | |
| 78 bool res = base::OpenProcessHandle(peer_pid, &browser_handle_); | |
| 79 DCHECK(res); | |
| 80 ChildProcess::current()->AddRefProcess(); | |
| 81 } | |
| 82 | |
| OLD | NEW |