1/*
2 * Copyright (C) 2019 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'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25#pragma once
26
27#if ENABLE(POINTER_EVENTS)
28
29#include "PointerID.h"
30#include <wtf/HashMap.h>
31
32namespace WebCore {
33
34class Element;
35class EventTarget;
36class PointerEvent;
37
38class PointerCaptureController {
39 WTF_MAKE_NONCOPYABLE(PointerCaptureController);
40 WTF_MAKE_FAST_ALLOCATED;
41public:
42 explicit PointerCaptureController(Page&);
43
44 ExceptionOr<void> setPointerCapture(Element*, PointerID);
45 ExceptionOr<void> releasePointerCapture(Element*, PointerID);
46 bool hasPointerCapture(Element*, PointerID);
47 void reset();
48
49 void pointerLockWasApplied();
50 void elementWasRemoved(Element&);
51
52 RefPtr<PointerEvent> pointerEventForMouseEvent(const MouseEvent&);
53
54#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
55 void dispatchEventForTouchAtIndex(EventTarget&, const PlatformTouchEvent&, unsigned, bool isPrimary, WindowProxy&);
56#endif
57
58 WEBCORE_EXPORT void touchWithIdentifierWasRemoved(PointerID);
59 bool hasCancelledPointerEventForIdentifier(PointerID);
60 bool preventsCompatibilityMouseEventsForIdentifier(PointerID);
61 void dispatchEvent(PointerEvent&, EventTarget*);
62 WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&);
63
64private:
65 struct CapturingData {
66 RefPtr<Element> pendingTargetOverride;
67 RefPtr<Element> targetOverride;
68 String pointerType;
69 bool cancelled { false };
70 bool isPrimary { false };
71 bool preventsCompatibilityMouseEvents { false };
72 bool pointerIsPressed { false };
73 short previousMouseButton { -1 };
74 };
75
76 void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*);
77 void pointerEventWasDispatched(const PointerEvent&);
78 void processPendingPointerCapture(const PointerEvent&);
79
80 Page& m_page;
81 // While PointerID is defined as int32_t, we use int64_t here so that we may use a value outside of the int32_t range to have safe
82 // empty and removed values, allowing any int32_t to be provided through the API for lookup in this hashmap.
83 using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
84 PointerIdToCapturingDataMap m_activePointerIdsToCapturingData;
85};
86
87} // namespace WebCore
88
89#endif // ENABLE(POINTER_EVENTS)
90