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