| 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 #include "chrome/browser/nacl_host/nacl_process_host.h" | 5 #include "chrome/browser/nacl_host/nacl_process_host.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 reply_msg_(NULL), | 161 reply_msg_(NULL), |
| 162 #if defined(OS_WIN) | 162 #if defined(OS_WIN) |
| 163 debug_exception_handler_requested_(false), | 163 debug_exception_handler_requested_(false), |
| 164 #endif | 164 #endif |
| 165 internal_(new NaClInternal()), | 165 internal_(new NaClInternal()), |
| 166 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), | 166 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
| 167 enable_exception_handling_(false), | 167 enable_exception_handling_(false), |
| 168 enable_debug_stub_(false), | 168 enable_debug_stub_(false), |
| 169 uses_irt_(uses_irt), | 169 uses_irt_(uses_irt), |
| 170 off_the_record_(off_the_record), | 170 off_the_record_(off_the_record), |
| 171 enable_ipc_proxy_(false), | |
| 172 ALLOW_THIS_IN_INITIALIZER_LIST(ipc_plugin_listener_(this)), | 171 ALLOW_THIS_IN_INITIALIZER_LIST(ipc_plugin_listener_(this)), |
| 173 render_view_id_(render_view_id) { | 172 render_view_id_(render_view_id) { |
| 174 process_.reset(content::BrowserChildProcessHost::Create( | 173 process_.reset(content::BrowserChildProcessHost::Create( |
| 175 content::PROCESS_TYPE_NACL_LOADER, this)); | 174 content::PROCESS_TYPE_NACL_LOADER, this)); |
| 176 | 175 |
| 177 // Set the display name so the user knows what plugin the process is running. | 176 // Set the display name so the user knows what plugin the process is running. |
| 178 // We aren't on the UI thread so getting the pref locale for language | 177 // We aren't on the UI thread so getting the pref locale for language |
| 179 // formatting isn't possible, so IDN will be lost, but this is probably OK | 178 // formatting isn't possible, so IDN will be lost, but this is probably OK |
| 180 // for this use case. | 179 // for this use case. |
| 181 process_->SetName(net::FormatUrl(manifest_url_, std::string())); | 180 process_->SetName(net::FormatUrl(manifest_url_, std::string())); |
| 182 | 181 |
| 183 // We allow untrusted hardware exception handling to be enabled via | 182 // We allow untrusted hardware exception handling to be enabled via |
| 184 // an env var for consistency with the standalone build of NaCl. | 183 // an env var for consistency with the standalone build of NaCl. |
| 185 if (CommandLine::ForCurrentProcess()->HasSwitch( | 184 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 186 switches::kEnableNaClExceptionHandling) || | 185 switches::kEnableNaClExceptionHandling) || |
| 187 getenv("NACL_UNTRUSTED_EXCEPTION_HANDLING") != NULL) { | 186 getenv("NACL_UNTRUSTED_EXCEPTION_HANDLING") != NULL) { |
| 188 enable_exception_handling_ = true; | 187 enable_exception_handling_ = true; |
| 189 } | 188 } |
| 190 enable_debug_stub_ = CommandLine::ForCurrentProcess()->HasSwitch( | 189 enable_debug_stub_ = CommandLine::ForCurrentProcess()->HasSwitch( |
| 191 switches::kEnableNaClDebug); | 190 switches::kEnableNaClDebug); |
| 192 | |
| 193 enable_ipc_proxy_ = !CommandLine::ForCurrentProcess()->HasSwitch( | |
| 194 switches::kEnableNaClSRPCProxy); | |
| 195 // If render_view_id == 0 we do not need PPAPI, so we can skip | |
| 196 // PPAPI IPC proxy channel creation, etc. | |
| 197 if (!render_view_id_) | |
| 198 enable_ipc_proxy_ = false; | |
| 199 } | 191 } |
| 200 | 192 |
| 201 NaClProcessHost::~NaClProcessHost() { | 193 NaClProcessHost::~NaClProcessHost() { |
| 202 int exit_code; | 194 int exit_code; |
| 203 process_->GetTerminationStatus(&exit_code); | 195 process_->GetTerminationStatus(&exit_code); |
| 204 std::string message = | 196 std::string message = |
| 205 base::StringPrintf("NaCl process exited with status %i (0x%x)", | 197 base::StringPrintf("NaCl process exited with status %i (0x%x)", |
| 206 exit_code, exit_code); | 198 exit_code, exit_code); |
| 207 if (exit_code == 0) { | 199 if (exit_code == 0) { |
| 208 LOG(INFO) << message; | 200 LOG(INFO) << message; |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 bool NaClProcessHost::StartNaClExecution() { | 692 bool NaClProcessHost::StartNaClExecution() { |
| 701 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); | 693 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); |
| 702 | 694 |
| 703 nacl::NaClStartParams params; | 695 nacl::NaClStartParams params; |
| 704 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); | 696 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); |
| 705 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); | 697 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); |
| 706 params.version = chrome::VersionInfo().CreateVersionString(); | 698 params.version = chrome::VersionInfo().CreateVersionString(); |
| 707 params.enable_exception_handling = enable_exception_handling_; | 699 params.enable_exception_handling = enable_exception_handling_; |
| 708 params.enable_debug_stub = enable_debug_stub_ && | 700 params.enable_debug_stub = enable_debug_stub_ && |
| 709 NaClBrowser::GetInstance()->URLMatchesDebugPatterns(manifest_url_); | 701 NaClBrowser::GetInstance()->URLMatchesDebugPatterns(manifest_url_); |
| 710 params.enable_ipc_proxy = enable_ipc_proxy_; | 702 // Enable PPAPI proxy channel creation only for renderer processes. |
| 703 params.enable_ipc_proxy = enable_ppapi_proxy(); |
| 711 params.uses_irt = uses_irt_; | 704 params.uses_irt = uses_irt_; |
| 712 | 705 |
| 713 const ChildProcessData& data = process_->GetData(); | 706 const ChildProcessData& data = process_->GetData(); |
| 714 if (!ShareHandleToSelLdr(data.handle, | 707 if (!ShareHandleToSelLdr(data.handle, |
| 715 internal_->socket_for_sel_ldr, true, | 708 internal_->socket_for_sel_ldr, true, |
| 716 ¶ms.handles)) { | 709 ¶ms.handles)) { |
| 717 return false; | 710 return false; |
| 718 } | 711 } |
| 719 | 712 |
| 720 if (params.uses_irt) { | 713 if (params.uses_irt) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 } | 752 } |
| 760 #endif | 753 #endif |
| 761 | 754 |
| 762 process_->Send(new NaClProcessMsg_Start(params)); | 755 process_->Send(new NaClProcessMsg_Start(params)); |
| 763 | 756 |
| 764 internal_->socket_for_sel_ldr = nacl::kInvalidHandle; | 757 internal_->socket_for_sel_ldr = nacl::kInvalidHandle; |
| 765 return true; | 758 return true; |
| 766 } | 759 } |
| 767 | 760 |
| 768 bool NaClProcessHost::SendStart() { | 761 bool NaClProcessHost::SendStart() { |
| 769 if (!enable_ipc_proxy_) { | 762 if (!enable_ppapi_proxy()) { |
| 770 if (!ReplyToRenderer(IPC::ChannelHandle())) | 763 if (!ReplyToRenderer(IPC::ChannelHandle())) |
| 771 return false; | 764 return false; |
| 772 } | 765 } |
| 773 return StartNaClExecution(); | 766 return StartNaClExecution(); |
| 774 } | 767 } |
| 775 | 768 |
| 776 // This method is called when NaClProcessHostMsg_PpapiChannelCreated is | 769 // This method is called when NaClProcessHostMsg_PpapiChannelCreated is |
| 777 // received or PpapiHostMsg_ChannelCreated is forwarded by our plugin | 770 // received or PpapiHostMsg_ChannelCreated is forwarded by our plugin |
| 778 // listener. | 771 // listener. |
| 779 void NaClProcessHost::OnPpapiChannelCreated( | 772 void NaClProcessHost::OnPpapiChannelCreated( |
| 780 const IPC::ChannelHandle& channel_handle) { | 773 const IPC::ChannelHandle& channel_handle) { |
| 781 DCHECK(enable_ipc_proxy_); | 774 // Only renderer processes should create a channel. |
| 775 DCHECK(enable_ppapi_proxy()); |
| 782 // If the proxy channel is null, this must be the initial NaCl-Browser IPC | 776 // If the proxy channel is null, this must be the initial NaCl-Browser IPC |
| 783 // channel. | 777 // channel. |
| 784 if (!ipc_proxy_channel_.get()) { | 778 if (!ipc_proxy_channel_.get()) { |
| 785 ipc_proxy_channel_.reset( | 779 ipc_proxy_channel_.reset( |
| 786 new IPC::ChannelProxy(channel_handle, | 780 new IPC::ChannelProxy(channel_handle, |
| 787 IPC::Channel::MODE_CLIENT, | 781 IPC::Channel::MODE_CLIENT, |
| 788 &ipc_plugin_listener_, | 782 &ipc_plugin_listener_, |
| 789 base::MessageLoopProxy::current())); | 783 base::MessageLoopProxy::current())); |
| 790 // Create the browser ppapi host and enable PPAPI message dispatching to the | 784 // Create the browser ppapi host and enable PPAPI message dispatching to the |
| 791 // browser process. | 785 // browser process. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 927 } else { | 921 } else { |
| 928 NaClStartDebugExceptionHandlerThread( | 922 NaClStartDebugExceptionHandlerThread( |
| 929 process_handle.Take(), info, | 923 process_handle.Take(), info, |
| 930 base::MessageLoopProxy::current(), | 924 base::MessageLoopProxy::current(), |
| 931 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, | 925 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, |
| 932 weak_factory_.GetWeakPtr())); | 926 weak_factory_.GetWeakPtr())); |
| 933 return true; | 927 return true; |
| 934 } | 928 } |
| 935 } | 929 } |
| 936 #endif | 930 #endif |
| OLD | NEW |