Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: components/nacl/browser/nacl_process_host.cc

Issue 2514323004: Convert NaCl renderer-browser messages to mojo. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/nacl/browser/nacl_process_host.h ('k') | components/nacl/browser/pnacl_host.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "components/nacl/browser/nacl_process_host.h" 5 #include "components/nacl/browser/nacl_process_host.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/base_switches.h" 13 #include "base/base_switches.h"
14 #include "base/bind.h" 14 #include "base/bind.h"
15 #include "base/callback_helpers.h"
15 #include "base/command_line.h" 16 #include "base/command_line.h"
16 #include "base/files/file_util.h" 17 #include "base/files/file_util.h"
17 #include "base/location.h" 18 #include "base/location.h"
18 #include "base/macros.h" 19 #include "base/macros.h"
19 #include "base/memory/ptr_util.h" 20 #include "base/memory/ptr_util.h"
20 #include "base/metrics/histogram_macros.h" 21 #include "base/metrics/histogram_macros.h"
21 #include "base/path_service.h" 22 #include "base/path_service.h"
22 #include "base/process/launch.h" 23 #include "base/process/launch.h"
23 #include "base/process/process_iterator.h" 24 #include "base/process/process_iterator.h"
24 #include "base/rand_util.h" 25 #include "base/rand_util.h"
25 #include "base/single_thread_task_runner.h" 26 #include "base/single_thread_task_runner.h"
26 #include "base/stl_util.h" 27 #include "base/stl_util.h"
27 #include "base/strings/string_number_conversions.h" 28 #include "base/strings/string_number_conversions.h"
28 #include "base/strings/string_split.h" 29 #include "base/strings/string_split.h"
29 #include "base/strings/string_util.h" 30 #include "base/strings/string_util.h"
30 #include "base/strings/stringprintf.h" 31 #include "base/strings/stringprintf.h"
31 #include "base/strings/utf_string_conversions.h" 32 #include "base/strings/utf_string_conversions.h"
32 #include "base/sys_byteorder.h" 33 #include "base/sys_byteorder.h"
33 #include "base/threading/sequenced_worker_pool.h" 34 #include "base/threading/sequenced_worker_pool.h"
34 #include "base/threading/thread_task_runner_handle.h" 35 #include "base/threading/thread_task_runner_handle.h"
35 #include "build/build_config.h" 36 #include "build/build_config.h"
36 #include "components/nacl/browser/nacl_browser.h" 37 #include "components/nacl/browser/nacl_browser.h"
37 #include "components/nacl/browser/nacl_browser_delegate.h" 38 #include "components/nacl/browser/nacl_browser_delegate.h"
38 #include "components/nacl/browser/nacl_host_message_filter.h"
39 #include "components/nacl/common/nacl_cmd_line.h" 39 #include "components/nacl/common/nacl_cmd_line.h"
40 #include "components/nacl/common/nacl_constants.h" 40 #include "components/nacl/common/nacl_constants.h"
41 #include "components/nacl/common/nacl_host_messages.h"
42 #include "components/nacl/common/nacl_messages.h" 41 #include "components/nacl/common/nacl_messages.h"
43 #include "components/nacl/common/nacl_process_type.h" 42 #include "components/nacl/common/nacl_process_type.h"
44 #include "components/nacl/common/nacl_switches.h" 43 #include "components/nacl/common/nacl_switches.h"
45 #include "components/url_formatter/url_formatter.h" 44 #include "components/url_formatter/url_formatter.h"
46 #include "content/public/browser/browser_child_process_host.h" 45 #include "content/public/browser/browser_child_process_host.h"
47 #include "content/public/browser/browser_ppapi_host.h" 46 #include "content/public/browser/browser_ppapi_host.h"
47 #include "content/public/browser/browser_thread.h"
48 #include "content/public/browser/child_process_data.h" 48 #include "content/public/browser/child_process_data.h"
49 #include "content/public/browser/plugin_service.h" 49 #include "content/public/browser/plugin_service.h"
50 #include "content/public/browser/render_process_host.h" 50 #include "content/public/browser/render_process_host.h"
51 #include "content/public/browser/web_contents.h" 51 #include "content/public/browser/web_contents.h"
52 #include "content/public/common/child_process_host.h" 52 #include "content/public/common/child_process_host.h"
53 #include "content/public/common/content_switches.h" 53 #include "content/public/common/content_switches.h"
54 #include "content/public/common/mojo_channel_switches.h" 54 #include "content/public/common/mojo_channel_switches.h"
55 #include "content/public/common/process_type.h" 55 #include "content/public/common/process_type.h"
56 #include "content/public/common/sandboxed_process_launcher_delegate.h" 56 #include "content/public/common/sandboxed_process_launcher_delegate.h"
57 #include "ipc/ipc_channel.h" 57 #include "ipc/ipc_channel.h"
58 #include "mojo/edk/embedder/embedder.h" 58 #include "mojo/edk/embedder/embedder.h"
59 #include "mojo/public/cpp/system/platform_handle.h"
59 #include "net/socket/socket_descriptor.h" 60 #include "net/socket/socket_descriptor.h"
60 #include "ppapi/host/host_factory.h" 61 #include "ppapi/host/host_factory.h"
61 #include "ppapi/host/ppapi_host.h" 62 #include "ppapi/host/ppapi_host.h"
62 #include "ppapi/proxy/ppapi_messages.h" 63 #include "ppapi/proxy/ppapi_messages.h"
63 #include "ppapi/shared_impl/ppapi_constants.h" 64 #include "ppapi/shared_impl/ppapi_constants.h"
64 #include "ppapi/shared_impl/ppapi_nacl_plugin_args.h" 65 #include "ppapi/shared_impl/ppapi_nacl_plugin_args.h"
65 66
66 #if defined(OS_POSIX) 67 #if defined(OS_POSIX)
67 68
68 #include <arpa/inet.h> 69 #include <arpa/inet.h>
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 199
199 unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ = 200 unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ =
200 ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds; 201 ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds;
201 202
202 NaClProcessHost::NaClProcessHost( 203 NaClProcessHost::NaClProcessHost(
203 const GURL& manifest_url, 204 const GURL& manifest_url,
204 base::File nexe_file, 205 base::File nexe_file,
205 const NaClFileToken& nexe_token, 206 const NaClFileToken& nexe_token,
206 const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files, 207 const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files,
207 ppapi::PpapiPermissions permissions, 208 ppapi::PpapiPermissions permissions,
209 int render_process_id,
208 int render_view_id, 210 int render_view_id,
209 uint32_t permission_bits, 211 uint32_t permission_bits,
210 bool uses_nonsfi_mode, 212 bool uses_nonsfi_mode,
211 bool off_the_record, 213 bool off_the_record,
212 NaClAppProcessType process_type, 214 NaClAppProcessType process_type,
213 const base::FilePath& profile_directory) 215 const base::FilePath& profile_directory)
214 : manifest_url_(manifest_url), 216 : manifest_url_(manifest_url),
215 nexe_file_(std::move(nexe_file)), 217 nexe_file_(std::move(nexe_file)),
216 nexe_token_(nexe_token), 218 nexe_token_(nexe_token),
217 prefetched_resource_files_(prefetched_resource_files), 219 prefetched_resource_files_(prefetched_resource_files),
218 permissions_(permissions), 220 permissions_(permissions),
219 #if defined(OS_WIN) 221 #if defined(OS_WIN)
220 process_launched_by_broker_(false), 222 process_launched_by_broker_(false),
221 #endif 223 #endif
222 reply_msg_(NULL),
223 #if defined(OS_WIN) 224 #if defined(OS_WIN)
224 debug_exception_handler_requested_(false), 225 debug_exception_handler_requested_(false),
225 #endif 226 #endif
226 uses_nonsfi_mode_(uses_nonsfi_mode), 227 uses_nonsfi_mode_(uses_nonsfi_mode),
227 enable_debug_stub_(false), 228 enable_debug_stub_(false),
228 enable_crash_throttling_(false), 229 enable_crash_throttling_(false),
229 off_the_record_(off_the_record), 230 off_the_record_(off_the_record),
230 process_type_(process_type), 231 process_type_(process_type),
231 profile_directory_(profile_directory), 232 profile_directory_(profile_directory),
233 render_process_id_(render_process_id),
232 render_view_id_(render_view_id), 234 render_view_id_(render_view_id),
233 weak_factory_(this) { 235 weak_factory_(this) {
234 process_.reset(content::BrowserChildProcessHost::Create( 236 process_.reset(content::BrowserChildProcessHost::Create(
235 static_cast<content::ProcessType>(PROCESS_TYPE_NACL_LOADER), this, 237 static_cast<content::ProcessType>(PROCESS_TYPE_NACL_LOADER), this,
236 kNaClLoaderServiceName)); 238 kNaClLoaderServiceName));
237 239
238 // Set the display name so the user knows what plugin the process is running. 240 // Set the display name so the user knows what plugin the process is running.
239 // We aren't on the UI thread so getting the pref locale for language 241 // We aren't on the UI thread so getting the pref locale for language
240 // formatting isn't possible, so IDN will be lost, but this is probably OK 242 // formatting isn't possible, so IDN will be lost, but this is probably OK
241 // for this use case. 243 // for this use case.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 content::BrowserThread::GetBlockingPool()->PostTask( 278 content::BrowserThread::GetBlockingPool()->PostTask(
277 FROM_HERE, base::Bind(&CloseFile, base::Passed(std::move(file)))); 279 FROM_HERE, base::Bind(&CloseFile, base::Passed(std::move(file))));
278 } 280 }
279 #endif 281 #endif
280 // Open files need to be closed on the blocking pool. 282 // Open files need to be closed on the blocking pool.
281 if (nexe_file_.IsValid()) { 283 if (nexe_file_.IsValid()) {
282 content::BrowserThread::GetBlockingPool()->PostTask( 284 content::BrowserThread::GetBlockingPool()->PostTask(
283 FROM_HERE, base::Bind(&CloseFile, base::Passed(std::move(nexe_file_)))); 285 FROM_HERE, base::Bind(&CloseFile, base::Passed(std::move(nexe_file_))));
284 } 286 }
285 287
286 if (reply_msg_) { 288 if (!launch_callback_.is_null()) {
287 // The process failed to launch for some reason. 289 // The process failed to launch for some reason.
288 // Don't keep the renderer hanging. 290 // Don't keep the renderer hanging.
289 reply_msg_->set_reply_error(); 291 SendMessageToRenderer(mojom::NaClLaunchResultPtr(), "");
290 nacl_host_message_filter_->Send(reply_msg_);
291 } 292 }
292 #if defined(OS_WIN) 293 #if defined(OS_WIN)
293 if (process_launched_by_broker_) { 294 if (process_launched_by_broker_) {
294 NaClBrokerService::GetInstance()->OnLoaderDied(); 295 NaClBrokerService::GetInstance()->OnLoaderDied();
295 } 296 }
296 #endif 297 #endif
297 } 298 }
298 299
299 void NaClProcessHost::OnProcessCrashed(int exit_status) { 300 void NaClProcessHost::OnProcessCrashed(int exit_status) {
300 if (enable_crash_throttling_ && 301 if (enable_crash_throttling_ &&
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 } 344 }
344 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) 345 #endif // defined(OS_POSIX) && !defined(OS_MACOSX)
345 346
346 // static 347 // static
347 void NaClProcessHost::SetPpapiKeepAliveThrottleForTesting( 348 void NaClProcessHost::SetPpapiKeepAliveThrottleForTesting(
348 unsigned milliseconds) { 349 unsigned milliseconds) {
349 keepalive_throttle_interval_milliseconds_ = milliseconds; 350 keepalive_throttle_interval_milliseconds_ = milliseconds;
350 } 351 }
351 352
352 void NaClProcessHost::Launch( 353 void NaClProcessHost::Launch(
353 NaClHostMessageFilter* nacl_host_message_filter, 354 const base::FilePath& manifest_path,
354 IPC::Message* reply_msg, 355 const mojom::NaClHost::LaunchNaClCallback& callback) {
355 const base::FilePath& manifest_path) { 356 launch_callback_ = callback;
356 nacl_host_message_filter_ = nacl_host_message_filter;
357 reply_msg_ = reply_msg;
358 manifest_path_ = manifest_path; 357 manifest_path_ = manifest_path;
359 358
360 // Do not launch the requested NaCl module if NaCl is marked "unstable" due 359 // Do not launch the requested NaCl module if NaCl is marked "unstable" due
361 // to too many crashes within a given time period. 360 // to too many crashes within a given time period.
362 if (enable_crash_throttling_ && 361 if (enable_crash_throttling_ &&
363 !base::CommandLine::ForCurrentProcess()->HasSwitch( 362 !base::CommandLine::ForCurrentProcess()->HasSwitch(
364 switches::kDisablePnaclCrashThrottling) && 363 switches::kDisablePnaclCrashThrottling) &&
365 NaClBrowser::GetInstance()->IsThrottled()) { 364 NaClBrowser::GetInstance()->IsThrottled()) {
366 SendErrorToRenderer("Process creation was throttled due to excessive" 365 SendErrorToRenderer("Process creation was throttled due to excessive"
367 " crashes"); 366 " crashes");
(...skipping 30 matching lines...) Expand all
398 397
399 if (uses_nonsfi_mode_) { 398 if (uses_nonsfi_mode_) {
400 bool nonsfi_mode_forced_by_command_line = false; 399 bool nonsfi_mode_forced_by_command_line = false;
401 bool nonsfi_mode_allowed = false; 400 bool nonsfi_mode_allowed = false;
402 #if defined(OS_LINUX) 401 #if defined(OS_LINUX)
403 nonsfi_mode_forced_by_command_line = 402 nonsfi_mode_forced_by_command_line =
404 cmd->HasSwitch(switches::kEnableNaClNonSfiMode); 403 cmd->HasSwitch(switches::kEnableNaClNonSfiMode);
405 #if defined(OS_CHROMEOS) && \ 404 #if defined(OS_CHROMEOS) && \
406 (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)) 405 (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL))
407 nonsfi_mode_allowed = NaClBrowser::GetDelegate()->IsNonSfiModeAllowed( 406 nonsfi_mode_allowed = NaClBrowser::GetDelegate()->IsNonSfiModeAllowed(
408 nacl_host_message_filter->profile_directory(), manifest_url_); 407 profile_directory_, manifest_url_);
409 #endif 408 #endif
410 #endif 409 #endif
411 bool nonsfi_mode_enabled = 410 bool nonsfi_mode_enabled =
412 nonsfi_mode_forced_by_command_line || nonsfi_mode_allowed; 411 nonsfi_mode_forced_by_command_line || nonsfi_mode_allowed;
413 412
414 if (!nonsfi_mode_enabled) { 413 if (!nonsfi_mode_enabled) {
415 SendErrorToRenderer( 414 SendErrorToRenderer(
416 "NaCl non-SFI mode is not available for this platform" 415 "NaCl non-SFI mode is not available for this platform"
417 " and NaCl module."); 416 " and NaCl module.");
418 delete this; 417 delete this;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 delete this; 627 delete this;
629 } else if (!StartNaClExecution()) { 628 } else if (!StartNaClExecution()) {
630 delete this; 629 delete this;
631 } 630 }
632 } 631 }
633 632
634 void NaClProcessHost::ReplyToRenderer( 633 void NaClProcessHost::ReplyToRenderer(
635 mojo::ScopedMessagePipeHandle ppapi_channel_handle, 634 mojo::ScopedMessagePipeHandle ppapi_channel_handle,
636 mojo::ScopedMessagePipeHandle trusted_channel_handle, 635 mojo::ScopedMessagePipeHandle trusted_channel_handle,
637 mojo::ScopedMessagePipeHandle manifest_service_channel_handle) { 636 mojo::ScopedMessagePipeHandle manifest_service_channel_handle) {
638 // Hereafter, we always send an IPC message with handles created above
639 // which, on Windows, are not closable in this process.
640 std::string error_message;
641 base::SharedMemoryHandle crash_info_shmem_renderer_handle;
642 if (!crash_info_shmem_.ShareToProcess(nacl_host_message_filter_->PeerHandle(),
643 &crash_info_shmem_renderer_handle)) {
644 // On error, we do not send "IPC::ChannelHandle"s to the renderer process.
645 // Note that some other FDs/handles still get sent to the renderer, but
646 // will be closed there.
647 ppapi_channel_handle.reset();
648 trusted_channel_handle.reset();
649 manifest_service_channel_handle.reset();
650 error_message = "ShareToProcess() failed";
651 }
652
653 const ChildProcessData& data = process_->GetData(); 637 const ChildProcessData& data = process_->GetData();
654 SendMessageToRenderer( 638 SendMessageToRenderer(
655 NaClLaunchResult(ppapi_channel_handle.release(), 639 mojom::NaClLaunchResult::New(
656 trusted_channel_handle.release(), 640 std::move(ppapi_channel_handle),
657 manifest_service_channel_handle.release(), 641 mojo::MakeRequest<mojom::NaClRendererHost>(
658 base::GetProcId(data.handle), 642 std::move(trusted_channel_handle)),
659 data.id, 643 std::move(manifest_service_channel_handle),
660 crash_info_shmem_renderer_handle), 644 base::GetProcId(data.handle), data.id,
661 error_message); 645 mojo::WrapSharedMemoryHandle(crash_info_shmem_.TakeHandle(),
646 kNaClCrashInfoShmemSize, false)),
647 "");
662 648
663 // Now that the crash information shmem handles have been shared with the 649 // Now that the crash information shmem handles have been shared with the
664 // plugin and the renderer, the browser can close its handle. 650 // plugin and the renderer, the browser can close its handle.
665 crash_info_shmem_.Close(); 651 crash_info_shmem_.Close();
666 } 652 }
667 653
668 void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) { 654 void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) {
669 LOG(ERROR) << "NaCl process launch failed: " << error_message; 655 LOG(ERROR) << "NaCl process launch failed: " << error_message;
670 SendMessageToRenderer(NaClLaunchResult(), error_message); 656 SendMessageToRenderer(mojom::NaClLaunchResultPtr(), error_message);
671 } 657 }
672 658
673 void NaClProcessHost::SendMessageToRenderer( 659 void NaClProcessHost::SendMessageToRenderer(mojom::NaClLaunchResultPtr result,
674 const NaClLaunchResult& result, 660 const std::string& error_message) {
675 const std::string& error_message) { 661 DCHECK(!launch_callback_.is_null());
676 DCHECK(nacl_host_message_filter_.get()); 662 if (launch_callback_.is_null()) {
677 DCHECK(reply_msg_);
678 if (nacl_host_message_filter_.get() == NULL || reply_msg_ == NULL) {
679 // As DCHECKed above, this case should not happen in general. 663 // As DCHECKed above, this case should not happen in general.
680 // Though, in this case, unfortunately there is no proper way to release
681 // resources which are already created in |result|. We just give up on
682 // releasing them, and leak them.
683 return; 664 return;
684 } 665 }
685 666
686 NaClHostMsg_LaunchNaCl::WriteReplyParams(reply_msg_, result, error_message); 667 base::ResetAndReturn(&launch_callback_).Run(std::move(result), error_message);
687 nacl_host_message_filter_->Send(reply_msg_);
688 nacl_host_message_filter_ = NULL;
689 reply_msg_ = NULL;
690 } 668 }
691 669
692 void NaClProcessHost::SetDebugStubPort(int port) { 670 void NaClProcessHost::SetDebugStubPort(int port) {
693 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); 671 NaClBrowser* nacl_browser = NaClBrowser::GetInstance();
694 nacl_browser->SetProcessGdbDebugStubPort(process_->GetData().id, port); 672 nacl_browser->SetProcessGdbDebugStubPort(process_->GetData().id, port);
695 } 673 }
696 674
697 #if defined(OS_POSIX) 675 #if defined(OS_POSIX)
698 // TCP port we chose for NaCl debug stub. It can be any other number. 676 // TCP port we chose for NaCl debug stub. It can be any other number.
699 static const uint16_t kInitialDebugStubPort = 4014; 677 static const uint16_t kInitialDebugStubPort = 4014;
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 898
921 DCHECK_EQ(PROCESS_TYPE_NACL_LOADER, process_->GetData().process_type); 899 DCHECK_EQ(PROCESS_TYPE_NACL_LOADER, process_->GetData().process_type);
922 900
923 ipc_proxy_channel_ = IPC::ChannelProxy::Create( 901 ipc_proxy_channel_ = IPC::ChannelProxy::Create(
924 channel_handle.release(), IPC::Channel::MODE_CLIENT, NULL, 902 channel_handle.release(), IPC::Channel::MODE_CLIENT, NULL,
925 base::ThreadTaskRunnerHandle::Get().get()); 903 base::ThreadTaskRunnerHandle::Get().get());
926 // Create the browser ppapi host and enable PPAPI message dispatching to the 904 // Create the browser ppapi host and enable PPAPI message dispatching to the
927 // browser process. 905 // browser process.
928 ppapi_host_.reset(content::BrowserPpapiHost::CreateExternalPluginProcess( 906 ppapi_host_.reset(content::BrowserPpapiHost::CreateExternalPluginProcess(
929 ipc_proxy_channel_.get(), // sender 907 ipc_proxy_channel_.get(), // sender
930 permissions_, 908 permissions_, process_->GetData().handle, ipc_proxy_channel_.get(),
931 process_->GetData().handle, 909 render_process_id_, render_view_id_, profile_directory_));
932 ipc_proxy_channel_.get(),
933 nacl_host_message_filter_->render_process_id(),
934 render_view_id_,
935 profile_directory_));
936 ppapi_host_->SetOnKeepaliveCallback( 910 ppapi_host_->SetOnKeepaliveCallback(
937 NaClBrowser::GetDelegate()->GetOnKeepaliveCallback()); 911 NaClBrowser::GetDelegate()->GetOnKeepaliveCallback());
938 912
939 ppapi::PpapiNaClPluginArgs args; 913 ppapi::PpapiNaClPluginArgs args;
940 args.off_the_record = nacl_host_message_filter_->off_the_record(); 914 args.off_the_record = off_the_record_;
941 args.permissions = permissions_; 915 args.permissions = permissions_;
942 args.keepalive_throttle_interval_milliseconds = 916 args.keepalive_throttle_interval_milliseconds =
943 keepalive_throttle_interval_milliseconds_; 917 keepalive_throttle_interval_milliseconds_;
944 base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); 918 base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
945 DCHECK(cmdline); 919 DCHECK(cmdline);
946 std::string flag_whitelist[] = { 920 std::string flag_whitelist[] = {
947 switches::kV, 921 switches::kV,
948 switches::kVModule, 922 switches::kVModule,
949 }; 923 };
950 for (size_t i = 0; i < arraysize(flag_whitelist); ++i) { 924 for (size_t i = 0; i < arraysize(flag_whitelist); ++i) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1165 NaClStartDebugExceptionHandlerThread( 1139 NaClStartDebugExceptionHandlerThread(
1166 std::move(process), info, base::ThreadTaskRunnerHandle::Get(), 1140 std::move(process), info, base::ThreadTaskRunnerHandle::Get(),
1167 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, 1141 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker,
1168 weak_factory_.GetWeakPtr())); 1142 weak_factory_.GetWeakPtr()));
1169 return true; 1143 return true;
1170 } 1144 }
1171 } 1145 }
1172 #endif 1146 #endif
1173 1147
1174 } // namespace nacl 1148 } // namespace nacl
OLDNEW
« no previous file with comments | « components/nacl/browser/nacl_process_host.h ('k') | components/nacl/browser/pnacl_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698