summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/test-incrementer.js
blob: 9c3fb813ae6048370db70a01a43e19eaaa0973ed (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
"use strict";

self.getViewValue = (view, index) => {
  if(view instanceof DataView) {
    return view.getInt8(index);
  }
  return view[index];
};

self.setViewValue = (view, index, value) => {
  if(view instanceof DataView) {
    view.setInt8(index, value);
  } else {
    view[index] = value;
  }
};

self.maybeBigInt = (view, value) => {
  if (view.constructor.name === "BigInt64Array" || view.constructor.name === "BigUint64Array") {
    return BigInt(value);
  }
  return value;
};

self.testSharingViaIncrementerScript = (t, whereToListen, whereToListenLabel, whereToSend, whereToSendLabel, origin, type = "Int32Array") => {
  return new Promise(resolve => {
    const sab = new SharedArrayBuffer(8);
    const view = new self[type](sab);
    setViewValue(view, 0, maybeBigInt(view, 1));

    whereToListen.onmessage = t.step_func(({ data }) => {
      switch (data.message) {
        case "initial payload received": {
          assert_equals(data.value, maybeBigInt(view, 1), `The ${whereToSendLabel} must see the same value in the SharedArrayBuffer`);
          break;
        }

        case "changed to 2": {
          assert_equals(getViewValue(view, 0), maybeBigInt(view, 2), `The ${whereToListenLabel} must see changes made in the ${whereToSendLabel}`);

          setViewValue(view, 0, maybeBigInt(view, 3));
          whereToSend.postMessage({ message: "changed to 3" }, origin);

          break;
        }

        case "changed to 3 received": {
          assert_equals(data.value, maybeBigInt(view, 3), `The ${whereToSendLabel} must see changes made in the ${whereToListenLabel}`);
          resolve();
          break;
        }
      }
    });

    whereToSend.postMessage({ message: "initial payload", view }, origin);
  });
};

self.setupDestinationIncrementer = (whereToListen, whereToSendBackTo, origin) => {
  let view;
  whereToListen.onmessage = ({ data }) => {
    switch (data.message) {
      case "initial payload": {
        view = data.view;
        whereToSendBackTo.postMessage({ message: "initial payload received", value: getViewValue(view, 0) }, origin);

        setViewValue(view, 0, maybeBigInt(view, 2));
        whereToSendBackTo.postMessage({ message: "changed to 2" }, origin);

        break;
      }

      case "changed to 3": {
        whereToSendBackTo.postMessage({ message: "changed to 3 received", value: getViewValue(view, 0) }, origin);

        break;
      }
    }
  };
};