#ifndef EventDispatcher_h
#define EventDispatcher_h
#include <wtf/Forward.h>
#include <wtf/Vector.h>
namespace WebCore {
class Event;
class EventContext;
class EventDispatchMediator;
class EventTarget;
class FrameView;
class Node;
class PlatformKeyboardEvent;
class PlatformMouseEvent;
class PlatformWheelEvent;
enum EventDispatchBehavior {
RetargetEvent,
StayInsideShadowDOM
};
class EventDispatcher {
public:
static bool dispatchEvent(Node*, PassRefPtr<EventDispatchMediator>);
static void dispatchScopedEvent(Node*, PassRefPtr<EventDispatchMediator>);
static void dispatchSimulatedClick(Node*, PassRefPtr<Event> underlyingEvent, bool sendMouseEvents, bool showPressedLook);
bool dispatchEvent(PassRefPtr<Event>);
PassRefPtr<EventTarget> adjustRelatedTarget(Event*, PassRefPtr<EventTarget>);
Node* node() const;
private:
EventDispatcher(Node*);
PassRefPtr<EventTarget> adjustToShadowBoundaries(PassRefPtr<Node> relatedTarget, const Vector<Node*> relatedTargetAncestors);
EventDispatchBehavior determineDispatchBehavior(Event*, Node* shadowRoot);
void ensureEventAncestors(Event*);
const EventContext* topEventContext();
Vector<EventContext> m_ancestors;
RefPtr<Node> m_node;
RefPtr<EventTarget> m_originalTarget;
RefPtr<FrameView> m_view;
bool m_ancestorsInitialized;
bool m_shouldPreventDispatch;
};
inline Node* EventDispatcher::node() const
{
return m_node.get();
}
}
#endif