summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-07 00:58:04 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-07 00:58:04 +0000
commitf967b723292a0988bb3789094d5e1641caa0c2f8 (patch)
treec707a6fed79ed5fabc4d7e01d1089eff6bac3e0c
parent557d842f64c7a8e33c0fceaf564506917b4a10b8 (diff)
downloadchromium_src-f967b723292a0988bb3789094d5e1641caa0c2f8.zip
chromium_src-f967b723292a0988bb3789094d5e1641caa0c2f8.tar.gz
chromium_src-f967b723292a0988bb3789094d5e1641caa0c2f8.tar.bz2
Start moving code from BrowserMain to content, so that it can be reused by all embedders of content. I've based the refactoring on the existing BrowserMainParts. This is the first step; I didn't want to do it all at the same time because it would be too big. Remaining tasks:-rename the browser_main files in chrome to chrome_browser_main-move the OS specific implementations of BrowserMainParts that are needed for content-finish splitting the remaining BrowserMain function (now that's in TemporaryContinue())BUG=90445
Review URL: http://codereview.chromium.org/7779040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@99884 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/chrome_main.cc64
-rw-r--r--chrome/browser/browser_main.cc494
-rw-r--r--chrome/browser/browser_main.h124
-rw-r--r--chrome/browser/browser_main_gtk.cc16
-rw-r--r--chrome/browser/browser_main_gtk.h3
-rw-r--r--chrome/browser/browser_main_mac.h20
-rw-r--r--chrome/browser/browser_main_mac.mm154
-rw-r--r--chrome/browser/browser_main_posix.cc5
-rw-r--r--chrome/browser/browser_main_posix.h10
-rw-r--r--chrome/browser/browser_main_unittest.cc35
-rw-r--r--chrome/browser/browser_main_win.cc67
-rw-r--r--chrome/browser/browser_main_win.h11
-rw-r--r--chrome/browser/browser_process_impl.cc2
-rw-r--r--chrome/browser/chrome_content_browser_client.cc23
-rw-r--r--chrome/browser/chrome_content_browser_client.h2
-rw-r--r--chrome/browser/chromeos/browser_main_chromeos.cc41
-rw-r--r--chrome/browser/chromeos/browser_main_chromeos.h11
-rw-r--r--chrome/browser/chromeos/net/network_change_notifier_chromeos.cc2
-rw-r--r--chrome/browser/ui/gtk/gtk_util.cc29
-rw-r--r--chrome/browser/ui/gtk/gtk_util.h3
-rw-r--r--chrome/chrome_browser.gypi1
-rw-r--r--chrome/chrome_dll.gypi1
-rw-r--r--chrome/common/chrome_constants.cc5
-rw-r--r--chrome/common/chrome_constants.h4
-rw-r--r--chrome/common/chrome_switches.cc25
-rw-r--r--chrome/common/chrome_switches.h7
-rw-r--r--content/app/content_main.cc52
-rw-r--r--content/browser/browser_main.cc319
-rw-r--r--content/browser/browser_main.h133
-rw-r--r--content/browser/content_browser_client.h12
-rw-r--r--content/browser/mock_content_browser_client.cc5
-rw-r--r--content/browser/mock_content_browser_client.h2
-rw-r--r--content/common/content_constants.cc13
-rw-r--r--content/common/content_constants.h4
-rw-r--r--content/common/content_switches.cc30
-rw-r--r--content/common/content_switches.h7
-rw-r--r--content/content_browser.gypi2
-rw-r--r--ui/gfx/gtk_util.cc29
-rw-r--r--ui/gfx/gtk_util.h3
39 files changed, 988 insertions, 782 deletions
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc
index 8cf2898..0bedac4 100644
--- a/chrome/app/chrome_main.cc
+++ b/chrome/app/chrome_main.cc
@@ -6,13 +6,12 @@
#include "base/lazy_instance.h"
#include "base/message_loop.h"
#include "base/metrics/stats_counters.h"
-#include "base/metrics/stats_table.h"
#include "base/path_service.h"
#include "base/process_util.h"
#include "base/stringprintf.h"
-#include "base/string_number_conversions.h"
#include "base/utf_string_conversions.h"
#include "build/build_config.h"
+#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/diagnostics/diagnostics_main.h"
#include "chrome/common/chrome_constants.h"
@@ -33,7 +32,6 @@
#include "content/common/content_client.h"
#include "content/common/content_counters.h"
#include "content/common/content_paths.h"
-#include "ipc/ipc_switches.h"
#include "media/base/media.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/ui_base_switches.h"
@@ -92,6 +90,8 @@
#endif
#if !defined(NACL_WIN64) // We don't build the this code on win nacl64.
+base::LazyInstance<chrome::ChromeContentBrowserClient>
+ g_chrome_content_browser_client(base::LINKER_INITIALIZED);
base::LazyInstance<chrome::ChromeContentRendererClient>
g_chrome_content_renderer_client(base::LINKER_INITIALIZED);
base::LazyInstance<chrome::ChromeContentUtilityClient>
@@ -101,7 +101,6 @@ base::LazyInstance<chrome::ChromeContentUtilityClient>
base::LazyInstance<chrome::ChromeContentPluginClient>
g_chrome_content_plugin_client(base::LINKER_INITIALIZED);
-extern int BrowserMain(const MainFunctionParams&);
extern int RendererMain(const MainFunctionParams&);
extern int NaClMain(const MainFunctionParams&);
extern int ProfileImportMain(const MainFunctionParams&);
@@ -279,7 +278,12 @@ void InitializeChromeContentRendererClient() {
}
void InitializeChromeContentClient(const std::string& process_type) {
- if (process_type == switches::kPluginProcess) {
+ if (process_type.empty()) {
+#if !defined(NACL_WIN64) // We don't build the this code on win nacl64.
+ content::GetContentClient()->set_browser(
+ &g_chrome_content_browser_client.Get());
+#endif
+ } else if (process_type == switches::kPluginProcess) {
content::GetContentClient()->set_plugin(
&g_chrome_content_plugin_client.Get());
} else if (process_type == switches::kRendererProcess ||
@@ -339,27 +343,6 @@ void SetMacProcessName(const std::string& process_type) {
#endif // defined(OS_MACOSX)
-void InitializeStatsTable(base::ProcessId browser_pid,
- const CommandLine& command_line) {
- // Initialize the Stats Counters table. With this initialized,
- // the StatsViewer can be utilized to read counters outside of
- // Chrome. These lines can be commented out to effectively turn
- // counters 'off'. The table is created and exists for the life
- // of the process. It is not cleaned up.
- if (command_line.HasSwitch(switches::kEnableStatsTable) ||
- command_line.HasSwitch(switches::kEnableBenchmarking)) {
- // NOTIMPLEMENTED: we probably need to shut this down correctly to avoid
- // leaking shared memory regions on posix platforms.
- std::string statsfile =
- base::StringPrintf("%s-%u",
- chrome::kStatsFilename,
- static_cast<unsigned int>(browser_pid));
- base::StatsTable *stats_table = new base::StatsTable(statsfile,
- chrome::kStatsMaxThreads, chrome::kStatsMaxCounters);
- base::StatsTable::set_current(stats_table);
- }
-}
-
#if defined(OS_POSIX)
// Check for --version and --product-version; return true if we encountered
// one of these switches and should exit now.
@@ -570,27 +553,6 @@ class ChromeMainDelegate : public content::ContentMainDelegate {
if (!user_data_dir.empty())
CHECK(PathService::Override(chrome::DIR_USER_DATA, user_data_dir));
- base::ProcessId browser_pid = base::GetCurrentProcId();
- if (!process_type.empty() &&
-#if defined(OS_MACOSX)
- process_type != switches::kRelauncherProcess &&
-#endif
- process_type != switches::kServiceProcess) {
-#if defined(OS_WIN) || defined(OS_MACOSX)
- std::string channel_name =
- command_line.GetSwitchValueASCII(switches::kProcessChannelID);
-
- int browser_pid_int;
- base::StringToInt(channel_name, &browser_pid_int);
- browser_pid = static_cast<base::ProcessId>(browser_pid_int);
- DCHECK_NE(browser_pid_int, 0);
-#elif defined(OS_POSIX)
- // On linux, we're in the zygote here; so we need the parent process' id.
- browser_pid = base::GetParentProcessId(base::GetCurrentProcId());
-#endif
- }
- InitializeStatsTable(browser_pid, command_line);
-
startup_timer_.reset(new base::StatsScope<base::StatsCounterTimer>
(content::Counters::chrome_main()));
@@ -694,7 +656,6 @@ class ChromeMainDelegate : public content::ContentMainDelegate {
const std::string& process_type,
const MainFunctionParams& main_function_params) OVERRIDE {
static const MainFunction kMainFunctions[] = {
- { "", BrowserMain },
// An extension process is just a renderer process. We use a different
// command line argument to differentiate crash reports.
{ switches::kExtensionProcess, RendererMain },
@@ -775,13 +736,6 @@ class ChromeMainDelegate : public content::ContentMainDelegate {
std::string process_type =
command_line.GetSwitchValueASCII(switches::kProcessType);
- // The StatsTable must be initialized in each process; we already
- // initialized for the browser process, now we need to initialize
- // within the new processes as well.
- pid_t browser_pid = base::GetParentProcessId(
- base::GetParentProcessId(base::GetCurrentProcId()));
- InitializeStatsTable(browser_pid, command_line);
-
#if defined(USE_LINUX_BREAKPAD)
// Needs to be called after we have chrome::DIR_USER_DATA. BrowserMain sets
// this up for the browser process in a different manner.
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc
index 43a888e..298cb52 100644
--- a/chrome/browser/browser_main.cc
+++ b/chrome/browser/browser_main.cc
@@ -8,7 +8,6 @@
#include <string>
#include <vector>
-#include "base/allocator/allocator_shim.h"
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/debug/trace_event.h"
@@ -24,7 +23,6 @@
#include "base/string_split.h"
#include "base/string_util.h"
#include "base/sys_string_conversions.h"
-#include "base/system_monitor/system_monitor.h"
#include "base/threading/platform_thread.h"
#include "base/threading/thread_restrictions.h"
#include "base/time.h"
@@ -36,7 +34,6 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_impl.h"
#include "chrome/browser/browser_shutdown.h"
-#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/extensions/extension_protocols.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -96,7 +93,6 @@
#include "content/browser/renderer_host/resource_dispatcher_host.h"
#include "content/common/child_process.h"
#include "content/common/content_client.h"
-#include "content/common/hi_res_timer_manager.h"
#include "content/common/main_function_params.h"
#include "grit/app_locale_settings.h"
#include "grit/chromium_strings.h"
@@ -104,13 +100,11 @@
#include "grit/platform_locale_settings.h"
#include "net/base/cookie_monster.h"
#include "net/base/net_module.h"
-#include "net/base/network_change_notifier.h"
#include "net/http/http_basic_stream.h"
#include "net/http/http_network_layer.h"
#include "net/http/http_stream_factory.h"
#include "net/socket/client_socket_pool_base.h"
#include "net/socket/client_socket_pool_manager.h"
-#include "net/socket/tcp_client_socket.h"
#include "net/spdy/spdy_session.h"
#include "net/spdy/spdy_session_pool.h"
#include "net/url_request/url_request.h"
@@ -125,8 +119,6 @@
#endif
#if defined(OS_POSIX) && !defined(OS_MACOSX)
-#include <dbus/dbus-glib.h>
-
#include "chrome/browser/browser_main_gtk.h"
#include "chrome/browser/ui/gtk/gtk_util.h"
#endif
@@ -148,7 +140,6 @@
#include "chrome/browser/chromeos/login/ownership_service.h"
#include "chrome/browser/chromeos/login/screen_locker.h"
#include "chrome/browser/chromeos/login/user_manager.h"
-#include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h"
#include "chrome/browser/chromeos/system_key_event_listener.h"
#include "chrome/browser/chromeos/user_cros_settings_provider.h"
#include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h"
@@ -162,9 +153,6 @@
// progress and should not be taken as an indication of a real refactoring.
#if defined(OS_WIN)
-#include <windows.h>
-#include <commctrl.h>
-#include <shellapi.h>
#include "base/environment.h" // For PreRead experiment.
#include "base/win/scoped_com_initializer.h"
@@ -180,11 +168,9 @@
#include "chrome/installer/util/install_util.h"
#include "chrome/installer/util/shell_util.h"
#include "content/browser/user_metrics.h"
-#include "content/common/sandbox_policy.h"
#include "net/base/net_util.h"
#include "net/base/sdch_manager.h"
#include "printing/printed_document.h"
-#include "sandbox/src/sandbox.h"
#include "ui/base/l10n/l10n_util_win.h"
#include "ui/gfx/platform_font_win.h"
#endif // defined(OS_WIN)
@@ -439,28 +425,6 @@ PrefService* InitializeLocalState(const CommandLine& parsed_command_line,
return local_state;
}
-// Windows-specific initialization code for the sandbox broker services. This
-// is just a NOP on non-Windows platforms to reduce ifdefs later on.
-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) {
- sandbox::InitBrokerServices(broker_services);
- if (!parsed_command_line.HasSwitch(switches::kNoSandbox)) {
- bool use_winsta = !parsed_command_line.HasSwitch(
- switches::kDisableAltWinstation);
- // Precreate the desktop and window station used by the renderers.
- sandbox::TargetPolicy* policy = broker_services->CreatePolicy();
- sandbox::ResultCode result = policy->CreateAlternateDesktop(use_winsta);
- CHECK(sandbox::SBOX_ERROR_FAILED_TO_SWITCH_BACK_WINSTATION != result);
- policy->Release();
- }
- }
-#endif
-}
-
// Initializes the profile, possibly doing some user prompting to pick a
// fallback profile. Returns the newly created profile, or NULL if startup
// should not continue.
@@ -534,117 +498,6 @@ int GetMinimumFontSize() {
#endif
-#if defined(TOOLKIT_USES_GTK)
-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 {
- 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
-
-void InitializeToolkit(const MainFunctionParams& parameters) {
- // 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(TOOLKIT_USES_GTK)
- // 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();
- // We use glib-dbus for geolocation and it's possible other libraries
- // (e.g. gnome-keyring) will use it, so initialize its threading here
- // as well.
- dbus_g_thread_init();
- gfx::GtkInitFromCommandLine(parameters.command_line_);
- 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.
- gtk_util::InitRCStyles();
-#endif
-
-#if defined(TOOLKIT_VIEWS)
- // The delegate needs to be set before any UI is created so that windows
- // display the correct icon.
- if (!views::ViewsDelegate::views_delegate)
- views::ViewsDelegate::views_delegate = new ChromeViewsDelegate;
-
- // TODO(beng): Move to WidgetImpl and implement on Windows too!
- if (parameters.command_line_.HasSwitch(switches::kDebugViewsPaint))
- views::Widget::SetDebugPaintEnabled(true);
-#endif
-
-#if defined(OS_WIN)
- gfx::PlatformFontWin::adjust_font_callback = &AdjustUIFont;
- gfx::PlatformFontWin::get_minimum_font_size_callback = &GetMinimumFontSize;
-
- // Init common control sex.
- INITCOMMONCONTROLSEX config;
- config.dwSize = sizeof(config);
- config.dwICC = ICC_WIN95_CLASSES;
- if (!InitCommonControlsEx(&config))
- LOG_GETLASTERROR(FATAL);
-#endif
-}
-
#if defined(OS_CHROMEOS)
// Class is used to login using passed username and password.
@@ -837,49 +690,24 @@ const char kMissingLocaleDataMessage[] =
// BrowserMainParts ------------------------------------------------------------
-BrowserMainParts::BrowserMainParts(const MainFunctionParams& parameters)
- : parameters_(parameters),
- parsed_command_line_(parameters.command_line_) {
-}
-
-BrowserMainParts::~BrowserMainParts() {
+ChromeBrowserMainParts::ChromeBrowserMainParts(
+ const MainFunctionParams& parameters)
+ : BrowserMainParts(parameters),
+ shutdown_watcher_(new ShutdownWatcherHelper()) {
+ // If we're running tests (ui_task is non-null).
+ if (parameters.ui_task)
+ browser_defaults::enable_help_app = false;
}
-// BrowserMainParts: |EarlyInitialization()| and related -----------------------
-
-void BrowserMainParts::EarlyInitialization() {
- PreEarlyInitialization();
-
- 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))
- 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 InitializeSSL().
- if (parsed_command_line().HasSwitch(switches::kEnableTcpFastOpen))
- net::set_tcp_fastopen_enabled(true);
-
- PostEarlyInitialization();
+ChromeBrowserMainParts::~ChromeBrowserMainParts() {
}
-void BrowserMainParts::SetupHistogramSynchronizer() {
+void ChromeBrowserMainParts::SetupHistogramSynchronizer() {
histogram_synchronizer_ = new HistogramSynchronizer();
}
// This will be called after the command-line has been mutated by about:flags
-MetricsService* BrowserMainParts::SetupMetricsAndFieldTrials(
+MetricsService* ChromeBrowserMainParts::SetupMetricsAndFieldTrials(
const CommandLine& parsed_command_line,
PrefService* local_state) {
// Must initialize metrics after labs have been converted into switches,
@@ -911,7 +739,7 @@ MetricsService* BrowserMainParts::SetupMetricsAndFieldTrials(
// run faster) uses 8. We would like to see how much of an effect this value has
// on browsing. Too large a value might cause us to run into SYN flood detection
// mechanisms.
-void BrowserMainParts::ConnectionFieldTrial() {
+void ChromeBrowserMainParts::ConnectionFieldTrial() {
const base::FieldTrial::Probability kConnectDivisor = 100;
const base::FieldTrial::Probability kConnectProbability = 1; // 1% prob.
@@ -960,7 +788,7 @@ void BrowserMainParts::ConnectionFieldTrial() {
// connection and instead show an error to the user. So we need to be
// conservative here. We've seen that some servers will close the socket after
// as short as 10 seconds. See http://crbug.com/84313 for more details.
-void BrowserMainParts::SocketTimeoutFieldTrial() {
+void ChromeBrowserMainParts::SocketTimeoutFieldTrial() {
const base::FieldTrial::Probability kIdleSocketTimeoutDivisor = 100;
// 1% probability for all experimental settings.
const base::FieldTrial::Probability kSocketTimeoutProbability = 1;
@@ -991,7 +819,7 @@ void BrowserMainParts::SocketTimeoutFieldTrial() {
}
}
-void BrowserMainParts::ProxyConnectionsFieldTrial() {
+void ChromeBrowserMainParts::ProxyConnectionsFieldTrial() {
const base::FieldTrial::Probability kProxyConnectionsDivisor = 100;
// 25% probability
const base::FieldTrial::Probability kProxyConnectionProbability = 1;
@@ -1037,7 +865,7 @@ void BrowserMainParts::ProxyConnectionsFieldTrial() {
// Http is still used for all requests.
// default group: no npn or spdy is involved. The "old" non-spdy
// chrome behavior.
-void BrowserMainParts::SpdyFieldTrial() {
+void ChromeBrowserMainParts::SpdyFieldTrial() {
if (parsed_command_line().HasSwitch(switches::kUseSpdy)) {
std::string spdy_mode =
parsed_command_line().GetSwitchValueASCII(switches::kUseSpdy);
@@ -1105,7 +933,7 @@ void BrowserMainParts::SpdyFieldTrial() {
// If --socket-reuse-policy is not specified, run an A/B test for choosing the
// warmest socket.
-void BrowserMainParts::WarmConnectionFieldTrial() {
+void ChromeBrowserMainParts::WarmConnectionFieldTrial() {
const CommandLine& command_line = parsed_command_line();
if (command_line.HasSwitch(switches::kSocketReusePolicy)) {
std::string socket_reuse_policy_str = command_line.GetSwitchValueASCII(
@@ -1146,7 +974,7 @@ void BrowserMainParts::WarmConnectionFieldTrial() {
// If neither --enable-connect-backup-jobs or --disable-connect-backup-jobs is
// specified, run an A/B test for automatically establishing backup TCP
// connections when a certain timeout value is exceeded.
-void BrowserMainParts::ConnectBackupJobsFieldTrial() {
+void ChromeBrowserMainParts::ConnectBackupJobsFieldTrial() {
if (parsed_command_line().HasSwitch(switches::kEnableConnectBackupJobs)) {
net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
true);
@@ -1174,7 +1002,7 @@ void BrowserMainParts::ConnectBackupJobsFieldTrial() {
// Test the impact on subsequent Google searches of getting suggestions from
// www.google.TLD instead of clients1.google.TLD.
-void BrowserMainParts::SuggestPrefixFieldTrial() {
+void ChromeBrowserMainParts::SuggestPrefixFieldTrial() {
const base::FieldTrial::Probability kSuggestPrefixDivisor = 100;
// 50% probability.
const base::FieldTrial::Probability kSuggestPrefixProbability = 50;
@@ -1186,40 +1014,11 @@ void BrowserMainParts::SuggestPrefixFieldTrial() {
// The field trial is detected directly, so we don't need to call anything.
}
-// BrowserMainParts: |MainMessageLoopStart()| and related ----------------------
-
-void BrowserMainParts::MainMessageLoopStart() {
- PreMainMessageLoopStart();
-
- main_message_loop_.reset(new MessageLoop(MessageLoop::TYPE_UI));
-
- // TODO(viettrungluu): should these really go before setting the thread name?
- system_monitor_.reset(new base::SystemMonitor);
- hi_res_timer_manager_.reset(new HighResolutionTimerManager);
-
- InitializeMainThread();
-
- network_change_notifier_.reset(net::NetworkChangeNotifier::Create());
-
- PostMainMessageLoopStart();
- Profiling::MainMessageLoopStarted();
-}
-
-void BrowserMainParts::InitializeMainThread() {
- const char* kThreadName = "CrBrowserMain";
- base::PlatformThread::SetName(kThreadName);
- main_message_loop().set_thread_name(kThreadName);
-
- // Register the main thread by instantiating it, but don't call any methods.
- main_thread_.reset(new BrowserThread(BrowserThread::UI,
- MessageLoop::current()));
-}
-
-// BrowserMainParts: |SetupMetricsAndFieldTrials()| related --------------------
+// ChromeBrowserMainParts: |SetupMetricsAndFieldTrials()| related --------------
// Initializes the metrics service with the configuration for this process,
// returning the created service (guaranteed non-NULL).
-MetricsService* BrowserMainParts::InitializeMetrics(
+MetricsService* ChromeBrowserMainParts::InitializeMetrics(
const CommandLine& parsed_command_line,
const PrefService* local_state) {
#if defined(OS_WIN)
@@ -1256,8 +1055,8 @@ MetricsService* BrowserMainParts::InitializeMetrics(
return metrics;
}
-void BrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled,
- bool proxy_policy_is_set) {
+void ChromeBrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled,
+ bool proxy_policy_is_set) {
// Note: make sure to call ConnectionFieldTrial() before
// ProxyConnectionsFieldTrial().
ConnectionFieldTrial();
@@ -1300,82 +1099,29 @@ DLLEXPORT void __cdecl RelaunchChromeBrowserWithNewCommandLineIfNeeded() {
}
#endif
-// Main routine for running as the Browser process.
-int BrowserMain(const MainFunctionParams& parameters) {
- // Create ShutdownWatcherHelper object for watching jank during shutdown.
- // Please keep |shutdown_watcher| as the first object constructed, and hence
- // it is destroyed last.
- ShutdownWatcherHelper shutdown_watcher;
-
- TRACE_EVENT_BEGIN_ETW("BrowserMain", 0, "");
-
- // Override the default ContentBrowserClient to let Chrome participate in
- // content logic.
- chrome::ChromeContentBrowserClient browser_client;
- content::GetContentClient()->set_browser(&browser_client);
-
- // If we're running tests (ui_task is non-null).
- if (parameters.ui_task)
- browser_defaults::enable_help_app = false;
-
- scoped_ptr<BrowserMainParts>
- parts(BrowserMainParts::CreateBrowserMainParts(parameters));
-
- parts->EarlyInitialization();
+void ChromeBrowserMainParts::PostMainMessageLoopStart() {
+ Profiling::MainMessageLoopStarted();
+}
- // Must happen before we try to use a message loop or display any UI.
- InitializeToolkit(parameters);
+void ChromeBrowserMainParts::ToolkitInitialized() {
+#if defined(TOOLKIT_VIEWS)
+ // The delegate needs to be set before any UI is created so that windows
+ // display the correct icon.
+ if (!views::ViewsDelegate::views_delegate)
+ views::ViewsDelegate::views_delegate = new ChromeViewsDelegate;
-#if defined(OS_CHROMEOS)
- // Initialize CrosLibrary only for the browser, unless running tests
- // (which do their own CrosLibrary setup).
- if (!parameters.ui_task) {
- bool use_stub = parameters.command_line_.HasSwitch(switches::kStubCros);
- chromeos::CrosLibrary::Initialize(use_stub);
- }
- // Replace the default NetworkChangeNotifierFactory with ChromeOS specific
- // implementation.
- net::NetworkChangeNotifier::SetFactory(
- new chromeos::CrosNetworkChangeNotifierFactory());
+ // TODO(beng): Move to WidgetImpl and implement on Windows too!
+ if (parameters().command_line_.HasSwitch(switches::kDebugViewsPaint))
+ views::Widget::SetDebugPaintEnabled(true);
#endif
- parts->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
- // to browser_shutdown::Shutdown or BrowserProcess::EndSession.
-
- // !!!!!!!!!! READ ME !!!!!!!!!!
- // I (viettrungluu) am in the process of refactoring |BrowserMain()|. If you
- // need to add something above this comment, read the documentation in
- // browser_main.h. If you need to add something below, please do the
- // following:
- // - Figure out where you should add your code. Do NOT just pick a random
- // location "which works".
- // - Document the dependencies apart from compile-time-checkable ones. What
- // must happen before your new code is executed? Does your new code need to
- // run before something else? Are there performance reasons for executing
- // your code at that point?
- // - If you need to create a (persistent) object, heap allocate it and keep a
- // |scoped_ptr| to it rather than allocating it on the stack. Otherwise
- // I'll have to convert your code when I refactor.
- // - Unless your new code is just a couple of lines, factor it out into a
- // function with a well-defined purpose. Do NOT just add it inline in
- // |BrowserMain()|.
- // Thanks!
-
- // TODO(viettrungluu): put the remainder into BrowserMainParts
- const CommandLine& parsed_command_line = parameters.command_line_;
- base::mac::ScopedNSAutoreleasePool* pool = parameters.autorelease_pool_;
-
-#if defined(OS_WIN) && !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
+#if defined(OS_WIN)
+ gfx::PlatformFontWin::adjust_font_callback = &AdjustUIFont;
+ gfx::PlatformFontWin::get_minimum_font_size_callback = &GetMinimumFontSize;
+#endif
+}
+int ChromeBrowserMainParts::TemporaryContinue() {
FilePath user_data_dir;
#if defined(OS_WIN)
PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
@@ -1392,38 +1138,26 @@ int BrowserMain(const MainFunctionParams& parameters) {
ProcessSingleton process_singleton(user_data_dir);
bool is_first_run = FirstRun::IsChromeFirstRun() ||
- parsed_command_line.HasSwitch(switches::kFirstRun);
+ parsed_command_line().HasSwitch(switches::kFirstRun);
scoped_ptr<BrowserProcessImpl> browser_process;
- if (parsed_command_line.HasSwitch(switches::kImport) ||
- parsed_command_line.HasSwitch(switches::kImportFromFile)) {
+ if (parsed_command_line().HasSwitch(switches::kImport) ||
+ parsed_command_line().HasSwitch(switches::kImportFromFile)) {
// We use different BrowserProcess when importing so no GoogleURLTracker is
// instantiated (as it makes a net::URLRequest and we don't have an IO
// thread, see bug #1292702).
- browser_process.reset(new FirstRunBrowserProcess(parsed_command_line));
+ browser_process.reset(new FirstRunBrowserProcess(parsed_command_line()));
is_first_run = false;
} else {
- browser_process.reset(new BrowserProcessImpl(parsed_command_line));
+ browser_process.reset(new BrowserProcessImpl(parsed_command_line()));
}
- // BrowserProcessImpl's constructor should set g_browser_process.
- DCHECK(g_browser_process);
-
// This forces the TabCloseableStateWatcher to be created and, on chromeos,
// register for the notifications it needs to track the closeable state of
// tabs.
g_browser_process->tab_closeable_state_watcher();
- // 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);
-
- // Initialize histogram statistics gathering system.
- base::StatisticsRecorder statistics;
-
- PrefService* local_state = InitializeLocalState(parsed_command_line,
+ PrefService* local_state = InitializeLocalState(parsed_command_line(),
is_first_run);
#if defined(USE_LINUX_BREAKPAD)
@@ -1438,7 +1172,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// If we're running tests (ui_task is non-null), then the ResourceBundle
// has already been initialized.
- if (parameters.ui_task) {
+ if (parameters().ui_task) {
g_browser_process->SetApplicationLocale("en-US");
} else {
// Mac starts it earlier in |PreMainMessageLoopStart()| (because it is
@@ -1454,7 +1188,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
const std::string loaded_locale =
ResourceBundle::InitSharedInstance(locale);
if (loaded_locale.empty() &&
- !parsed_command_line.HasSwitch(switches::kNoErrorDialogs)) {
+ !parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) {
ShowMissingLocaleMessageBox();
return chrome::RESULT_CODE_MISSING_DATA;
}
@@ -1472,7 +1206,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
#endif
std::string try_chrome =
- parsed_command_line.GetSwitchValueASCII(switches::kTryChromeAgain);
+ parsed_command_line().GetSwitchValueASCII(switches::kTryChromeAgain);
if (!try_chrome.empty()) {
#if defined(OS_WIN)
// Setup.exe has determined that we need to run a retention experiment
@@ -1507,9 +1241,9 @@ int BrowserMain(const MainFunctionParams& parameters) {
CommandLine::ForCurrentProcess()->HasSwitch(switches::kUsePureViews));
// Launch the views desktop shell window and register it as the default parent
// for all unparented views widgets.
- if (parsed_command_line.HasSwitch(switches::kViewsDesktop)) {
+ if (parsed_command_line().HasSwitch(switches::kViewsDesktop)) {
std::string desktop_type_cmd =
- parsed_command_line.GetSwitchValueASCII(switches::kViewsDesktop);
+ parsed_command_line().GetSwitchValueASCII(switches::kViewsDesktop);
views::desktop::DesktopWindowView::DesktopType desktop_type;
if (desktop_type_cmd == "netbook")
desktop_type = views::desktop::DesktopWindowView::DESKTOP_NETBOOK;
@@ -1540,14 +1274,14 @@ int BrowserMain(const MainFunctionParams& parameters) {
// If we are running in App mode, we do not want to show the importer
// (first run) UI.
if (!first_run_ui_bypass &&
- (parsed_command_line.HasSwitch(switches::kApp) ||
- parsed_command_line.HasSwitch(switches::kAppId) ||
- parsed_command_line.HasSwitch(switches::kNoFirstRun)))
+ (parsed_command_line().HasSwitch(switches::kApp) ||
+ parsed_command_line().HasSwitch(switches::kAppId) ||
+ parsed_command_line().HasSwitch(switches::kNoFirstRun)))
first_run_ui_bypass = true;
}
// TODO(viettrungluu): why don't we run this earlier?
- if (!parsed_command_line.HasSwitch(switches::kNoErrorDialogs))
+ if (!parsed_command_line().HasSwitch(switches::kNoErrorDialogs))
WarnAboutMinimumSystemRequirements();
// Enable print preview once for supported platforms.
@@ -1565,19 +1299,19 @@ int BrowserMain(const MainFunctionParams& parameters) {
about_flags::ConvertFlagsToSwitches(local_state,
CommandLine::ForCurrentProcess());
- InitializeNetworkOptions(parsed_command_line);
+ InitializeNetworkOptions(parsed_command_line());
InitializeURLRequestThrottlerManager(browser_process->net_log());
// Initialize histogram synchronizer system. This is a singleton and is used
// for posting tasks via NewRunnableMethod. Its deleted when it goes out of
// scope. Even though NewRunnableMethod does AddRef and Release, the object
// will not be deleted after the Task is executed.
- parts->SetupHistogramSynchronizer();
+ SetupHistogramSynchronizer();
// Now the command line has been mutated based on about:flags, we can
// set up metrics and initialize field trials.
- MetricsService* metrics = parts->SetupMetricsAndFieldTrials(
- parsed_command_line, local_state);
+ MetricsService* metrics = SetupMetricsAndFieldTrials(
+ parsed_command_line(), local_state);
// Now that all preferences have been registered, set the install date
// for the uninstall metrics if this is our first run. This only actually
@@ -1625,14 +1359,14 @@ int BrowserMain(const MainFunctionParams& parameters) {
// If the command line specifies 'uninstall' then we need to work here
// unless we detect another chrome browser running.
- if (parsed_command_line.HasSwitch(switches::kUninstall))
+ if (parsed_command_line().HasSwitch(switches::kUninstall))
return DoUninstallTasks(already_running);
#endif
- if (parsed_command_line.HasSwitch(switches::kHideIcons) ||
- parsed_command_line.HasSwitch(switches::kShowIcons))
- return HandleIconsCommands(parsed_command_line);
- if (parsed_command_line.HasSwitch(switches::kMakeDefaultBrowser)) {
+ if (parsed_command_line().HasSwitch(switches::kHideIcons) ||
+ parsed_command_line().HasSwitch(switches::kShowIcons))
+ return HandleIconsCommands(parsed_command_line());
+ if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) {
return ShellIntegration::SetAsDefaultBrowser() ?
static_cast<int>(content::RESULT_CODE_NORMAL_EXIT) :
static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED);
@@ -1640,9 +1374,9 @@ int BrowserMain(const MainFunctionParams& parameters) {
// If the command line specifies --pack-extension, attempt the pack extension
// startup action and exit.
- if (parsed_command_line.HasSwitch(switches::kPackExtension)) {
+ if (parsed_command_line().HasSwitch(switches::kPackExtension)) {
ExtensionsStartupUtil extension_startup_util;
- if (extension_startup_util.PackExtension(parsed_command_line)) {
+ if (extension_startup_util.PackExtension(parsed_command_line())) {
return content::RESULT_CODE_NORMAL_EXIT;
} else {
return chrome::RESULT_CODE_PACK_EXTENSION_ERROR;
@@ -1654,8 +1388,8 @@ int BrowserMain(const MainFunctionParams& parameters) {
// from other browsers. In case this process is a short-lived "import"
// process that another browser runs just to import the settings, we
// don't want to be checking for another browser process, by design.
- if (!(parsed_command_line.HasSwitch(switches::kImport) ||
- parsed_command_line.HasSwitch(switches::kImportFromFile))) {
+ if (!(parsed_command_line().HasSwitch(switches::kImport) ||
+ parsed_command_line().HasSwitch(switches::kImportFromFile))) {
#endif
// When another process is running, use that process instead of starting a
// new one. NotifyOtherProcess will currently give the other process up to
@@ -1708,7 +1442,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// TODO(abarth): Should this move to InitializeNetworkOptions()?
// Allow access to file:// on ChromeOS for tests.
- if (parsed_command_line.HasSwitch(switches::kAllowFileAccess))
+ if (parsed_command_line().HasSwitch(switches::kAllowFileAccess))
net::URLRequest::AllowFileAccess();
// There are two use cases for kLoginUser:
@@ -1716,15 +1450,15 @@ int BrowserMain(const MainFunctionParams& parameters) {
// 2) if passed alone, to signal that the indicated user has already
// logged in and we should behave accordingly.
// This handles case 2.
- if (parsed_command_line.HasSwitch(switches::kLoginUser) &&
- !parsed_command_line.HasSwitch(switches::kLoginPassword)) {
+ if (parsed_command_line().HasSwitch(switches::kLoginUser) &&
+ !parsed_command_line().HasSwitch(switches::kLoginPassword)) {
std::string username =
- parsed_command_line.GetSwitchValueASCII(switches::kLoginUser);
+ parsed_command_line().GetSwitchValueASCII(switches::kLoginUser);
VLOG(1) << "Relaunching browser for user: " << username;
chromeos::UserManager::Get()->UserLoggedIn(username);
// Redirects Chrome logging to the user data dir.
- logging::RedirectChromeLogging(parsed_command_line);
+ logging::RedirectChromeLogging(parsed_command_line());
// Initialize user policy before creating the profile so the profile
// initialization code sees policy settings.
@@ -1739,8 +1473,8 @@ int BrowserMain(const MainFunctionParams& parameters) {
g_browser_process->profile_manager()->SetWillImport();
}
- Profile* profile = CreateProfile(parameters, user_data_dir,
- parsed_command_line);
+ Profile* profile = CreateProfile(parameters(), user_data_dir,
+ parsed_command_line());
if (!profile)
return content::RESULT_CODE_NORMAL_EXIT;
@@ -1750,8 +1484,8 @@ int BrowserMain(const MainFunctionParams& parameters) {
// Pass the TokenService pointer to the policy connector so user policy can
// grab a token and register with the policy server.
// TODO(mnissler): Remove once OAuth is the only authentication mechanism.
- if (parsed_command_line.HasSwitch(switches::kLoginUser) &&
- !parsed_command_line.HasSwitch(switches::kLoginPassword)) {
+ if (parsed_command_line().HasSwitch(switches::kLoginUser) &&
+ !parsed_command_line().HasSwitch(switches::kLoginPassword)) {
g_browser_process->browser_policy_connector()->SetUserPolicyTokenService(
profile->GetTokenService());
}
@@ -1762,8 +1496,8 @@ int BrowserMain(const MainFunctionParams& parameters) {
// Tests should be able to tune login manager before showing it.
// Thus only show login manager in normal (non-testing) mode.
- if (!parameters.ui_task) {
- OptionallyRunChromeOSLoginManager(parsed_command_line, profile);
+ if (!parameters().ui_task) {
+ OptionallyRunChromeOSLoginManager(parsed_command_line(), profile);
}
#if !defined(OS_MACOSX)
@@ -1771,15 +1505,15 @@ int BrowserMain(const MainFunctionParams& parameters) {
// that exits when this task has finished.
// TODO(port): Port the Mac's IPC-based implementation to other platforms to
// replace this implementation. http://crbug.com/22142
- if (parsed_command_line.HasSwitch(switches::kImport) ||
- parsed_command_line.HasSwitch(switches::kImportFromFile)) {
- return FirstRun::ImportNow(profile, parsed_command_line);
+ if (parsed_command_line().HasSwitch(switches::kImport) ||
+ parsed_command_line().HasSwitch(switches::kImportFromFile)) {
+ return FirstRun::ImportNow(profile, parsed_command_line());
}
#endif
#if defined(OS_WIN)
// Do the tasks if chrome has been upgraded while it was last running.
- if (!already_running && upgrade_util::DoUpgradeTasks(parsed_command_line))
+ if (!already_running && upgrade_util::DoUpgradeTasks(parsed_command_line()))
return content::RESULT_CODE_NORMAL_EXIT;
#endif
@@ -1791,7 +1525,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// (uninstall, resource bundle initialization, other chrome browser
// processes etc).
// Do not allow this to occur for Chrome Frame user-to-system handoffs.
- if (!parsed_command_line.HasSwitch(switches::kChromeFrame) &&
+ if (!parsed_command_line().HasSwitch(switches::kChromeFrame) &&
CheckMachineLevelInstall())
return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS;
@@ -1800,7 +1534,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
DCHECK(translate_manager != NULL);
#if defined(OS_MACOSX)
- if (!parsed_command_line.HasSwitch(switches::kNoFirstRun)) {
+ if (!parsed_command_line().HasSwitch(switches::kNoFirstRun)) {
// Disk image installation is sort of a first-run task, so it shares the
// kNoFirstRun switch.
if (MaybeInstallFromDiskImage()) {
@@ -1844,7 +1578,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// Sets things up so that if we crash from this point on, a dialog will
// popup asking the user to restart chrome. It is done this late to avoid
// testing against a bunch of special cases that are taken care early on.
- PrepareRestartOnCrashEnviroment(parsed_command_line);
+ PrepareRestartOnCrashEnviroment(parsed_command_line());
#if defined(OS_WIN)
// Registers Chrome with the Windows Restart Manager, which will restore the
@@ -1853,7 +1587,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// but should run on startup if extended to handle crashes/hangs/patches.
// Also, better to run once here than once for each HWND's WM_QUERYENDSESSION.
if (base::win::GetVersion() >= base::win::VERSION_VISTA)
- RegisterApplicationRestart(parsed_command_line);
+ RegisterApplicationRestart(parsed_command_line());
#endif // OS_WIN
// Initialize and maintain network predictor module, which handles DNS
@@ -1861,9 +1595,9 @@ int BrowserMain(const MainFunctionParams& parameters) {
// This also registers an observer to discard data when closing incognito
// mode.
bool preconnect_enabled = true; // Default status (easy to change!).
- if (parsed_command_line.HasSwitch(switches::kDisablePreconnect))
+ if (parsed_command_line().HasSwitch(switches::kDisablePreconnect))
preconnect_enabled = false;
- else if (parsed_command_line.HasSwitch(switches::kEnablePreconnect))
+ else if (parsed_command_line().HasSwitch(switches::kEnablePreconnect))
preconnect_enabled = true;
chrome_browser_net::PredictorInit dns_prefetch(
user_prefs,
@@ -1942,9 +1676,9 @@ int BrowserMain(const MainFunctionParams& parameters) {
// Use default of "" so that all domains are supported.
std::string sdch_supported_domain("");
- if (parsed_command_line.HasSwitch(switches::kSdchFilter)) {
+ if (parsed_command_line().HasSwitch(switches::kSdchFilter)) {
sdch_supported_domain =
- parsed_command_line.GetSwitchValueASCII(switches::kSdchFilter);
+ parsed_command_line().GetSwitchValueASCII(switches::kSdchFilter);
} else {
sdch_trial->AppendGroup("global_disable_sdch",
kSDCH_DISABLE_PROBABILITY);
@@ -1956,12 +1690,12 @@ int BrowserMain(const MainFunctionParams& parameters) {
sdch_manager.set_sdch_fetcher(new SdchDictionaryFetcher);
sdch_manager.EnableSdchSupport(sdch_supported_domain);
- InstallJankometer(parsed_command_line);
+ InstallJankometer(parsed_command_line());
#if defined(OS_WIN) && !defined(GOOGLE_CHROME_BUILD)
- if (parsed_command_line.HasSwitch(switches::kDebugPrint)) {
+ if (parsed_command_line().HasSwitch(switches::kDebugPrint)) {
FilePath path =
- parsed_command_line.GetSwitchValuePath(switches::kDebugPrint);
+ parsed_command_line().GetSwitchValuePath(switches::kDebugPrint);
printing::PrintedDocument::set_debug_dump_path(path);
}
#endif
@@ -1971,7 +1705,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
CommandLine::ForCurrentProcess()->HasSwitch(switches::kKeepMouseCursor));
#endif
- HandleTestParameters(parsed_command_line);
+ HandleTestParameters(parsed_command_line());
RecordBreakpadStatusUMA(metrics);
about_flags::RecordUMAStatistics(local_state);
LanguageUsageMetrics::RecordAcceptLanguages(
@@ -2000,9 +1734,9 @@ int BrowserMain(const MainFunctionParams& parameters) {
// The extension service may be available at this point. If the command line
// specifies --uninstall-extension, attempt the uninstall extension startup
// action.
- if (parsed_command_line.HasSwitch(switches::kUninstallExtension)) {
+ if (parsed_command_line().HasSwitch(switches::kUninstallExtension)) {
ExtensionsStartupUtil ext_startup_util;
- if (ext_startup_util.UninstallExtension(parsed_command_line, profile)) {
+ if (ext_startup_util.UninstallExtension(parsed_command_line(), profile)) {
return content::RESULT_CODE_NORMAL_EXIT;
} else {
return chrome::RESULT_CODE_UNINSTALL_EXTENSION_ERROR;
@@ -2018,7 +1752,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// ChildProcess:: is a misnomer unless you consider context. Use
// of --wait-for-debugger only makes sense when Chrome itself is a
// child process (e.g. when launched by PyAuto).
- if (parsed_command_line.HasSwitch(switches::kWaitForDebugger)) {
+ if (parsed_command_line().HasSwitch(switches::kWaitForDebugger)) {
ChildProcess::WaitForDebugger("Browser");
}
@@ -2047,15 +1781,16 @@ int BrowserMain(const MainFunctionParams& parameters) {
NewRunnableFunction(&GpuBlacklistUpdater::SetupOnFileThread));
// Start watching all browser threads for responsiveness.
- ThreadWatcherList::StartWatchingAll(parsed_command_line);
+ ThreadWatcherList::StartWatchingAll(parsed_command_line());
int result_code = content::RESULT_CODE_NORMAL_EXIT;
- if (parameters.ui_task) {
+ base::mac::ScopedNSAutoreleasePool* pool = parameters().autorelease_pool_;
+ if (parameters().ui_task) {
// We are in test mode. Run one task and enter the main message loop.
if (pool)
pool->Recycle();
- parameters.ui_task->Run();
- delete parameters.ui_task;
+ parameters().ui_task->Run();
+ delete parameters().ui_task;
} else {
// Most general initialization is behind us, but opening a
// tab and/or session restore and such is still to be done.
@@ -2063,7 +1798,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// We are in regular browser boot sequence. Open initial tabs and enter the
// main message loop.
- if (browser_init.Start(parsed_command_line, FilePath(), profile,
+ if (browser_init.Start(parsed_command_line(), FilePath(), profile,
&result_code)) {
#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
// Initialize autoupdate timer. Timer callback costs basically nothing
@@ -2096,7 +1831,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
#if !defined(OS_CHROMEOS)
// If we're running tests (ui_task is non-null), then we don't want to
// call FetchLanguageListFromTranslateServer
- if (parameters.ui_task == NULL && translate_manager != NULL) {
+ if (parameters().ui_task == NULL && translate_manager != NULL) {
// TODO(willchan): Get rid of this after TranslateManager doesn't use
// the default request context. http://crbug.com/89396.
// This is necessary to force |default_request_context_| to be
@@ -2111,8 +1846,8 @@ int BrowserMain(const MainFunctionParams& parameters) {
}
// Start watching for jank during shutdown. It gets disarmed when
- // |shutdown_watcher| object is destructed.
- shutdown_watcher.Arm(base::TimeDelta::FromSeconds(25));
+ // |shutdown_watcher_| object is destructed.
+ shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(25));
#if defined(OS_WIN)
// If it's the first run, log the search engine chosen. We wait until
@@ -2162,7 +1897,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
// Some tests don't set parameters.ui_task, so they started translate
// language fetch that was never completed so we need to cleanup here
// otherwise it will be done by the destructor in a wrong thread.
- if (parameters.ui_task == NULL && translate_manager != NULL)
+ if (parameters().ui_task == NULL && translate_manager != NULL)
translate_manager->CleanupPendingUlrFetcher();
@@ -2178,21 +1913,6 @@ int BrowserMain(const MainFunctionParams& parameters) {
ignore_result(browser_process.release());
browser_shutdown::Shutdown();
- // Release BrowserMainParts here, before shutting down CrosLibrary, since
- // some of the classes initialized there have CrosLibrary dependencies.
- parts.reset(NULL);
-
-#if defined(OS_CHROMEOS)
- if (!parameters.ui_task)
- chromeos::CrosLibrary::Shutdown();
-
- // To be precise, logout (browser shutdown) is not yet done, but the
- // remaining work is negligible, hence we say LogoutDone here.
- chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("LogoutDone",
- false);
- chromeos::BootTimesLoader::Get()->WriteLogoutTimes();
-#endif
- TRACE_EVENT_END_ETW("BrowserMain", 0, 0);
return result_code;
}
diff --git a/chrome/browser/browser_main.h b/chrome/browser/browser_main.h
index ec1dc6e..177ed1c 100644
--- a/chrome/browser/browser_main.h
+++ b/chrome/browser/browser_main.h
@@ -8,27 +8,15 @@
#include "base/basictypes.h"
#include "base/gtest_prod_util.h"
-#include "base/memory/scoped_ptr.h"
#include "base/metrics/field_trial.h"
#include "base/tracked_objects.h"
+#include "content/browser/browser_main.h"
-class BrowserThread;
-class CommandLine;
-class HistogramSynchronizer;
class FieldTrialSynchronizer;
-class HighResolutionTimerManager;
-struct MainFunctionParams;
-class MessageLoop;
+class HistogramSynchronizer;
class MetricsService;
class PrefService;
-
-namespace base {
-class SystemMonitor;
-}
-
-namespace net {
-class NetworkChangeNotifier;
-}
+class ShutdownWatcherHelper;
namespace chrome_browser {
// For use by ShowMissingLocaleMessageBox.
@@ -36,59 +24,9 @@ extern const char kMissingLocaleDataTitle[];
extern const char kMissingLocaleDataMessage[];
}
-// BrowserMainParts:
-// This class contains different "stages" to be executed in |BrowserMain()|,
-// mostly initialization. This is made into a class rather than just functions
-// so each stage can create and maintain state. Each part is represented by a
-// single method (e.g., "EarlyInitialization()"), which does the following:
-// - calls a method (e.g., "PreEarlyInitialization()") which individual
-// platforms can override to provide platform-specific code which is to be
-// executed before the common code;
-// - calls various methods for things common to all platforms (for that given
-// stage); and
-// - calls a method (e.g., "PostEarlyInitialization()") for platform-specific
-// code to be called after the common code.
-// As indicated above, platforms should override the default "Pre...()" and
-// "Post...()" methods when necessary; they need not call the superclass's
-// implementation (which is empty).
-//
-// Parts:
-// - EarlyInitialization: things which should be done as soon as possible on
-// program start (such as setting up signal handlers) and things to be done
-// at some generic time before the start of the main message loop.
-// - MainMessageLoopStart: things beginning with the start of the main message
-// loop and ending with initialization of the main thread; platform-specific
-// things which should be done immediately before the start of the main
-// message loop should go in |PreMainMessageLoopStart()|.
-// - (more to come)
-//
-// How to add stuff (to existing parts):
-// - Figure out when your new code should be executed. What must happen
-// before/after your code is executed? Are there performance reasons for
-// running your code at a particular time? Document these things!
-// - Split out any platform-specific bits. Please avoid #ifdefs it at all
-// possible. You have two choices for platform-specific code: (1) Execute it
-// from one of the platform-specific |Pre/Post...()| methods; do this if the
-// code is unique to a platform type. Or (2) execute it from one of the
-// "parts" (e.g., |EarlyInitialization()|) and provide platform-specific
-// implementations of your code (in a virtual method); do this if you need to
-// provide different implementations across most/all platforms.
-// - Unless your new code is just one or two lines, put it into a separate
-// method with a well-defined purpose. (Likewise, if you're adding to an
-// existing chunk which makes it longer than one or two lines, please move
-// the code out into a separate method.)
-class BrowserMainParts {
+class ChromeBrowserMainParts : public content::BrowserMainParts {
public:
- // This static method is to be implemented by each platform and should
- // instantiate the appropriate subclass.
- static BrowserMainParts* CreateBrowserMainParts(
- const MainFunctionParams& parameters);
-
- virtual ~BrowserMainParts();
-
- // Parts to be called by |BrowserMain()|.
- void EarlyInitialization();
- void MainMessageLoopStart();
+ virtual ~ChromeBrowserMainParts();
// Constructs HistogramSynchronizer which gets released early (before
// main_message_loop_).
@@ -102,25 +40,12 @@ class BrowserMainParts {
PrefService* local_state);
protected:
- explicit BrowserMainParts(const MainFunctionParams& parameters);
-
- // Accessors for data members (below) ----------------------------------------
- const MainFunctionParams& parameters() const {
- return parameters_;
- }
- const CommandLine& parsed_command_line() const {
- return parsed_command_line_;
- }
- MessageLoop& main_message_loop() const {
- return *main_message_loop_;
- }
-
- // Methods to be overridden to provide platform-specific code; these
- // correspond to the "parts" above.
- virtual void PreEarlyInitialization() {}
- virtual void PostEarlyInitialization() {}
- virtual void PreMainMessageLoopStart() {}
- virtual void PostMainMessageLoopStart() {}
+ explicit ChromeBrowserMainParts(const MainFunctionParams& parameters);
+
+ virtual void PostMainMessageLoopStart() OVERRIDE;
+ virtual void ToolkitInitialized() OVERRIDE;
+
+ virtual int TemporaryContinue() OVERRIDE;
private:
// Methods for |EarlyInitialization()| ---------------------------------------
@@ -147,13 +72,6 @@ class BrowserMainParts {
// A/B test for using a different host prefix in Google search suggest.
void SuggestPrefixFieldTrial();
- // Used to initialize NSPR where appropriate.
- virtual void InitializeSSL() = 0;
-
- // Methods for |MainMessageLoopStart()| --------------------------------------
-
- void InitializeMainThread();
-
// Methods for |SetupMetricsAndFieldTrials()| --------------------------------
static MetricsService* InitializeMetrics(
@@ -166,8 +84,10 @@ class BrowserMainParts {
// Members initialized on construction ---------------------------------------
- const MainFunctionParams& parameters_;
- const CommandLine& parsed_command_line_;
+ // Create ShutdownWatcherHelper object for watching jank during shutdown.
+ // Please keep |shutdown_watcher| as the first object constructed, and hence
+ // it is destroyed last.
+ scoped_ptr<ShutdownWatcherHelper> shutdown_watcher_;
#if defined(TRACK_ALL_TASK_OBJECTS)
// Creating this object starts tracking the creation and deletion of Task
@@ -180,13 +100,6 @@ class BrowserMainParts {
// SetupMetricsAndFieldTrials is called.
scoped_ptr<base::FieldTrialList> field_trial_list_;
- // Members initialized in |MainMessageLoopStart()| ---------------------------
- scoped_ptr<MessageLoop> main_message_loop_;
- scoped_ptr<base::SystemMonitor> system_monitor_;
- scoped_ptr<HighResolutionTimerManager> hi_res_timer_manager_;
- scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
- scoped_ptr<BrowserThread> main_thread_;
-
// Members initialized after / released before main_message_loop_ ------------
// Initialized in SetupHistogramSynchronizer.
@@ -198,14 +111,9 @@ class BrowserMainParts {
FRIEND_TEST(BrowserMainTest, WarmConnectionFieldTrial_WarmestSocket);
FRIEND_TEST(BrowserMainTest, WarmConnectionFieldTrial_Random);
FRIEND_TEST(BrowserMainTest, WarmConnectionFieldTrial_Invalid);
- DISALLOW_COPY_AND_ASSIGN(BrowserMainParts);
+ DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainParts);
};
-
-// Perform platform-specific work that needs to be done after the main event
-// loop has ended.
-void DidEndMainMessageLoop();
-
// Records the conditions that can prevent Breakpad from generating and
// sending crash reports. The presence of a Breakpad handler (after
// attempting to initialize crash reporting) and the presence of a debugger
diff --git a/chrome/browser/browser_main_gtk.cc b/chrome/browser/browser_main_gtk.cc
index 7e718c2..2b8432a 100644
--- a/chrome/browser/browser_main_gtk.cc
+++ b/chrome/browser/browser_main_gtk.cc
@@ -81,6 +81,10 @@ int BrowserX11IOErrorHandler(Display* d) {
} // namespace
+BrowserMainPartsGtk::BrowserMainPartsGtk(const MainFunctionParams& parameters)
+ : BrowserMainPartsPosix(parameters) {
+}
+
void BrowserMainPartsGtk::PreEarlyInitialization() {
DetectRunningAsRoot();
@@ -163,9 +167,13 @@ void BrowserMainPartsGtk::SetupSandbox() {
zhost->Init(sandbox_cmd);
}
+namespace content {
+
void DidEndMainMessageLoop() {
}
+}
+
void RecordBreakpadStatusUMA(MetricsService* metrics) {
#if defined(USE_LINUX_BREAKPAD)
metrics->RecordBreakpadRegistration(IsCrashReporterEnabled());
@@ -221,11 +229,3 @@ void SetBrowserX11ErrorHandlers() {
// goes away.
ui::SetX11ErrorHandlers(BrowserX11ErrorHandler, BrowserX11IOErrorHandler);
}
-
-#if !defined(OS_CHROMEOS)
-// static
-BrowserMainParts* BrowserMainParts::CreateBrowserMainParts(
- const MainFunctionParams& parameters) {
- return new BrowserMainPartsGtk(parameters);
-}
-#endif
diff --git a/chrome/browser/browser_main_gtk.h b/chrome/browser/browser_main_gtk.h
index 39fb621..22558e3 100644
--- a/chrome/browser/browser_main_gtk.h
+++ b/chrome/browser/browser_main_gtk.h
@@ -13,8 +13,7 @@
class BrowserMainPartsGtk : public BrowserMainPartsPosix {
public:
- explicit BrowserMainPartsGtk(const MainFunctionParams& parameters)
- : BrowserMainPartsPosix(parameters) {}
+ explicit BrowserMainPartsGtk(const MainFunctionParams& parameters);
virtual void PreEarlyInitialization() OVERRIDE;
diff --git a/chrome/browser/browser_main_mac.h b/chrome/browser/browser_main_mac.h
new file mode 100644
index 0000000..fcc9215
--- /dev/null
+++ b/chrome/browser/browser_main_mac.h
@@ -0,0 +1,20 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_BROWSER_MAIN_MAC_H_
+#define CHROME_BROWSER_BROWSER_MAIN_MAC_H_
+#pragma once
+
+#include "chrome/browser/browser_main_posix.h"
+
+class BrowserMainPartsMac : public BrowserMainPartsPosix {
+ public:
+ explicit BrowserMainPartsMac(const MainFunctionParams& parameters);
+
+ virtual void PreEarlyInitialization() OVERRIDE;
+ virtual void PreMainMessageLoopStart() OVERRIDE;
+ virtual void InitializeSSL() OVERRIDE;
+};
+
+#endif // CHROME_BROWSER_BROWSER_MAIN_WIN_H_
diff --git a/chrome/browser/browser_main_mac.mm b/chrome/browser/browser_main_mac.mm
index da805df..41badcc 100644
--- a/chrome/browser/browser_main_mac.mm
+++ b/chrome/browser/browser_main_mac.mm
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/browser_main_posix.h"
+#include "chrome/browser/browser_main_mac.h"
#import <Cocoa/Cocoa.h>
@@ -27,11 +27,15 @@
#include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
+namespace content {
+
void DidEndMainMessageLoop() {
AppController* appController = [NSApp delegate];
[appController didEndMainMessageLoop];
}
+}
+
void RecordBreakpadStatusUMA(MetricsService* metrics) {
metrics->RecordBreakpadRegistration(IsCrashReporterEnabled());
metrics->RecordBreakpadHasDebugger(base::debug::BeingDebugged());
@@ -68,90 +72,80 @@ void PrepareRestartOnCrashEnviroment(const CommandLine& parsed_command_line) {
// BrowserMainPartsMac ---------------------------------------------------------
-class BrowserMainPartsMac : public BrowserMainPartsPosix {
- public:
- explicit BrowserMainPartsMac(const MainFunctionParams& parameters)
- : BrowserMainPartsPosix(parameters) {}
+BrowserMainPartsMac::BrowserMainPartsMac(const MainFunctionParams& parameters)
+ : BrowserMainPartsPosix(parameters) {
+}
- protected:
- virtual void PreEarlyInitialization() {
- BrowserMainPartsPosix::PreEarlyInitialization();
+void BrowserMainPartsMac::PreEarlyInitialization() {
+ BrowserMainPartsPosix::PreEarlyInitialization();
- if (base::mac::WasLaunchedAsHiddenLoginItem()) {
- CommandLine* singleton_command_line = CommandLine::ForCurrentProcess();
- singleton_command_line->AppendSwitch(switches::kNoStartupWindow);
- }
+ if (base::mac::WasLaunchedAsHiddenLoginItem()) {
+ CommandLine* singleton_command_line = CommandLine::ForCurrentProcess();
+ singleton_command_line->AppendSwitch(switches::kNoStartupWindow);
}
+}
- virtual void PreMainMessageLoopStart() {
- BrowserMainPartsPosix::PreMainMessageLoopStart();
-
- // Tell Cooca to finish its initalization, which we want to do manually
- // instead of calling NSApplicationMain(). The primary reason is that NSAM()
- // never returns, which would leave all the objects currently on the stack
- // in scoped_ptrs hanging and never cleaned up. We then load the main nib
- // directly. The main event loop is run from common code using the
- // MessageLoop API, which works out ok for us because it's a wrapper around
- // CFRunLoop.
-
- // Initialize NSApplication using the custom subclass.
- [BrowserCrApplication sharedApplication];
-
- // If ui_task is not NULL, the app is actually a browser_test, so startup is
- // handled outside of BrowserMain (which is what called this).
- if (!parameters().ui_task) {
- // The browser process only wants to support the language Cocoa will use,
- // so force the app locale to be overriden with that value.
- l10n_util::OverrideLocaleWithCocoaLocale();
-
- // Before we load the nib, we need to start up the resource bundle so we
- // have the strings avaiable for localization.
- // TODO(markusheintz): Read preference pref::kApplicationLocale in order
- // to enforce the application locale.
- const std::string loaded_locale =
- ResourceBundle::InitSharedInstance(std::string());
- CHECK(!loaded_locale.empty()) << "Default locale could not be found";
-
- FilePath resources_pack_path;
- PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
- ResourceBundle::AddDataPackToSharedInstance(resources_pack_path);
- }
-
- // Now load the nib (from the right bundle).
- scoped_nsobject<NSNib>
- nib([[NSNib alloc] initWithNibNamed:@"MainMenu"
- bundle:base::mac::MainAppBundle()]);
- // TODO(viettrungluu): crbug.com/20504 - This currently leaks, so if you
- // change this, you'll probably need to change the Valgrind suppression.
- [nib instantiateNibWithOwner:NSApp topLevelObjects:nil];
- // Make sure the app controller has been created.
- DCHECK([NSApp delegate]);
-
- // This is a no-op if the KeystoneRegistration framework is not present.
- // The framework is only distributed with branded Google Chrome builds.
- [[KeystoneGlue defaultKeystoneGlue] registerWithKeystone];
-
- // Prevent Cocoa from turning command-line arguments into
- // |-application:openFiles:|, since we already handle them directly.
- [[NSUserDefaults standardUserDefaults]
- setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
+void BrowserMainPartsMac::PreMainMessageLoopStart() {
+ BrowserMainPartsPosix::PreMainMessageLoopStart();
+
+ // Tell Cooca to finish its initialization, which we want to do manually
+ // instead of calling NSApplicationMain(). The primary reason is that NSAM()
+ // never returns, which would leave all the objects currently on the stack
+ // in scoped_ptrs hanging and never cleaned up. We then load the main nib
+ // directly. The main event loop is run from common code using the
+ // MessageLoop API, which works out ok for us because it's a wrapper around
+ // CFRunLoop.
+
+ // Initialize NSApplication using the custom subclass.
+ [BrowserCrApplication sharedApplication];
+
+ // If ui_task is not NULL, the app is actually a browser_test, so startup is
+ // handled outside of BrowserMain (which is what called this).
+ if (!parameters().ui_task) {
+ // The browser process only wants to support the language Cocoa will use,
+ // so force the app locale to be overriden with that value.
+ l10n_util::OverrideLocaleWithCocoaLocale();
+
+ // Before we load the nib, we need to start up the resource bundle so we
+ // have the strings avaiable for localization.
+ // TODO(markusheintz): Read preference pref::kApplicationLocale in order
+ // to enforce the application locale.
+ const std::string loaded_locale =
+ ResourceBundle::InitSharedInstance(std::string());
+ CHECK(!loaded_locale.empty()) << "Default locale could not be found";
+
+ FilePath resources_pack_path;
+ PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
+ ResourceBundle::AddDataPackToSharedInstance(resources_pack_path);
}
- private:
- virtual void InitializeSSL() {
- // Use NSS for SSL by default.
- // The default client socket factory uses NSS for SSL by default on Mac.
- if (parsed_command_line().HasSwitch(switches::kUseSystemSSL)) {
- net::ClientSocketFactory::UseSystemSSL();
- } else {
- // We want to be sure to init NSPR on the main thread.
- crypto::EnsureNSPRInit();
- }
- }
-};
+ // Now load the nib (from the right bundle).
+ scoped_nsobject<NSNib>
+ nib([[NSNib alloc] initWithNibNamed:@"MainMenu"
+ bundle:base::mac::MainAppBundle()]);
+ // TODO(viettrungluu): crbug.com/20504 - This currently leaks, so if you
+ // change this, you'll probably need to change the Valgrind suppression.
+ [nib instantiateNibWithOwner:NSApp topLevelObjects:nil];
+ // Make sure the app controller has been created.
+ DCHECK([NSApp delegate]);
+
+ // This is a no-op if the KeystoneRegistration framework is not present.
+ // The framework is only distributed with branded Google Chrome builds.
+ [[KeystoneGlue defaultKeystoneGlue] registerWithKeystone];
+
+ // Prevent Cocoa from turning command-line arguments into
+ // |-application:openFiles:|, since we already handle them directly.
+ [[NSUserDefaults standardUserDefaults]
+ setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
+}
-// static
-BrowserMainParts* BrowserMainParts::CreateBrowserMainParts(
- const MainFunctionParams& parameters) {
- return new BrowserMainPartsMac(parameters);
+ void BrowserMainPartsMac::InitializeSSL() {
+ // Use NSS for SSL by default.
+ // The default client socket factory uses NSS for SSL by default on Mac.
+ if (parsed_command_line().HasSwitch(switches::kUseSystemSSL)) {
+ net::ClientSocketFactory::UseSystemSSL();
+ } else {
+ // We want to be sure to init NSPR on the main thread.
+ crypto::EnsureNSPRInit();
+ }
}
diff --git a/chrome/browser/browser_main_posix.cc b/chrome/browser/browser_main_posix.cc
index cd88cc7..518daaa 100644
--- a/chrome/browser/browser_main_posix.cc
+++ b/chrome/browser/browser_main_posix.cc
@@ -186,6 +186,11 @@ void SetFileDescriptorLimit(unsigned int max_descriptors) {
// BrowserMainPartsPosix -------------------------------------------------------
+BrowserMainPartsPosix::BrowserMainPartsPosix(
+ const MainFunctionParams& parameters)
+ : ChromeBrowserMainParts(parameters) {
+}
+
void BrowserMainPartsPosix::PreEarlyInitialization() {
// We need to accept SIGCHLD, even though our handler is a no-op because
// otherwise we cannot wait on children. (According to POSIX 2001.)
diff --git a/chrome/browser/browser_main_posix.h b/chrome/browser/browser_main_posix.h
index 817565a..0b83fdd 100644
--- a/chrome/browser/browser_main_posix.h
+++ b/chrome/browser/browser_main_posix.h
@@ -7,14 +7,12 @@
#include "chrome/browser/browser_main.h"
-class BrowserMainPartsPosix : public BrowserMainParts {
+class BrowserMainPartsPosix : public ChromeBrowserMainParts {
public:
- explicit BrowserMainPartsPosix(const MainFunctionParams& parameters)
- : BrowserMainParts(parameters) {}
+ explicit BrowserMainPartsPosix(const MainFunctionParams& parameters);
- protected:
- virtual void PreEarlyInitialization();
- virtual void PostMainMessageLoopStart();
+ virtual void PreEarlyInitialization() OVERRIDE;
+ virtual void PostMainMessageLoopStart() OVERRIDE;
private:
#if !defined(OS_MACOSX)
diff --git a/chrome/browser/browser_main_unittest.cc b/chrome/browser/browser_main_unittest.cc
index f14e5b2..5d609d85 100644
--- a/chrome/browser/browser_main_unittest.cc
+++ b/chrome/browser/browser_main_unittest.cc
@@ -7,8 +7,11 @@
#include <string>
#include <vector>
#include "base/command_line.h"
+#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/testing_pref_service.h"
+#include "content/browser/content_browser_client.h"
#include "content/common/main_function_params.h"
#include "content/common/sandbox_init_wrapper.h"
#include "net/socket/client_socket_pool_base.h"
@@ -32,10 +35,12 @@ TEST_F(BrowserMainTest, WarmConnectionFieldTrial_WarmestSocket) {
scoped_ptr<MainFunctionParams> params(
new MainFunctionParams(command_line_, *sandbox_init_wrapper_, NULL));
- scoped_ptr<BrowserMainParts> bw(BrowserMainParts::CreateBrowserMainParts(
- *params));
+ scoped_ptr<content::BrowserMainParts> bw(
+ content::GetContentClient()->browser()->CreateBrowserMainParts(
+ *params));
- bw->WarmConnectionFieldTrial();
+ ChromeBrowserMainParts* cbw = static_cast<ChromeBrowserMainParts*>(bw.get());
+ cbw->WarmConnectionFieldTrial();
EXPECT_EQ(0, net::GetSocketReusePolicy());
}
@@ -43,12 +48,14 @@ TEST_F(BrowserMainTest, WarmConnectionFieldTrial_WarmestSocket) {
TEST_F(BrowserMainTest, WarmConnectionFieldTrial_Random) {
scoped_ptr<MainFunctionParams> params(
new MainFunctionParams(command_line_, *sandbox_init_wrapper_, NULL));
- scoped_ptr<BrowserMainParts> bw(BrowserMainParts::CreateBrowserMainParts(
- *params));
+ scoped_ptr<content::BrowserMainParts> bw(
+ content::GetContentClient()->browser()->CreateBrowserMainParts(
+ *params));
+ ChromeBrowserMainParts* cbw = static_cast<ChromeBrowserMainParts*>(bw.get());
const int kNumRuns = 1000;
for (int i = 0; i < kNumRuns; i++) {
- bw->WarmConnectionFieldTrial();
+ cbw->WarmConnectionFieldTrial();
int val = net::GetSocketReusePolicy();
EXPECT_LE(val, 2);
EXPECT_GE(val, 0);
@@ -60,9 +67,17 @@ TEST_F(BrowserMainTest, WarmConnectionFieldTrial_Invalid) {
scoped_ptr<MainFunctionParams> params(
new MainFunctionParams(command_line_, *sandbox_init_wrapper_, NULL));
- scoped_ptr<BrowserMainParts> bw(BrowserMainParts::CreateBrowserMainParts(
- *params));
-
- EXPECT_DEBUG_DEATH(bw->WarmConnectionFieldTrial(),
+ // This test ends up launching a new process, and that doesn't initialize the
+ // ContentClient interfaces.
+ scoped_ptr<content::BrowserMainParts> bw;
+ if (content::GetContentClient()) {
+ bw.reset(content::GetContentClient()->browser()->CreateBrowserMainParts(
+ *params));
+ } else {
+ chrome::ChromeContentBrowserClient ccbc;
+ bw.reset(ccbc.CreateBrowserMainParts(*params));
+ }
+ ChromeBrowserMainParts* cbw = static_cast<ChromeBrowserMainParts*>(bw.get());
+ EXPECT_DEBUG_DEATH(cbw->WarmConnectionFieldTrial(),
"Not a valid socket reuse policy group");
}
diff --git a/chrome/browser/browser_main_win.cc b/chrome/browser/browser_main_win.cc
index 9f22b2d..6fbd782 100644
--- a/chrome/browser/browser_main_win.cc
+++ b/chrome/browser/browser_main_win.cc
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/browser_main.h"
#include "chrome/browser/browser_main_win.h"
#include <windows.h>
@@ -62,10 +61,14 @@ void InitializeWindowProcExceptions() {
}
} // namespace
+namespace content {
+
void DidEndMainMessageLoop() {
OleUninitialize();
}
+}
+
void RecordBreakpadStatusUMA(MetricsService* metrics) {
DWORD len = ::GetEnvironmentVariableW(
ASCIIToWide(env_vars::kNoOOBreakpad).c_str() , NULL, 0);
@@ -280,47 +283,37 @@ bool CheckMachineLevelInstall() {
// BrowserMainPartsWin ---------------------------------------------------------
-class BrowserMainPartsWin : public BrowserMainParts {
- public:
- explicit BrowserMainPartsWin(const MainFunctionParams& parameters)
- : BrowserMainParts(parameters) {}
+BrowserMainPartsWin::BrowserMainPartsWin(const MainFunctionParams& parameters)
+ : ChromeBrowserMainParts(parameters) {
+}
- protected:
- virtual void PreEarlyInitialization() {
- // Initialize Winsock.
- net::EnsureWinsockInit();
- }
+void BrowserMainPartsWin::PreEarlyInitialization() {
+ // Initialize Winsock.
+ net::EnsureWinsockInit();
+}
- virtual void PreMainMessageLoopStart() {
- OleInitialize(NULL);
+void BrowserMainPartsWin::PreMainMessageLoopStart() {
+ 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();
+ // 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();
- // Make sure that we know how to handle exceptions from the message loop.
- InitializeWindowProcExceptions();
- }
+ // Make sure that we know how to handle exceptions from the message loop.
+ InitializeWindowProcExceptions();
}
+}
- private:
- virtual void InitializeSSL() {
- // Use NSS for SSL by default.
- // The default client socket factory uses NSS for SSL by default on
- // Windows.
- if (parsed_command_line().HasSwitch(switches::kUseSystemSSL)) {
- net::ClientSocketFactory::UseSystemSSL();
- } else {
- // We want to be sure to init NSPR on the main thread.
- crypto::EnsureNSPRInit();
- }
+void BrowserMainPartsWin::InitializeSSL() {
+ // Use NSS for SSL by default.
+ // The default client socket factory uses NSS for SSL by default on
+ // Windows.
+ if (parsed_command_line().HasSwitch(switches::kUseSystemSSL)) {
+ net::ClientSocketFactory::UseSystemSSL();
+ } else {
+ // We want to be sure to init NSPR on the main thread.
+ crypto::EnsureNSPRInit();
}
-};
-
-// static
-BrowserMainParts* BrowserMainParts::CreateBrowserMainParts(
- const MainFunctionParams& parameters) {
- return new BrowserMainPartsWin(parameters);
}
diff --git a/chrome/browser/browser_main_win.h b/chrome/browser/browser_main_win.h
index 3548605..6183a18 100644
--- a/chrome/browser/browser_main_win.h
+++ b/chrome/browser/browser_main_win.h
@@ -8,6 +8,8 @@
#define CHROME_BROWSER_BROWSER_MAIN_WIN_H_
#pragma once
+#include "chrome/browser/browser_main.h"
+
class CommandLine;
// Handle uninstallation when given the appropriate the command-line switch.
@@ -37,4 +39,13 @@ int HandleIconsCommands(const CommandLine& parsed_command_line);
// user level Chrome.
bool CheckMachineLevelInstall();
+class BrowserMainPartsWin : public ChromeBrowserMainParts {
+ public:
+ explicit BrowserMainPartsWin(const MainFunctionParams& parameters);
+
+ virtual void PreEarlyInitialization() OVERRIDE;
+ virtual void PreMainMessageLoopStart() OVERRIDE;
+ virtual void InitializeSSL() OVERRIDE;
+};
+
#endif // CHROME_BROWSER_BROWSER_MAIN_WIN_H_
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index f40047f..0c5a69f 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -311,7 +311,7 @@ unsigned int BrowserProcessImpl::ReleaseModule() {
FROM_HERE,
NewRunnableFunction(&base::ThreadRestrictions::SetIOAllowed, true));
MessageLoop::current()->PostTask(
- FROM_HERE, NewRunnableFunction(DidEndMainMessageLoop));
+ FROM_HERE, NewRunnableFunction(content::DidEndMainMessageLoop));
MessageLoop::current()->Quit();
}
return module_ref_count_;
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 1c8d9ce..3e6639c9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -73,6 +73,7 @@
#if defined(OS_LINUX)
#include "base/linux_util.h"
+#include "chrome/browser/browser_main_gtk.h"
#include "chrome/browser/crash_handler_host_linux.h"
#endif
@@ -84,6 +85,13 @@
#include "chrome/browser/tab_contents/tab_contents_view_gtk.h"
#elif defined(OS_MACOSX)
#include "chrome/browser/tab_contents/tab_contents_view_mac.h"
+#include "chrome/browser/browser_main_mac.h"
+#endif
+
+#if defined(OS_WIN)
+#include "chrome/browser/browser_main_win.h"
+#elif defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/browser_main_chromeos.h"
#endif
#if defined(USE_NSS)
@@ -113,6 +121,21 @@ static bool HandleWebUI(GURL* url, content::BrowserContext* browser_context) {
namespace chrome {
+content::BrowserMainParts* ChromeContentBrowserClient::CreateBrowserMainParts(
+ const MainFunctionParams& parameters) {
+#if defined(OS_WIN)
+ return new BrowserMainPartsWin(parameters);
+#elif defined(OS_MACOSX)
+ return new BrowserMainPartsMac(parameters);
+#elif defined(OS_CHROMEOS)
+ return new BrowserMainPartsChromeos(parameters);
+#elif defined(OS_LINUX)
+ return new BrowserMainPartsGtk(parameters);
+#else
+ return NULL;
+#endif
+}
+
TabContentsView* ChromeContentBrowserClient::CreateTabContentsView(
TabContents* tab_contents) {
#if defined(TOUCH_UI)
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 7d5e322..239bb30 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -15,6 +15,8 @@ namespace chrome {
class ChromeContentBrowserClient : public content::ContentBrowserClient {
public:
+ virtual content::BrowserMainParts* CreateBrowserMainParts(
+ const MainFunctionParams& parameters) OVERRIDE;
virtual TabContentsView* CreateTabContentsView(
TabContents* tab_contents) OVERRIDE;
virtual void RenderViewHostCreated(RenderViewHost* render_view_host) OVERRIDE;
diff --git a/chrome/browser/chromeos/browser_main_chromeos.cc b/chrome/browser/chromeos/browser_main_chromeos.cc
index 776a82b..93be779 100644
--- a/chrome/browser/chromeos/browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/browser_main_chromeos.cc
@@ -4,8 +4,15 @@
#include "chrome/browser/chromeos/browser_main_chromeos.h"
+#include "base/command_line.h"
#include "base/lazy_instance.h"
#include "base/message_loop.h"
+#include "chrome/browser/chromeos/boot_times_loader.h"
+#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h"
+#include "chrome/common/chrome_switches.h"
+#include "content/common/main_function_params.h"
+#include "net/base/network_change_notifier.h"
#include <gtk/gtk.h>
@@ -41,14 +48,36 @@ class MessageLoopObserver : public MessageLoopForUI::Observer {
static base::LazyInstance<MessageLoopObserver> g_message_loop_observer(
base::LINKER_INITIALIZED);
+BrowserMainPartsChromeos::BrowserMainPartsChromeos(
+ const MainFunctionParams& parameters)
+ : BrowserMainPartsGtk(parameters) {
+}
+BrowserMainPartsChromeos::~BrowserMainPartsChromeos() {
+ if (!parameters().ui_task && chromeos::CrosLibrary::Get())
+ chromeos::CrosLibrary::Shutdown();
+
+ // To be precise, logout (browser shutdown) is not yet done, but the
+ // remaining work is negligible, hence we say LogoutDone here.
+ chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("LogoutDone",
+ false);
+ chromeos::BootTimesLoader::Get()->WriteLogoutTimes();
+}
+
+void BrowserMainPartsChromeos::PreMainMessageLoopStart() {
+ // Initialize CrosLibrary only for the browser, unless running tests
+ // (which do their own CrosLibrary setup).
+ if (!parameters().ui_task) {
+ bool use_stub = parameters().command_line_.HasSwitch(switches::kStubCros);
+ chromeos::CrosLibrary::Initialize(use_stub);
+ }
+ // Replace the default NetworkChangeNotifierFactory with ChromeOS specific
+ // implementation.
+ net::NetworkChangeNotifier::SetFactory(
+ new chromeos::CrosNetworkChangeNotifierFactory());
+}
+
void BrowserMainPartsChromeos::PostMainMessageLoopStart() {
BrowserMainPartsPosix::PostMainMessageLoopStart();
MessageLoopForUI* message_loop = MessageLoopForUI::current();
message_loop->AddObserver(g_message_loop_observer.Pointer());
}
-
-// static
-BrowserMainParts* BrowserMainParts::CreateBrowserMainParts(
- const MainFunctionParams& parameters) {
- return new BrowserMainPartsChromeos(parameters);
-}
diff --git a/chrome/browser/chromeos/browser_main_chromeos.h b/chrome/browser/chromeos/browser_main_chromeos.h
index b2fb924..61d281e 100644
--- a/chrome/browser/chromeos/browser_main_chromeos.h
+++ b/chrome/browser/chromeos/browser_main_chromeos.h
@@ -9,11 +9,14 @@
class BrowserMainPartsChromeos : public BrowserMainPartsGtk {
public:
- explicit BrowserMainPartsChromeos(const MainFunctionParams& parameters)
- : BrowserMainPartsGtk(parameters) {}
+ explicit BrowserMainPartsChromeos(const MainFunctionParams& parameters);
- protected:
- virtual void PostMainMessageLoopStart();
+ ~BrowserMainPartsChromeos();
+
+ virtual void PreMainMessageLoopStart() OVERRIDE;
+ virtual void PostMainMessageLoopStart() OVERRIDE;
+
+ private:
DISALLOW_COPY_AND_ASSIGN(BrowserMainPartsChromeos);
};
diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc
index 8dfc40e..3d16dce 100644
--- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc
+++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc
@@ -81,6 +81,8 @@ NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() {
online_notification_task_->Cancel();
online_notification_task_ = NULL;
}
+ if (!chromeos::CrosLibrary::Get())
+ return;
chromeos::NetworkLibrary* lib =
chromeos::CrosLibrary::Get()->GetNetworkLibrary();
lib->RemoveNetworkManagerObserver(this);
diff --git a/chrome/browser/ui/gtk/gtk_util.cc b/chrome/browser/ui/gtk/gtk_util.cc
index 25edfa6..5107045 100644
--- a/chrome/browser/ui/gtk/gtk_util.cc
+++ b/chrome/browser/ui/gtk/gtk_util.cc
@@ -496,35 +496,6 @@ void ConvertWidgetPointToScreen(GtkWidget* widget, gfx::Point* p) {
p->SetPoint(p->x() + position.x(), p->y() + position.y());
}
-void InitRCStyles() {
- static const char kRCText[] =
- // Make our dialogs styled like the GNOME HIG.
- //
- // TODO(evanm): content-area-spacing was introduced in a later
- // version of GTK, so we need to set that manually on all dialogs.
- // Perhaps it would make sense to have a shared FixupDialog() function.
- "style \"gnome-dialog\" {\n"
- " xthickness = 12\n"
- " GtkDialog::action-area-border = 0\n"
- " GtkDialog::button-spacing = 6\n"
- " GtkDialog::content-area-spacing = 18\n"
- " GtkDialog::content-area-border = 12\n"
- "}\n"
- // Note we set it at the "application" priority, so users can override.
- "widget \"GtkDialog\" style : application \"gnome-dialog\"\n"
-
- // Make our about dialog special, so the image is flush with the edge.
- "style \"about-dialog\" {\n"
- " GtkDialog::action-area-border = 12\n"
- " GtkDialog::button-spacing = 6\n"
- " GtkDialog::content-area-spacing = 18\n"
- " GtkDialog::content-area-border = 0\n"
- "}\n"
- "widget \"about-dialog\" style : application \"about-dialog\"\n";
-
- gtk_rc_parse_string(kRCText);
-}
-
GtkWidget* CenterWidgetInHBox(GtkWidget* hbox, GtkWidget* widget,
bool pack_at_end, int padding) {
GtkWidget* centering_vbox = gtk_vbox_new(FALSE, 0);
diff --git a/chrome/browser/ui/gtk/gtk_util.h b/chrome/browser/ui/gtk/gtk_util.h
index f4e89fd..f2adc4a 100644
--- a/chrome/browser/ui/gtk/gtk_util.h
+++ b/chrome/browser/ui/gtk/gtk_util.h
@@ -127,9 +127,6 @@ gfx::Size GetWidgetSize(GtkWidget* widget);
// relative to the widget's top-left origin.
void ConvertWidgetPointToScreen(GtkWidget* widget, gfx::Point* p);
-// Initialize some GTK settings so that our dialogs are consistent.
-void InitRCStyles();
-
// Stick the widget in the given hbox without expanding vertically. The widget
// is packed at the start of the hbox. This is useful for widgets that would
// otherwise expand to fill the vertical space of the hbox
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 09935b4..1506f69 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -291,6 +291,7 @@
'browser/browser_main_gtk.cc',
'browser/browser_main_gtk.h',
'browser/browser_main_mac.mm',
+ 'browser/browser_main_mac.h',
'browser/browser_main_posix.cc',
'browser/browser_main_posix.h',
'browser/browser_main_win.cc',
diff --git a/chrome/chrome_dll.gypi b/chrome/chrome_dll.gypi
index d5bc950..ea4d845 100644
--- a/chrome/chrome_dll.gypi
+++ b/chrome/chrome_dll.gypi
@@ -719,6 +719,7 @@
'../content/common/child_process.cc',
'../content/common/child_thread.cc',
'../content/common/content_client.cc',
+ '../content/common/content_constants.cc',
'../content/common/content_counters.cc',
'../content/common/content_message_generator.cc',
'../content/common/content_paths.cc',
diff --git a/chrome/common/chrome_constants.cc b/chrome/common/chrome_constants.cc
index fe086f4..9e1bb3f 100644
--- a/chrome/common/chrome_constants.cc
+++ b/chrome/common/chrome_constants.cc
@@ -104,10 +104,8 @@ const char* const kHelperFlavorSuffixes[] = {
const wchar_t kNaClAppName[] = L"nacl64";
#if defined(GOOGLE_CHROME_BUILD)
const wchar_t kBrowserAppName[] = L"Chrome";
-const char kStatsFilename[] = "ChromeStats2";
#else
const wchar_t kBrowserAppName[] = L"Chromium";
-const char kStatsFilename[] = "ChromiumStats2";
#endif
#if defined(OS_WIN)
@@ -158,9 +156,6 @@ const FilePath::CharType kJumpListIconDirname[] = FPL("JumpListIcons");
const FilePath::CharType kWebAppDirname[] = FPL("Web Applications");
const FilePath::CharType kServiceStateFileName[] = FPL("Service State");
-const int kStatsMaxThreads = 32;
-const int kStatsMaxCounters = 3000;
-
// We don't enable record mode in the released product because users could
// potentially be tricked into running a product in record mode without
// knowing it. Enable in debug builds. Playback mode is allowed always,
diff --git a/chrome/common/chrome_constants.h b/chrome/common/chrome_constants.h
index 3e3acc4..7f196a3 100644
--- a/chrome/common/chrome_constants.h
+++ b/chrome/common/chrome_constants.h
@@ -46,7 +46,6 @@ extern const wchar_t kCrashReportLog[];
extern const wchar_t kTestingInterfaceDLL[];
extern const char kInitialProfile[];
extern const char kMultiProfileDirPrefix[];
-extern const char kStatsFilename[];
extern const wchar_t kBrowserResourcesDll[];
extern const wchar_t kNaClAppName[];
extern const FilePath::CharType kExtensionFileExtension[];
@@ -84,9 +83,6 @@ extern const FilePath::CharType kJumpListIconDirname[];
extern const FilePath::CharType kWebAppDirname[];
extern const FilePath::CharType kServiceStateFileName[];
-extern const int kStatsMaxThreads;
-extern const int kStatsMaxCounters;
-
extern const bool kRecordModeEnabled;
// Most sequence numbers are used by a renderer when responding to a browser
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 63aa4f7..9fc6437 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -101,12 +101,6 @@ const char kAutomationReinitializeOnChannelError[] =
const char kBlockReadingThirdPartyCookies[] =
"block-reading-third-party-cookies";
-// Causes the browser process to throw an assertion on startup.
-const char kBrowserAssertTest[] = "assert-test";
-
-// Causes the browser process to crash on startup.
-const char kBrowserCrashTest[] = "crash-test";
-
// How often (in seconds) to check for updates. Should only be used for
// testing purposes.
const char kCheckForUpdateIntervalSec[] = "check-for-update-interval";
@@ -303,9 +297,6 @@ const char kDisableSanitizedClientSidePhishingDetection[] =
// Disable site-specific tailoring to compatibility issues in WebKit.
const char kDisableSiteSpecificQuirks[] = "disable-site-specific-quirks";
-// Disable False Start in SSL and TLS connections.
-const char kDisableSSLFalseStart[] = "disable-ssl-false-start";
-
// Disable SSL v3 (usually for testing purposes).
const char kDisableSSL3[] = "disable-ssl3";
@@ -441,11 +432,6 @@ const char kEnableConnectBackupJobs[] = "enable-connect-backup-jobs";
// Enables web developers to create apps for Chrome without using crx packages.
const char kEnableCrxlessWebApps[] = "enable-crxless-web-apps";
-// Enable DNS side checking of certificates. Still experimental, should only
-// be used by developers at the current time.
-const char kEnableDNSCertProvenanceChecking[] =
- "enable-dns-cert-provenance-checking";
-
// Enables extension APIs that are in development.
const char kEnableExperimentalExtensionApis[] =
"enable-experimental-extension-apis";
@@ -502,9 +488,6 @@ const char kEnableNaCl[] = "enable-nacl";
// Enables debugging via RSP over a socket.
const char kEnableNaClDebug[] = "enable-nacl-debug";
-// Enables TLS origin bound certificate extension.
-const char kEnableOriginBoundCerts[] = "enable-origin-bound-certs";
-
// Enable content settings based on host *and* plug-in.
const char kEnableResourceContentSettings[] =
"enable-resource-content-settings";
@@ -524,10 +507,6 @@ const char kEnableShortcutsProvider[] = "enable-shortcuts-provider";
// On platforms that support it, enable smooth scroll animation.
const char kEnableSmoothScrolling[] = "enable-smooth-scrolling";
-
-// Enables TLS cached info extension.
-const char kEnableSSLCachedInfo[] = "enable-ssl-cached-info";
-
// Enable OAuth sign-in for sync.
const char kEnableSyncOAuth[] = "enable-sync-oauth";
@@ -547,10 +526,6 @@ const char kEnableTabGroupsContextMenu[] = "enable-tab-groups-context-menu";
// Enable the "synced bookmarks" folder.
const char kEnableSyncedBookmarksFolder[] = "enable-synced-bookmarks-folder";
-// Enable use of experimental TCP sockets API for sending data in the
-// SYN packet.
-const char kEnableTcpFastOpen[] = "enable-tcp-fastopen";
-
// Enables the option to show tabs as a vertical stack down the side of the
// browser window.
const char kEnableVerticalTabs[] = "enable-vertical-tabs";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 997aabe..36b2e53 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -45,8 +45,6 @@ extern const char kAuthServerWhitelist[];
extern const char kAutomationClientChannelID[];
extern const char kAutomationReinitializeOnChannelError[];
extern const char kBlockReadingThirdPartyCookies[];
-extern const char kBrowserAssertTest[];
-extern const char kBrowserCrashTest[];
extern const char kCheckForUpdateIntervalSec[];
extern const char kChromeVersion[];
extern const char kCipherSuiteBlacklist[];
@@ -92,7 +90,6 @@ extern const char kDisableRestoreBackgroundContents[];
extern const char kDisableSanitizedClientSidePhishingDetection[];
extern const char kDisableSiteSpecificQuirks[];
extern const char kDisableSSL3[];
-extern const char kDisableSSLFalseStart[];
extern const char kDisableSync[];
extern const char kDisableSyncApps[];
extern const char kDisableSyncAutofill[];
@@ -129,7 +126,6 @@ extern const char kEnableCloudPrint[];
extern const char kEnableCompositeToTexture[];
extern const char kEnableConnectBackupJobs[];
extern const char kEnableCrxlessWebApps[];
-extern const char kEnableDNSCertProvenanceChecking[];
extern const char kEnableExperimentalExtensionApis[];
extern const char kEnableExtensionTimelineApi[];
extern const char kEnableFastback[];
@@ -144,21 +140,18 @@ extern const char kEnableMacCookies[];
extern const char kEnableMemoryInfo[];
extern const char kEnableNaCl[];
extern const char kEnableNaClDebug[];
-extern const char kEnableOriginBoundCerts[];
extern const char kEnablePanels[];
extern const char kEnablePreconnect[];
extern const char kEnableResourceContentSettings[];
extern const char kEnableSearchProviderApiV2[];
extern const char kEnableShortcutsProvider[];
extern const char kEnableSmoothScrolling[];
-extern const char kEnableSSLCachedInfo[];
extern const char kEnableSyncOAuth[];
extern const char kEnableSyncSearchEngines[];
extern const char kEnableSyncSessions[];
extern const char kEnableSyncSessionsForOtherClients[];
extern const char kEnableSyncedBookmarksFolder[];
extern const char kEnableTabGroupsContextMenu[];
-extern const char kEnableTcpFastOpen[];
extern const char kEnableTopSites[];
extern const char kEnableVerticalTabs[];
extern const char kEnableWatchdog[];
diff --git a/content/app/content_main.cc b/content/app/content_main.cc
index 971766d..eacb2bd 100644
--- a/content/app/content_main.cc
+++ b/content/app/content_main.cc
@@ -12,15 +12,19 @@
#include "base/logging.h"
#include "base/mac/scoped_nsautorelease_pool.h"
#include "base/memory/scoped_ptr.h"
+#include "base/metrics/stats_table.h"
#include "base/process_util.h"
#include "base/stringprintf.h"
+#include "base/string_number_conversions.h"
#include "content/app/content_main_delegate.h"
+#include "content/common/content_constants.h"
#include "content/common/content_paths.h"
#include "content/common/content_switches.h"
#include "content/common/main_function_params.h"
#include "content/common/sandbox_init_wrapper.h"
#include "content/common/set_process_title.h"
#include "crypto/nss_util.h"
+#include "ipc/ipc_switches.h"
#include "ui/base/ui_base_switches.h"
#include "ui/base/ui_base_paths.h"
@@ -53,6 +57,7 @@ int tc_set_new_mode(int mode);
}
#endif
+extern int BrowserMain(const MainFunctionParams&);
extern int RendererMain(const MainFunctionParams&);
extern int GpuMain(const MainFunctionParams&);
extern int PluginMain(const MainFunctionParams&);
@@ -184,6 +189,27 @@ void CommonSubprocessInit(const std::string& process_type) {
#endif
}
+void InitializeStatsTable(base::ProcessId browser_pid,
+ const CommandLine& command_line) {
+ // Initialize the Stats Counters table. With this initialized,
+ // the StatsViewer can be utilized to read counters outside of
+ // Chrome. These lines can be commented out to effectively turn
+ // counters 'off'. The table is created and exists for the life
+ // of the process. It is not cleaned up.
+ if (command_line.HasSwitch(switches::kEnableStatsTable) ||
+ command_line.HasSwitch(switches::kEnableBenchmarking)) {
+ // NOTIMPLEMENTED: we probably need to shut this down correctly to avoid
+ // leaking shared memory regions on posix platforms.
+ std::string statsfile =
+ base::StringPrintf("%s-%u",
+ content::kStatsFilename,
+ static_cast<unsigned int>(browser_pid));
+ base::StatsTable* stats_table = new base::StatsTable(statsfile,
+ content::kStatsMaxThreads, content::kStatsMaxCounters);
+ base::StatsTable::set_current(stats_table);
+ }
+}
+
// We dispatch to a process-type-specific FooMain() based on a command-line
// flag. This struct is used to build a table of (flag, main function) pairs.
struct MainFunction {
@@ -217,6 +243,13 @@ int RunZygote(const MainFunctionParams& main_function_params,
// line so update it here with the new version.
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ // The StatsTable must be initialized in each process; we already
+ // initialized for the browser process, now we need to initialize
+ // within the new processes as well.
+ pid_t browser_pid = base::GetParentProcessId(
+ base::GetParentProcessId(base::GetCurrentProcId()));
+ InitializeStatsTable(browser_pid, command_line);
+
MainFunctionParams main_params(command_line,
main_function_params.sandbox_info_,
main_function_params.autorelease_pool_);
@@ -244,6 +277,7 @@ int RunNamedProcessTypeMain(const std::string& process_type,
const MainFunctionParams& main_function_params,
content::ContentMainDelegate* delegate) {
static const MainFunction kMainFunctions[] = {
+ { "", BrowserMain },
{ switches::kRendererProcess, RendererMain },
{ switches::kPluginProcess, PluginMain },
{ switches::kWorkerProcess, WorkerMain },
@@ -389,6 +423,24 @@ int ContentMain(int argc,
CHECK(icu_util::Initialize());
+ base::ProcessId browser_pid = base::GetCurrentProcId();
+ if (command_line.HasSwitch(switches::kProcessChannelID)) {
+#if defined(OS_WIN) || defined(OS_MACOSX)
+ std::string channel_name =
+ command_line.GetSwitchValueASCII(switches::kProcessChannelID);
+
+ int browser_pid_int;
+ base::StringToInt(channel_name, &browser_pid_int);
+ browser_pid = static_cast<base::ProcessId>(browser_pid_int);
+ DCHECK_NE(browser_pid_int, 0);
+#elif defined(OS_POSIX)
+ // On linux, we're in the zygote here; so we need the parent process' id.
+ browser_pid = base::GetParentProcessId(base::GetCurrentProcId());
+#endif
+ }
+
+ InitializeStatsTable(browser_pid, command_line);
+
if (delegate) delegate->PreSandboxStartup();
if (!process_type.empty())
diff --git a/content/browser/browser_main.cc b/content/browser/browser_main.cc
new file mode 100644
index 0000000..7d7a599
--- /dev/null
+++ b/content/browser/browser_main.cc
@@ -0,0 +1,319 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/browser_main.h"
+
+#include "base/allocator/allocator_shim.h"
+#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 "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/sandbox_policy.h"
+#include "net/base/network_change_notifier.h"
+#include "net/base/ssl_config_service.h"
+#include "net/socket/tcp_client_socket.h"
+
+#if defined(OS_WIN)
+#include <windows.h>
+#include <commctrl.h>
+#include <shellapi.h>
+
+#include "sandbox/src/sandbox.h"
+#endif
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+#include <dbus/dbus-glib.h>
+#endif
+
+#if defined(TOOLKIT_USES_GTK)
+#include "ui/gfx/gtk_util.h"
+#endif
+
+namespace {
+
+// Windows-specific initialization code for the sandbox broker services. This
+// is just a NOP on non-Windows platforms to reduce ifdefs later on.
+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) {
+ sandbox::InitBrokerServices(broker_services);
+ if (!parsed_command_line.HasSwitch(switches::kNoSandbox)) {
+ bool use_winsta = !parsed_command_line.HasSwitch(
+ switches::kDisableAltWinstation);
+ // Precreate the desktop and window station used by the renderers.
+ sandbox::TargetPolicy* policy = broker_services->CreatePolicy();
+ sandbox::ResultCode result = policy->CreateAlternateDesktop(use_winsta);
+ CHECK(sandbox::SBOX_ERROR_FAILED_TO_SWITCH_BACK_WINSTATION != result);
+ policy->Release();
+ }
+ }
+#endif
+}
+
+#if defined(TOOLKIT_USES_GTK)
+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 {
+ 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
+
+} // namespace
+
+namespace content {
+
+BrowserMainParts::BrowserMainParts(const MainFunctionParams& parameters)
+ : parameters_(parameters),
+ parsed_command_line_(parameters.command_line_) {
+}
+
+BrowserMainParts::~BrowserMainParts() {
+}
+
+void BrowserMainParts::EarlyInitialization() {
+ PreEarlyInitialization();
+
+ 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))
+ 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 InitializeSSL().
+ if (parsed_command_line().HasSwitch(switches::kEnableTcpFastOpen))
+ net::set_tcp_fastopen_enabled(true);
+
+ PostEarlyInitialization();
+}
+
+void BrowserMainParts::MainMessageLoopStart() {
+ PreMainMessageLoopStart();
+
+ main_message_loop_.reset(new MessageLoop(MessageLoop::TYPE_UI));
+
+ // TODO(viettrungluu): should these really go before setting the thread name?
+ system_monitor_.reset(new base::SystemMonitor);
+ hi_res_timer_manager_.reset(new HighResolutionTimerManager);
+
+ InitializeMainThread();
+
+ network_change_notifier_.reset(net::NetworkChangeNotifier::Create());
+
+ PostMainMessageLoopStart();
+}
+
+void BrowserMainParts::InitializeMainThread() {
+ const char* kThreadName = "CrBrowserMain";
+ base::PlatformThread::SetName(kThreadName);
+ main_message_loop().set_thread_name(kThreadName);
+
+ // 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(TOOLKIT_USES_GTK)
+ // 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();
+ // We use glib-dbus for geolocation and it's possible other libraries
+ // (e.g. gnome-keyring) will use it, so initialize its threading here
+ // as well.
+ dbus_g_thread_init();
+ gfx::GtkInitFromCommandLine(parameters().command_line_);
+ 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::InitializeSSL() {
+}
+
+void BrowserMainParts::ToolkitInitialized() {
+}
+
+int BrowserMainParts::TemporaryContinue() {
+ return 0;
+}
+
+} // namespace content
+
+// Main routine for running as the Browser process.
+int BrowserMain(const MainFunctionParams& parameters) {
+ TRACE_EVENT_BEGIN_ETW("BrowserMain", 0, "");
+
+ scoped_ptr<content::BrowserMainParts> parts(
+ content::GetContentClient()->browser()->CreateBrowserMainParts(
+ parameters));
+
+ parts->EarlyInitialization();
+
+ // Must happen before we try to use a message loop or display any UI.
+ parts->InitializeToolkit();
+
+ parts->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
+ // to browser_shutdown::Shutdown or BrowserProcess::EndSession.
+
+ // !!!!!!!!!! READ ME !!!!!!!!!!
+ // I (viettrungluu) am in the process of refactoring |BrowserMain()|. If you
+ // need to add something above this comment, read the documentation in
+ // browser_main.h. If you need to add something below, please do the
+ // following:
+ // - Figure out where you should add your code. Do NOT just pick a random
+ // location "which works".
+ // - Document the dependencies apart from compile-time-checkable ones. What
+ // must happen before your new code is executed? Does your new code need to
+ // run before something else? Are there performance reasons for executing
+ // your code at that point?
+ // - If you need to create a (persistent) object, heap allocate it and keep a
+ // |scoped_ptr| to it rather than allocating it on the stack. Otherwise
+ // I'll have to convert your code when I refactor.
+ // - Unless your new code is just a couple of lines, factor it out into a
+ // function with a well-defined purpose. Do NOT just add it inline in
+ // |BrowserMain()|.
+ // Thanks!
+
+ // TODO(viettrungluu): put the remainder into BrowserMainParts
+ const CommandLine& parsed_command_line = parameters.command_line_;
+
+#if defined(OS_WIN) && !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
+
+ // 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);
+
+ // Initialize histogram statistics gathering system.
+ base::StatisticsRecorder statistics;
+
+ // TODO(jam): bring the content parts from this chrome function here.
+ int result_code = parts->TemporaryContinue();
+
+ // 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;
+}
diff --git a/content/browser/browser_main.h b/content/browser/browser_main.h
new file mode 100644
index 0000000..931bd9a
--- /dev/null
+++ b/content/browser/browser_main.h
@@ -0,0 +1,133 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_BROWSER_MAIN_H_
+#define CONTENT_BROWSER_BROWSER_MAIN_H_
+#pragma once
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+
+class BrowserThread;
+class CommandLine;
+class HighResolutionTimerManager;
+class MessageLoop;
+struct MainFunctionParams;
+
+namespace base {
+class SystemMonitor;
+}
+
+namespace net {
+class NetworkChangeNotifier;
+}
+
+namespace content {
+
+// BrowserMainParts:
+// This class contains different "stages" to be executed in |BrowserMain()|,
+// mostly initialization. This is made into a class rather than just functions
+// so each stage can create and maintain state. Each part is represented by a
+// single method (e.g., "EarlyInitialization()"), which does the following:
+// - calls a method (e.g., "PreEarlyInitialization()") which individual
+// platforms can override to provide platform-specific code which is to be
+// executed before the common code;
+// - calls various methods for things common to all platforms (for that given
+// stage); and
+// - calls a method (e.g., "PostEarlyInitialization()") for platform-specific
+// code to be called after the common code.
+// As indicated above, platforms should override the default "Pre...()" and
+// "Post...()" methods when necessary; they need not call the superclass's
+// implementation (which is empty).
+//
+// Parts:
+// - EarlyInitialization: things which should be done as soon as possible on
+// program start (such as setting up signal handlers) and things to be done
+// at some generic time before the start of the main message loop.
+// - MainMessageLoopStart: things beginning with the start of the main message
+// loop and ending with initialization of the main thread; platform-specific
+// things which should be done immediately before the start of the main
+// message loop should go in |PreMainMessageLoopStart()|.
+// - (more to come)
+//
+// How to add stuff (to existing parts):
+// - Figure out when your new code should be executed. What must happen
+// before/after your code is executed? Are there performance reasons for
+// running your code at a particular time? Document these things!
+// - Split out any platform-specific bits. Please avoid #ifdefs it at all
+// possible. You have two choices for platform-specific code: (1) Execute it
+// from one of the platform-specific |Pre/Post...()| methods; do this if the
+// code is unique to a platform type. Or (2) execute it from one of the
+// "parts" (e.g., |EarlyInitialization()|) and provide platform-specific
+// implementations of your code (in a virtual method); do this if you need to
+// provide different implementations across most/all platforms.
+// - Unless your new code is just one or two lines, put it into a separate
+// method with a well-defined purpose. (Likewise, if you're adding to an
+// existing chunk which makes it longer than one or two lines, please move
+// the code out into a separate method.)
+class BrowserMainParts {
+ public:
+ explicit BrowserMainParts(const MainFunctionParams& parameters);
+ virtual ~BrowserMainParts();
+
+ // Parts to be called by |BrowserMain()|.
+ void EarlyInitialization();
+ void MainMessageLoopStart();
+ void InitializeToolkit();
+
+ // Temporary function since not all the code from chrome is moved over yet.
+ virtual int TemporaryContinue();
+
+ protected:
+ // Methods to be overridden to provide platform-specific code; these
+ // correspond to the "parts" above.
+ virtual void PreEarlyInitialization();
+ virtual void PostEarlyInitialization();
+ virtual void PreMainMessageLoopStart();
+ virtual void PostMainMessageLoopStart();
+
+ // Used to initialize NSPR where appropriate.
+ virtual void InitializeSSL();
+
+ // Allows an embedder to do any extra toolkit initialization.
+ virtual void ToolkitInitialized();
+
+ // Accessors for data members (below) ----------------------------------------
+ const MainFunctionParams& parameters() const {
+ return parameters_;
+ }
+ const CommandLine& parsed_command_line() const {
+ return parsed_command_line_;
+ }
+ MessageLoop& main_message_loop() const {
+ return *main_message_loop_;
+ }
+
+ private:
+ void InitializeMainThread();
+
+ // Members initialized on construction ---------------------------------------
+
+ const MainFunctionParams& parameters_;
+ const CommandLine& parsed_command_line_;
+
+ // Members initialized in |MainMessageLoopStart()| ---------------------------
+ scoped_ptr<MessageLoop> main_message_loop_;
+ scoped_ptr<base::SystemMonitor> system_monitor_;
+ scoped_ptr<HighResolutionTimerManager> hi_res_timer_manager_;
+ scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
+ scoped_ptr<BrowserThread> main_thread_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserMainParts);
+};
+
+// Perform platform-specific work that needs to be done after the main event
+// loop has ended. The embedder must be sure to call this.
+// TODO(jam): change this so that content calls it so that we don't depend on
+// the embedder.
+void DidEndMainMessageLoop();
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_BROWSER_MAIN_H_
diff --git a/content/browser/content_browser_client.h b/content/browser/content_browser_client.h
index 7fdff59..32fa117 100644
--- a/content/browser/content_browser_client.h
+++ b/content/browser/content_browser_client.h
@@ -32,8 +32,13 @@ class TabContents;
class TabContentsView;
class WorkerProcessHost;
struct DesktopNotificationHostMsg_Show_Params;
+struct MainFunctionParams;
struct WebPreferences;
+namespace content {
+class BrowserMainParts;
+}
+
namespace crypto {
class CryptoModuleBlockingPasswordDelegate;
}
@@ -59,6 +64,7 @@ class Clipboard;
namespace content {
class BrowserContext;
+class BrowserMainParts;
class ResourceContext;
class WebUIFactory;
@@ -74,6 +80,12 @@ class ContentBrowserClient {
public:
virtual ~ContentBrowserClient() {}
+ // Allows the embedder to return a customed BrowserMainParts implementation
+ // for the browser staratup code. Can return NULL, in which case the default
+ // is used.
+ virtual BrowserMainParts* CreateBrowserMainParts(
+ const MainFunctionParams& parameters) = 0;
+
virtual TabContentsView* CreateTabContentsView(TabContents* tab_contents) = 0;
// Notifies that a new RenderHostView has been created.
diff --git a/content/browser/mock_content_browser_client.cc b/content/browser/mock_content_browser_client.cc
index c47f2c5..1ab31c9 100644
--- a/content/browser/mock_content_browser_client.cc
+++ b/content/browser/mock_content_browser_client.cc
@@ -19,6 +19,11 @@ namespace content {
MockContentBrowserClient::~MockContentBrowserClient() {
}
+BrowserMainParts* MockContentBrowserClient::CreateBrowserMainParts(
+ const MainFunctionParams& parameters) {
+ return NULL;
+}
+
TabContentsView* MockContentBrowserClient::CreateTabContentsView(
TabContents* tab_contents) {
return new TestTabContentsView;
diff --git a/content/browser/mock_content_browser_client.h b/content/browser/mock_content_browser_client.h
index e2831dd..4320592 100644
--- a/content/browser/mock_content_browser_client.h
+++ b/content/browser/mock_content_browser_client.h
@@ -18,6 +18,8 @@ class MockContentBrowserClient : public ContentBrowserClient {
public:
virtual ~MockContentBrowserClient();
+ virtual BrowserMainParts* CreateBrowserMainParts(
+ const MainFunctionParams& parameters) OVERRIDE;
virtual TabContentsView* CreateTabContentsView(
TabContents* tab_contents) OVERRIDE;
virtual void RenderViewHostCreated(
diff --git a/content/common/content_constants.cc b/content/common/content_constants.cc
index 6835362..da22264 100644
--- a/content/common/content_constants.cc
+++ b/content/common/content_constants.cc
@@ -16,6 +16,15 @@ const size_t kMaxURLDisplayChars = 32 * 1024;
const char kDefaultPluginRenderViewId[] = "PluginRenderViewId";
const char kDefaultPluginRenderProcessId[] = "PluginRenderProcessId";
-} // namespace content
+#if defined(GOOGLE_CHROME_BUILD)
+const wchar_t kBrowserAppName[] = L"Chrome";
+const char kStatsFilename[] = "ChromeStats2";
+#else
+const wchar_t kBrowserAppName[] = L"Chromium";
+const char kStatsFilename[] = "ChromiumStats2";
+#endif
+
+const int kStatsMaxThreads = 32;
+const int kStatsMaxCounters = 3000;
-#undef FPL
+} // namespace content
diff --git a/content/common/content_constants.h b/content/common/content_constants.h
index 1c8b680..ad900d0 100644
--- a/content/common/content_constants.h
+++ b/content/common/content_constants.h
@@ -35,6 +35,10 @@ extern const size_t kMaxURLDisplayChars;
extern const char kDefaultPluginRenderViewId[];
extern const char kDefaultPluginRenderProcessId[];
+extern const char kStatsFilename[];
+extern const int kStatsMaxThreads;
+extern const int kStatsMaxCounters;
+
} // namespace content
#endif // CONTENT_COMMON_CHROME_CONSTANTS_H_
diff --git a/content/common/content_switches.cc b/content/common/content_switches.cc
index 8657e95..70527a8 100644
--- a/content/common/content_switches.cc
+++ b/content/common/content_switches.cc
@@ -17,6 +17,12 @@ const char kAllowRunningInsecureContent[] = "allow-running-insecure-content";
// Allows debugging of sandboxed processes (see zygote_main_linux.cc).
const char kAllowSandboxDebugging[] = "allow-sandbox-debugging";
+// Causes the browser process to throw an assertion on startup.
+const char kBrowserAssertTest[] = "assert-test";
+
+// Causes the browser process to crash on startup.
+const char kBrowserCrashTest[] = "crash-test";
+
// Path to the exe to run for the renderer and plugin subprocesses.
const char kBrowserSubprocessPath[] = "browser-subprocess-path";
@@ -117,9 +123,6 @@ const char kDisableLocalStorage[] = "disable-local-storage";
// builds.
const char kDisableLogging[] = "disable-logging";
-// Disable smooth scrolling for testing.
-const char kDisableSmoothScrolling[] = "disable-smooth-scrolling";
-
// Prevent plugins from running.
const char kDisablePlugins[] = "disable-plugins";
@@ -129,6 +132,12 @@ const char kDisablePopupBlocking[] = "disable-popup-blocking";
// Turns off the accessibility in the renderer.
const char kDisableRendererAccessibility[] = "disable-renderer-accessibility";
+// Disable False Start in SSL and TLS connections.
+const char kDisableSSLFalseStart[] = "disable-ssl-false-start";
+
+// Disable smooth scrolling for testing.
+const char kDisableSmoothScrolling[] = "disable-smooth-scrolling";
+
// Disable the seccomp sandbox (Linux only)
const char kDisableSeccompSandbox[] = "disable-seccomp-sandbox";
@@ -168,6 +177,11 @@ const char kEnableAccessibilityLogging[] = "enable-accessibility-logging";
// Enables the benchmarking extensions.
const char kEnableBenchmarking[] = "enable-benchmarking";
+// Enable DNS side checking of certificates. Still experimental, should only
+// be used by developers at the current time.
+const char kEnableDNSCertProvenanceChecking[] =
+ "enable-dns-cert-provenance-checking";
+
// Enables device motion events.
const char kEnableDeviceMotion[] = "enable-device-motion";
@@ -190,9 +204,15 @@ const char kEnableMediaStream[] = "enable-media-stream";
// assumed to be sRGB.
const char kEnableMonitorProfile[] = "enable-monitor-profile";
+// Enables TLS origin bound certificate extension.
+const char kEnableOriginBoundCerts[] = "enable-origin-bound-certs";
+
// Enable caching of pre-parsed JS script data. See http://crbug.com/32407.
const char kEnablePreparsedJsCaching[] = "enable-preparsed-js-caching";
+// Enables TLS cached info extension.
+const char kEnableSSLCachedInfo[] = "enable-ssl-cached-info";
+
// Cause the OS X sandbox write to syslog every time an access to a resource
// is denied by the sandbox.
const char kEnableSandboxLogging[] = "enable-sandbox-logging";
@@ -203,6 +223,10 @@ const char kEnableSeccompSandbox[] = "enable-seccomp-sandbox";
// Enables StatsTable, logging statistics to a global named shared memory table.
const char kEnableStatsTable[] = "enable-stats-table";
+// Enable use of experimental TCP sockets API for sending data in the
+// SYN packet.
+const char kEnableTcpFastOpen[] = "enable-tcp-fastopen";
+
// Enables support for fullscreen video. Current implementation is
// incomplete and this flag is used for development and testing.
const char kEnableVideoFullscreen[] = "enable-video-fullscreen";
diff --git a/content/common/content_switches.h b/content/common/content_switches.h
index c11bb6f..653ba77 100644
--- a/content/common/content_switches.h
+++ b/content/common/content_switches.h
@@ -15,6 +15,8 @@ namespace switches {
extern const char kAllowFileAccessFromFiles[];
extern const char kAllowRunningInsecureContent[];
extern const char kAllowSandboxDebugging[];
+extern const char kBrowserAssertTest[];
+extern const char kBrowserCrashTest[];
extern const char kBrowserSubprocessPath[];
// TODO(jam): this doesn't belong in content.
extern const char kChromeFrame[];
@@ -50,6 +52,7 @@ extern const char kDisableSmoothScrolling[];
extern const char kDisablePlugins[];
extern const char kDisablePopupBlocking[];
extern const char kDisableRendererAccessibility[];
+extern const char kDisableSSLFalseStart[];
extern const char kDisableSeccompSandbox[];
extern const char kDisableSessionStorage[];
extern const char kDisableSharedWorkers[];
@@ -62,16 +65,20 @@ extern const char kEnableAcceleratedDrawing[];
extern const char kEnableAccessibility[];
extern const char kEnableAccessibilityLogging[];
extern const char kEnableBenchmarking[];
+extern const char kEnableDNSCertProvenanceChecking[];
extern const char kEnableDeviceMotion[];
extern const char kEnableFullScreen[];
extern const char kEnableGPUPlugin[];
extern const char kEnableLogging[];
extern const char kEnableMediaStream[];
extern const char kEnableMonitorProfile[];
+extern const char kEnableOriginBoundCerts[];
extern const char kEnablePreparsedJsCaching[];
+extern const char kEnableSSLCachedInfo[];
extern const char kEnableSandboxLogging[];
extern const char kEnableSeccompSandbox[];
extern const char kEnableStatsTable[];
+extern const char kEnableTcpFastOpen[];
extern const char kEnableVideoFullscreen[];
extern const char kEnableVideoLogging[];
extern const char kEnableWebIntents[];
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 21d16c5..f153a44 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -56,6 +56,8 @@
'browser/browser_child_process_host.cc',
'browser/browser_child_process_host.h',
'browser/browser_context.h',
+ 'browser/browser_main.cc',
+ 'browser/browser_main.h',
'browser/browser_message_filter.cc',
'browser/browser_message_filter.h',
'browser/browser_thread.cc',
diff --git a/ui/gfx/gtk_util.cc b/ui/gfx/gtk_util.cc
index fb5a31d..45ae56a 100644
--- a/ui/gfx/gtk_util.cc
+++ b/ui/gfx/gtk_util.cc
@@ -219,4 +219,33 @@ uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride) {
return new_pixels;
}
+void InitRCStyles() {
+ static const char kRCText[] =
+ // Make our dialogs styled like the GNOME HIG.
+ //
+ // TODO(evanm): content-area-spacing was introduced in a later
+ // version of GTK, so we need to set that manually on all dialogs.
+ // Perhaps it would make sense to have a shared FixupDialog() function.
+ "style \"gnome-dialog\" {\n"
+ " xthickness = 12\n"
+ " GtkDialog::action-area-border = 0\n"
+ " GtkDialog::button-spacing = 6\n"
+ " GtkDialog::content-area-spacing = 18\n"
+ " GtkDialog::content-area-border = 12\n"
+ "}\n"
+ // Note we set it at the "application" priority, so users can override.
+ "widget \"GtkDialog\" style : application \"gnome-dialog\"\n"
+
+ // Make our about dialog special, so the image is flush with the edge.
+ "style \"about-dialog\" {\n"
+ " GtkDialog::action-area-border = 12\n"
+ " GtkDialog::button-spacing = 6\n"
+ " GtkDialog::content-area-spacing = 18\n"
+ " GtkDialog::content-area-border = 0\n"
+ "}\n"
+ "widget \"about-dialog\" style : application \"about-dialog\"\n";
+
+ gtk_rc_parse_string(kRCText);
+}
+
} // namespace gfx
diff --git a/ui/gfx/gtk_util.h b/ui/gfx/gtk_util.h
index 7438165..71b9e52 100644
--- a/ui/gfx/gtk_util.h
+++ b/ui/gfx/gtk_util.h
@@ -66,6 +66,9 @@ UI_EXPORT std::string RemoveWindowsStyleAccelerators(const std::string& label);
// assumed to be 4 * |width|.
uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride);
+// Initialize some GTK settings so that our dialogs are consistent.
+void InitRCStyles();
+
} // namespace gfx
// It's not legal C++ to have a templatized typedefs, so we wrap it in a