Chromium Code Reviews| 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 "base/allocator/allocator_extension.h" | 9 #include "base/allocator/allocator_extension.h" |
| 10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/debug/debugger.h" | 12 #include "base/debug/debugger.h" |
| 13 #include "base/debug/trace_event.h" | 13 #include "base/debug/trace_event.h" |
| 14 #include "base/file_path.h" | 14 #include "base/file_path.h" |
| 15 #include "base/i18n/icu_util.h" | 15 #include "base/i18n/icu_util.h" |
| 16 #include "base/lazy_instance.h" | 16 #include "base/lazy_instance.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
| 19 #include "base/metrics/stats_table.h" | 19 #include "base/metrics/stats_table.h" |
| 20 #include "base/path_service.h" | 20 #include "base/path_service.h" |
| 21 #include "base/process_util.h" | 21 #include "base/process_util.h" |
| 22 #include "base/profiler/alternate_timer.h" | 22 #include "base/profiler/alternate_timer.h" |
| 23 #include "base/string_util.h" | |
| 23 #include "base/stringprintf.h" | 24 #include "base/stringprintf.h" |
| 24 #include "base/string_number_conversions.h" | 25 #include "base/string_number_conversions.h" |
| 25 #include "content/browser/browser_main.h" | 26 #include "content/browser/browser_main.h" |
| 26 #include "content/common/set_process_title.h" | 27 #include "content/common/set_process_title.h" |
| 27 #include "content/common/url_schemes.h" | 28 #include "content/common/url_schemes.h" |
| 28 #include "content/public/app/content_main_delegate.h" | 29 #include "content/public/app/content_main_delegate.h" |
| 29 #include "content/public/app/startup_helper_win.h" | 30 #include "content/public/app/startup_helper_win.h" |
| 30 #include "content/public/browser/content_browser_client.h" | 31 #include "content/public/browser/content_browser_client.h" |
| 31 #include "content/public/common/content_client.h" | 32 #include "content/public/common/content_client.h" |
| 32 #include "content/public/common/content_constants.h" | 33 #include "content/public/common/content_constants.h" |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 48 | 49 |
| 49 #if defined(USE_TCMALLOC) | 50 #if defined(USE_TCMALLOC) |
| 50 #include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h" | 51 #include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h" |
| 51 #endif | 52 #endif |
| 52 | 53 |
| 53 #if defined(OS_WIN) | 54 #if defined(OS_WIN) |
| 54 #include <cstring> | 55 #include <cstring> |
| 55 #include <atlbase.h> | 56 #include <atlbase.h> |
| 56 #include <atlapp.h> | 57 #include <atlapp.h> |
| 57 #include <malloc.h> | 58 #include <malloc.h> |
| 59 #include <string> | |
|
jam
2012/09/12 00:36:05
nit: this is very redundant, no need to add
MAD
2012/09/12 02:10:02
Done.
| |
| 58 #elif defined(OS_MACOSX) | 60 #elif defined(OS_MACOSX) |
| 59 #include "base/mac/scoped_nsautorelease_pool.h" | 61 #include "base/mac/scoped_nsautorelease_pool.h" |
| 60 #include "base/mach_ipc_mac.h" | 62 #include "base/mach_ipc_mac.h" |
| 61 #include "base/system_monitor/system_monitor.h" | 63 #include "base/system_monitor/system_monitor.h" |
| 62 #include "content/browser/mach_broker_mac.h" | 64 #include "content/browser/mach_broker_mac.h" |
| 63 #include "content/common/sandbox_init_mac.h" | 65 #include "content/common/sandbox_init_mac.h" |
| 64 #endif // OS_WIN | 66 #endif // OS_WIN |
| 65 | 67 |
| 66 #if defined(OS_POSIX) | 68 #if defined(OS_POSIX) |
| 67 #include <signal.h> | 69 #include <signal.h> |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 88 extern int RendererMain(const content::MainFunctionParams&); | 90 extern int RendererMain(const content::MainFunctionParams&); |
| 89 extern int WorkerMain(const content::MainFunctionParams&); | 91 extern int WorkerMain(const content::MainFunctionParams&); |
| 90 extern int UtilityMain(const content::MainFunctionParams&); | 92 extern int UtilityMain(const content::MainFunctionParams&); |
| 91 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 93 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 92 namespace content { | 94 namespace content { |
| 93 extern int ZygoteMain(const MainFunctionParams&, | 95 extern int ZygoteMain(const MainFunctionParams&, |
| 94 ZygoteForkDelegate* forkdelegate); | 96 ZygoteForkDelegate* forkdelegate); |
| 95 } // namespace content | 97 } // namespace content |
| 96 #endif | 98 #endif |
| 97 | 99 |
| 100 namespace { | |
| 101 #if defined(OS_WIN) | |
| 102 // In order to have Theme support, we need to connect to the theme service. | |
| 103 // This needs to be done before we lock down the renderer. Officially this | |
|
jam
2012/09/12 00:36:05
renderer->process to make it generic, now that thi
MAD
2012/09/12 02:10:02
Done.
| |
| 104 // can be done with OpenThemeData() but it fails unless you pass a valid | |
| 105 // window at least the first time. Interestingly, the very act of creating a | |
| 106 // window also sets the connection to the theme service. | |
| 107 void EnableThemeSupportOnAllWindowStations() { | |
| 108 HDESK desktop_handle = ::OpenInputDesktop(0, FALSE, READ_CONTROL); | |
| 109 if (desktop_handle) { | |
| 110 // This means we are running in an input desktop, which implies WinSta0. | |
| 111 ::CloseDesktop(desktop_handle); | |
| 112 return; | |
| 113 } | |
| 114 | |
| 115 HWINSTA current_station = ::GetProcessWindowStation(); | |
| 116 DCHECK(current_station); | |
| 117 | |
| 118 HWINSTA winsta0 = ::OpenWindowStationA("WinSta0", FALSE, GENERIC_READ); | |
| 119 if (!winsta0 || !::SetProcessWindowStation(winsta0)) { | |
| 120 // Could not set the alternate window station. There is a possibility | |
| 121 // that the theme wont be correctly initialized. | |
| 122 NOTREACHED() << "Unable to switch to WinSta0, we: "<< ::GetLastError(); | |
| 123 } | |
| 124 | |
| 125 HWND window = ::CreateWindowExW(0, L"Static", L"", WS_POPUP | WS_DISABLED, | |
| 126 CW_USEDEFAULT, 0, 0, 0, HWND_MESSAGE, NULL, | |
| 127 ::GetModuleHandleA(NULL), NULL); | |
| 128 if (!window) { | |
| 129 DLOG(WARNING) << "failed to enable theme support"; | |
| 130 } else { | |
| 131 ::DestroyWindow(window); | |
| 132 window = NULL; | |
| 133 } | |
| 134 | |
| 135 // Revert the window station. | |
| 136 if (!::SetProcessWindowStation(current_station)) { | |
| 137 // We failed to switch back to the secure window station. This might | |
| 138 // confuse the renderer enough that we should kill it now. | |
|
jam
2012/09/12 00:36:05
ditto
MAD
2012/09/12 02:10:02
Done.
| |
| 139 LOG(FATAL) << "Failed to restore alternate window station"; | |
| 140 } | |
| 141 | |
| 142 if (!::CloseWindowStation(winsta0)) { | |
| 143 // We might be leaking a winsta0 handle. This is a security risk, but | |
| 144 // since we allow fail over to no desktop protection in low memory | |
| 145 // condition, this is not a big risk. | |
| 146 NOTREACHED(); | |
| 147 } | |
| 148 } | |
| 149 #endif // defined(OS_WIN) | |
| 150 } // namespace | |
| 151 | |
| 98 namespace content { | 152 namespace content { |
| 99 | 153 |
| 100 base::LazyInstance<ContentBrowserClient> | 154 base::LazyInstance<ContentBrowserClient> |
| 101 g_empty_content_browser_client = LAZY_INSTANCE_INITIALIZER; | 155 g_empty_content_browser_client = LAZY_INSTANCE_INITIALIZER; |
| 102 base::LazyInstance<ContentPluginClient> | 156 base::LazyInstance<ContentPluginClient> |
| 103 g_empty_content_plugin_client = LAZY_INSTANCE_INITIALIZER; | 157 g_empty_content_plugin_client = LAZY_INSTANCE_INITIALIZER; |
| 104 base::LazyInstance<ContentRendererClient> | 158 base::LazyInstance<ContentRendererClient> |
| 105 g_empty_content_renderer_client = LAZY_INSTANCE_INITIALIZER; | 159 g_empty_content_renderer_client = LAZY_INSTANCE_INITIALIZER; |
| 106 base::LazyInstance<ContentUtilityClient> | 160 base::LazyInstance<ContentUtilityClient> |
| 107 g_empty_content_utility_client = LAZY_INSTANCE_INITIALIZER; | 161 g_empty_content_utility_client = LAZY_INSTANCE_INITIALIZER; |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 556 (delegate && | 610 (delegate && |
| 557 delegate->ProcessRegistersWithSystemProcess(process_type))) { | 611 delegate->ProcessRegistersWithSystemProcess(process_type))) { |
| 558 base::SystemMonitor::AllocateSystemIOPorts(); | 612 base::SystemMonitor::AllocateSystemIOPorts(); |
| 559 } | 613 } |
| 560 | 614 |
| 561 if (!process_type.empty() && | 615 if (!process_type.empty() && |
| 562 (!delegate || delegate->ShouldSendMachPort(process_type))) { | 616 (!delegate || delegate->ShouldSendMachPort(process_type))) { |
| 563 SendTaskPortToParentProcess(); | 617 SendTaskPortToParentProcess(); |
| 564 } | 618 } |
| 565 #elif defined(OS_WIN) | 619 #elif defined(OS_WIN) |
| 620 // This must be done early enough since some helper functions like | |
| 621 // IsTouchEnanbled, needed to load resources, may call into the theme dll. | |
| 622 EnableThemeSupportOnAllWindowStations(); | |
| 566 #if defined(ENABLE_HIDPI) | 623 #if defined(ENABLE_HIDPI) |
| 567 ui::EnableHighDPISupport(); | 624 ui::EnableHighDPISupport(); |
| 568 #endif | 625 #endif |
| 569 SetupCRT(command_line); | 626 SetupCRT(command_line); |
| 570 #endif | 627 #endif |
| 571 | 628 |
| 572 #if defined(OS_POSIX) | 629 #if defined(OS_POSIX) |
| 573 if (!process_type.empty()) { | 630 if (!process_type.empty()) { |
| 574 // When you hit Ctrl-C in a terminal running the browser | 631 // When you hit Ctrl-C in a terminal running the browser |
| 575 // process, a SIGINT is delivered to the entire process group. | 632 // process, a SIGINT is delivered to the entire process group. |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 709 | 766 |
| 710 DISALLOW_COPY_AND_ASSIGN(ContentMainRunnerImpl); | 767 DISALLOW_COPY_AND_ASSIGN(ContentMainRunnerImpl); |
| 711 }; | 768 }; |
| 712 | 769 |
| 713 // static | 770 // static |
| 714 ContentMainRunner* ContentMainRunner::Create() { | 771 ContentMainRunner* ContentMainRunner::Create() { |
| 715 return new ContentMainRunnerImpl(); | 772 return new ContentMainRunnerImpl(); |
| 716 } | 773 } |
| 717 | 774 |
| 718 } // namespace content | 775 } // namespace content |
| OLD | NEW |