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

Unified Diff: content/app/content_main_runner.cc

Issue 10479023: Simplify how Content*Client interfaces are created. Instead of depending on the embedder to know wh… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: remove unused function declaration Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/app/content_main_runner.cc
===================================================================
--- content/app/content_main_runner.cc (revision 140381)
+++ content/app/content_main_runner.cc (working copy)
@@ -11,6 +11,7 @@
#include "base/debug/trace_event.h"
#include "base/file_path.h"
#include "base/i18n/icu_util.h"
+#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/stats_table.h"
@@ -23,12 +24,16 @@
#include "content/common/url_schemes.h"
#include "content/public/app/content_main_delegate.h"
#include "content/public/app/startup_helper_win.h"
+#include "content/public/browser/content_browser_client.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/main_function_params.h"
#include "content/public/common/sandbox_init.h"
+#include "content/public/plugin/content_plugin_client.h"
+#include "content/public/renderer/content_renderer_client.h"
+#include "content/public/utility/content_utility_client.h"
#include "crypto/nss_util.h"
#include "ipc/ipc_switches.h"
#include "media/base/media.h"
@@ -81,13 +86,22 @@
extern int UtilityMain(const content::MainFunctionParams&);
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
namespace content {
-extern int ZygoteMain(const content::MainFunctionParams&,
- content::ZygoteForkDelegate* forkdelegate);
+extern int ZygoteMain(const MainFunctionParams&,
+ ZygoteForkDelegate* forkdelegate);
} // namespace content
#endif
-namespace {
+namespace content {
+base::LazyInstance<ContentBrowserClient>
+ g_empty_content_browser_client = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<ContentPluginClient>
+ g_empty_content_plugin_client = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<ContentRendererClient>
+ g_empty_content_renderer_client = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<ContentUtilityClient>
+ g_empty_content_utility_client = LAZY_INSTANCE_INITIALIZER;
+
#if defined(OS_WIN)
static CAppModule _Module;
@@ -206,20 +220,50 @@
// 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,
+ base::StringPrintf("%s-%u", kStatsFilename,
static_cast<unsigned int>(GetBrowserPid(command_line)));
base::StatsTable* stats_table = new base::StatsTable(statsfile,
- content::kStatsMaxThreads, content::kStatsMaxCounters);
+ kStatsMaxThreads, kStatsMaxCounters);
base::StatsTable::set_current(stats_table);
}
}
+class ContentClientInitializer {
+ public:
+ static void Set(const std::string& process_type,
+ ContentMainDelegate* delegate) {
+ ContentClient* content_client = GetContentClient();
+ if (process_type.empty()) {
+ if (delegate)
+ content_client->browser_ = delegate->CreateContentBrowserClient();
+ if (!content_client->browser_)
+ content_client->browser_ = &g_empty_content_browser_client.Get();
+ }
+
+ if (process_type == switches::kPluginProcess) {
+ if (delegate)
+ content_client->plugin_ = delegate->CreateContentPluginClient();
+ if (!content_client->plugin_)
+ content_client->plugin_ = &g_empty_content_plugin_client.Get();
+ } else if (process_type == switches::kRendererProcess) {
+ if (delegate)
+ content_client->renderer_ = delegate->CreateContentRendererClient();
+ if (!content_client->renderer_)
+ content_client->renderer_ = &g_empty_content_renderer_client.Get();
+ } else if (process_type == switches::kUtilityProcess) {
+ if (delegate)
+ content_client->utility_ = delegate->CreateContentUtilityClient();
+ if (!content_client->utility_)
+ content_client->utility_ = &g_empty_content_utility_client.Get();
+ }
+ }
+};
+
// 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 {
const char* name;
- int (*function)(const content::MainFunctionParams&);
+ int (*function)(const MainFunctionParams&);
};
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
@@ -227,8 +271,8 @@
// subprocesses that are launched via the zygote. This function
// fills in some process-launching bits around ZygoteMain().
// Returns the exit code of the subprocess.
-int RunZygote(const content::MainFunctionParams& main_function_params,
- content::ContentMainDelegate* delegate) {
+int RunZygote(const MainFunctionParams& main_function_params,
+ ContentMainDelegate* delegate) {
static const MainFunction kMainFunctions[] = {
{ switches::kRendererProcess, RendererMain },
{ switches::kWorkerProcess, WorkerMain },
@@ -236,19 +280,19 @@
{ switches::kUtilityProcess, UtilityMain },
};
- scoped_ptr<content::ZygoteForkDelegate> zygote_fork_delegate;
+ scoped_ptr<ZygoteForkDelegate> zygote_fork_delegate;
if (delegate) {
zygote_fork_delegate.reset(delegate->ZygoteStarting());
// Each Renderer we spawn will re-attempt initialization of the media
// libraries, at which point failure will be detected and handled, so
// we do not need to cope with initialization failures here.
FilePath media_path;
- if (PathService::Get(content::DIR_MEDIA_LIBS, &media_path))
+ if (PathService::Get(DIR_MEDIA_LIBS, &media_path))
media::InitializeMediaLibrary(media_path);
}
// This function call can return multiple times, once per fork().
- if (!content::ZygoteMain(main_function_params, zygote_fork_delegate.get()))
+ if (!ZygoteMain(main_function_params, zygote_fork_delegate.get()))
return 1;
if (delegate) delegate->ZygoteForked();
@@ -256,6 +300,9 @@
// Zygote::HandleForkRequest may have reallocated the command
// line so update it here with the new version.
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ std::string process_type =
+ command_line.GetSwitchValueASCII(switches::kProcessType);
+ ContentClientInitializer::Set(process_type, delegate);
// If a custom user agent was passed on the command line, we need
// to (re)set it now, rather than using the default one the zygote
@@ -270,12 +317,8 @@
// within the new processes as well.
InitializeStatsTable(command_line);
- content::MainFunctionParams main_params(command_line);
+ MainFunctionParams main_params(command_line);
- // Get the new process type from the new command line.
- std::string process_type =
- command_line.GetSwitchValueASCII(switches::kProcessType);
-
for (size_t i = 0; i < arraysize(kMainFunctions); ++i) {
if (process_type == kMainFunctions[i].name)
return kMainFunctions[i].function(main_params);
@@ -294,8 +337,8 @@
// Returns the exit code for this process.
int RunNamedProcessTypeMain(
const std::string& process_type,
- const content::MainFunctionParams& main_function_params,
- content::ContentMainDelegate* delegate) {
+ const MainFunctionParams& main_function_params,
+ ContentMainDelegate* delegate) {
static const MainFunction kMainFunctions[] = {
{ "", BrowserMain },
{ switches::kRendererProcess, RendererMain },
@@ -334,7 +377,7 @@
return 1;
}
-class ContentMainRunnerImpl : public content::ContentMainRunner {
+class ContentMainRunnerImpl : public ContentMainRunner {
public:
ContentMainRunnerImpl()
: is_initialized_(false),
@@ -361,12 +404,12 @@
#if defined(OS_WIN)
virtual int Initialize(HINSTANCE instance,
sandbox::SandboxInterfaceInfo* sandbox_info,
- content::ContentMainDelegate* delegate) OVERRIDE {
+ ContentMainDelegate* delegate) OVERRIDE {
// argc/argv are ignored on Windows; see command_line.h for details.
int argc = 0;
char** argv = NULL;
- content::RegisterInvalidParamHandler();
+ RegisterInvalidParamHandler();
_Module.Init(NULL, static_cast<HINSTANCE>(instance));
if (sandbox_info)
@@ -377,7 +420,7 @@
#else // !OS_WIN
virtual int Initialize(int argc,
const char** argv,
- content::ContentMainDelegate* delegate) OVERRIDE {
+ ContentMainDelegate* delegate) OVERRIDE {
// NOTE(willchan): One might ask why this call is done here rather than in
// process_util_linux.cc with the definition of
@@ -448,15 +491,17 @@
int exit_code;
if (delegate && delegate->BasicStartupComplete(&exit_code))
return exit_code;
- DCHECK(!delegate || content::GetContentClient()) <<
- "BasicStartupComplete didn't set the content client";
completed_basic_startup_ = true;
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
std::string process_type =
- command_line.GetSwitchValueASCII(switches::kProcessType);
+ command_line.GetSwitchValueASCII(switches::kProcessType);
+ if (!GetContentClient())
+ SetContentClient(&empty_content_client_);
+ ContentClientInitializer::Set(process_type, delegate_);
+
// Enable startup tracing asap to avoid early TRACE_EVENT calls being
// ignored.
if (command_line.HasSwitch(switches::kTraceStartup)) {
@@ -487,7 +532,7 @@
#if defined(ENABLE_HIDPI)
ui::EnableHighDPISupport();
#endif
- content::SetupCRT(command_line);
+ SetupCRT(command_line);
#endif
#if defined(OS_POSIX)
@@ -513,8 +558,8 @@
#endif
ui::RegisterPathProvider();
- content::RegisterPathProvider();
- content::RegisterContentSchemes(true);
+ RegisterPathProvider();
+ RegisterContentSchemes(true);
CHECK(icu_util::Initialize());
@@ -535,7 +580,7 @@
CommonSubprocessInit(process_type);
#if defined(OS_WIN)
- CHECK(content::InitializeSandbox(sandbox_info));
+ CHECK(InitializeSandbox(sandbox_info));
#elif defined(OS_MACOSX)
if (process_type == switches::kRendererProcess ||
process_type == switches::kPpapiPluginProcess ||
@@ -543,7 +588,7 @@
// On OS X the renderer sandbox needs to be initialized later in the
// startup sequence in RendererMainPlatformDelegate::EnableSandbox().
} else {
- CHECK(content::InitializeSandbox());
+ CHECK(InitializeSandbox());
}
#endif
@@ -565,7 +610,7 @@
std::string process_type =
command_line.GetSwitchValueASCII(switches::kProcessType);
- content::MainFunctionParams main_params(command_line);
+ MainFunctionParams main_params(command_line);
#if defined(OS_WIN)
main_params.sandbox_info = &sandbox_info_;
#elif defined(OS_MACOSX)
@@ -605,7 +650,7 @@
is_shutdown_ = true;
}
- protected:
+ private:
// True if the runner has been initialized.
bool is_initialized_;
@@ -615,8 +660,11 @@
// True if basic startup was completed.
bool completed_basic_startup_;
+ // Used if the embedder doesn't set one.
+ ContentClient empty_content_client_;
+
// The delegate will outlive this object.
- content::ContentMainDelegate* delegate_;
+ ContentMainDelegate* delegate_;
scoped_ptr<base::AtExitManager> exit_manager_;
#if defined(OS_WIN)
@@ -628,10 +676,6 @@
DISALLOW_COPY_AND_ASSIGN(ContentMainRunnerImpl);
};
-} // namespace
-
-namespace content {
-
// static
ContentMainRunner* ContentMainRunner::Create() {
return new ContentMainRunnerImpl();

Powered by Google App Engine
This is Rietveld 408576698