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 content { 21 22 class BrowserChildProcessHostIterator; 23 class BrowserChildProcessObserver; 24 class BrowserMessageFilter; 25 26 // Plugins/workers and other child processes that live on the IO thread use this 27 // class. RenderProcessHostImpl is the main exception that doesn't use this 28 /// class because it lives on the UI thread. 29 class CONTENT_EXPORT BrowserChildProcessHostImpl 30 : public BrowserChildProcessHost, 31 public NON_EXPORTED_BASE(ChildProcessHostDelegate), 32 public ChildProcessLauncher::Client { 33 public: 34 BrowserChildProcessHostImpl( 35 int process_type, 36 BrowserChildProcessHostDelegate* delegate); 37 virtual ~BrowserChildProcessHostImpl(); 38 39 // Terminates all child processes and deletes each BrowserChildProcessHost 40 // instance. 41 static void TerminateAll(); 42 43 // BrowserChildProcessHost implementation: 44 virtual bool Send(IPC::Message* message) OVERRIDE; 45 virtual void Launch( 46 #if defined(OS_WIN) 47 SandboxedProcessLauncherDelegate* delegate, 48 #elif defined(OS_POSIX) 49 bool use_zygote, 50 const base::EnvironmentMap& environ, 51 #endif 52 CommandLine* cmd_line) OVERRIDE; 53 virtual const ChildProcessData& GetData() const OVERRIDE; 54 virtual ChildProcessHost* GetHost() const OVERRIDE; 55 virtual base::TerminationStatus GetTerminationStatus( 56 bool known_dead, int* exit_code) OVERRIDE; 57 virtual void SetName(const base::string16& name) OVERRIDE; 58 virtual void SetHandle(base::ProcessHandle handle) OVERRIDE; 59 60 // Returns the handle of the child process. This can be called only after 61 // OnProcessLaunched is called or it will be invalid and may crash. 62 base::ProcessHandle GetHandle() const; 63 64 // Removes this host from the host list. Calls ChildProcessHost::ForceShutdown 65 void ForceShutdown(); 66 67 // Callers can reduce the BrowserChildProcess' priority. 68 void SetBackgrounded(bool backgrounded); 69 70 // Controls whether the child process should be terminated on browser 71 // shutdown. Default is to always terminate. 72 void SetTerminateChildOnShutdown(bool terminate_on_shutdown); 73 74 // Adds an IPC message filter. 75 void AddFilter(BrowserMessageFilter* filter); 76 77 // Called when an instance of a particular child is created in a page. 78 static void NotifyProcessInstanceCreated(const ChildProcessData& data); 79 80 BrowserChildProcessHostDelegate* delegate() const { return delegate_; } 81 82 typedef std::list<BrowserChildProcessHostImpl*> BrowserChildProcessList; 83 private: 84 friend class BrowserChildProcessHostIterator; 85 friend class BrowserChildProcessObserver; 86 87 static BrowserChildProcessList* GetIterator(); 88 89 static void AddObserver(BrowserChildProcessObserver* observer); 90 static void RemoveObserver(BrowserChildProcessObserver* observer); 91 92 // ChildProcessHostDelegate implementation: 93 virtual bool CanShutdown() OVERRIDE; 94 virtual void OnChildDisconnected() OVERRIDE; 95 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 96 virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; 97 virtual void OnChannelError() OVERRIDE; 98 99 // ChildProcessLauncher::Client implementation. 100 virtual void OnProcessLaunched() 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