1/*
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef EventDispatcher_h
27#define EventDispatcher_h
28
29#include "Connection.h"
30#include <wtf/HashMap.h>
31#include <wtf/Noncopyable.h>
32#include <wtf/RefPtr.h>
33#include <wtf/ThreadingPrimitives.h>
34
35namespace WebCore {
36    class ScrollingTree;
37}
38
39namespace WebKit {
40
41class WebEvent;
42class WebPage;
43class WebWheelEvent;
44
45#if ENABLE(GESTURE_EVENTS)
46class WebGestureEvent;
47#endif
48
49class EventDispatcher : public CoreIPC::Connection::WorkQueueMessageReceiver {
50public:
51    static PassRefPtr<EventDispatcher> create();
52    ~EventDispatcher();
53
54#if ENABLE(THREADED_SCROLLING)
55    void addScrollingTreeForPage(WebPage*);
56    void removeScrollingTreeForPage(WebPage*);
57#endif
58
59    void initializeConnection(CoreIPC::Connection*);
60
61private:
62    EventDispatcher();
63
64    // CoreIPC::Connection::WorkQueueMessageReceiver.
65    virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&) OVERRIDE;
66
67    // Message handlers
68    void wheelEvent(uint64_t pageID, const WebWheelEvent&, bool canGoBack, bool canGoForward);
69#if ENABLE(GESTURE_EVENTS)
70    void gestureEvent(uint64_t pageID, const WebGestureEvent&);
71#endif
72
73    // This is called on the main thread.
74    void dispatchWheelEvent(uint64_t pageID, const WebWheelEvent&);
75#if ENABLE(GESTURE_EVENTS)
76    void dispatchGestureEvent(uint64_t pageID, const WebGestureEvent&);
77#endif
78
79#if ENABLE(THREADED_SCROLLING)
80    void sendDidReceiveEvent(uint64_t pageID, const WebEvent&, bool didHandleEvent);
81#endif
82
83    RefPtr<WorkQueue> m_queue;
84
85#if ENABLE(THREADED_SCROLLING)
86    Mutex m_scrollingTreesMutex;
87    HashMap<uint64_t, RefPtr<WebCore::ScrollingTree>> m_scrollingTrees;
88#endif
89};
90
91} // namespace WebKit
92
93#endif // EventDispatcher_h
94