Index: content/browser/browser_main.cc |
diff --git a/content/browser/browser_main.cc b/content/browser/browser_main.cc |
index c0ef41ef31fe63f1c4e0bdaf71513f2b50626d9a..9627f36b2ea9bb8d79f8469aed2ab553f3b3007b 100644 |
--- a/content/browser/browser_main.cc |
+++ b/content/browser/browser_main.cc |
@@ -8,54 +8,17 @@ |
#include "base/command_line.h" |
#include "base/debug/trace_event.h" |
#include "base/logging.h" |
-#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 "base/tracked_objects.h" |
+#include "content/browser/browser_main_loop.h" |
#include "content/browser/browser_thread.h" |
#include "content/browser/notification_service_impl.h" |
-#include "content/common/hi_res_timer_manager.h" |
#include "content/common/main_function_params.h" |
-#include "content/common/sandbox_policy.h" |
-#include "content/public/browser/content_browser_client.h" |
#include "content/public/common/content_switches.h" |
-#include "content/public/common/result_codes.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 "content/common/sandbox_policy.h" |
#include "sandbox/src/sandbox.h" |
-#include "ui/base/l10n/l10n_util_win.h" |
-#endif |
- |
-#if defined(OS_LINUX) |
-#include <glib-object.h> |
-#endif |
- |
-#if defined(OS_CHROMEOS) |
-#include <dbus/dbus-glib.h> |
-#endif |
- |
-#if defined(OS_POSIX) && !defined(OS_MACOSX) |
-#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) |
-#include "ui/gfx/gtk_util.h" |
#endif |
namespace { |
@@ -79,292 +42,14 @@ void InitializeBrokerServices(const MainFunctionParams& parameters, |
} |
} |
} |
-#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(OS_LINUX) |
-static void GLibLogHandler(const gchar* log_domain, |
- GLogLevelFlags log_level, |
- const gchar* message, |
- gpointer userdata) { |
- if (!log_domain) |
- log_domain = "<unknown>"; |
- if (!message) |
- message = "<no message>"; |
- |
- if (strstr(message, "Loading IM context type") || |
- strstr(message, "wrong ELF class: ELFCLASS64")) { |
- // http://crbug.com/9643 |
- // Until we have a real 64-bit build or all of these 32-bit package issues |
- // are sorted out, don't fatal on ELF 32/64-bit mismatch warnings and don't |
- // spam the user with more than one of them. |
- static bool alerted = false; |
- if (!alerted) { |
- LOG(ERROR) << "Bug 9643: " << log_domain << ": " << message; |
- alerted = true; |
- } |
- } else if (strstr(message, "Theme file for default has no") || |
- strstr(message, "Theme directory") || |
- strstr(message, "theme pixmap")) { |
- LOG(ERROR) << "GTK theme error: " << message; |
- } else if (strstr(message, "gtk_drag_dest_leave: assertion")) { |
- LOG(ERROR) << "Drag destination deleted: http://crbug.com/18557"; |
- } else if (strstr(message, "Out of memory") && |
- strstr(log_domain, "<unknown>")) { |
- LOG(ERROR) << "DBus call timeout or out of memory: " |
- << "http://crosbug.com/15496"; |
- } else if (strstr(message, "XDG_RUNTIME_DIR variable not set")) { |
- LOG(ERROR) << message << " (http://bugs.chromium.org/97293)"; |
- } else { |
- LOG(DFATAL) << log_domain << ": " << message; |
- } |
-} |
- |
-static void SetUpGLibLogHandler() { |
- // Register GLib-handled assertions to go through our logging system. |
- const char* kLogDomains[] = { NULL, "Gtk", "Gdk", "GLib", "GLib-GObject" }; |
- for (size_t i = 0; i < arraysize(kLogDomains); i++) { |
- g_log_set_handler(kLogDomains[i], |
- static_cast<GLogLevelFlags>(G_LOG_FLAG_RECURSION | |
- G_LOG_FLAG_FATAL | |
- G_LOG_LEVEL_ERROR | |
- G_LOG_LEVEL_CRITICAL | |
- G_LOG_LEVEL_WARNING), |
- GLibLogHandler, |
- NULL); |
- } |
-} |
-#endif |
+bool g_exited_main_message_loop = false; |
} // namespace |
namespace content { |
-BrowserMainParts::BrowserMainParts(const MainFunctionParams& parameters) |
- : parameters_(parameters), |
- parsed_command_line_(parameters.command_line_), |
- result_code_(content::RESULT_CODE_NORMAL_EXIT) { |
-#if defined(OS_WIN) |
- OleInitialize(NULL); |
-#endif |
-} |
- |
-BrowserMainParts::~BrowserMainParts() { |
-#if defined(OS_WIN) |
- OleUninitialize(); |
-#endif |
-} |
- |
-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::kDisableSSLFalseStart)) |
- net::SSLConfigService::DisableFalseStart(); |
- if (parsed_command_line().HasSwitch(switches::kEnableSSLCachedInfo)) |
- net::SSLConfigService::EnableCachedInfo(); |
- if (parsed_command_line().HasSwitch(switches::kEnableOriginBoundCerts)) |
- net::SSLConfigService::EnableOriginBoundCerts(); |
- if (parsed_command_line().HasSwitch( |
- switches::kEnableDNSCertProvenanceChecking)) { |
- net::SSLConfigService::EnableDNSCertProvenanceChecking(); |
- } |
- |
- // TODO(abarth): Should this move to InitializeNetworkOptions? This doesn't |
- // seem dependent on SSL initialization(). |
- if (parsed_command_line().HasSwitch(switches::kEnableTcpFastOpen)) |
- net::set_tcp_fastopen_enabled(true); |
- |
- PostEarlyInitialization(); |
-} |
- |
-void BrowserMainParts::MainMessageLoopStart() { |
- PreMainMessageLoopStart(); |
- |
-#if defined(OS_WIN) |
- // 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)); |
- |
- InitializeMainThread(); |
- |
- system_monitor_.reset(new base::SystemMonitor); |
- hi_res_timer_manager_.reset(new HighResolutionTimerManager); |
- |
- network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); |
- |
- PostMainMessageLoopStart(); |
-} |
- |
-static bool g_exited_main_message_loop = false; |
- |
-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, ""); |
- |
- g_exited_main_message_loop = true; |
- |
- PostMainMessageLoopRun(); |
-} |
- |
-void BrowserMainParts::InitializeMainThread() { |
- const char* kThreadName = "CrBrowserMain"; |
- base::PlatformThread::SetName(kThreadName); |
- main_message_loop().set_thread_name(kThreadName); |
- |
-#if defined(TRACK_ALL_TASK_OBJECTS) |
- tracked_objects::ThreadData::InitializeThreadContext(kThreadName); |
-#endif // TRACK_ALL_TASK_OBJECTS |
- |
- // Register the main thread by instantiating it, but don't call any methods. |
- main_thread_.reset(new BrowserThread(BrowserThread::UI, |
- MessageLoop::current())); |
-} |
- |
-void BrowserMainParts::InitializeToolkit() { |
- // TODO(evan): this function is rather subtle, due to the variety |
- // of intersecting ifdefs we have. To keep it easy to follow, there |
- // are no #else branches on any #ifs. |
- |
-#if defined(OS_LINUX) |
- // We want to call g_thread_init(), but in some codepaths (tests) it |
- // is possible it has already been called. In older versions of |
- // GTK, it is an error to call g_thread_init twice; unfortunately, |
- // the API to tell whether it has been called already was also only |
- // added in a newer version of GTK! Thankfully, this non-intuitive |
- // check is actually equivalent and sufficient to work around the |
- // error. |
- if (!g_thread_supported()) |
- g_thread_init(NULL); |
- // Glib type system initialization. Needed at least for gconf, |
- // used in net/proxy/proxy_config_service_linux.cc. Most likely |
- // this is superfluous as gtk_init() ought to do this. It's |
- // definitely harmless, so retained as a reminder of this |
- // requirement for gconf. |
- g_type_init(); |
-#if defined(OS_CHROMEOS) |
- // ChromeOS still uses dbus-glib, so initialize its threading here. |
- // TODO(satorux, stevenjb): remove this once it is no longer needed. |
- dbus_g_thread_init(); |
-#endif |
-#if !defined(USE_AURA) |
- gfx::GtkInitFromCommandLine(parameters().command_line_); |
-#endif |
- SetUpGLibLogHandler(); |
-#endif |
- |
-#if defined(TOOLKIT_GTK) |
- // It is important for this to happen before the first run dialog, as it |
- // styles the dialog as well. |
- gfx::InitRCStyles(); |
-#endif |
- |
-#if defined(OS_WIN) |
- // Init common control sex. |
- INITCOMMONCONTROLSEX config; |
- config.dwSize = sizeof(config); |
- config.dwICC = ICC_WIN95_CLASSES; |
- if (!InitCommonControlsEx(&config)) |
- LOG_GETLASTERROR(FATAL); |
-#endif |
- |
- ToolkitInitialized(); |
-} |
- |
-void BrowserMainParts::PreEarlyInitialization() { |
-} |
- |
-void BrowserMainParts::PostEarlyInitialization() { |
-} |
- |
-void BrowserMainParts::PreMainMessageLoopStart() { |
-} |
- |
-void BrowserMainParts::PostMainMessageLoopStart() { |
-} |
- |
-void BrowserMainParts::PreMainMessageLoopRun() { |
-} |
- |
-void BrowserMainParts::MainMessageLoopRun() { |
- if (parameters().ui_task) |
- MessageLoopForUI::current()->PostTask(FROM_HERE, parameters().ui_task); |
- |
-#if defined(OS_MACOSX) |
- MessageLoopForUI::current()->Run(); |
-#else |
- MessageLoopForUI::current()->RunWithDispatcher(NULL); |
-#endif |
-} |
- |
-void BrowserMainParts::PostMainMessageLoopRun() { |
-} |
- |
-void BrowserMainParts::ToolkitInitialized() { |
-} |
- |
bool ExitedMainMessageLoop() { |
return g_exited_main_message_loop; |
} |
@@ -377,18 +62,17 @@ int BrowserMain(const MainFunctionParams& parameters) { |
NotificationServiceImpl main_notification_service; |
- scoped_ptr<content::BrowserMainParts> parts( |
- content::GetContentClient()->browser()->CreateBrowserMainParts( |
- parameters)); |
- if (!parts.get()) |
- parts.reset(new content::BrowserMainParts(parameters)); |
+ scoped_ptr<content::BrowserMainLoop> main_loop( |
+ new content::BrowserMainLoop(parameters)); |
+ |
+ main_loop->Init(); |
- parts->EarlyInitialization(); |
+ main_loop->EarlyInitialization(); |
// Must happen before we try to use a message loop or display any UI. |
- parts->InitializeToolkit(); |
+ main_loop->InitializeToolkit(); |
- parts->MainMessageLoopStart(); |
+ main_loop->MainMessageLoopStart(); |
// WARNING: If we get a WM_ENDSESSION, objects created on the stack here |
// are NOT deleted. If you need something to run during WM_ENDSESSION add it |
@@ -434,8 +118,9 @@ int BrowserMain(const MainFunctionParams& parameters) { |
base::StatisticsRecorder statistics; |
- parts->RunMainMessageLoopParts(); |
+ main_loop->RunMainMessageLoopParts(&g_exited_main_message_loop); |
TRACE_EVENT_END_ETW("BrowserMain", 0, 0); |
- return parts->result_code(); |
+ |
+ return main_loop->GetResultCode(); |
} |