summaryrefslogtreecommitdiffstats
path: root/content/browser/browser_child_process_host.h
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-22 22:58:22 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-22 22:58:22 +0000
commitdf8e899b92196a772511a165130f1fe08e199cb8 (patch)
tree893ca8821adc6165823f3c9a10dd0edfeb2e49e1 /content/browser/browser_child_process_host.h
parent5b77de94051020ca0aef549dee0cb33f7a737d88 (diff)
downloadchromium_src-df8e899b92196a772511a165130f1fe08e199cb8.zip
chromium_src-df8e899b92196a772511a165130f1fe08e199cb8.tar.gz
chromium_src-df8e899b92196a772511a165130f1fe08e199cb8.tar.bz2
Move core pieces of chrome\browser. I've only gone up to "g", will do the rest in another cl.
TBR=avi Review URL: http://codereview.chromium.org/6538100 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75652 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/browser_child_process_host.h')
-rw-r--r--content/browser/browser_child_process_host.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/content/browser/browser_child_process_host.h b/content/browser/browser_child_process_host.h
new file mode 100644
index 0000000..f57ec5f
--- /dev/null
+++ b/content/browser/browser_child_process_host.h
@@ -0,0 +1,143 @@
+// 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_CHILD_PROCESS_HOST_H_
+#define CONTENT_BROWSER_BROWSER_CHILD_PROCESS_HOST_H_
+#pragma once
+
+#include <list>
+
+#include "chrome/common/child_process_host.h"
+#include "chrome/common/child_process_info.h"
+#include "content/browser/child_process_launcher.h"
+#include "content/browser/renderer_host/resource_message_filter.h"
+
+class ResourceDispatcherHost;
+
+// Plugins/workers and other child processes that live on the IO thread should
+// derive from this class.
+//
+// [Browser]RenderProcessHost is the main exception that doesn't derive from
+// this class. That project lives on the UI thread.
+class BrowserChildProcessHost : public ChildProcessHost,
+ public ChildProcessInfo,
+ public ChildProcessLauncher::Client {
+ public:
+ virtual ~BrowserChildProcessHost();
+
+ // Prepares command_line for crash reporting as appropriate. On Linux and
+ // Mac, a command-line flag to enable crash reporting in the child process
+ // will be appended if needed, because the child process may not have access
+ // to the data that determines the status of crash reporting in the
+ // currently-executing process. This function is a no-op on Windows.
+ static void SetCrashReporterCommandLine(CommandLine* command_line);
+
+ // Terminates all child processes and deletes each ChildProcessHost instance.
+ static void TerminateAll();
+
+ // The Iterator class allows iteration through either all child processes, or
+ // ones of a specific type, depending on which constructor is used. Note that
+ // this should be done from the IO thread and that the iterator should not be
+ // kept around as it may be invalidated on subsequent event processing in the
+ // event loop.
+ class Iterator {
+ public:
+ Iterator();
+ explicit Iterator(ChildProcessInfo::ProcessType type);
+ BrowserChildProcessHost* operator->() { return *iterator_; }
+ BrowserChildProcessHost* operator*() { return *iterator_; }
+ BrowserChildProcessHost* operator++();
+ bool Done();
+
+ private:
+ bool all_;
+ ChildProcessInfo::ProcessType type_;
+ std::list<BrowserChildProcessHost*>::iterator iterator_;
+ };
+
+ protected:
+ // |resource_dispatcher_host| may be NULL to indicate none is needed for
+ // this process type.
+ // |url_request_context_getter| allows derived classes to override the
+ // net::URLRequestContext.
+ BrowserChildProcessHost(
+ ChildProcessInfo::ProcessType type,
+ ResourceDispatcherHost* resource_dispatcher_host,
+ ResourceMessageFilter::URLRequestContextOverride*
+ url_request_context_override);
+
+ // A convenient constructor for those classes that want to use the default
+ // net::URLRequestContext.
+ BrowserChildProcessHost(
+ ChildProcessInfo::ProcessType type,
+ ResourceDispatcherHost* resource_dispatcher_host);
+
+ // Derived classes call this to launch the child process asynchronously.
+ void Launch(
+#if defined(OS_WIN)
+ const FilePath& exposed_dir,
+#elif defined(OS_POSIX)
+ bool use_zygote,
+ const base::environment_vector& environ,
+#endif
+ CommandLine* cmd_line);
+
+ // Returns the handle of the child process. This can be called only after
+ // OnProcessLaunched is called or it will be invalid and may crash.
+ base::ProcessHandle GetChildProcessHandle() const;
+
+ // ChildProcessLauncher::Client implementation.
+ virtual void OnProcessLaunched() {}
+
+ // Derived classes can override this to know if the process crashed.
+ // |exit_code| is the status returned when the process crashed (for
+ // posix, as returned from waitpid(), for Windows, as returned from
+ // GetExitCodeProcess()).
+ virtual void OnProcessCrashed(int exit_code) {}
+
+ // Derived classes can override this to know if the process was
+ // killed. |exit_code| is the status returned when the process
+ // was killed (for posix, as returned from waitpid(), for Windows,
+ // as returned from GetExitCodeProcess()).
+ virtual void OnProcessWasKilled(int exit_code) {}
+
+ // Returns the termination status of a child. |exit_code| is the
+ // status returned when the process exited (for posix, as returned
+ // from waitpid(), for Windows, as returned from
+ // GetExitCodeProcess()). |exit_code| may be NULL.
+ virtual base::TerminationStatus GetChildTerminationStatus(int* exit_code);
+
+ // Overrides from ChildProcessHost
+ virtual void OnChildDied();
+ virtual void ShutdownStarted();
+ virtual void Notify(NotificationType type);
+ // Extends the base class implementation and removes this host from
+ // the host list. Calls ChildProcessHost::ForceShutdown
+ virtual void ForceShutdown();
+
+ ResourceDispatcherHost* resource_dispatcher_host() {
+ return resource_dispatcher_host_;
+ }
+
+ private:
+ void Initialize(ResourceMessageFilter::URLRequestContextOverride*
+ url_request_context_override);
+
+ // By using an internal class as the ChildProcessLauncher::Client, we can
+ // intercept OnProcessLaunched and do our own processing before
+ // calling the subclass' implementation.
+ class ClientHook : public ChildProcessLauncher::Client {
+ public:
+ explicit ClientHook(BrowserChildProcessHost* host);
+ virtual void OnProcessLaunched();
+ private:
+ BrowserChildProcessHost* host_;
+ };
+ ClientHook client_;
+ // May be NULL if this current process has no resource dispatcher host.
+ ResourceDispatcherHost* resource_dispatcher_host_;
+ scoped_ptr<ChildProcessLauncher> child_process_;
+};
+
+#endif // CONTENT_BROWSER_BROWSER_CHILD_PROCESS_HOST_H_