| Differences between
and this patch
- a/Source/JavaScriptCore/ChangeLog +10 lines
Lines 1-3 a/Source/JavaScriptCore/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        * Configurations/FeatureDefines.xcconfig:
10
1
2019-02-24  Devin Rousso  <drousso@apple.com>
11
2019-02-24  Devin Rousso  <drousso@apple.com>
2
12
3
        Web Inspector: Change the InspectorOverlay to use native rather than canvas
13
        Web Inspector: Change the InspectorOverlay to use native rather than canvas
- a/Source/WebCore/ChangeLog +47 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        We now dispatch relevant pointer events as we prepare to dispatch mouse events. In most cases, this means we dispatch
10
        a pointer event of the same type, with "mouse" being substituted by "pointer", and with the same properties with the
11
        exception that if preventDefault() is called for a "pointerdown" event, the matching "mousedown" will not be dispatched,
12
        and the same behavior also extends to "pointerup".
13
14
        Tests: pointerevents/mouse/over-enter-out-leave.html
15
               pointerevents/mouse/pointer-capture.html
16
               pointerevents/mouse/pointer-event-basic-properties.html
17
               pointerevents/mouse/pointer-events-before-mouse-events.html
18
               pointerevents/mouse/pointerdown-prevent-default.html
19
20
        * Configurations/FeatureDefines.xcconfig:
21
        * dom/Document.cpp: All of the touch-action related members and functions should be iOS-specific since the touch-action
22
        property does not have any effect on macOS.
23
        (WebCore::Document::invalidateRenderingDependentRegions):
24
        (WebCore::Document::nodeWillBeRemoved):
25
        (WebCore::Document::updateTouchActionElements):
26
        * dom/Document.h:
27
        * dom/Element.cpp:
28
        (WebCore::Element::dispatchMouseEvent): Dispatch a pointer event matching the mouse event that is about to be dispatched.
29
        If preventDefault() is called in the event handler for either "pointerdown" or "pointerup", do not proceed with dispatching
30
        the mouse event.
31
        * dom/PointerEvent.cpp:
32
        (WebCore::pointerEventType):
33
        (WebCore::PointerEvent::create):
34
        * dom/PointerEvent.h:
35
        * page/EventHandler.cpp: Check both the pointer and mouse events to see if we need to dispatch "enter" and "leave" events.
36
        (WebCore::hierarchyHasCapturingEventListeners):
37
        (WebCore::EventHandler::updateMouseEventTargetNode):
38
        * page/PointerCaptureController.cpp: Fix a build error which only happened on macOS.
39
        (WebCore::PointerCaptureController::PointerCaptureController): Create the CapturingData for the unique mouse pointer.
40
        (WebCore::PointerCaptureController::hasPointerCapture): The code did not match the spec cited in the comment, only the
41
        pending target override needs to be considered to determine whether a given element has pointer capture enabled.
42
        (WebCore::PointerCaptureController::dispatchEvent): Dispatch the provided pointer event, accounting for pointer capture if
43
        it is set.
44
        * page/PointerLockController.cpp: Fix a build error which only happened on macOS.
45
        * style/StyleTreeResolver.cpp:
46
        (WebCore::Style::TreeResolver::resolveElement): Code related to touch-action is only relevant to iOS.
47
1
2019-02-25  Miguel Gomez  <magomez@igalia.com>
48
2019-02-25  Miguel Gomez  <magomez@igalia.com>
2
49
3
        [WPE] Add support for holepunch using an external video player
50
        [WPE] Add support for holepunch using an external video player
- a/Source/WebCore/PAL/ChangeLog +10 lines
Lines 1-3 a/Source/WebCore/PAL/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        * Configurations/FeatureDefines.xcconfig:
10
1
2019-02-23  Keith Miller  <keith_miller@apple.com>
11
2019-02-23  Keith Miller  <keith_miller@apple.com>
2
12
3
        Add new mac target numbers
13
        Add new mac target numbers
- a/Source/WebKit/ChangeLog +10 lines
Lines 1-3 a/Source/WebKit/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        * Configurations/FeatureDefines.xcconfig:
10
1
2019-02-24  Zalan Bujtas  <zalan@apple.com>
11
2019-02-24  Zalan Bujtas  <zalan@apple.com>
2
12
3
        Introduce ContentChangeObserver class
13
        Introduce ContentChangeObserver class
- a/Source/WebKitLegacy/mac/ChangeLog +10 lines
Lines 1-3 a/Source/WebKitLegacy/mac/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        * Configurations/FeatureDefines.xcconfig:
10
1
2019-02-23  Keith Miller  <keith_miller@apple.com>
11
2019-02-23  Keith Miller  <keith_miller@apple.com>
2
12
3
        Add new mac target numbers
13
        Add new mac target numbers
