File: pointerevent_pointerId_scope.html

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (170 lines) | stat: -rw-r--r-- 6,298 bytes parent folder | download | duplicates (15)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<!doctype html>
<html>
<head>
  <title>Pointer Events pointerdown tests</title>
  <meta name="viewport" content="width=device-width">
  <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
  <link rel="help" href="https://w3c.github.io/pointerevents/#dom-pointerevent-pointerid">
  <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>
  <!-- Additional helper script for common checks across event types -->
  <script type="text/javascript" src="pointerevent_support.js"></script>
  <script>
    "use strict"

    function loadFrame() {
      return new Promise(resolve => {
        const innerframe = document.getElementById("innerframe");
        innerframe.onload = resolve;
        innerframe.src =
            "resources/pointerevent_pointerId_scope-iframe.html";
      });
    }

    const eventList = [
      'pointerenter',
      'pointerover',
      'pointermove',
      'pointerout',
      'pointerleave'
    ];

    function recordEvents(test) {
      const target0 = document.getElementById("target0");
      const innerframe = document.getElementById("innerframe");
      let activePointerId = undefined;
      let activePointerType = undefined;
      const eventsReceived = {
        'inner': {},
        'outer': {},
      };

      // Records the last event of a given type in the case of multiple
      // events.
      const recordEvent = (event, context) => {
        if (activePointerId === undefined) {
          activePointerId = event.pointerId;
        }
        if (activePointerType == undefined) {
          activePointerType= event.pointerType;
        }
        eventsReceived[context][event.type] = {
          pointerId: event.pointerId,
          pointerType: event.pointerType
        };
      }

      const listener = (event) => {
        recordEvent(event, 'outer');
      };
      eventList.forEach(eventType => {
        target0.addEventListener(eventType, listener);
      });

      const messageListener = (event) => {
        if (event.source != innerframe.contentWindow) {
          return;
        }
        recordEvent(event.data, 'inner');
      };
      window.addEventListener('message', messageListener);

      test.add_cleanup(() => {
        eventList.forEach(eventType => {
          target0.removeEventListener(eventType, listener);
        });
        window.removeEventListener('message', messageListener);
      });

      return new Promise(resolve => {
        document.addEventListener('pointerup', () => {
          // As pointer events for the inner frame are routed via a post
          // message, the outer frame won't see the event until the following
          // event processing loop. Allow 2 additional animation frames to
          // ensure adequate time to receive the events.
          waitForAnimationFrames(2).then(() => {
            eventsReceived.activePointerId = activePointerId;
            eventsReceived.activePointerType = activePointerType;
            resolve(eventsReceived);
          });
        }, { once: true });
      });

    };

    async function run() {
      await loadFrame();

      const target0 = document.getElementById("target0");
      const innerframe = document.getElementById("innerframe");
      const target1 =
          innerframe.contentWindow.document.getElementsByTagName("div")[0];

      promise_test(async t => {
        const results = recordEvents(t);
        // Move from the target in the outer-frame to a target in the inner-
        // frame, click on second target, move back to the first and click.
        // The inner target is not centered in the iframe, thus its position
        // needs to be calculated.
        const iframeRect = innerframe.getClientRects()[0];
        const rect = target1.getClientRects()[0];
        const center_x =
            Math.round(iframeRect.left + (rect.left + rect.right) / 2);
        const center_y =
            Math.round(iframeRect.top + (rect.top + rect.bottom) / 2);

        await new test_driver.Actions()
            .pointerMove(0, 0, { origin: target0 })
            .pointerMove(center_x, center_y)
            .pointerDown()
            .pointerUp()
            .pointerMove(0, 0, { origin: target0 })
            .pointerDown()
            .pointerUp()
            .send();

        const events = await results;

        assert_equals(
            Object.keys(events.outer).length, eventList.length,
            "Missing events for outer target");
        assert_equals(
            Object.keys(events.inner).length, eventList.length,
            "Missing events for inner target");

        const activePointerId = events.activePointerId;
        const activePointerType = events.activePointerType;
        eventList.forEach(eventName => {
          assert_equals(
              events.inner[eventName].pointerId, activePointerId,
              `PointerId of ${eventName} in the inner frame is not correct`);
          assert_equals(
              events.outer[eventName].pointerId, activePointerId,
              `PointerId of ${eventName} in the outer frame is not correct`);
          assert_equals(
              events.inner[eventName].pointerType, activePointerType,
              `PointerType of ${eventName} in the inner frame is not correct`);
          assert_equals(
              events.outer[eventName].pointerType, activePointerType,
              `PointerType of ${eventName} in the outer frame is not correct`);
        });
      }, 'pointerId of an active pointer is the same across same origin ' +
         'frames');
    }
    </script>
</head>
<body onload="run()">
    <h1>Pointer Events pointer ID tests</h1>
    <div id="target0" class="touchActionNone"></div>
    <!-- Document onload does not guarantee that child iframes have loaded.
         Force synchronization by deferring setting the iframe's source
         until a promise is set up to capture its load event. The root
         document will load first, then the iframe.  This ordering ensures
         deterministic behavior.
      -->
    <iframe id="innerframe"></iframe>
</body>
</html>