#pragma once
#if ENABLE(GPU_PROCESS)
#include "AuxiliaryProcessProxy.h"
#include "GPUProcessProxyMessagesReplies.h"
#include "ProcessLauncher.h"
#include "ProcessThrottler.h"
#include "ProcessThrottlerClient.h"
#include "WebPageProxyIdentifier.h"
#include "WebProcessProxyMessagesReplies.h"
#include <memory>
#include <pal/SessionID.h>
#if HAVE(VISIBILITY_PROPAGATION_VIEW)
#include "LayerHostingContext.h"
#endif
namespace WebKit {
class WebProcessProxy;
class WebsiteDataStore;
struct GPUProcessCreationParameters;
class GPUProcessProxy final : public AuxiliaryProcessProxy, private ProcessThrottlerClient, public CanMakeWeakPtr<GPUProcessProxy> {
WTF_MAKE_FAST_ALLOCATED;
WTF_MAKE_NONCOPYABLE(GPUProcessProxy);
friend LazyNeverDestroyed<GPUProcessProxy>;
public:
static Ref<GPUProcessProxy> getOrCreate();
static GPUProcessProxy* singletonIfCreated();
~GPUProcessProxy();
void getGPUProcessConnection(WebProcessProxy&, Messages::WebProcessProxy::GetGPUProcessConnectionDelayedReply&&);
ProcessThrottler& throttler() final { return m_throttler; }
void updateProcessAssertion();
#if ENABLE(MEDIA_STREAM)
void setUseMockCaptureDevices(bool);
void setOrientationForMediaCapture(uint64_t orientation);
void updateCaptureAccess(bool allowAudioCapture, bool allowVideoCapture, bool allowDisplayCapture, WebCore::ProcessIdentifier, CompletionHandler<void()>&&);
#endif
void removeSession(PAL::SessionID);
#if HAVE(VISIBILITY_PROPAGATION_VIEW)
LayerHostingContextID contextIDForVisibilityPropagation() const;
#endif
private:
explicit GPUProcessProxy();
void addSession(const WebsiteDataStore&);
ASCIILiteral processName() const final { return "GPU"_s; }
void getLaunchOptions(ProcessLauncher::LaunchOptions&) override;
void connectionWillOpen(IPC::Connection&) override;
void processWillShutDown(IPC::Connection&) override;
void gpuProcessCrashed();
ASCIILiteral clientName() const final { return "GPUProcess"_s; }
void sendPrepareToSuspend(IsSuspensionImminent, CompletionHandler<void()>&&) final;
void sendProcessDidResume() final;
void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
void didClose(IPC::Connection&) override;
void didReceiveInvalidMessage(IPC::Connection&, IPC::MessageName) override;
void terminateWebProcess(WebCore::ProcessIdentifier);
#if HAVE(VISIBILITY_PROPAGATION_VIEW)
void didCreateContextForVisibilityPropagation(LayerHostingContextID);
#endif
ProcessThrottler m_throttler;
ProcessThrottler::ActivityVariant m_activityFromWebProcesses;
#if ENABLE(MEDIA_STREAM)
bool m_useMockCaptureDevices { false };
uint64_t m_orientation { 0 };
#endif
HashSet<PAL::SessionID> m_sessionIDs;
#if HAVE(VISIBILITY_PROPAGATION_VIEW)
LayerHostingContextID m_contextIDForVisibilityPropagation { 0 };
Vector<WeakPtr<WebProcessProxy>> m_processesPendingVisibilityPropagationNotification;
#endif
};
}
#endif // ENABLE(GPU_PROCESS)