#ifndef ChildProcess_h
#define ChildProcess_h
#include "Connection.h"
#include "MessageReceiverMap.h"
#include "MessageSender.h"
#include <WebCore/RunLoop.h>
#include <wtf/HashMap.h>
#include <wtf/RetainPtr.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/WTFString.h>
namespace WebKit {
class SandboxInitializationParameters;
struct ChildProcessInitializationParameters {
String uiProcessName;
String clientIdentifier;
CoreIPC::Connection::Identifier connectionIdentifier;
HashMap<String, String> extraInitializationData;
};
class ChildProcess : protected CoreIPC::Connection::Client, public CoreIPC::MessageSender {
WTF_MAKE_NONCOPYABLE(ChildProcess);
public:
void initialize(const ChildProcessInitializationParameters&);
void disableTermination();
void enableTermination();
void addMessageReceiver(CoreIPC::StringReference messageReceiverName, CoreIPC::MessageReceiver*);
void addMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID, CoreIPC::MessageReceiver*);
void removeMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID);
#if PLATFORM(MAC)
void setProcessSuppressionEnabled(bool);
bool processSuppressionEnabled() const { return !m_processSuppressionAssertion; }
void incrementActiveTaskCount();
void decrementActiveTaskCount();
void setApplicationIsDaemon();
#else
void incrementActiveTaskCount() { }
void decrementActiveTaskCount() { }
#endif
CoreIPC::Connection* parentProcessConnection() const { return m_connection.get(); }
CoreIPC::MessageReceiverMap& messageReceiverMap() { return m_messageReceiverMap; }
protected:
explicit ChildProcess();
virtual ~ChildProcess();
void setTerminationTimeout(double seconds) { m_terminationTimeout = seconds; }
virtual void initializeProcess(const ChildProcessInitializationParameters&);
virtual void initializeProcessName(const ChildProcessInitializationParameters&);
virtual void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&);
virtual void initializeConnection(CoreIPC::Connection*);
virtual bool shouldTerminate() = 0;
virtual void terminate();
virtual void stopRunLoop();
#if PLATFORM(MAC)
static void stopNSAppRunLoop();
#endif
private:
virtual CoreIPC::Connection* messageSenderConnection() OVERRIDE;
virtual uint64_t messageSenderDestinationID() OVERRIDE;
void terminationTimerFired();
void platformInitialize();
double m_terminationTimeout;
unsigned m_terminationCounter;
WebCore::RunLoop::Timer<ChildProcess> m_terminationTimer;
RefPtr<CoreIPC::Connection> m_connection;
CoreIPC::MessageReceiverMap m_messageReceiverMap;
#if PLATFORM(MAC)
void suspensionHysteresisTimerFired();
void setProcessSuppressionEnabledInternal(bool);
size_t m_activeTaskCount;
bool m_shouldSuspend;
WebCore::RunLoop::Timer<ChildProcess> m_suspensionHysteresisTimer;
RetainPtr<id> m_processSuppressionAssertion;
#endif
};
}
#endif // ChildProcess_h