diff options
author | gregoryd@google.com <gregoryd@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-26 10:53:26 +0000 |
---|---|---|
committer | gregoryd@google.com <gregoryd@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-26 10:53:26 +0000 |
commit | 8939b46c28247a9c7e2f349020f61ea7038e16ee (patch) | |
tree | 8ed6ccd597fddd797541111d8e585eeed3a107ba /chrome/browser/nacl_process_host.cc | |
parent | eb5eaec3e3e50d0effcfb53f629e0c93c0fa119c (diff) | |
download | chromium_src-8939b46c28247a9c7e2f349020f61ea7038e16ee.zip chromium_src-8939b46c28247a9c7e2f349020f61ea7038e16ee.tar.gz chromium_src-8939b46c28247a9c7e2f349020f61ea7038e16ee.tar.bz2 |
Revert 27324 - First step towards NaClChrome integration:1. NaCl plugin becomes a builtin plugin in Chrome and runs in the renderer process.2. Most of the changes are related to launching the NaCl process (that loads and runs the NaCl module) and establishing the initial communication between that process and the NaCl plugin.3. Command line flag "internalnacl" is required to enable the builtin NaCl plugin. NaCl still cannot run in Chrome sandbox, the flag automatically disables the sandboxCommitted: http://src.chromium.org/viewvc/chrome?view=rev&revision=27315
Review URL: http://codereview.chromium.org/153002
TBR=bradnelson@google.com
Review URL: http://codereview.chromium.org/244017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27326 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/nacl_process_host.cc')
-rw-r--r-- | chrome/browser/nacl_process_host.cc | 187 |
1 files changed, 0 insertions, 187 deletions
diff --git a/chrome/browser/nacl_process_host.cc b/chrome/browser/nacl_process_host.cc deleted file mode 100644 index 72db561..0000000 --- a/chrome/browser/nacl_process_host.cc +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "build/build_config.h" - -#include "chrome/browser/nacl_process_host.h" - -#if defined(OS_POSIX) -#include <fcntl.h> -#endif - -#if defined(OS_POSIX) -#include "base/global_descriptors_posix.h" -#endif -#include "base/path_service.h" -#include "base/process_util.h" -#include "chrome/browser/renderer_host/resource_message_filter.h" -#include "chrome/common/chrome_descriptors.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/common/logging_chrome.h" -#include "chrome/common/nacl_messages.h" -#include "ipc/ipc_switches.h" - -#if defined(OS_WIN) -#include "chrome/browser/sandbox_policy.h" -#endif - -#if defined(OS_POSIX) -#include "ipc/ipc_channel_posix.h" -#endif - -NaClProcessHost::NaClProcessHost( - ResourceDispatcherHost *resource_dispatcher_host) - : ChildProcessHost(NACL_PROCESS, resource_dispatcher_host), - resource_dispatcher_host_(resource_dispatcher_host) { -} - -bool NaClProcessHost::Launch(ResourceMessageFilter* renderer_msg_filter, - const int descriptor, - nacl::FileDescriptor* handle) { - nacl::Handle pair[2]; - bool success = false; - // Create a connected socket - if (nacl::SocketPair(pair) == -1) { - NATIVE_HANDLE(*handle) = nacl::kInvalidHandle; - return false; - } - - // Launch the process - success = LaunchSelLdr(renderer_msg_filter, descriptor, pair[1]); - - if (!success) { - nacl::Close(pair[0]); - NATIVE_HANDLE(*handle) = nacl::kInvalidHandle; - return false; - } - - nacl::Handle duplicate_handle = nacl::kInvalidHandle; -#if NACL_WINDOWS - DuplicateHandle(base::GetCurrentProcessHandle(), - reinterpret_cast<HANDLE>(pair[0]), - renderer_msg_filter->handle(), - reinterpret_cast<HANDLE*>(&duplicate_handle), - GENERIC_READ | GENERIC_WRITE, - FALSE, - DUPLICATE_CLOSE_SOURCE); - *handle = duplicate_handle; -#else - duplicate_handle = pair[0]; - int flags = fcntl(duplicate_handle, F_GETFD); - if (flags != -1) { - flags |= FD_CLOEXEC; - fcntl(duplicate_handle, F_SETFD, flags); - } - // No need to dup the handle - we don't pass it anywhere else so - // it cannot be closed. - handle->fd = duplicate_handle; - handle->auto_close = true; -#endif - - return true; -} - -bool NaClProcessHost::LaunchSelLdr(ResourceMessageFilter* renderer_msg_filter, - const int descriptor, - const nacl::Handle handle) { - if (!CreateChannel()) - return false; - - // Build command line for nacl. - const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); - std::wstring exe_path = - browser_command_line.GetSwitchValue(switches::kBrowserSubprocessPath); - if (exe_path.empty() && !PathService::Get(base::FILE_EXE, &exe_path)) - return false; - - CommandLine cmd_line(exe_path); - if (logging::DialogsAreSuppressed()) - cmd_line.AppendSwitch(switches::kNoErrorDialogs); - - // propagate the following switches to the plugin command line (along with - // any associated values) if present in the browser command line - // TODO(gregoryd): check which flags of those below can be supported. - static const wchar_t* const switch_names[] = { - switches::kNoSandbox, - switches::kTestSandbox, - switches::kDisableBreakpad, - switches::kFullMemoryCrashReport, - switches::kEnableLogging, - switches::kDisableLogging, - switches::kLoggingLevel, - switches::kEnableDCHECK, - switches::kSilentDumpOnDCHECK, - switches::kMemoryProfiling, - }; - - for (size_t i = 0; i < arraysize(switch_names); ++i) { - if (browser_command_line.HasSwitch(switch_names[i])) { - cmd_line.AppendSwitchWithValue( - switch_names[i], - browser_command_line.GetSwitchValue(switch_names[i])); - } - } - - cmd_line.AppendSwitchWithValue(switches::kProcessType, - switches::kNaClProcess); - - cmd_line.AppendSwitchWithValue(switches::kProcessChannelID, - ASCIIToWide(channel_id())); - - base::ProcessHandle process = 0; -#if defined(OS_WIN) - process = sandbox::StartProcess(&cmd_line); -#else - base::file_handle_mapping_vector fds_to_map; - const int ipcfd = channel().GetClientFileDescriptor(); - if (ipcfd > -1) - fds_to_map.push_back(std::pair<int, int>( - ipcfd, kPrimaryIPCChannel + base::GlobalDescriptors::kBaseDescriptor)); - base::LaunchApp(cmd_line.argv(), fds_to_map, false, &process); -#endif - - if (!process) - return false; - SetHandle(process); - - // send a message with duplicated handle to sel_ldr - return SendStartMessage(process, descriptor, handle); -} - -bool NaClProcessHost::SendStartMessage(base::ProcessHandle process, - int descriptor, - nacl::Handle handle) { - nacl::FileDescriptor channel; -#if defined(OS_WIN) - if (!DuplicateHandle(GetCurrentProcess(), - reinterpret_cast<HANDLE>(handle), - process, - reinterpret_cast<HANDLE*>(&channel), - GENERIC_READ | GENERIC_WRITE, - FALSE, DUPLICATE_CLOSE_SOURCE)) { - return false; - } -#else - channel.fd = dup(handle); - channel.auto_close = true; -#endif - NaClProcessMsg_Start* msg = new NaClProcessMsg_Start(descriptor, - channel); - - if (!Send(msg)) { - return false; - } - return true; -} - -void NaClProcessHost::OnMessageReceived(const IPC::Message& msg) { - NOTREACHED() << "Invalid message with type = " << msg.type(); -} - -URLRequestContext* NaClProcessHost::GetRequestContext( - uint32 request_id, - const ViewHostMsg_Resource_Request& request_data) { - return NULL; -} - |