• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_BROWSER_BROWSER_CHILD_PROCESS_HOST_IMPL_H_
6 #define CONTENT_BROWSER_BROWSER_CHILD_PROCESS_HOST_IMPL_H_
7 
8 #include <list>
9 
10 #include "base/compiler_specific.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/process/process.h"
13 #include "base/synchronization/waitable_event_watcher.h"
14 #include "content/browser/child_process_launcher.h"
15 #include "content/browser/power_monitor_message_broadcaster.h"
16 #include "content/public/browser/browser_child_process_host.h"
17 #include "content/public/browser/child_process_data.h"
18 #include "content/public/common/child_process_host_delegate.h"
19 
20 namespace base {
21 class CommandLine;
22 }
23 
24 namespace content {
25 
26 class BrowserChildProcessHostIterator;
27 class BrowserChildProcessObserver;
28 class BrowserMessageFilter;
29 
30 // Plugins/workers and other child processes that live on the IO thread use this
31 // class. RenderProcessHostImpl is the main exception that doesn't use this
32 /// class because it lives on the UI thread.
33 class CONTENT_EXPORT BrowserChildProcessHostImpl
34     : public BrowserChildProcessHost,
35       public NON_EXPORTED_BASE(ChildProcessHostDelegate),
36       public ChildProcessLauncher::Client {
37  public:
38   BrowserChildProcessHostImpl(
39       int process_type,
40       BrowserChildProcessHostDelegate* delegate);
41   virtual ~BrowserChildProcessHostImpl();
42 
43   // Terminates all child processes and deletes each BrowserChildProcessHost
44   // instance.
45   static void TerminateAll();
46 
47   // BrowserChildProcessHost implementation:
48   virtual bool Send(IPC::Message* message) OVERRIDE;
49   virtual void Launch(
50       SandboxedProcessLauncherDelegate* delegate,
51       base::CommandLine* cmd_line) OVERRIDE;
52   virtual const ChildProcessData& GetData() const OVERRIDE;
53   virtual ChildProcessHost* GetHost() const OVERRIDE;
54   virtual base::TerminationStatus GetTerminationStatus(
55       bool known_dead, int* exit_code) OVERRIDE;
56   virtual void SetName(const base::string16& name) OVERRIDE;
57   virtual void SetHandle(base::ProcessHandle handle) OVERRIDE;
58 
59   // ChildProcessHostDelegate implementation:
60   virtual bool CanShutdown() OVERRIDE;
61   virtual void OnChildDisconnected() OVERRIDE;
62   virtual base::ProcessHandle GetHandle() const OVERRIDE;
63   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
64   virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
65   virtual void OnChannelError() OVERRIDE;
66   virtual void OnBadMessageReceived(const IPC::Message& message) OVERRIDE;
67 
68   // Removes this host from the host list. Calls ChildProcessHost::ForceShutdown
69   void ForceShutdown();
70 
71   // Callers can reduce the BrowserChildProcess' priority.
72   void SetBackgrounded(bool backgrounded);
73 
74   // Controls whether the child process should be terminated on browser
75   // shutdown. Default is to always terminate.
76   void SetTerminateChildOnShutdown(bool terminate_on_shutdown);
77 
78   // Adds an IPC message filter.
79   void AddFilter(BrowserMessageFilter* filter);
80 
81   // Called when an instance of a particular child is created in a page.
82   static void NotifyProcessInstanceCreated(const ChildProcessData& data);
83 
84   static void HistogramBadMessageTerminated(int process_type);
85 
delegate()86   BrowserChildProcessHostDelegate* delegate() const { return delegate_; }
87 
88   typedef std::list<BrowserChildProcessHostImpl*> BrowserChildProcessList;
89  private:
90   friend class BrowserChildProcessHostIterator;
91   friend class BrowserChildProcessObserver;
92 
93   static BrowserChildProcessList* GetIterator();
94 
95   static void AddObserver(BrowserChildProcessObserver* observer);
96   static void RemoveObserver(BrowserChildProcessObserver* observer);
97 
98   // ChildProcessLauncher::Client implementation.
99   virtual void OnProcessLaunched() OVERRIDE;
100   virtual void OnProcessLaunchFailed() OVERRIDE;
101 
102 #if defined(OS_WIN)
103   void DeleteProcessWaitableEvent(base::WaitableEvent* event);
104   void OnProcessExitedEarly(base::WaitableEvent* event);
105 #endif
106 
107   ChildProcessData data_;
108   BrowserChildProcessHostDelegate* delegate_;
109   scoped_ptr<ChildProcessHost> child_process_host_;
110 
111   scoped_ptr<ChildProcessLauncher> child_process_;
112 
113   PowerMonitorMessageBroadcaster power_monitor_message_broadcaster_;
114 
115 #if defined(OS_WIN)
116   // Watches to see if the child process exits before the IPC channel has
117   // been connected. Thereafter, its exit is determined by an error on the
118   // IPC channel.
119   base::WaitableEventWatcher early_exit_watcher_;
120 #endif
121 };
122 
123 }  // namespace content
124 
125 #endif  // CONTENT_BROWSER_BROWSER_CHILD_PROCESS_HOST_IMPL_H_
126