summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/pointerevents/pointerevent_lostpointercapture_is_first.html
blob: c84961b6c5a2350548d98f17eb964ed66ae6e768 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<!doctype html>
<html>
    <head>
        <title>Lostpointercapture triggers first and asynchronously</title>
        <meta name="assert" content="TA5.2.10: A user agent must fire a pointer event named lostpointercapture after pointer capture is released for a pointer. This event must be fired prior to any subsequent events for the pointer after capture was released. This event is fired at the element from which pointer capture was removed;">
        <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="/resources/testdriver.js"></script>
        <script src="/resources/testdriver-actions.js"></script>
        <script src="/resources/testdriver-vendor.js"></script>
        <script src="pointerevent_support.js"></script>
    </head>
    <body onload="run()">
        <h1>Pointer Events capture test - lostpointercapture order</h1>
        <h4>
            Test Description:
            This test checks if lostpointercapture is handled asynchronously and prior to all subsequent events.
            Complete the following actions:
            <ol>
                <li>Press and hold left mouse button over "Set Capture" button and move a little. "gotpointercapture" should be logged inside of the black rectangle
                <li>"lostpointercapture" should be logged inside of the black rectangle after pointerup
            </ol>
        </h4>
        Test passes if lostpointercapture is dispatched after releasing the mouse button and before any additional pointer events.
        <div id="target0" style="background:black; color:white"></div>
        <br>
        <input type="button" id="btnCapture" value="Set Capture">
        <script type='text/javascript'>
            var detected_pointertypes = {};
            var detected_pointerEvents = new Array();
            var pointerdown_event = null;
            var firstPointermoveReceived = false; // To handle the first pointermove right after gotpointercapture which gotpointercapture was sent right before it.
            var firstPointeroverReceived = false; // To handle the first pointerover right after gotpointercapture which gotpointercapture was sent right before it.
            var firstPointerenterReceived = false; // To handle the first pointeenter right after gotpointercapture which gotpointercapture was sent right before it.

            var test_pointerEvent = async_test("lostpointercapture is dispatched prior to subsequent events"); // set up test harness

            var isPointerCapture = false;
            var count=0;

            var testStarted = false;
            var eventRcvd = false;
            var isAsync = false;
            var event_log = [];
            var actions_promise;

            add_completion_callback(end_of_test);
            function end_of_test() {
                showLoggedEvents();
                showPointerTypes();
            }

            var target0 = document.getElementById('target0');
            var captureButton = document.getElementById('btnCapture');

            function run() {
                on_event(captureButton, 'pointerdown', function(event) {
                    detected_pointertypes[event.pointerType] = true;
                    pointerdown_event = event;
                    if(isPointerCapture == false) {
                        isPointerCapture = true;
                        captureButton.value = 'Release Capture';
                        sPointerCapture(event);
                    }
                });

                // TA5.1.3.1: Process Pending Pointer Capture
                // Whenever a user agent is to fire a Pointer Event that is not gotpointercapture or lostpointercapture,
                // it must first run the steps of processing pending pointer capture
                //
                // TA5.2.12: The lostpointercapture event
                // After pointer capture is released for a pointer, and prior to any subsequent events for the pointer,
                // the lostpointercapture event must be dispatched to the element from which pointer capture was removed.
                // listen to all events
                for (var i = 0; i < All_Pointer_Events.length; i++) {
                    on_event(target0, All_Pointer_Events[i], function (event) {
                        // if the event was gotpointercapture, just log it and return
                        if (event.type == "gotpointercapture") {
                            testStarted = true;
                            rPointerCapture(event);
                            isAsync = true;
                            event_log.push('gotpointercapture@target0');
                            return;
                        }
                        else if (event.type == "lostpointercapture") {
                            event_log.push('lostpointercapture@target0');
                            captureButton.value = 'Set Capture';
                            isPointerCapture = false;

                            // TA: 11.2
                            test_pointerEvent.step(function () {
                                assert_true(isAsync, "lostpointercapture must be fired asynchronously");
                             });

                            // if any events except pointerup have been received with same pointerId before lostpointercapture, then fail
                            var eventsRcvd_str = "";
                            if (eventRcvd) {
                                eventsRcvd_str = "Events received before lostpointercapture: ";
                                for (var i = 0; i < detected_pointerEvents.length; i++) {
                                    eventsRcvd_str += detected_pointerEvents[i] + ", ";
                                }
                            }
                            test_pointerEvent.step(function () {
                                assert_false(eventRcvd, "no other events should be received before lostpointercapture." + eventsRcvd_str);
                                assert_equals(event.pointerId, pointerdown_event.pointerId, "pointerID is same for pointerdown and lostpointercapture");
                            });
                            // Make sure the test finishes after all the input actions are completed.
                            actions_promise.then( () => {
                                test_pointerEvent.done();
                            });
                        }
                        else {
                            if (testStarted && pointerdown_event != null && pointerdown_event.pointerId === event.pointerId) {
                                if (event.type == "pointermove" && !firstPointermoveReceived) {
                                  firstPointermoveReceived = true;
                                }
                                else if (event.type == "pointerenter" && !firstPointerenterReceived) {
                                  firstPointerenterReceived = true;
                                }
                                else if (event.type == "pointerover" && !firstPointeroverReceived) {
                                  firstPointeroverReceived = true;
                                }
                                else if (event.type != "pointerup") {
                                    detected_pointerEvents.push(event.type);
                                    eventRcvd = true;
                                }
                            }
                        }
                    });
                }

                // Inject mouse inputs.
                actions_promise = new test_driver.Actions()
                    .pointerMove(0, 0, {origin: captureButton})
                    .pointerDown()
                    .pointerMove(2, 0, {origin: captureButton})
                    .pointerMove(5, 0, {origin: captureButton})
                    .pointerUp()
                    .send();
            }
        </script>
        <h1>Pointer Events Capture Test</h1>
        <div id="complete-notice">
            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
            <p>The following events were logged: <span id="event-log"></span>.</p>
        </div>
        <div id="log"></div>
    </body>
</html>