File: iframe_sensor_handler.html

package info (click to toggle)
firefox 144.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,637,504 kB
  • sloc: cpp: 7,576,692; javascript: 6,430,831; ansic: 3,748,119; python: 1,398,978; xml: 628,810; asm: 438,679; java: 186,194; sh: 63,212; makefile: 19,159; objc: 13,086; perl: 12,986; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (92 lines) | stat: -rw-r--r-- 3,225 bytes parent folder | download | duplicates (10)
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
<!DOCTYPE html>
<meta charset="utf-8">
<title>cross-origin iframe sensor tester</title>
<script src="/resources/testdriver.js?feature=bidi"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/generic-sensor/resources/generic-sensor-helpers.js"></script>
<script>
  let sensor = null;

  test_driver.set_test_context(window.parent);

  // This function is defined separately so that it is added only once
  // regardless of how many times the 'start_sensor' command is received.
  function sensorReadingEventHandler() {
    window.parent.postMessage(
      {
        eventName: 'reading',
        serializedSensor: serialize_sensor_data(sensor),
      }, '*');
  }

  async function messageHandler(e) {
    switch (e.data.command) {
      case 'create_sensor':
        if (!sensor) {
          const { sensorName, permissionName } = e.data.sensorData;
          // TODO(https://github.com/w3c/permissions/issues/419): This does not
          // work as expected: due to the set_test_context() call above, this
          // call goes through the top-level frame, which has a different
          // origin in cross-origin tests, meaning that cross-origin tests only
          // really work when permissions are granted by default. This can only
          // be fixed by testdriver.js allowing set_permission() to specify a
          // different origin.
          await test_driver.bidi.permissions.set_permission(
              {descriptor: {name: permissionName}, state: 'granted'});
          sensor = new self[sensorName]();
        }
        return Promise.resolve();

      case 'start_sensor':
        return new Promise((resolve, reject) => {
          // This event listener is different from the ones below, as it is
          // supposed to be used together with IframeSensorReadingEventWatcher.
          // It sends a message whenever there is an event, and window.parent
          // decides whether it was expected or not. It is the only way to have
          // something akin to EventWatcher in a cross-origin iframe.
          sensor.addEventListener('reading', sensorReadingEventHandler);

          sensor.addEventListener('activate', () => {
            resolve();
          }, { once: true });
          sensor.addEventListener('error', e => {
            reject(`${e.error.name}: ${e.error.message}`);
          }, { once: true });
          sensor.start();
        });

      case 'has_reading':
        return Promise.resolve(sensor.hasReading);

      case 'stop_sensor':
        if (sensor) {
          sensor.stop();
        }
        return Promise.resolve();

      default:
        return Promise.reject(`unknown command "${e.data.command}"`);
    }
  }

  window.onmessage = async (e) => {
    // The call to test_driver.set_context() above makes messages other than
    // those we are specifically waiting for to be delivered too. Ignore those
    // here.
    if (!e.data.command) {
      return;
    }

    try {
      test_driver.message_test({
        command: e.data.command,
        result: await messageHandler(e),
      });
    } catch (error) {
      test_driver.message_test({
        command: e.data.command,
        error,
      });
    }
  }
</script>