- a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig +1 lines
Lines 305-310 ENABLE_POINTER_EVENTS = $(ENABLE_POINTER_EVENTS_$(WK_PLATFORM_NAME)); a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig_sec1
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
308
ENABLE_POINTER_EVENTS_macosx = ENABLE_POINTER_EVENTS;
308
309
309
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
311
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
- a/Source/WebCore/Configurations/FeatureDefines.xcconfig +1 lines
Lines 305-310 ENABLE_POINTER_EVENTS = $(ENABLE_POINTER_EVENTS_$(WK_PLATFORM_NAME)); a/Source/WebCore/Configurations/FeatureDefines.xcconfig_sec1
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
308
ENABLE_POINTER_EVENTS_macosx = ENABLE_POINTER_EVENTS;
308
309
309
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
311
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
- a/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig +1 lines
Lines 305-310 ENABLE_POINTER_EVENTS = $(ENABLE_POINTER_EVENTS_$(WK_PLATFORM_NAME)); a/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig_sec1
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
308
ENABLE_POINTER_EVENTS_macosx = ENABLE_POINTER_EVENTS;
308
309
309
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
311
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
- a/Source/WebCore/dom/Document.cpp -5 / +3 lines
Lines 4153-4159 void Document::invalidateRenderingDependentRegions(AnnotationsAction annotations a/Source/WebCore/dom/Document.cpp_sec1
4153
    setTouchEventRegionsNeedUpdate();
4153
    setTouchEventRegionsNeedUpdate();
4154
#endif
4154
#endif
4155
4155
4156
#if ENABLE(POINTER_EVENTS)
4156
#if PLATFORM(IOS_FAMILY) && ENABLE(POINTER_EVENTS)
4157
    if (auto* page = this->page()) {
4157
    if (auto* page = this->page()) {
4158
        if (auto* frameView = view()) {
4158
        if (auto* frameView = view()) {
4159
            if (auto* scrollingCoordinator = page->scrollingCoordinator())
4159
            if (auto* scrollingCoordinator = page->scrollingCoordinator())
Lines 4545-4551 void Document::nodeWillBeRemoved(Node& node) a/Source/WebCore/dom/Document.cpp_sec2
4545
    if (is<Text>(node))
4545
    if (is<Text>(node))
4546
        m_markers->removeMarkers(node);
4546
        m_markers->removeMarkers(node);
4547
4547
4548
#if ENABLE(POINTER_EVENTS)
4548
#if PLATFORM(IOS_FAMILY) && ENABLE(POINTER_EVENTS)
4549
    if (m_touchActionElements && is<Element>(node))
4549
    if (m_touchActionElements && is<Element>(node))
4550
        m_touchActionElements->remove(&downcast<Element>(node));
4550
        m_touchActionElements->remove(&downcast<Element>(node));
4551
#endif
4551
#endif
Lines 8687-8693 void Document::setPaintWorkletGlobalScopeForName(const String& name, Ref<PaintWo a/Source/WebCore/dom/Document.cpp_sec3
8687
}
8687
}
8688
#endif
8688
#endif
8689
8689
8690
#if ENABLE(POINTER_EVENTS)
8690
#if PLATFORM(IOS_FAMILY) && ENABLE(POINTER_EVENTS)
8691
void Document::updateTouchActionElements(Element& element, const RenderStyle& style)
8691
void Document::updateTouchActionElements(Element& element, const RenderStyle& style)
8692
{
8692
{
8693
    bool changed = false;
8693
    bool changed = false;
Lines 8699-8705 void Document::updateTouchActionElements(Element& element, const RenderStyle& st a/Source/WebCore/dom/Document.cpp_sec4
8699
    } else if (m_touchActionElements)
8699
    } else if (m_touchActionElements)
8700
        changed |= m_touchActionElements->remove(&element);
8700
        changed |= m_touchActionElements->remove(&element);
8701
8701
8702
#if PLATFORM(IOS_FAMILY)
8703
    if (!changed)
8702
    if (!changed)
8704
        return;
8703
        return;
8705
8704
Lines 8711-8717 void Document::updateTouchActionElements(Element& element, const RenderStyle& st a/Source/WebCore/dom/Document.cpp_sec5
8711
        if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
8710
        if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
8712
            scrollingCoordinator->frameViewEventTrackingRegionsChanged(*frameView);
8711
            scrollingCoordinator->frameViewEventTrackingRegionsChanged(*frameView);
8713
    }
8712
    }
8714
#endif
8715
}
8713
}
8716
#endif
8714
#endif
8717
8715
- a/Source/WebCore/dom/Document.h -2 / +2 lines
Lines 1251-1257 public: a/Source/WebCore/dom/Document.h_sec1
1251
    bool hasTouchEventHandlers() const { return false; }
1251
    bool hasTouchEventHandlers() const { return false; }
1252
    bool touchEventTargetsContain(Node&) const { return false; }
1252
    bool touchEventTargetsContain(Node&) const { return false; }
1253
#endif
1253
#endif
1254
#if ENABLE(POINTER_EVENTS)
1254
#if PLATFORM(IOS_FAMILY) && ENABLE(POINTER_EVENTS)
1255
    void updateTouchActionElements(Element&, const RenderStyle&);
1255
    void updateTouchActionElements(Element&, const RenderStyle&);
1256
    const HashSet<RefPtr<Element>>* touchActionElements() const { return m_touchActionElements.get(); }
1256
    const HashSet<RefPtr<Element>>* touchActionElements() const { return m_touchActionElements.get(); }
1257
#endif
1257
#endif
Lines 1847-1853 private: a/Source/WebCore/dom/Document.h_sec2
1847
#if ENABLE(TOUCH_EVENTS)
1847
#if ENABLE(TOUCH_EVENTS)
1848
    std::unique_ptr<EventTargetSet> m_touchEventTargets;
1848
    std::unique_ptr<EventTargetSet> m_touchEventTargets;
1849
#endif
1849
#endif
1850
#if ENABLE(POINTER_EVENTS)
1850
#if PLATFORM(IOS_FAMILY) && ENABLE(POINTER_EVENTS)
1851
    std::unique_ptr<HashSet<RefPtr<Element>>> m_touchActionElements;
1851
    std::unique_ptr<HashSet<RefPtr<Element>>> m_touchActionElements;
1852
#endif
1852
#endif
1853
    std::unique_ptr<EventTargetSet> m_wheelEventTargets;
1853
    std::unique_ptr<EventTargetSet> m_wheelEventTargets;
- a/Source/WebCore/dom/Element.cpp -1 / +18 lines
Lines 79-84 a/Source/WebCore/dom/Element.cpp_sec1
79
#include "NodeRenderStyle.h"
79
#include "NodeRenderStyle.h"
80
#include "PlatformWheelEvent.h"
80
#include "PlatformWheelEvent.h"
81
#include "PointerCaptureController.h"
81
#include "PointerCaptureController.h"
82
#include "PointerEvent.h"
82
#include "PointerLockController.h"
83
#include "PointerLockController.h"
83
#include "RenderFragmentContainer.h"
84
#include "RenderFragmentContainer.h"
84
#include "RenderLayer.h"
85
#include "RenderLayer.h"
Lines 288-296 bool Element::dispatchMouseEvent(const PlatformMouseEvent& platformEvent, const a/Source/WebCore/dom/Element.cpp_sec2
288
    if (mouseEvent->type().isEmpty())
289
    if (mouseEvent->type().isEmpty())
289
        return true; // Shouldn't happen.
290
        return true; // Shouldn't happen.
290
291
292
    bool didNotSwallowEvent = true;
293
294
#if ENABLE(POINTER_EVENTS)
295
    if (RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled()) {
296
        auto pointerEvent = PointerEvent::create(mouseEvent);
297
        if (auto* page = document().page())
298
            page->pointerCaptureController().dispatchEvent(pointerEvent, this);
299
        if (pointerEvent->defaultPrevented() || pointerEvent->defaultHandled()) {
300
            didNotSwallowEvent = false;
301
            if (pointerEvent->type() == eventNames().pointerdownEvent || pointerEvent->type() == eventNames().pointerupEvent)
302
                return false;
303
        }
304
    }
305
#endif
306
291
    ASSERT(!mouseEvent->target() || mouseEvent->target() != relatedTarget);
307
    ASSERT(!mouseEvent->target() || mouseEvent->target() != relatedTarget);
292
    dispatchEvent(mouseEvent);
308
    dispatchEvent(mouseEvent);
293
    bool didNotSwallowEvent = !mouseEvent->defaultPrevented() && !mouseEvent->defaultHandled();
309
    if (mouseEvent->defaultPrevented() || mouseEvent->defaultHandled())
310
        didNotSwallowEvent = false;
294
311
295
    if (mouseEvent->type() == eventNames().clickEvent && mouseEvent->detail() == 2) {
312
    if (mouseEvent->type() == eventNames().clickEvent && mouseEvent->detail() == 2) {
296
        // Special case: If it's a double click event, we also send the dblclick event. This is not part
313
        // Special case: If it's a double click event, we also send the dblclick event. This is not part
- a/Source/WebCore/dom/PointerEvent.cpp +52 lines
Lines 28-33 a/Source/WebCore/dom/PointerEvent.cpp_sec1
28
28
29
#if ENABLE(POINTER_EVENTS)
29
#if ENABLE(POINTER_EVENTS)
30
30
31
#import "EventNames.h"
32
31
namespace WebCore {
33
namespace WebCore {
32
34
33
const String& PointerEvent::mousePointerType()
35
const String& PointerEvent::mousePointerType()
Lines 48-53 const String& PointerEvent::touchPointerType() a/Source/WebCore/dom/PointerEvent.cpp_sec2
48
    return touchType;
50
    return touchType;
49
}
51
}
50
52
53
static AtomicString pointerEventType(const AtomicString& mouseEventType)
54
{
55
    auto& names = eventNames();
56
    if (mouseEventType == names.mousedownEvent)
57
        return names.pointerdownEvent;
58
    if (mouseEventType == names.mouseoverEvent)
59
        return names.pointeroverEvent;
60
    if (mouseEventType == names.mouseenterEvent)
61
        return names.pointerenterEvent;
62
    if (mouseEventType == names.mousemoveEvent)
63
        return names.pointermoveEvent;
64
    if (mouseEventType == names.mouseleaveEvent)
65
        return names.pointerleaveEvent;
66
    if (mouseEventType == names.mouseoutEvent)
67
        return names.pointeroutEvent;
68
    if (mouseEventType == names.mouseupEvent)
69
        return names.pointerupEvent;
70
71
    ASSERT_NOT_REACHED();
72
    return nullAtom();
73
}
74
51
PointerEvent::PointerEvent() = default;
75
PointerEvent::PointerEvent() = default;
52
76
53
PointerEvent::PointerEvent(const AtomicString& type, Init&& initializer)
77
PointerEvent::PointerEvent(const AtomicString& type, Init&& initializer)
Lines 65-70 PointerEvent::PointerEvent(const AtomicString& type, Init&& initializer) a/Source/WebCore/dom/PointerEvent.cpp_sec3
65
{
89
{
66
}
90
}
67
91
92
Ref<PointerEvent> PointerEvent::create(const MouseEvent& mouseEvent)
93
{
94
    auto type = pointerEventType(mouseEvent.type());
95
    auto isEnterOrLeave = type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent;
96
97
    PointerEvent::Init init;
98
    init.bubbles = !isEnterOrLeave;
99
    init.cancelable = !isEnterOrLeave;
100
    init.composed = !isEnterOrLeave;
101
    init.view = mouseEvent.view();
102
    init.ctrlKey = mouseEvent.ctrlKey();
103
    init.shiftKey = mouseEvent.shiftKey();
104
    init.altKey = mouseEvent.altKey();
105
    init.metaKey = mouseEvent.metaKey();
106
    init.modifierAltGraph = mouseEvent.altGraphKey();
107
    init.modifierCapsLock = mouseEvent.capsLockKey();
108
    init.screenX = mouseEvent.screenX();
109
    init.screenY = mouseEvent.screenY();
110
    init.clientX = mouseEvent.clientX();
111
    init.clientY = mouseEvent.clientY();
112
    init.button = mouseEvent.button();
113
    init.buttons = mouseEvent.buttons();
114
    init.relatedTarget = mouseEvent.relatedTarget();
115
    init.isPrimary = true;
116
117
    return PointerEvent::create(type, WTFMove(init));
118
}
119
68
PointerEvent::~PointerEvent() = default;
120
PointerEvent::~PointerEvent() = default;
69
121
70
EventInterface PointerEvent::eventInterface() const
122
EventInterface PointerEvent::eventInterface() const
- a/Source/WebCore/dom/PointerEvent.h +2 lines
Lines 81-86 public: a/Source/WebCore/dom/PointerEvent.h_sec1
81
        return adoptRef(*new PointerEvent);
81
        return adoptRef(*new PointerEvent);
82
    }
82
    }
83
83
84
    static Ref<PointerEvent> create(const MouseEvent&);
85
84
#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
86
#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
85
    static Ref<PointerEvent> create(const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&);
87
    static Ref<PointerEvent> create(const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&);
86
    static Ref<PointerEvent> create(const String& type, const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&);
88
    static Ref<PointerEvent> create(const String& type, const PlatformTouchEvent&, unsigned touchIndex, bool isPrimary, Ref<WindowProxy>&&);
- a/Source/WebCore/page/EventHandler.cpp -6 / +6 lines
Lines 2467-2476 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques a/Source/WebCore/page/EventHandler.cpp_sec1
2467
    return m_frame.document()->prepareMouseEvent(request, documentPointForWindowPoint(m_frame, mouseEvent.position()), mouseEvent);
2467
    return m_frame.document()->prepareMouseEvent(request, documentPointForWindowPoint(m_frame, mouseEvent.position()), mouseEvent);
2468
}
2468
}
2469
2469
2470
static bool hierarchyHasCapturingEventListeners(Element* element, const AtomicString& eventName)
2470
static bool hierarchyHasCapturingEventListeners(Element* element, const AtomicString& pointerEventName, const AtomicString& compatibilityMouseEventName)
2471
{
2471
{
2472
    for (ContainerNode* curr = element; curr; curr = curr->parentInComposedTree()) {
2472
    for (ContainerNode* curr = element; curr; curr = curr->parentInComposedTree()) {
2473
        if (curr->hasCapturingEventListeners(eventName))
2473
        if (curr->hasCapturingEventListeners(pointerEventName) || curr->hasCapturingEventListeners(compatibilityMouseEventName))
2474
            return true;
2474
            return true;
2475
    }
2475
    }
2476
    return false;
2476
    return false;
Lines 2540-2547 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo a/Source/WebCore/page/EventHandler.cpp_sec2
2540
            // mouseenter and mouseleave events are only dispatched if there is a capturing eventhandler on an ancestor
2540
            // mouseenter and mouseleave events are only dispatched if there is a capturing eventhandler on an ancestor
2541
            // or a normal eventhandler on the element itself (they don't bubble).
2541
            // or a normal eventhandler on the element itself (they don't bubble).
2542
            // This optimization is necessary since these events can cause O(n^2) capturing event-handler checks.
2542
            // This optimization is necessary since these events can cause O(n^2) capturing event-handler checks.
2543
            bool hasCapturingMouseEnterListener = hierarchyHasCapturingEventListeners(m_elementUnderMouse.get(), eventNames().mouseenterEvent);
2543
            bool hasCapturingMouseEnterListener = hierarchyHasCapturingEventListeners(m_elementUnderMouse.get(), eventNames().pointerenterEvent, eventNames().mouseenterEvent);
2544
            bool hasCapturingMouseLeaveListener = hierarchyHasCapturingEventListeners(m_lastElementUnderMouse.get(), eventNames().mouseleaveEvent);
2544
            bool hasCapturingMouseLeaveListener = hierarchyHasCapturingEventListeners(m_lastElementUnderMouse.get(), eventNames().pointerleaveEvent, eventNames().mouseleaveEvent);
2545
2545
2546
            Vector<Ref<Element>, 32> leftElementsChain;
2546
            Vector<Ref<Element>, 32> leftElementsChain;
2547
            for (Element* element = m_lastElementUnderMouse.get(); element; element = element->parentElementInComposedTree())
2547
            for (Element* element = m_lastElementUnderMouse.get(); element; element = element->parentElementInComposedTree())
Lines 2565-2571 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo a/Source/WebCore/page/EventHandler.cpp_sec3
2565
                m_lastElementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoutEvent, 0, m_elementUnderMouse.get());
2565
                m_lastElementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoutEvent, 0, m_elementUnderMouse.get());
2566
2566
2567
            for (auto& chain : leftElementsChain) {
2567
            for (auto& chain : leftElementsChain) {
2568
                if (hasCapturingMouseLeaveListener || chain->hasEventListeners(eventNames().mouseleaveEvent))
2568
                if (hasCapturingMouseLeaveListener || chain->hasEventListeners(eventNames().pointerleaveEvent) || chain->hasEventListeners(eventNames().mouseleaveEvent))
2569
                    chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseleaveEvent, 0, m_elementUnderMouse.get());
2569
                    chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseleaveEvent, 0, m_elementUnderMouse.get());
2570
            }
