5bfead0d0e6cbe0b80034d4225a60e324dfac839
[WebKit-https.git] / Source / WebCore / dom / EventDispatcher.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
6  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  * Copyright (C) 2011 Google Inc. All rights reserved.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public License
21  * along with this library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23  * Boston, MA 02110-1301, USA.
24  */
25
26 #ifndef EventDispatcher_h
27 #define EventDispatcher_h
28
29 #include <wtf/Forward.h>
30 #include <wtf/HashMap.h>
31 #include <wtf/Vector.h>
32
33 namespace WebCore {
34
35 class Event;
36 class EventContext;
37 class EventDispatchMediator;
38 class EventTarget;
39 class FrameView;
40 class Node;
41 class PlatformKeyboardEvent;
42 class PlatformMouseEvent;
43 class ShadowRoot;
44 class TreeScope;
45 class WindowEventContext;
46
47 enum EventDispatchBehavior {
48     RetargetEvent,
49     StayInsideShadowDOM
50 };
51
52 enum EventDispatchContinuation {
53     ContinueDispatching,
54     DoneDispatching
55 };
56
57 class EventRelatedTargetAdjuster {
58 public:
59     EventRelatedTargetAdjuster(PassRefPtr<Node>, PassRefPtr<Node> relatedTarget);
60     void adjust(Vector<EventContext>&);
61 private:
62     typedef HashMap<TreeScope*, EventTarget*> RelatedTargetMap;
63     EventTarget* findRelatedTarget(TreeScope*);
64
65     RefPtr<Node> m_node;
66     RefPtr<Node> m_relatedTarget;
67     RelatedTargetMap m_relatedTargetMap;
68 };
69
70 class EventDispatcher {
71 public:
72     static bool dispatchEvent(Node*, PassRefPtr<EventDispatchMediator>);
73     static void dispatchScopedEvent(Node*, PassRefPtr<EventDispatchMediator>);
74
75     static void dispatchSimulatedClick(Node*, PassRefPtr<Event> underlyingEvent, bool sendMouseEvents, bool showPressedLook);
76
77     bool dispatchEvent(PassRefPtr<Event>);
78     void adjustRelatedTarget(Event*, PassRefPtr<EventTarget> prpRelatedTarget);
79     Node* node() const;
80
81 private:
82     EventDispatcher(Node*);
83
84     EventDispatchBehavior determineDispatchBehavior(Event*, ShadowRoot*, EventTarget*);
85
86     void ensureEventAncestors(Event*);
87     const EventContext* topEventContext();
88
89     EventDispatchContinuation dispatchEventPreProcess(PassRefPtr<Event>, void*& preDispatchEventHandlerResult);
90     EventDispatchContinuation dispatchEventAtCapturing(PassRefPtr<Event>, WindowEventContext&);
91     EventDispatchContinuation dispatchEventAtTarget(PassRefPtr<Event>);
92     EventDispatchContinuation dispatchEventAtBubbling(PassRefPtr<Event>, WindowEventContext&);
93     void dispatchEventPostProcess(PassRefPtr<Event>, void* preDispatchEventHandlerResult);
94
95     Vector<EventContext> m_ancestors;
96     RefPtr<Node> m_node;
97     RefPtr<FrameView> m_view;
98     bool m_ancestorsInitialized;
99 #ifndef NDEBUG
100     bool m_eventDispatched;
101 #endif
102 };
103
104 inline Node* EventDispatcher::node() const
105 {
106     return m_node.get();
107 }
108
109 }
110
111 #endif