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

Unified Diff: content/browser/browser_child_process_host.h

Issue 9150017: Add a Content API around BrowserChildProcessHost, similar to what was done with ChildProcessHost.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix?! Created 8 years, 11 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
« no previous file with comments | « chrome/service/service_utility_process_host.cc ('k') | content/browser/browser_child_process_host.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/browser_child_process_host.h
===================================================================
--- content/browser/browser_child_process_host.h (revision 118420)
+++ content/browser/browser_child_process_host.h (working copy)
@@ -14,117 +14,53 @@
#include "base/process.h"
#include "base/synchronization/waitable_event_watcher.h"
#include "content/browser/child_process_launcher.h"
-#include "content/common/content_export.h"
+#include "content/public/browser/browser_child_process_host.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/common/child_process_host_delegate.h"
-#include "ipc/ipc_message.h"
-namespace base {
-class WaitableEvent;
-}
-
namespace content {
-class ChildProcessHost;
+class BrowserChildProcessHostIterator;
}
-// 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.
+// Plugins/workers and other child processes that live on the IO thread use this
+// class. RenderProcessHostImpl is the main exception that doesn't use this
+/// class because it lives on the UI thread.
class CONTENT_EXPORT BrowserChildProcessHost :
+ public NON_EXPORTED_BASE(content::BrowserChildProcessHost),
public NON_EXPORTED_BASE(content::ChildProcessHostDelegate),
public ChildProcessLauncher::Client,
- public base::WaitableEventWatcher::Delegate,
- public IPC::Message::Sender {
+ public base::WaitableEventWatcher::Delegate {
public:
+ BrowserChildProcessHost(content::ProcessType type,
+ content::BrowserChildProcessHostDelegate* delegate);
virtual ~BrowserChildProcessHost();
- virtual void OnWaitableEventSignaled(
- base::WaitableEvent* waitable_event) OVERRIDE;
-
// Terminates all child processes and deletes each BrowserChildProcessHost
// 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 CONTENT_EXPORT Iterator {
- public:
- Iterator();
- explicit Iterator(content::ProcessType type);
- BrowserChildProcessHost* operator->() { return *iterator_; }
- BrowserChildProcessHost* operator*() { return *iterator_; }
- BrowserChildProcessHost* operator++();
- bool Done();
-
- private:
- bool all_;
- content::ProcessType type_;
- std::list<BrowserChildProcessHost*>::iterator iterator_;
- };
-
- // IPC::Message::Sender override
+ // BrowserChildProcessHost implementation:
virtual bool Send(IPC::Message* message) OVERRIDE;
-
- const content::ChildProcessData& data() const { return data_; }
- bool disconnect_was_alive() const { return disconnect_was_alive_; }
-
- protected:
- explicit BrowserChildProcessHost(content::ProcessType type);
-
- // Derived classes call this to launch the child process asynchronously.
- void Launch(
+ virtual 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);
+ CommandLine* cmd_line) OVERRIDE;
+ virtual const content::ChildProcessData& GetData() const OVERRIDE;
+ virtual content::ChildProcessHost* GetHost() const OVERRIDE;
+ virtual base::TerminationStatus GetTerminationStatus(int* exit_code) OVERRIDE;
+ virtual void SetName(const string16& name) OVERRIDE;
+ virtual void SetHandle(base::ProcessHandle handle) OVERRIDE;
- // TODO(jam): below is what will be in the BrowserChildProcessHostDelegate
- // interface.
+ bool disconnect_was_alive() const { return disconnect_was_alive_; }
- // ChildProcessLauncher::Client implementation.
- virtual void OnProcessLaunched() OVERRIDE {}
-
- // 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) {}
-
- // Overrides from ChildProcessHostDelegate
- virtual bool CanShutdown() OVERRIDE;
- virtual void OnChildDisconnected() OVERRIDE;
- virtual void ShutdownStarted() OVERRIDE;
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
-
- // 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.
- base::TerminationStatus GetChildTerminationStatus(int* exit_code);
-
// 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;
+ base::ProcessHandle GetHandle() const;
- // Sets the user-visible name of the process.
- void SetName(const string16& name);
-
- // Set the handle of the process. BrowserChildProcessHost will do this when
- // the Launch method is used to start the process. However if the owner
- // of this object doesn't call Launch and starts the process in another way,
- // they need to call this method so that the process handle is associated with
- // this object.
- void SetHandle(base::ProcessHandle handle);
-
// Removes this host from the host list. Calls ChildProcessHost::ForceShutdown
void ForceShutdown();
@@ -135,26 +71,35 @@
// Sends the given notification on the UI thread.
void Notify(int type);
- content::ChildProcessHost* child_process_host() const {
- return child_process_host_.get();
+ content::BrowserChildProcessHostDelegate* delegate() const {
+ return delegate_;
}
+ typedef std::list<BrowserChildProcessHost*> BrowserChildProcessList;
private:
- // 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() OVERRIDE;
- private:
- BrowserChildProcessHost* host_;
- };
+ friend class content::BrowserChildProcessHostIterator;
+ static BrowserChildProcessList* GetIterator();
+
+ // ChildProcessHostDelegate implementation:
+ virtual bool CanShutdown() OVERRIDE;
+ virtual void OnChildDisconnected() OVERRIDE;
+ virtual void ShutdownStarted() OVERRIDE;
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+ virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
+ virtual void OnChannelError() OVERRIDE;
+
+ // ChildProcessLauncher::Client implementation.
+ virtual void OnProcessLaunched() OVERRIDE;
+
+ // public base::WaitableEventWatcher::Delegate implementation:
+ virtual void OnWaitableEventSignaled(
+ base::WaitableEvent* waitable_event) OVERRIDE;
+
content::ChildProcessData data_;
+ content::BrowserChildProcessHostDelegate* delegate_;
scoped_ptr<content::ChildProcessHost> child_process_host_;
- ClientHook client_;
scoped_ptr<ChildProcessLauncher> child_process_;
#if defined(OS_WIN)
base::WaitableEventWatcher child_watcher_;
« no previous file with comments | « chrome/service/service_utility_process_host.cc ('k') | content/browser/browser_child_process_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698