| 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 "content/public/app/content_main_runner.h" | 5 #include "content/public/app/content_main_runner.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include <string> |
| 10 |
| 9 #include "base/allocator/allocator_extension.h" | 11 #include "base/allocator/allocator_extension.h" |
| 10 #include "base/at_exit.h" | 12 #include "base/at_exit.h" |
| 11 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 12 #include "base/debug/debugger.h" | 14 #include "base/debug/debugger.h" |
| 13 #include "base/debug/stack_trace.h" | 15 #include "base/debug/stack_trace.h" |
| 14 #include "base/files/file_path.h" | 16 #include "base/files/file_path.h" |
| 15 #include "base/i18n/icu_util.h" | 17 #include "base/i18n/icu_util.h" |
| 16 #include "base/lazy_instance.h" | 18 #include "base/lazy_instance.h" |
| 17 #include "base/logging.h" | 19 #include "base/logging.h" |
| 18 #include "base/memory/scoped_ptr.h" | 20 #include "base/memory/scoped_ptr.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 29 #include "base/strings/stringprintf.h" | 31 #include "base/strings/stringprintf.h" |
| 30 #include "base/trace_event/trace_event.h" | 32 #include "base/trace_event/trace_event.h" |
| 31 #include "components/tracing/trace_config_file.h" | 33 #include "components/tracing/trace_config_file.h" |
| 32 #include "components/tracing/tracing_switches.h" | 34 #include "components/tracing/tracing_switches.h" |
| 33 #include "content/browser/browser_main.h" | 35 #include "content/browser/browser_main.h" |
| 34 #include "content/common/set_process_title.h" | 36 #include "content/common/set_process_title.h" |
| 35 #include "content/common/url_schemes.h" | 37 #include "content/common/url_schemes.h" |
| 36 #include "content/gpu/in_process_gpu_thread.h" | 38 #include "content/gpu/in_process_gpu_thread.h" |
| 37 #include "content/public/app/content_main.h" | 39 #include "content/public/app/content_main.h" |
| 38 #include "content/public/app/content_main_delegate.h" | 40 #include "content/public/app/content_main_delegate.h" |
| 39 #include "content/public/app/startup_helper_win.h" | |
| 40 #include "content/public/browser/content_browser_client.h" | 41 #include "content/public/browser/content_browser_client.h" |
| 41 #include "content/public/common/content_client.h" | 42 #include "content/public/common/content_client.h" |
| 42 #include "content/public/common/content_constants.h" | 43 #include "content/public/common/content_constants.h" |
| 43 #include "content/public/common/content_paths.h" | 44 #include "content/public/common/content_paths.h" |
| 44 #include "content/public/common/content_switches.h" | 45 #include "content/public/common/content_switches.h" |
| 45 #include "content/public/common/main_function_params.h" | 46 #include "content/public/common/main_function_params.h" |
| 46 #include "content/public/common/sandbox_init.h" | 47 #include "content/public/common/sandbox_init.h" |
| 47 #include "content/renderer/in_process_renderer_thread.h" | 48 #include "content/renderer/in_process_renderer_thread.h" |
| 48 #include "content/utility/in_process_utility_thread.h" | 49 #include "content/utility/in_process_utility_thread.h" |
| 49 #include "ipc/ipc_descriptors.h" | 50 #include "ipc/ipc_descriptors.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 68 #include "content/browser/utility_process_host_impl.h" | 69 #include "content/browser/utility_process_host_impl.h" |
| 69 #include "content/public/plugin/content_plugin_client.h" | 70 #include "content/public/plugin/content_plugin_client.h" |
| 70 #include "content/public/renderer/content_renderer_client.h" | 71 #include "content/public/renderer/content_renderer_client.h" |
| 71 #include "content/public/utility/content_utility_client.h" | 72 #include "content/public/utility/content_utility_client.h" |
| 72 #endif | 73 #endif |
| 73 | 74 |
| 74 #if defined(OS_WIN) | 75 #if defined(OS_WIN) |
| 75 #include <malloc.h> | 76 #include <malloc.h> |
| 76 #include <cstring> | 77 #include <cstring> |
| 77 | 78 |
| 78 #include "base/strings/string_number_conversions.h" | |
| 79 #include "base/trace_event/trace_event_etw_export_win.h" | 79 #include "base/trace_event/trace_event_etw_export_win.h" |
| 80 #include "base/win/process_startup_helper.h" |
| 80 #include "ui/base/win/atl_module.h" | 81 #include "ui/base/win/atl_module.h" |
| 81 #include "ui/gfx/win/dpi.h" | 82 #include "ui/gfx/win/dpi.h" |
| 82 #elif defined(OS_MACOSX) | 83 #elif defined(OS_MACOSX) |
| 83 #include "base/mac/scoped_nsautorelease_pool.h" | 84 #include "base/mac/scoped_nsautorelease_pool.h" |
| 84 #if !defined(OS_IOS) | 85 #if !defined(OS_IOS) |
| 85 #include "base/power_monitor/power_monitor_device_source.h" | 86 #include "base/power_monitor/power_monitor_device_source.h" |
| 86 #include "content/app/mac/mac_init.h" | 87 #include "content/app/mac/mac_init.h" |
| 87 #include "content/browser/browser_io_surface_manager_mac.h" | 88 #include "content/browser/browser_io_surface_manager_mac.h" |
| 88 #include "content/browser/mach_broker_mac.h" | 89 #include "content/browser/mach_broker_mac.h" |
| 89 #include "content/child/child_io_surface_manager_mac.h" | 90 #include "content/child/child_io_surface_manager_mac.h" |
| 90 #include "content/common/sandbox_init_mac.h" | 91 #include "content/common/sandbox_init_mac.h" |
| 91 #endif // !OS_IOS | 92 #endif // !OS_IOS |
| 92 #endif // OS_WIN | 93 #endif // OS_WIN |
| 93 | 94 |
| 94 #if defined(OS_POSIX) | 95 #if defined(OS_POSIX) |
| 95 #include <signal.h> | 96 #include <signal.h> |
| 96 | 97 |
| 97 #include "base/posix/global_descriptors.h" | 98 #include "base/posix/global_descriptors.h" |
| 98 #include "content/public/common/content_descriptors.h" | 99 #include "content/public/common/content_descriptors.h" |
| 99 | 100 |
| 100 #if !defined(OS_MACOSX) | 101 #if !defined(OS_MACOSX) |
| 101 #include "content/public/common/content_descriptors.h" | |
| 102 #include "content/public/common/zygote_fork_delegate_linux.h" | 102 #include "content/public/common/zygote_fork_delegate_linux.h" |
| 103 #endif | 103 #endif |
| 104 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) | 104 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 105 #include "content/zygote/zygote_main.h" | 105 #include "content/zygote/zygote_main.h" |
| 106 #endif | 106 #endif |
| 107 | 107 |
| 108 #endif // OS_POSIX | 108 #endif // OS_POSIX |
| 109 | 109 |
| 110 #if defined(USE_NSS_CERTS) | 110 #if defined(USE_NSS_CERTS) |
| 111 #include "crypto/nss_util.h" | 111 #include "crypto/nss_util.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 150 |
| 151 #endif // defined(OS_WIN) | 151 #endif // defined(OS_WIN) |
| 152 | 152 |
| 153 #if defined(OS_POSIX) && !defined(OS_IOS) | 153 #if defined(OS_POSIX) && !defined(OS_IOS) |
| 154 | 154 |
| 155 // Setup signal-handling state: resanitize most signals, ignore SIGPIPE. | 155 // Setup signal-handling state: resanitize most signals, ignore SIGPIPE. |
| 156 void SetupSignalHandlers() { | 156 void SetupSignalHandlers() { |
| 157 // Sanitise our signal handling state. Signals that were ignored by our | 157 // Sanitise our signal handling state. Signals that were ignored by our |
| 158 // parent will also be ignored by us. We also inherit our parent's sigmask. | 158 // parent will also be ignored by us. We also inherit our parent's sigmask. |
| 159 sigset_t empty_signal_set; | 159 sigset_t empty_signal_set; |
| 160 CHECK(0 == sigemptyset(&empty_signal_set)); | 160 CHECK_EQ(0, sigemptyset(&empty_signal_set)); |
| 161 CHECK(0 == sigprocmask(SIG_SETMASK, &empty_signal_set, NULL)); | 161 CHECK_EQ(0, sigprocmask(SIG_SETMASK, &empty_signal_set, NULL)); |
| 162 | 162 |
| 163 struct sigaction sigact; | 163 struct sigaction sigact; |
| 164 memset(&sigact, 0, sizeof(sigact)); | 164 memset(&sigact, 0, sizeof(sigact)); |
| 165 sigact.sa_handler = SIG_DFL; | 165 sigact.sa_handler = SIG_DFL; |
| 166 static const int signals_to_reset[] = | 166 static const int signals_to_reset[] = |
| 167 {SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, | 167 {SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, |
| 168 SIGALRM, SIGTERM, SIGCHLD, SIGBUS, SIGTRAP}; // SIGPIPE is set below. | 168 SIGALRM, SIGTERM, SIGCHLD, SIGBUS, SIGTRAP}; // SIGPIPE is set below. |
| 169 for (unsigned i = 0; i < arraysize(signals_to_reset); i++) { | 169 for (unsigned i = 0; i < arraysize(signals_to_reset); i++) { |
| 170 CHECK(0 == sigaction(signals_to_reset[i], &sigact, NULL)); | 170 CHECK_EQ(0, sigaction(signals_to_reset[i], &sigact, NULL)); |
| 171 } | 171 } |
| 172 | 172 |
| 173 // Always ignore SIGPIPE. We check the return value of write(). | 173 // Always ignore SIGPIPE. We check the return value of write(). |
| 174 CHECK(signal(SIGPIPE, SIG_IGN) != SIG_ERR); | 174 CHECK_NE(SIG_ERR, signal(SIGPIPE, SIG_IGN)); |
| 175 } | 175 } |
| 176 | 176 |
| 177 #endif // OS_POSIX && !OS_IOS | 177 #endif // OS_POSIX && !OS_IOS |
| 178 | 178 |
| 179 void CommonSubprocessInit(const std::string& process_type) { | 179 void CommonSubprocessInit(const std::string& process_type) { |
| 180 #if defined(OS_WIN) | 180 #if defined(OS_WIN) |
| 181 // HACK: Let Windows know that we have started. This is needed to suppress | 181 // HACK: Let Windows know that we have started. This is needed to suppress |
| 182 // the IDC_APPSTARTING cursor from being displayed for a prolonged period | 182 // the IDC_APPSTARTING cursor from being displayed for a prolonged period |
| 183 // while a subprocess is starting. | 183 // while a subprocess is starting. |
| 184 PostThreadMessage(GetCurrentThreadId(), WM_NULL, 0, 0); | 184 PostThreadMessage(GetCurrentThreadId(), WM_NULL, 0, 0); |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 static void ReleaseFreeMemoryThunk() { | 436 static void ReleaseFreeMemoryThunk() { |
| 437 MallocExtension::instance()->ReleaseFreeMemory(); | 437 MallocExtension::instance()->ReleaseFreeMemory(); |
| 438 } | 438 } |
| 439 #endif | 439 #endif |
| 440 | 440 |
| 441 int Initialize(const ContentMainParams& params) override { | 441 int Initialize(const ContentMainParams& params) override { |
| 442 ui_task_ = params.ui_task; | 442 ui_task_ = params.ui_task; |
| 443 | 443 |
| 444 base::EnableTerminationOnOutOfMemory(); | 444 base::EnableTerminationOnOutOfMemory(); |
| 445 #if defined(OS_WIN) | 445 #if defined(OS_WIN) |
| 446 RegisterInvalidParamHandler(); | 446 base::win::RegisterInvalidParamHandler(); |
| 447 ui::win::CreateATLModuleIfNeeded(); | 447 ui::win::CreateATLModuleIfNeeded(); |
| 448 | 448 |
| 449 sandbox_info_ = *params.sandbox_info; | 449 sandbox_info_ = *params.sandbox_info; |
| 450 #else // !OS_WIN | 450 #else // !OS_WIN |
| 451 | 451 |
| 452 #if defined(OS_ANDROID) | 452 #if defined(OS_ANDROID) |
| 453 // See note at the initialization of ExitManager, below; basically, | 453 // See note at the initialization of ExitManager, below; basically, |
| 454 // only Android builds have the ctor/dtor handlers set up to use | 454 // only Android builds have the ctor/dtor handlers set up to use |
| 455 // TRACE_EVENT right away. | 455 // TRACE_EVENT right away. |
| 456 TRACE_EVENT0("startup,benchmark", "ContentMainRunnerImpl::Initialize"); | 456 TRACE_EVENT0("startup,benchmark", "ContentMainRunnerImpl::Initialize"); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 | 560 |
| 561 // TODO(yiyaoliu, vadimt): Remove this once crbug.com/453640 is fixed. | 561 // TODO(yiyaoliu, vadimt): Remove this once crbug.com/453640 is fixed. |
| 562 // Enable profiler recording right after command line is initialized so that | 562 // Enable profiler recording right after command line is initialized so that |
| 563 // browser startup can be instrumented. | 563 // browser startup can be instrumented. |
| 564 if (delegate_ && delegate_->ShouldEnableProfilerRecording()) | 564 if (delegate_ && delegate_->ShouldEnableProfilerRecording()) |
| 565 tracked_objects::ScopedTracker::Enable(); | 565 tracked_objects::ScopedTracker::Enable(); |
| 566 | 566 |
| 567 #if !defined(OS_IOS) | 567 #if !defined(OS_IOS) |
| 568 SetProcessTitleFromCommandLine(argv); | 568 SetProcessTitleFromCommandLine(argv); |
| 569 #endif | 569 #endif |
| 570 #endif // !OS_ANDROID | 570 #endif // !OS_ANDROID |
| 571 | 571 |
| 572 int exit_code = 0; | 572 int exit_code = 0; |
| 573 if (delegate_ && delegate_->BasicStartupComplete(&exit_code)) | 573 if (delegate_ && delegate_->BasicStartupComplete(&exit_code)) |
| 574 return exit_code; | 574 return exit_code; |
| 575 | 575 |
| 576 completed_basic_startup_ = true; | 576 completed_basic_startup_ = true; |
| 577 | 577 |
| 578 const base::CommandLine& command_line = | 578 const base::CommandLine& command_line = |
| 579 *base::CommandLine::ForCurrentProcess(); | 579 *base::CommandLine::ForCurrentProcess(); |
| 580 std::string process_type = | 580 std::string process_type = |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 // Enable exporting of events to ETW if requested on the command line. | 632 // Enable exporting of events to ETW if requested on the command line. |
| 633 if (command_line.HasSwitch(switches::kTraceExportEventsToETW)) | 633 if (command_line.HasSwitch(switches::kTraceExportEventsToETW)) |
| 634 base::trace_event::TraceEventETWExport::EnableETWExport(); | 634 base::trace_event::TraceEventETWExport::EnableETWExport(); |
| 635 #endif // OS_WIN | 635 #endif // OS_WIN |
| 636 | 636 |
| 637 #if !defined(OS_ANDROID) | 637 #if !defined(OS_ANDROID) |
| 638 // Android tracing started at the beginning of the method. | 638 // Android tracing started at the beginning of the method. |
| 639 // Other OSes have to wait till we get here in order for all the memory | 639 // Other OSes have to wait till we get here in order for all the memory |
| 640 // management setup to be completed. | 640 // management setup to be completed. |
| 641 TRACE_EVENT0("startup,benchmark", "ContentMainRunnerImpl::Initialize"); | 641 TRACE_EVENT0("startup,benchmark", "ContentMainRunnerImpl::Initialize"); |
| 642 #endif // !OS_ANDROID | 642 #endif // !OS_ANDROID |
| 643 | 643 |
| 644 #if defined(OS_MACOSX) && !defined(OS_IOS) | 644 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 645 // We need to allocate the IO Ports before the Sandbox is initialized or | 645 // We need to allocate the IO Ports before the Sandbox is initialized or |
| 646 // the first instance of PowerMonitor is created. | 646 // the first instance of PowerMonitor is created. |
| 647 // It's important not to allocate the ports for processes which don't | 647 // It's important not to allocate the ports for processes which don't |
| 648 // register with the power monitor - see crbug.com/88867. | 648 // register with the power monitor - see crbug.com/88867. |
| 649 if (process_type.empty() || | 649 if (process_type.empty() || |
| 650 (delegate_ && | 650 (delegate_ && |
| 651 delegate_->ProcessRegistersWithSystemProcess(process_type))) { | 651 delegate_->ProcessRegistersWithSystemProcess(process_type))) { |
| 652 base::PowerMonitorDeviceSource::AllocateSystemIOPorts(); | 652 base::PowerMonitorDeviceSource::AllocateSystemIOPorts(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 if (!process_type.empty() && | 655 if (!process_type.empty() && |
| 656 (!delegate_ || delegate_->ShouldSendMachPort(process_type))) { | 656 (!delegate_ || delegate_->ShouldSendMachPort(process_type))) { |
| 657 MachBroker::ChildSendTaskPortToParent(); | 657 MachBroker::ChildSendTaskPortToParent(); |
| 658 } | 658 } |
| 659 | 659 |
| 660 if (!command_line.HasSwitch(switches::kSingleProcess) && | 660 if (!command_line.HasSwitch(switches::kSingleProcess) && |
| 661 !process_type.empty() && (process_type == switches::kRendererProcess || | 661 !process_type.empty() && (process_type == switches::kRendererProcess || |
| 662 process_type == switches::kGpuProcess)) { | 662 process_type == switches::kGpuProcess)) { |
| 663 base::mac::ScopedMachSendRight service_port = | 663 base::mac::ScopedMachSendRight service_port = |
| 664 BrowserIOSurfaceManager::LookupServicePort(getppid()); | 664 BrowserIOSurfaceManager::LookupServicePort(getppid()); |
| 665 if (service_port.is_valid()) { | 665 if (service_port.is_valid()) { |
| 666 ChildIOSurfaceManager::GetInstance()->set_service_port( | 666 ChildIOSurfaceManager::GetInstance()->set_service_port( |
| 667 service_port.release()); | 667 service_port.release()); |
| 668 IOSurfaceManager::SetInstance(ChildIOSurfaceManager::GetInstance()); | 668 IOSurfaceManager::SetInstance(ChildIOSurfaceManager::GetInstance()); |
| 669 } | 669 } |
| 670 } | 670 } |
| 671 #elif defined(OS_WIN) | 671 #elif defined(OS_WIN) |
| 672 SetupCRT(command_line); | 672 base::win::SetupCRT(command_line); |
| 673 #endif | 673 #endif |
| 674 | 674 |
| 675 #if defined(OS_POSIX) | 675 #if defined(OS_POSIX) |
| 676 if (!process_type.empty()) { | 676 if (!process_type.empty()) { |
| 677 // When you hit Ctrl-C in a terminal running the browser | 677 // When you hit Ctrl-C in a terminal running the browser |
| 678 // process, a SIGINT is delivered to the entire process group. | 678 // process, a SIGINT is delivered to the entire process group. |
| 679 // When debugging the browser process via gdb, gdb catches the | 679 // When debugging the browser process via gdb, gdb catches the |
| 680 // SIGINT for the browser process (and dumps you back to the gdb | 680 // SIGINT for the browser process (and dumps you back to the gdb |
| 681 // console) but doesn't for the child processes, killing them. | 681 // console) but doesn't for the child processes, killing them. |
| 682 // The fix is to have child processes ignore SIGINT; they'll die | 682 // The fix is to have child processes ignore SIGINT; they'll die |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 | 857 |
| 858 DISALLOW_COPY_AND_ASSIGN(ContentMainRunnerImpl); | 858 DISALLOW_COPY_AND_ASSIGN(ContentMainRunnerImpl); |
| 859 }; | 859 }; |
| 860 | 860 |
| 861 // static | 861 // static |
| 862 ContentMainRunner* ContentMainRunner::Create() { | 862 ContentMainRunner* ContentMainRunner::Create() { |
| 863 return new ContentMainRunnerImpl(); | 863 return new ContentMainRunnerImpl(); |
| 864 } | 864 } |
| 865 | 865 |
| 866 } // namespace content | 866 } // namespace content |
| OLD | NEW |