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

Unified Diff: content/browser/browser_main.cc

Issue 7840041: Refactor some more BrowserMain code. Move core code that's required by all embedders to content. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: review comments Created 9 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/browser_main.h ('k') | content/common/content_switches.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/browser_main.cc
===================================================================
--- content/browser/browser_main.cc (revision 100153)
+++ content/browser/browser_main.cc (working copy)
@@ -11,26 +11,38 @@
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
#include "base/system_monitor/system_monitor.h"
+#include "base/threading/thread_restrictions.h"
#include "content/browser/browser_thread.h"
#include "content/browser/content_browser_client.h"
#include "content/common/content_switches.h"
#include "content/common/hi_res_timer_manager.h"
#include "content/common/main_function_params.h"
+#include "content/common/result_codes.h"
#include "content/common/sandbox_policy.h"
+#include "crypto/nss_util.h"
#include "net/base/network_change_notifier.h"
#include "net/base/ssl_config_service.h"
+#include "net/socket/client_socket_factory.h"
#include "net/socket/tcp_client_socket.h"
#if defined(OS_WIN)
#include <windows.h>
#include <commctrl.h>
+#include <ole2.h>
#include <shellapi.h>
+#include "base/win/scoped_com_initializer.h"
+#include "net/base/winsock_init.h"
#include "sandbox/src/sandbox.h"
+#include "ui/base/l10n/l10n_util_win.h"
#endif
#if defined(OS_POSIX) && !defined(OS_MACOSX)
#include <dbus/dbus-glib.h>
+#include <sys/stat.h>
+
+#include "content/browser/renderer_host/render_sandbox_host_linux.h"
+#include "content/browser/zygote_host_linux.h"
#endif
#if defined(TOOLKIT_USES_GTK)
@@ -39,11 +51,10 @@
namespace {
-// Windows-specific initialization code for the sandbox broker services. This
-// is just a NOP on non-Windows platforms to reduce ifdefs later on.
+#if defined(OS_WIN)
+// Windows-specific initialization code for the sandbox broker services.
void InitializeBrokerServices(const MainFunctionParams& parameters,
const CommandLine& parsed_command_line) {
-#if defined(OS_WIN)
sandbox::BrokerServices* broker_services =
parameters.sandbox_info_.BrokerServices();
if (broker_services) {
@@ -58,8 +69,36 @@
policy->Release();
}
}
+}
+#elif defined(OS_POSIX) && !defined(OS_MACOSX)
+void SetupSandbox(const CommandLine& parsed_command_line) {
+ // TODO(evanm): move this into SandboxWrapper; I'm just trying to move this
+ // code en masse out of chrome_main for now.
+ const char* sandbox_binary = NULL;
+ struct stat st;
+
+ // In Chromium branded builds, developers can set an environment variable to
+ // use the development sandbox. See
+ // http://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment
+ if (stat("/proc/self/exe", &st) == 0 && st.st_uid == getuid())
+ sandbox_binary = getenv("CHROME_DEVEL_SANDBOX");
+
+#if defined(LINUX_SANDBOX_PATH)
+ if (!sandbox_binary)
+ sandbox_binary = LINUX_SANDBOX_PATH;
#endif
+
+ std::string sandbox_cmd;
+ if (sandbox_binary && !parsed_command_line.HasSwitch(switches::kNoSandbox))
+ sandbox_cmd = sandbox_binary;
+
+ // Tickle the sandbox host and zygote host so they fork now.
+ RenderSandboxHostLinux* shost = RenderSandboxHostLinux::GetInstance();
+ shost->Init(sandbox_cmd);
+ ZygoteHost* zhost = ZygoteHost::GetInstance();
+ zhost->Init(sandbox_cmd);
}
+#endif
#if defined(TOOLKIT_USES_GTK)
static void GLibLogHandler(const gchar* log_domain,
@@ -119,7 +158,8 @@
BrowserMainParts::BrowserMainParts(const MainFunctionParams& parameters)
: parameters_(parameters),
- parsed_command_line_(parameters.command_line_) {
+ parsed_command_line_(parameters.command_line_),
+ result_code_(content::RESULT_CODE_NORMAL_EXIT) {
}
BrowserMainParts::~BrowserMainParts() {
@@ -128,11 +168,32 @@
void BrowserMainParts::EarlyInitialization() {
PreEarlyInitialization();
+#if defined(OS_WIN)
+ net::EnsureWinsockInit();
+#endif
+
+ // Use NSS for SSL by default.
+ // The default client socket factory uses NSS for SSL by default on
+ // Windows and Mac.
+#if defined(OS_WIN) || defined(OS_MACOSX)
+ if (parsed_command_line().HasSwitch(switches::kUseSystemSSL)) {
+ net::ClientSocketFactory::UseSystemSSL();
+ } else {
+#elif defined(USE_NSS)
+ if (true) {
+#else
+ if (false) {
+#endif
+ // We want to be sure to init NSPR on the main thread.
+ crypto::EnsureNSPRInit();
+ }
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+ SetupSandbox(parsed_command_line());
+#endif
+
if (parsed_command_line().HasSwitch(switches::kEnableBenchmarking))
base::FieldTrial::EnableBenchmarking();
-
- InitializeSSL();
-
if (parsed_command_line().HasSwitch(switches::kDisableSSLFalseStart))
net::SSLConfigService::DisableFalseStart();
if (parsed_command_line().HasSwitch(switches::kEnableSSLCachedInfo))
@@ -145,7 +206,7 @@
}
// TODO(abarth): Should this move to InitializeNetworkOptions? This doesn't
- // seem dependent on InitializeSSL().
+ // seem dependent on SSL initialization().
if (parsed_command_line().HasSwitch(switches::kEnableTcpFastOpen))
net::set_tcp_fastopen_enabled(true);
@@ -155,6 +216,17 @@
void BrowserMainParts::MainMessageLoopStart() {
PreMainMessageLoopStart();
+#if defined(OS_WIN)
+ OleInitialize(NULL);
+
+ // If we're running tests (ui_task is non-null), then the ResourceBundle
+ // has already been initialized.
+ if (!parameters().ui_task) {
+ // Override the configured locale with the user's preferred UI language.
+ l10n_util::OverrideLocaleWithUILanguageList();
+ }
+#endif
+
main_message_loop_.reset(new MessageLoop(MessageLoop::TYPE_UI));
// TODO(viettrungluu): should these really go before setting the thread name?
@@ -168,6 +240,19 @@
PostMainMessageLoopStart();
}
+void BrowserMainParts::RunMainMessageLoopParts() {
+ PreMainMessageLoopRun();
+
+ TRACE_EVENT_BEGIN_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
+ // If the UI thread blocks, the whole UI is unresponsive.
+ // Do not allow disk IO from the UI thread.
+ base::ThreadRestrictions::SetIOAllowed(false);
+ MainMessageLoopRun();
+ TRACE_EVENT_END_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
+
+ PostMainMessageLoopRun();
+}
+
void BrowserMainParts::InitializeMainThread() {
const char* kThreadName = "CrBrowserMain";
base::PlatformThread::SetName(kThreadName);
@@ -214,7 +299,6 @@
#endif
#if defined(OS_WIN)
- // Init common control sex.
INITCOMMONCONTROLSEX config;
config.dwSize = sizeof(config);
config.dwICC = ICC_WIN95_CLASSES;
@@ -237,16 +321,23 @@
void BrowserMainParts::PostMainMessageLoopStart() {
}
-void BrowserMainParts::InitializeSSL() {
+void BrowserMainParts::PreMainMessageLoopRun() {
}
-void BrowserMainParts::ToolkitInitialized() {
+void BrowserMainParts::MainMessageLoopRun() {
+#if defined(OS_MACOSX)
+ MessageLoopForUI::current()->Run();
+#else
+ MessageLoopForUI::current()->Run(NULL);
+#endif
}
-int BrowserMainParts::TemporaryContinue() {
- return 0;
+void BrowserMainParts::PostMainMessageLoopRun() {
}
+void BrowserMainParts::ToolkitInitialized() {
+}
+
} // namespace content
// Main routine for running as the Browser process.
@@ -288,32 +379,29 @@
// Thanks!
// TODO(viettrungluu): put the remainder into BrowserMainParts
- const CommandLine& parsed_command_line = parameters.command_line_;
-#if defined(OS_WIN) && !defined(NO_TCMALLOC)
+#if defined(OS_WIN)
+#if !defined(NO_TCMALLOC)
// When linking shared libraries, NO_TCMALLOC is defined, and dynamic
// allocator selection is not supported.
// Make this call before going multithreaded, or spawning any subprocesses.
base::allocator::SetupSubprocessAllocator();
-#endif // OS_WIN
-
+#endif
// The broker service initialization needs to run early because it will
// initialize the sandbox broker, which requires the process to swap its
// window station. During this time all the UI will be broken. This has to
// run before threads and windows are created.
- InitializeBrokerServices(parameters, parsed_command_line);
+ InitializeBrokerServices(parameters, parameters.command_line_);
+ base::win::ScopedCOMInitializer com_initializer;
+#endif // OS_WIN
+
// Initialize histogram statistics gathering system.
base::StatisticsRecorder statistics;
- // TODO(jam): bring the content parts from this chrome function here.
- int result_code = parts->TemporaryContinue();
+ parts->RunMainMessageLoopParts();
- // Release BrowserMainParts here, before shutting down CrosLibrary, since
- // some of the classes initialized there have CrosLibrary dependencies.
- parts.reset(NULL);
-
TRACE_EVENT_END_ETW("BrowserMain", 0, 0);
- return result_code;
+ return parts->result_code();
}
« no previous file with comments | « content/browser/browser_main.h ('k') | content/common/content_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698