summaryrefslogtreecommitdiffstats
path: root/dom/base/test/test_postMessages_messagePort.html
blob: 5797c23c5c15cff59f6271bc8b0731cc6b407334 (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
<!DOCTYPE HTML>
<html>
<head>
  <title>Test for postMessages cloning/transferring objects</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <script src="common_postMessages.js"></script>
</head>

<body>
<input id="fileList" type="file"></input>
<script type="application/javascript">

// PostMessage for MessagePort
tests.push(function test_messagePort() {
  info("Testing messagePort");

  var mc = new MessageChannel();
  var resolve;

  function resolvePromise(data) {
    if (!resolve) {
      ok(false, "Unexpected message!");
      return;
    }

    let tmp = resolve;
    resolve = null;
    tmp(data);
  }

  mc.port2.onmessage = function(e) {
    resolvePromise({ data: e.data, ports: e.ports, error: false });
  }

  mc.port2.onmessageerror = function(e) {
    resolvePromise({ error: true });
  }

  runTests({
    clonableObjectsEveryWhere: true,
    clonableObjectsSameProcess: true,
    transferableObjects: true,
    send(what, ports) {
      return new Promise(function(r, rr) {
        resolve = r;
        try {
          mc.port1.postMessage(what, ports);
        } catch(e) {
          resolve = null;
          rr();
        }
      });
    },

    finished() {
      next();
    }
  });
});

// PostMessage for MessagePort in Workers
tests.push(function test_messagePort_inWorkers() {
  info("Testing messagePort in workers");

  var mc = new MessageChannel();
  var resolve;

  var w = new Worker('worker_postMessages.js');
  w.postMessage('messagePort', [ mc.port2 ]);
  w.onmessage = function(e) {
    is(e.data, 'ok', "Worker ready!");

    w.onmessage = function(e1) {
      if (!resolve) {
        ok(false, "Unexpected message!");
        return;
      }

      let tmp = resolve;
      resolve = null;
      tmp({ data: e1.data, ports: e1.ports, error: e1.data === "error" });
    }

    runTests({
      clonableObjectsEveryWhere: true,
      clonableObjectsSameProcess: true,
      transferableObjects: true,
      send(what, ports) {
        return new Promise(function(r, rr) {
          resolve = r;
          try {
            mc.port1.postMessage(what, ports);
          } catch(ex) {
            resolve = null;
            rr();
          }
        });
      },

      finished() {
        w.terminate();
        next();
      }
    });
  }
});

SimpleTest.waitForExplicitFinish();
next();

</script>
</body>
</html>