2570
            }
2571
2571
Lines 2573-2579 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo a/Source/WebCore/page/EventHandler.cpp_sec4
2573
                m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get());
2573
                m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get());
2574
2574
2575
            for (auto& chain : enteredElementsChain) {
2575
            for (auto& chain : enteredElementsChain) {
2576
                if (hasCapturingMouseEnterListener || chain->hasEventListeners(eventNames().mouseenterEvent))
2576
                if (hasCapturingMouseEnterListener || chain->hasEventListeners(eventNames().pointerenterEvent) || chain->hasEventListeners(eventNames().mouseenterEvent))
2577
                    chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseenterEvent, 0, m_lastElementUnderMouse.get());
2577
                    chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseenterEvent, 0, m_lastElementUnderMouse.get());
2578
            }
2578
            }
2579
        }
2579
        }
- a/Source/WebCore/page/PointerCaptureController.cpp -5 / +25 lines
Lines 35-45 a/Source/WebCore/page/PointerCaptureController.cpp_sec1
35
#include "Page.h"
35
#include "Page.h"
36
#include "PointerEvent.h"
36
#include "PointerEvent.h"
37
37
38
#if ENABLE(POINTER_LOCK)
39
#include "PointerLockController.h"
40
#endif
41
38
namespace WebCore {
42
namespace WebCore {
39
43
40
PointerCaptureController::PointerCaptureController(Page& page)
44
PointerCaptureController::PointerCaptureController(Page& page)
41
    : m_page(page)
45
    : m_page(page)
42
{
46
{
47
#if !ENABLE(TOUCH_EVENTS)
48
    CapturingData capturingData;
49
    capturingData.pointerType = PointerEvent::mousePointerType();
50
    m_activePointerIdsToCapturingData.set(0, capturingData);
51
#endif
43
}
52
}
44
53
45
ExceptionOr<void> PointerCaptureController::setPointerCapture(Element* capturingTarget, PointerID pointerId)
54
ExceptionOr<void> PointerCaptureController::setPointerCapture(Element* capturingTarget, PointerID pointerId)
Lines 104-114 bool PointerCaptureController::hasPointerCapture(Element* capturingTarget, Point a/Source/WebCore/page/PointerCaptureController.cpp_sec2
104
    // invoked, and false otherwise.
113
    // invoked, and false otherwise.
105
114
106
    auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
115
    auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
107
    if (iterator == m_activePointerIdsToCapturingData.end())
116
    return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.pendingTargetOverride == capturingTarget;
108
        return false;
109
110
    auto& capturingData = iterator->value;
111
    return capturingData.pendingTargetOverride == capturingTarget || capturingData.targetOverride == capturingTarget;
112
}
117
}
113
118
114
void PointerCaptureController::pointerLockWasApplied()
119
void PointerCaptureController::pointerLockWasApplied()
Lines 175-180 std::pair<bool, bool> PointerCaptureController::dispatchEventForTouchAtIndex(Eve a/Source/WebCore/page/PointerCaptureController.cpp_sec3
175
}
180
}
176
#endif
181
#endif
177
182
183
void PointerCaptureController::dispatchEvent(PointerEvent& event, EventTarget* target)
184
{
185
    auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
186
    if (iterator != m_activePointerIdsToCapturingData.end()) {
187
        auto& capturingData = iterator->value;
188
        if (capturingData.pendingTargetOverride && capturingData.targetOverride)
189
            capturingData.targetOverride->dispatchEvent(event);
190
    }
191
192
    if (target && !event.target())
193
        target->dispatchEvent(event);
194
195
    pointerEventWasDispatched(event);
196
}
197
178
void PointerCaptureController::pointerEventWillBeDispatched(const PointerEvent& event, EventTarget* target)
198
void PointerCaptureController::pointerEventWillBeDispatched(const PointerEvent& event, EventTarget* target)
179
{
199
{
180
    // https://w3c.github.io/pointerevents/#implicit-pointer-capture
200
    // https://w3c.github.io/pointerevents/#implicit-pointer-capture
- a/Source/WebCore/page/PointerLockController.cpp +4 lines
Lines 38-43 a/Source/WebCore/page/PointerLockController.cpp_sec1
38
#include "UserGestureIndicator.h"
38
#include "UserGestureIndicator.h"
39
#include "VoidCallback.h"
39
#include "VoidCallback.h"
40
40
41
#if ENABLE(POINTER_EVENTS)
42
#include "PointerCaptureController.h"
43
#endif
44
41
namespace WebCore {
45
namespace WebCore {
42
46
43
PointerLockController::PointerLockController(Page& page)
47
PointerLockController::PointerLockController(Page& page)
- a/Source/WebCore/style/StyleTreeResolver.cpp -1 / +1 lines
Lines 237-243 ElementUpdates TreeResolver::resolveElement(Element& element) a/Source/WebCore/style/StyleTreeResolver.cpp_sec1
237
    auto beforeUpdate = resolvePseudoStyle(element, update, PseudoId::Before);
237
    auto beforeUpdate = resolvePseudoStyle(element, update, PseudoId::Before);
238
    auto afterUpdate = resolvePseudoStyle(element, update, PseudoId::After);
238
    auto afterUpdate = resolvePseudoStyle(element, update, PseudoId::After);
239
239
240
#if ENABLE(POINTER_EVENTS)
240
#if ENABLE(POINTER_EVENTS) && PLATFORM(IOS_FAMILY)
241
    if (RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled())
241
    if (RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled())
242
        m_document.updateTouchActionElements(element, *update.style.get());
242
        m_document.updateTouchActionElements(element, *update.style.get());
243
#endif
243
#endif
- a/Source/WebKit/Configurations/FeatureDefines.xcconfig +1 lines
Lines 305-310 ENABLE_POINTER_EVENTS = $(ENABLE_POINTER_EVENTS_$(WK_PLATFORM_NAME)); a/Source/WebKit/Configurations/FeatureDefines.xcconfig_sec1
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
308
ENABLE_POINTER_EVENTS_macosx = ENABLE_POINTER_EVENTS;
308
309
309
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
311
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
- a/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig +1 lines
Lines 305-310 ENABLE_POINTER_EVENTS = $(ENABLE_POINTER_EVENTS_$(WK_PLATFORM_NAME)); a/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig_sec1
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
308
ENABLE_POINTER_EVENTS_macosx = ENABLE_POINTER_EVENTS;
308
309
309
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
311
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
- a/Tools/ChangeLog +10 lines
Lines 1-3 a/Tools/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        * TestWebKitAPI/Configurations/FeatureDefines.xcconfig:
10
1
2019-02-24  Michael Catanzaro  <mcatanzaro@igalia.com>
11
2019-02-24  Michael Catanzaro  <mcatanzaro@igalia.com>
2
12
3
        [WPE][GTK] Remove user agent quirk for washingtonpost.com
13
        [WPE][GTK] Remove user agent quirk for washingtonpost.com
- a/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig +1 lines
Lines 305-310 ENABLE_POINTER_EVENTS = $(ENABLE_POINTER_EVENTS_$(WK_PLATFORM_NAME)); a/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig_sec1
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
305
ENABLE_POINTER_EVENTS_iosmac = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
306
ENABLE_POINTER_EVENTS_iphoneos = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
307
ENABLE_POINTER_EVENTS_iphonesimulator = ENABLE_POINTER_EVENTS;
308
ENABLE_POINTER_EVENTS_macosx = ENABLE_POINTER_EVENTS;
308
309
309
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK = $(ENABLE_POINTER_LOCK_$(WK_PLATFORM_NAME));
310
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
311
ENABLE_POINTER_LOCK_macosx = ENABLE_POINTER_LOCK;
- a/LayoutTests/ChangeLog +23 lines
Lines 1-3 a/LayoutTests/ChangeLog_sec1
1
2019-02-26  Antoine Quint  <graouts@apple.com>
2
3
        Support Pointer Events on macOS
4
        https://bugs.webkit.org/show_bug.cgi?id=195008
5
        <rdar://problem/47454419>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        * platform/mac/TestExpectations: Enable the new mouse-based tests.
10
        * pointerevents/mouse/over-enter-out-leave-expected.txt: Added.
11
        * pointerevents/mouse/over-enter-out-leave.html: Added.
12
        * pointerevents/mouse/pointer-capture-expected.txt: Added.
13
        * pointerevents/mouse/pointer-capture.html: Added.
14
        * pointerevents/mouse/pointer-event-basic-properties-expected.txt: Added.
15
        * pointerevents/mouse/pointer-event-basic-properties.html: Added.
16
        * pointerevents/mouse/pointer-events-before-mouse-events-expected.txt: Added.
17
        * pointerevents/mouse/pointer-events-before-mouse-events.html: Added.
18
        * pointerevents/mouse/pointerdown-prevent-default-expected.txt: Added.
19
        * pointerevents/mouse/pointerdown-prevent-default.html: Added.
20
        * pointerevents/utils.js:
21
        (prototype.clear):
22
        (prototype.assertMatchesEvents): Remove this first assertion since some of the new tests check for empty events.
23
1
2019-02-24  Devin Rousso  <drousso@apple.com>
24
2019-02-24  Devin Rousso  <drousso@apple.com>
2
25
3
        Web Inspector: Change the InspectorOverlay to use native rather than canvas
26
        Web Inspector: Change the InspectorOverlay to use native rather than canvas
- a/LayoutTests/platform/mac/TestExpectations +2 lines
Lines 39-44 http/tests/gzip-content-encoding [ Pass ] a/LayoutTests/platform/mac/TestExpectations_sec1
39
fast/text/mac [ Pass ]
39
fast/text/mac [ Pass ]
40
webkit.org/b/181964 fast/text/mac/select-character-before-zero-width-joiner.html [ ImageOnlyFailure ]
40
webkit.org/b/181964 fast/text/mac/select-character-before-zero-width-joiner.html [ ImageOnlyFailure ]
41
41
42
pointerevents/mouse [ Pass ]
43
42
#//////////////////////////////////////////////////////////////////////////////////////////
44
#//////////////////////////////////////////////////////////////////////////////////////////
43
# End platform-specific directories.
45
# End platform-specific directories.
44
#//////////////////////////////////////////////////////////////////////////////////////////
46
#//////////////////////////////////////////////////////////////////////////////////////////
- a/LayoutTests/pointerevents/mouse/over-enter-out-leave-expected.txt +3 lines
Line 0 a/LayoutTests/pointerevents/mouse/over-enter-out-leave-expected.txt_sec1
1
2
PASS Testing that "pointerover" and "pointerenter" are dispatched when entering an element's bounds and that "pointerout" and "pointerleave" are dispatched when leaving an element's bounds. 
3
- a/LayoutTests/pointerevents/mouse/over-enter-out-leave.html +32 lines
Line 0 a/LayoutTests/pointerevents/mouse/over-enter-out-leave.html_sec1
1
<!DOCTYPE html>
2
<html>
3
<head>
4
<meta charset=utf-8>
5
</head>
6
<body>
7
<script src="../../resources/testharness.js"></script>
8
<script src="../../resources/testharnessreport.js"></script>
9
<script src="../utils.js"></script>
10
<script>
11
12
'use strict';
13
14
target_test({ x: "100px", y: "100px", width: "100px", height: "100px" }, (target, test) => {
15
    const eventTracker = new EventTracker(target, ["pointerover", "pointerenter", "pointerout", "pointerleave"]);
16
17
    eventSender.mouseMoveTo(50, 50);
18
    eventSender.mouseMoveTo(150, 150);
19
    eventSender.mouseMoveTo(250, 250);
20
21
    eventTracker.assertMatchesEvents([
22
        { type: "pointerover", x: 150, y: 150, isPrimary: true },
23
        { type: "pointerenter", x: 150, y: 150, isPrimary: true },
24
        { type: "pointerout", x: 250, y: 250, isPrimary: true },
25
        { type: "pointerleave", x: 250, y: 250, isPrimary: true },
26
    ]);
27
    test.done();
28
}, `Testing that "pointerover" and "pointerenter" are dispatched when entering an element's bounds and that "pointerout" and "pointerleave" are dispatched when leaving an element's bounds.`);
29
30
</script>
31
</body>
32
</html>
- a/LayoutTests/pointerevents/mouse/pointer-capture-expected.txt +3 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointer-capture-expected.txt_sec1
1
2
PASS Testing that setting pointer capture on an element dispatches pointermove events to that element even when the pointer is outside of its bounds. 
3
- a/LayoutTests/pointerevents/mouse/pointer-capture.html +67 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointer-capture.html_sec1
1
<!DOCTYPE html>
2
<html>
3
<head>
4
<meta charset=utf-8>
5
</head>
6
<body>
7
<script src="../../resources/testharness.js"></script>
8
<script src="../../resources/testharnessreport.js"></script>
9
<script src="../utils.js"></script>
10
<script>
11
12
'use strict';
13
14
target_test({ x: "100px", y: "100px", width: "100px", height: "100px" }, (target, test) => {
15
    const eventTracker = new EventTracker(target, ["pointermove"]);
16
17
    // Start with the mouse outside of the target.
18
    eventSender.mouseMoveTo(50, 50);
19
20
    // Move it over the target, this yields a "pointermove" event.
21
    eventSender.mouseMoveTo(150, 150);
22
    eventTracker.assertMatchesEvents([
23
        { type: "pointermove", x: 150, y: 150 }
24
    ]);
25
    eventTracker.clear();
26
27
    // Press the mouse and move it outside the target and release it, this does not yield a "pointermove" event since there is no capture.
28
    eventSender.mouseDown();
29
    eventSender.mouseMoveTo(250, 250);
30
    eventSender.mouseUp();
31
32
    // Now, move the mouse over the target again.
33
    eventSender.mouseMoveTo(150, 150);
34
    eventTracker.assertMatchesEvents([
35
        { type: "pointermove", x: 150, y: 150 }
36
    ]);
37
    eventTracker.clear();
38
39
    // And press the mouse button again, but set the capture while handling the "pointerdown" event.
40
    let pointerId;
41
    target.addEventListener("pointerdown", event => {
42
        pointerId = event.pointerId;
43
        assert_false(target.hasPointerCapture(pointerId), "The target does not have pointer capture by default.");
44
        target.setPointerCapture(pointerId);
45
        assert_true(target.hasPointerCapture(pointerId), "The target has pointer capture after calling setPointerCapture().");
46
    });
47
    eventSender.mouseDown();
48
49
    // Move the mouse oustide the target again, this time this yields a "pointermove" event since the target has pointer capture.
50
    eventSender.mouseMoveTo(250, 250);
51
    eventTracker.assertMatchesEvents([
52
        { type: "pointermove", x: 250, y: 250 }
53
    ]);
54
    eventTracker.clear();
55
56
    // Finally, release capture and mouse the mouse again, this should not yield a "pointermove" event.
57
    target.releasePointerCapture(pointerId);
58
    assert_false(target.hasPointerCapture(pointerId), "The target no longer has pointer capture after calling releasePointerCapture().");
59
    eventSender.mouseMoveTo(240, 240);
60
    eventTracker.assertMatchesEvents([]);
61
62
    test.done();
63
}, `Testing that setting pointer capture on an element dispatches pointermove events to that element even when the pointer is outside of its bounds.`);
64
65
</script>
66
</body>
67
</html>
- a/LayoutTests/pointerevents/mouse/pointer-event-basic-properties-expected.txt +3 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointer-event-basic-properties-expected.txt_sec1
1
2
PASS Testing the basic properties of a pointer event triggered by a mouse. 
3
- a/LayoutTests/pointerevents/mouse/pointer-event-basic-properties.html +29 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointer-event-basic-properties.html_sec1
1
<!DOCTYPE html>
2
<html>
3
<head>
4
<meta charset=utf-8>
5
</head>
6
<body>
7
<script src="../../resources/testharness.js"></script>
8
<script src="../../resources/testharnessreport.js"></script>
9
<script src="../utils.js"></script>
10
<script>
11
12
'use strict';
13
14
target_test((target, test) => {
15
    eventSender.mouseMoveTo(50, 50);
16
    eventSender.mouseDown();
17
18
    target.addEventListener("pointerdown", event => {
19
        assert_equals(event.pointerId, 0, "The pointer's identifier is 0.");
20
        assert_equals(event.pointerType, "mouse", "The pointer type is 'mouse'.");
21
        assert_true(event.isPrimary, "The pointer is the primary pointer.");
22
    });
23
24
    test.done();
25
}, `Testing the basic properties of a pointer event triggered by a mouse.`);
26
27
</script>
28
</body>
29
</html>
- a/LayoutTests/pointerevents/mouse/pointer-events-before-mouse-events-expected.txt +3 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointer-events-before-mouse-events-expected.txt_sec1
1
2
PASS Testing that pointer events are dispatched prior to compatibility mouse events. 
3
- a/LayoutTests/pointerevents/mouse/pointer-events-before-mouse-events.html +59 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointer-events-before-mouse-events.html_sec1
1
<!DOCTYPE html>
2
<html>
3
<head>
4
<meta charset=utf-8>
5
</head>
6
<body>
7
<script src="../../resources/testharness.js"></script>
8
<script src="../../resources/testharnessreport.js"></script>
9
<script src="../utils.js"></script>
10
<script>
11
12
'use strict';
13
14
target_test({ x: "100px", y: "100px", width: "100px", height: "100px" }, (target, test) => {
15
    const eventTracker = new EventTracker(target, ["pointerover", "pointerenter", "pointermove", "pointerdown", "pointerup", "pointerout", "pointerleave",
16
                                                   "mouseover", "mouseenter", "mousemove", "mousedown", "mouseup", "mouseout", "mouseleave", "click"]);
17
    // Start outside of the target.
18
    eventSender.mouseMoveTo(50, 50);
19
20
    // Move the cursor over the target.
21
    eventSender.mouseMoveTo(150, 150);
22
    eventTracker.assertMatchesEvents([
23
        { type: "pointerover", x: 150, y: 150 },
24
        { type: "mouseover", x: 150, y: 150 },
25
        { type: "pointerenter", x: 150, y: 150 },
26
        { type: "mouseenter", x: 150, y: 150 },
27
        { type: "pointermove", x: 150, y: 150 },
28
        { type: "mousemove", x: 150, y: 150 },
29
    ]);
30
    eventTracker.clear();
31
32
    // Click.
33
    eventSender.mouseDown();
34
    eventSender.mouseUp();
35
    eventTracker.assertMatchesEvents([
36
        { type: "pointerdown", x: 150, y: 150 },
37
        { type: "mousedown", x: 150, y: 150 },
38
        { type: "pointerup", x: 150, y: 150 },
39
        { type: "mouseup", x: 150, y: 150 },
40
        { type: "click", x: 150, y: 150 },
41
    ]);
42
    eventTracker.clear();
43
44
    // Move the cursor outside the target.
45
    eventSender.mouseMoveTo(250, 250);
46
    eventTracker.assertMatchesEvents([
47
        { type: "pointerout", x: 250, y: 250 },
48
        { type: "mouseout", x: 250, y: 250 },
49
        { type: "pointerleave", x: 250, y: 250 },
50
        { type: "mouseleave", x: 250, y: 250 },
51
    ]);
52
    eventTracker.clear();
53
54
    test.done();
55
}, `Testing that pointer events are dispatched prior to compatibility mouse events.`);
56
57
</script>
58
</body>
59
</html>
- a/LayoutTests/pointerevents/mouse/pointerdown-prevent-default-expected.txt +3 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointerdown-prevent-default-expected.txt_sec1
1
2
PASS Testing that calling preventDefault() when handling a "pointerdown" event does not dispatch a "mousedown" event. 
3
- a/LayoutTests/pointerevents/mouse/pointerdown-prevent-default.html +38 lines
Line 0 a/LayoutTests/pointerevents/mouse/pointerdown-prevent-default.html_sec1
1
<!DOCTYPE html>
2
<html>
3
<head>
4
<meta charset=utf-8>
5
</head>
6
<body>
7
<script src="../../resources/testharness.js"></script>
8
<script src="../../resources/testharnessreport.js"></script>
9
<script src="../utils.js"></script>
10
<script>
11
12
'use strict';
13
14
target_test((target, test) => {
15
    const eventTracker = new EventTracker(target, ["pointerdown", "mousedown"]);
16
17
    // Press the mouse once without calling preventDefault().
18
    eventSender.mouseMoveTo(50, 50);
19
    eventSender.mouseDown();
20
    eventSender.mouseUp();
21
22
    // Press it again and call preventDefault().
23
    target.addEventListener("pointerdown", event => event.preventDefault());
24
    eventSender.mouseMoveTo(50, 50);
25
    eventSender.mouseDown();
26
    eventSender.mouseUp();
27
28
    eventTracker.assertMatchesEvents([
29
        { type: "pointerdown", x: 50, y: 50 },
30
        { type: "mousedown", x: 50, y: 50 },
31
        { type: "pointerdown", x: 50, y: 50 },
32
    ]);
33
    test.done();
34
}, `Testing that calling preventDefault() when handling a "pointerdown" event does not dispatch a "mousedown" event.`);
35
36
</script>
37
</body>
38
</html>
- a/LayoutTests/pointerevents/utils.js -1 / +5 lines
Lines 44-49 class EventTracker a/LayoutTests/pointerevents/utils.js_sec1
44
            target.addEventListener(eventName, this);
44
            target.addEventListener(eventName, this);
45
    }
45
    }
46
46
47
    clear()
48
    {
49
        this.events = [];
50
    }
51
47
    handleEvent(event)
52
    handleEvent(event)
48
    {
53
    {
49
        if (event instanceof PointerEvent)
54
        if (event instanceof PointerEvent)
Lines 77-83 class EventTracker a/LayoutTests/pointerevents/utils.js_sec2
77
82
78
    assertMatchesEvents(expectedEvents)
83
    assertMatchesEvents(expectedEvents)
79
    {
84
    {
80
        assert_true(!!this.events.length, "Event tracker saw some events.");
81
        assert_equals(expectedEvents.length, this.events.length, "Expected events and actual events have the same length.");
85
        assert_equals(expectedEvents.length, this.events.length, "Expected events and actual events have the same length.");
82
        for (let i = 0; i < expectedEvents.length; ++i) {
86
        for (let i = 0; i < expectedEvents.length; ++i) {
83
            const expectedEvent = expectedEvents[i];
87
            const expectedEvent = expectedEvents[i];

Return to Bug 195008