summaryrefslogtreecommitdiffstats
path: root/content/browser/browser_main.h
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/browser_main.h')
-rw-r--r--content/browser/browser_main.h133
1 files changed, 133 insertions, 0 deletions
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_