#pragma once
#include "CallbackID.h"
#include "Connection.h"
#include "WebEvent.h"
#include <WebCore/PageIdentifier.h>
#include <WebCore/PlatformWheelEvent.h>
#include <WebCore/WheelEventDeltaFilter.h>
#include <memory>
#include <wtf/HashMap.h>
#include <wtf/Lock.h>
#include <wtf/Noncopyable.h>
#include <wtf/RefPtr.h>
#include <wtf/ThreadingPrimitives.h>
#if ENABLE(MAC_GESTURE_EVENTS)
#include "WebGestureEvent.h"
#endif
namespace WebCore {
class ThreadedScrollingTree;
using PlatformDisplayID = uint32_t;
}
namespace WebKit {
class WebPage;
class WebWheelEvent;
#if ENABLE(IOS_TOUCH_EVENTS)
class WebTouchEvent;
#endif
class EventDispatcher : public IPC::Connection::WorkQueueMessageReceiver {
public:
static Ref<EventDispatcher> create();
~EventDispatcher();
#if ENABLE(SCROLLING_THREAD)
void addScrollingTreeForPage(WebPage*);
void removeScrollingTreeForPage(WebPage*);
#endif
#if ENABLE(IOS_TOUCH_EVENTS)
using TouchEventQueue = Vector<std::pair<WebTouchEvent, Optional<CallbackID>>, 1>;
void takeQueuedTouchEventsForPage(const WebPage&, TouchEventQueue&);
#endif
void initializeConnection(IPC::Connection*);
void notifyScrollingTreesDisplayWasRefreshed(WebCore::PlatformDisplayID);
private:
EventDispatcher();
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
void wheelEvent(WebCore::PageIdentifier, const WebWheelEvent&, bool canRubberBandAtLeft, bool canRubberBandAtRight, bool canRubberBandAtTop, bool canRubberBandAtBottom);
#if ENABLE(IOS_TOUCH_EVENTS)
void touchEvent(WebCore::PageIdentifier, const WebTouchEvent&, Optional<CallbackID>);
#endif
#if ENABLE(MAC_GESTURE_EVENTS)
void gestureEvent(WebCore::PageIdentifier, const WebGestureEvent&);
#endif
void dispatchWheelEvent(WebCore::PageIdentifier, const WebWheelEvent&, OptionSet<WebCore::WheelEventProcessingSteps>);
void dispatchWheelEventViaMainThread(WebCore::PageIdentifier, const WebWheelEvent&, OptionSet<WebCore::WheelEventProcessingSteps>);
#if ENABLE(IOS_TOUCH_EVENTS)
void dispatchTouchEvents();
#endif
#if ENABLE(MAC_GESTURE_EVENTS)
void dispatchGestureEvent(WebCore::PageIdentifier, const WebGestureEvent&);
#endif
#if ENABLE(ASYNC_SCROLLING)
static void sendDidReceiveEvent(WebCore::PageIdentifier, WebEvent::Type, bool didHandleEvent);
#endif
#if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
void displayWasRefreshed(WebCore::PlatformDisplayID);
#endif
#if ENABLE(SCROLLING_THREAD)
void displayDidRefreshOnScrollingThread(WebCore::PlatformDisplayID);
#endif
Ref<WorkQueue> m_queue;
#if ENABLE(SCROLLING_THREAD)
Lock m_scrollingTreesMutex;
HashMap<WebCore::PageIdentifier, RefPtr<WebCore::ThreadedScrollingTree>> m_scrollingTrees;
#endif
std::unique_ptr<WebCore::WheelEventDeltaFilter> m_recentWheelEventDeltaFilter;
#if ENABLE(IOS_TOUCH_EVENTS)
Lock m_touchEventsLock;
HashMap<WebCore::PageIdentifier, TouchEventQueue> m_touchEvents;
#endif
};
}